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

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

Amazon EKS 上的网络负载均衡器

当您创建一个库贝内特Service类型LoadBalancer,一个Amazon配置 Network Load Balancer (NLB) 以平衡网络流量的负载。有关 NLB 的更多信息,请参阅什么是 Network Load Balancer?。有关 Kubernetes 服务的更多信息,请参阅。服务在 Kubernetes 文档中。NLB 可以与部署到 Amazon EC2 节点或AmazonFargate IP 目标。您可以部署Amazon负载均衡器连接到公有子网或私有子网。

网络流量在 OSI 模型的 L4 处进行负载平衡。若要在 L7 上对应用程序流量进行负载平衡,请部署 KubernetesIngress, 其中规定AmazonApplication Load Balancer。有关更多信息,请参阅 Amazon EKS 上的 Application Load Balancing。要了解有关两种类型的负载均衡器之间的差异的更多信息,请参阅Elastic Load Balancing 功能上Amazon网站.

在 Amazon EKS 中,您可以将网络流量负载平衡到 NLB (实例或者IP目标)。有关 NLB 目标类型的更多信息,请参阅Target type(在网络负载均衡器用户指南中)。有关更多信息,请参阅 。Amazon负载均衡器(位于 GitHub 上)。

重要

随着2.2.0的版本AmazonLoad BalancerKubernetes 树内服务负载平衡器控制器已弃用,并且只接收关键错误修复。为类型为服务置备新的网络负载平衡器时LoadBalancer,建议使用AmazonLoad Balancer。本主题中的信息假定您使用AmazonLoad Balancer 器控制器,而不是 Kubernetes 树内控制器。

Prerequisites

在向应用程序实现网络通信负载均衡器之前,您必须符合以下要求。

  • 至少有一个子网。如果在一个可用区中找到多个带标记的子网,控制器将按照子网 ID 的字典顺序选择第一个子网。

  • 如果您使用的是AmazonLoad Balancer 控制器版本v2.1.1或更早版本,则必须按如下方式标记子网。如果使用版本 2.1.2 或更高版本,则此标签是可选的。如果您在同一 VPC 中运行多个集群或多个Amazon服务共享 VPC 中的子网,并希望更好地控制每个群集配置负载均衡器的位置。如果您明确指定子网 ID 作为服务对象上的注释,则 Kubernetes 和Amazon负载平衡器控制器直接使用这些子网创建 Load Balancer。如果选择使用此方法置备负载平衡器,并且可以跳过以下私有子网和公有子网标记要求,则不需要子网标记。Replacecluster-name使用您的集群名称。

    • 密钥kubernetes.io/cluster/cluster-name

    • shared或者owned

  • 您的公有子网和私有子网必须满足以下要求,除非您明确指定子网 ID 作为服务或入口对象上的注释。如果通过明确指定子网 ID 作为服务或入口对象上的注释来置备负载均衡器,则 Kubernetes 和Amazon负载平衡器控制器直接使用这些子网创建 Load Balancer,并且不需要以下标签。

    • 私有子网— 必须标记如下,以便库贝内特人和Amazon负载平衡器控制器知道子网可用于内部 Load Balancer。如果您使用的是eksctl或 Amazon EKSAmazon Amazon CloudFormation模板在 2020 年 3 月 26 日之后创建 VPC,则子网会在创建时被适当添加标签。有关 Amazon EKS 的更多信息Amazon Amazon CloudFormationVPC 模板,请参阅为您的 Amazon EKS 集群创建 VPC

      • 密钥kubernetes.io/role/internal-elb

      • 1

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

      • 密钥kubernetes.io/role/elb

      • 1

    如果未显式添加子网角色标签,Kubernetes 服务控制器将检查您的集群 VPC 子网的路由表,以确定子网是私有还是公有子网。我们建议您不要依赖于此行为,而是显式添加私有或公有角色标签。这些区域有:AmazonLoad Balancer 器控制器不检查路由表,并要求存在专用标记和公有标记才能成功自动发现。

