上的网络负载均衡Amazon EKS - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

上的网络负载均衡Amazon EKS

在创建类型为 Service 的 Kubernetes LoadBalancer 时,会预置 AWS 网络负载均衡器 (NLB) 或 传统负载均衡器 (CLB),用于对网络流量进行负载均衡。要了解有关两种类型的负载均衡器之间差异的更多信息,请参阅 网站上的 Elastic Load Balancing 功能AWS。有关 Kubernetes 服务的更多信息,请参阅 Kubernetes 文档中的服务。NLBs 可以与部署到节点或 AWS Fargate IP 目标的 Pod 一起使用。您可以将 AWS 负载均衡器部署到公有子网或私有子网。

网络流量在 OSI 模型的 L4 处实现负载均衡。要在 L7 处对应用程序流量进行负载均衡,您需要部署一个 Kubernetes Ingress,它预配置一个 AWS 应用程序负载均衡器。有关更多信息,请参阅上的应用程序负载均衡Amazon EKS。要了解有关两种类型的负载均衡之间的区别的更多信息,请参阅 网站上的 Elastic Load Balancing 功能AWS。

在 Amazon EKS 中,您可以对到 NLB(实例IP 目标)或 CLB(实例目标)的网络流量进行负载均衡。有关 NLB 目标类型的更多信息,请参阅 中的目标类型Network Load Balancer 用户指南。当您将网络流量负载均衡到实例目标时,Kubernetes 树内控制器将创建 NLB 或 CLB。为了将网络流量负载均衡到 IP 目标类型,AWS 负载均衡器控制器创建了一个 NLB。有关更多信息,请参阅 上的 AWS 负载均衡器控制器GitHub。

Prerequisites

您必须先满足以下要求,然后才能将网络流量负载均衡到应用程序。

  • 拥有现有集群。如果您没有现有集群,请参阅Amazon EKS 入门。如果要将负载均衡到 IP 目标,则集群必须是 1.18 或更高版本。要更新现有集群,请参阅更新集群

  • 如果要将负载均衡到 IP 目标,则必须在集群上预配置 AWS 负载均衡器控制器。有关更多信息,请参阅AWS 负载均衡器控制器

  • 必须按照以下方式为公有子网添加标签,以便 Kubernetes 知道仅将这些子网用于外部负载均衡器,而不是在每个可用区中选择一个公有子网(按子网 ID 的字母表顺序选择)。如果您在 March 26, 2020之后使用 eksctl 或 Amazon EKS AWS CloudFormation 模板创建 VPC,则在创建子网时会为子网添加适当的标签。有关 Amazon EKS AWS CloudFormation VPC 模板的更多信息,请参阅为 Amazon EKS 集群创建 VPC

    kubernetes.io/role/elb

    1

  • 必须按照以下方式为私有子网添加标签,以便 Kubernetes 知道它可以将这些子网用于内部负载均衡器。如果您在 March 26, 2020之后使用 eksctl 或 Amazon EKS AWS CloudFormation 模板创建 VPC,则在创建子网时会为子网添加适当的标签。有关 Amazon EKS AWS CloudFormation VPC 模板的更多信息,请参阅为 Amazon EKS 集群创建 VPC

    kubernetes.io/role/internal-elb

    1

Considerations

  • 在具有以下平台版本的 Amazon EKS 集群上,负载均衡器支持 UDP 协议的使用。有关更多信息,请参阅Amazon EKS 平台版本

    Amazon EKS version 平台版本
    1.18 1.
    1.17 2.
    1.16 3.
    1.15 4.
  • 您只能将 NLB IP 目标与 Amazon EKS VPC CNI 插件结合使用。您可以将 NLB 实例目标与 Amazon EKS VPC CNI 插件或可替换的兼容 CNI 插件结合使用。

  • 您只能将 IP 目标与 NLB 一起使用。您不能将 IP 目标与 CLBs 一起使用。

  • 负载均衡器的配置由添加到服务清单中的注释控制。如果要在创建负载均衡器时(或之后)向负载均衡器添加标签,请在服务规范中添加以下注释。有关更多信息,请参阅 Kubernetes 文档中的其他 ELB 注释

    service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags
  • 如果您使用的是 Amazon EKS 1.16 或更高版本,则可以通过添加以下注释来向 分配弹性 IP 地址网络负载均衡器。将 <example-values>(包括 <>)替换为您的弹性 IP 地址的分配 IDs。分配 IDs 的数量必须与用于负载均衡器的子网数匹配。

    service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-<xxxxxxxxxxxxxxxxx>,eipalloc-<yyyyyyyyyyyyyyyyy>
  • 对于您在 1.16 或更高版本的集群上创建的每个 NLB,Amazon EKS 会向节点的安全组客户端流量添加一个入站规则,并针对 VPC 中的每个负载均衡器子网添加一个规则以进行运行状况检查。在 1.15 集群上,将为分配给 VPC 的每个 CIDR 块添加一个规则。如果 LoadBalancer 尝试创建的规则超出安全组允许的最大规则数配额,Amazon EKS 类型的服务部署可能会失败。有关更多信息,请参阅 配额中的Amazon VPC安全组Amazon VPC 用户指南。请考虑以下选项来最大程度地降低超过安全组的最大规则数的几率。

    • 请求增加每个安全组规则的配额。有关更多信息,请参阅 中的请求提高配额Service Quotas 用户指南。

    • 使用 负载均衡器 – IP 目标 而不是实例目标。对于 IP 目标,可能为相同的目标端口共享规则。可以使用注释手动指定负载均衡器子网。有关更多信息,请参阅 上的注释GitHub。

    • 使用入口,而不是 LoadBalancer 类型的服务来将流量发送到您的服务。AWS (ALB) 需要的规则少于 应用程序负载均衡器。NLBs 也可以跨多个入口共享一个 ALB。有关更多信息,请参阅上的应用程序负载均衡Amazon EKS

    • 将集群部署到多个账户。