Considerations

  • 您只能使用 NLBIP带的目标亚马逊 EKS VPC CNI 插件。您可以使用 NLB实例目标与亚马逊 EKS VPC CNI 插件或备选的兼容 CNI 插件

  • 控制器配置 NLB,但不提供传统负载均衡器。

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

    service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags
  • 您可以将弹性 IP 地址通过添加以下注释添加到 Network Load Balancer。将替换为example-values使用弹性 IP 地址的分配 ID。分配 ID 的数量必须与用于负载均衡器的子网数匹配。

    service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-xxxxxxxxxxxxxxxxx,eipalloc-yyyyyyyyyyyyyyyyy
  • 对于您创建的每个 NLB,Amazon EKS 会为节点的客户端流量添加一条入站规则,并为 VPC 中的每个负载均衡器子网添加一条规则以进行运行状况检查。类型的服务的部署LoadBalancer如果 Amazon EKS 尝试创建超出安全组允许的最大规则数的配额的规则,则可能会失败。有关更多信息,请参阅 。安全组(在 Amazon VPC 用户指南中)。请考虑以下选项以最大限度地减少超过安全组规则数的可能性。

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

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

    • 使用入口,而不是类型为LoadBalancer将流量发送到您的服务。这些区域有:AmazonApplication Load Balancer (ALB) 需要的规则少于 NLB。ALB 也可以在多个入口之间共享。有关更多信息,请参阅 Amazon EKS 上的 Application Load Balancing

    • 将您的集群部署到多个帐户。

  • 如果您的窗格在 Windows 上运行,则在 Amazon EKS 群集中,具有负载均衡器的单个服务最多可支持 64 个后端容器。每个容器都有自己的唯一 IP 地址。这是对 Amazon EC2 节点上 Windows 操作系统的限制。

  • 我们建议您只使用AmazonLoad Balancer。尝试替换使用 Kubernetes 树内负载平衡器控制器创建的现有 NLB 可能会导致多个 NLB,这可能会导致应用程序停机。

创建网络负载均衡器

您可以使用 IP 或实例目标创建网络负载均衡器。选择带有要负载均衡器的目标类型名称的选项卡。

IP targets

您可以将 IP 目标与部署到 Amazon EC2 节点或 Fargate 的容器结合使用。您的 Kubernetes 服务必须创建为类型LoadBalancer。有关更多信息,请参阅 。类型 LoadBalancer在 Kubernetes 文档中。

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

service.beta.kubernetes.io/aws-load-balancer-type: "external" service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"

默认情况下,NLB 创建为内部。对于内部 NLB,Amazon EKS 集群必须配置为使用 VPC 中的至少一个私有子网。Kubernetes 会检查子网的路由表来确定它们是公有还是私有。公有子网有使用 Internet 网关直接连接到 Internet 的路由,但私有子网没有。

如果要创建面向 Internet 的 NLB,请添加以下注释:

service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
注意

这些区域有:service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"注释仍然支持向后兼容,但我们建议使用之前的注释来代替新的负载均衡器service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"

重要

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

Instance targets

在过去,Kubernetes 树内控制器创建了带有实例目标的 NLB。的 2.2.0 版本或更高版本或更高版本AmazonLoad Balancer 控制器使用实例目标创建 NLB。我们建议使用它,而不是 Kubernetes 树内控制器来创建新的 NLB。您可以将 NLB 实例目标与部署到 Amazon EC2 节点的容器一起使用,但不能使用到 Fargate。要在部署到 Fargate 的容器之间对网络流量进行负载平衡,必须使用 IP 目标。

要将负载均衡器部署到私有子网,您的服务规范必须具有以下注释。您可以查看示例服务清单使用注释。

service.beta.kubernetes.io/aws-load-balancer-type: "external" service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"

默认情况下,NLB 创建为内部。对于内部 NLB,Amazon EKS 集群必须配置为使用 VPC 中的至少一个私有子网。Kubernetes 会检查子网的路由表来确定它们是公有还是私有。公有子网有使用 Internet 网关直接连接到 Internet 的路由,但私有子网没有。

如果要创建面向 Internet 的 NLB,请添加以下注释:

service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
重要

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

部署示例应用程序。

部署示例应用程序

  1. 部署示例应用程序。

    1. 将以下内容保存到名为的文件中sample-deployment.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/nginx/nginx:1.19.6 ports: - name: http containerPort: 80
    2. 将清单应用于集群。

      kubectl apply -f sample-deployment.yaml
  2. 创建具有内部 NLB 的服务,以便与 IP 目标进行负载均衡。

    1. 将以下内容保存到名为的文件中sample-service.yaml文件中的。

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

      kubectl apply -f sample-service.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.cn-north-1.amazonaws.com.cn 80:32400/TCP 16h
  4. 打开Amazon EC2Amazon Web Services Management Console。Select目标组(在下)负载均衡) 中的。在名称列中,选择目标组的名称,其中负载均衡器列中的名称与EXTERNAL-IP列中的输出。例如,您需要选择名为 r 的目标组k8s-default-samplese-xxxxxxxxxx如果您的输出与上面的输出相同。这些区域有:Target typeIP因为这是在示例服务部署清单中指定的。

  5. 选择目标组,然后选择目标选项卡。在已注册目标,您应该看到上一步中部署的三个副本的三个 IP 地址。等待,直到所有目标的状态为正常然后再继续。在所有目标之前,可能需要几分钟时间。healthy。这些目标可能具有unhealthy状态之前更改为healthy

  6. 将流量发送到服务替换xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx使用上一步中返回的值EXTERNAL-IPcn-north-1使用群集所在的区域。

    curl k8s-default-samplese-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.cn-north-1.amazonaws.com.cn

    输出

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

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