负载均衡器 – 实例目标

具有实例目标的 NLB 或 CLBs 由 Kubernetes 树内负载均衡控制器创建。树内控制器随 Kubernetes 提供,因此您无需将其部署到集群。您可以将 NLB 实例目标与部署到节点的 Pod 一起使用,但不能与 Fargate 一起使用。要跨部署到 Fargate 的 Pod 实现网络流量的负载均衡,您必须使用 IP 目标。默认情况下,当您部署类型为 传统负载均衡器 的 Kubernetes 服务时,将创建外部(公有)LoadBalancer。 要部署 网络负载均衡器,请将以下注释应用于您的服务:

service.beta.kubernetes.io/aws-load-balancer-type: nlb
重要

在创建服务后,请勿编辑此注释。如果您需要修改它,请删除服务对象,然后使用此注释的所需值再次创建它。

要将负载均衡器部署到私有子网,您的服务规范必须具有以下注释:

service.beta.kubernetes.io/aws-load-balancer-internal: "true"

对于内部负载均衡器,Amazon EKS 集群必须配置为使用 VPC 中的至少一个私有子网。Kubernetes 会检查子网的路由表来确定它们是公有还是私有。公有子网有使用 Internet 网关直接连接到 Internet 的路由,但私有子网没有。

有关指定负载均衡器的示例服务清单,请参阅 Kubernetes 文档中的类型 LoadBalancer。有关通过 Kubernetes 使用 网络负载均衡器 的更多信息,请参阅 Kubernetes 文档中的 AWS 上的 Network Load Balancer 支持

负载均衡器 – IP 目标

NLBs 具有 IP 目标的 CLBs 由 AWS 负载均衡器控制器创建(您不能将 与 IP 目标结合使用)。您可以将 NLB IP 目标与部署到 Amazon EC2 节点或 Fargate 的 Pod 一起使用。您的 Kubernetes 服务必须创建为类型 LoadBalancer。 有关更多信息,请参阅 Kubernetes 文档中的类型 LoadBalancer

要创建使用 IP 目标的负载均衡器,请将以下注释添加到服务清单并部署您的服务。

service.beta.kubernetes.io/aws-load-balancer-type: nlb-ip
重要

在创建服务后,请勿编辑此注释。如果您需要修改它,请删除服务对象,然后使用此注释的所需值再次创建它。您只能将 NLB IP 目标与至少运行 Amazon EKS 版本 1.18 的集群结合使用。要升级当前版本,请参阅更新集群

部署示例应用程序

  1. 部署示例应用程序。

    1. 将以下内容保存到计算机上的 yaml 文件中。

      apiVersion: apps/v1 kind: Deployment metadata: name: sample-app spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: public.ecr.aws/z9d2n7e1/nginx:1.19.5 ports: - name: http containerPort: 80
    2. 将清单应用于集群。

      kubectl apply -f <file-name-you-specified>.yaml
  2. 使用注释创建 LoadBalancer 类型的服务,以创建具有 IP 目标的 NLB。

    1. 将以下内容保存到计算机上的 yaml 文件中。

      apiVersion: v1 kind: Service metadata: name: sample-service annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb-ip spec: ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer selector: app: nginx
    2. 将清单应用于集群。

      kubectl apply -f <file-name-you-specified>.yaml
  3. 验证是否已部署服务。

    kubectl get svc sample-service

    输出

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sample-service LoadBalancer 10.100.240.137 k8s-default-samplese-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com 80:32400/TCP 16h
  4. 打开 Amazon EC2 AWS 管理控制台。在左侧面板中选择 Target Groups (目标组)(在 Load Balancing 下)。在 Name (名称) 列中,选择与上一步输出的 EXTERNAL-IP 列中的名称匹配的目标组的名称。例如,如果输出与上面的输出相同,则可以选择名为 k8s-default-samplese-xxxxxxxxxx 的目标组。Target type (目标类型),因为已在示例服务部署清单中指定该类型。IP

  5. 选择 Target group,然后选择 Targets 选项卡。在 Registered targets (注册目标) 下,您应看到上一步中部署的三个副本的三个 IP 地址。请耐心等待,直到所有目标的状态为正常,然后再继续。可能需要几分钟时间,然后所有目标才为 healthy。 在更改为 unhealthy 之前,目标可能具有 healthy 状态。

  6. 使用上一步中返回的值将流量发送到替换示例值的服务。EXTERNAL-IP

    curl <k8s-default-samplese-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com>

    输出

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
  7. 当您使用完示例部署和服务后,请将其删除。

    kubectl delete service sample-service kubectl delete deployment sample-app