Amazon EKS 上的 Application Load Balancing - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Amazon EKS 上的 Application Load Balancing

当您创建一个库贝内特Ingress,一个Amazon预配 Application Load Balancer,以平衡应用程序流量。要了解更多信息,请参阅什么是 Application Load Balancer?中的Application Load Balancer 用户指南Ingress在 Kubernetes 文档中。ALB 可以与部署到节点或AmazonFargate 您可以将 ALB 部署到公有子网或私有子网。

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

Prerequisites

在您可以对应用程序流量进行负载均衡之前,您必须符合以下要求。

  • 具有现有集群。如果您没有现有集群,请参阅Amazon EKS 入门。如果您需要更新现有集群的版本,请参阅更新集群

  • 这些区域有:Amazon在您的集群上预配置的 Load Balancer 器控制器。有关更多信息,请参阅 AmazonLoad Balancer

  • 在不同的可用区中,至少有两个子网。这些区域有:Amazon负载均衡器控制器从每个可用区中选择一个子网。如果在一个可用区中找到多个带标记的子网,控制器将按照子网 ID 的字典顺序选择第一个子网。

  • 如果您使用AmazonLoad Balancer 控制器版本v2.1.1或更早版本,则必须按如下方式标记子网。使用 2.1.2 版或更高版本时,此标签是可选的。如果您在同一 VPC 中运行多个集群,或者多个Amazon服务共享 VPC 中的子网,并希望更好地控制每个群集配置负载均衡器的位置。Replacecluster-name使用集群名称。

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

    • shared或者owned

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

    • 私有子网— 必须标记如下,以便库贝内特人和Amazon负载平衡器控制器知道子网可用于内部负载均衡器。如果您使用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 子网的路由表,以确定子网是私有还是公有子网。我们建议您不要依赖此行为,而是显式添加私有或公有角色标签。这些区域有:Amazon负载平衡器控制器不检查路由表,并且要求存在专用标记和公有标记才能成功自动发现。

Considerations

  • 这些区域有:AmazonLoad Balancer 控制器创建 ALB 和必要的支持Amazon资源,只要在群集上创建一个 Kubernetes 入口资源kubernetes.io/ingress.class: alb注释。入口资源会配置 ALB 以便将 HTTP 或 HTTPS 流量路由到集群中的其他 Pod。要确保您的入口对象使用AmazonLoad Balancer 控制器中,将以下注释添加到您的 Kubernetes 入口规范。有关更多信息,请参阅 。入口规范(位于 GitHub 上)。

    annotations: kubernetes.io/ingress.class: alb
  • 这些区域有:AmazonLoad Balancer 控制器支持以下流量模式:

    • 实例— 将集群中的节点注册为 ALB 的目标。传输到 ALB 的流量将路由到您的服务的 NodePort,然后转发到您的 Pod。这是默认流量模式。您也可以使用 alb.ingress.kubernetes.io/target-type: instance 注释明确地指定该模式。

      注意

      您的 Kubernetes 服务必须指定NodePort或 “LoadBalancer” 类型使用此流量模式。

    • IP— 将 Pods 注册为 ALB 的目标。传输到 ALB 的流量将直接路由到您的服务的 Pod。您必须指定 alb.ingress.kubernetes.io/target-type: ip 注释,才能使用此流量模式。当目标窗格在 Fargate 上运行时,必须使用 IP 目标类型。

  • 要标记由控制器创建的 ALB,请向控制器添加以下注释:alb.ingress.kubernetes.io/tags。 有关支持的所有可用注释的列表,请参阅AmazonLoad Balancer 器控制器,请参阅入口注释(位于 GitHub 上)。

要在多个入口资源之间共享应用程序负载均衡器,请使用IngressGroups

要将入口加入到入口组,请将以下注释添加到 Kubernetes 入口资源规范中。

alb.ingress.kubernetes.io/group.name: my-group

组名必须为:

  • 长度不超过 63 个字符。

  • 由小写字母数字字符组成,-, 和.,并且必须以字母数字字符的字母数字字符开头和结尾。

控制器将自动合并同一入口组中所有入口规则,并使用单个 ALB 支持它们。在入口中定义的大多数注释仅适用于该入口定义的路径。默认情况下,入口资源不属于任何入口组。

警告

潜在的安全风险:只有在拥有 RBAC 权限创建或修改入口资源的所有 Kubernetes 用户位于同一信任边界内时,才应为入口指定入口组。如果添加具有组名称的注释,其他 Kubernetes 用户可以创建或修改其入口,使其属于同一入口组。这样做可能会导致不良行为,例如使用更高优先级规则覆盖现有规则。

您可以添加入口资源的订单编号。

alb.ingress.kubernetes.io/group.order: '10'

该数字可以介于 1-1000 之间。首先计算同一入口组中所有入口的最小数字。使用值为零的值评估所有不具有此注释的入口。具有较大数字的重复规则可以用较小的数字覆盖规则。默认情况下,同一入口组中的入口之间的规则顺序由入口名称空间和名称的词法顺序决定。

重要

确保同一入口组中的每个入口都具有唯一的优先级编号。您不能在入口中有重复的订单编号。

部署示例应用程序

您可以在只具有 Amazon EC2 节点的集群上、Fargate Pods 的集群上或同时具有这两者的集群上运行示例应用程序。

  1. 如果您要部署到 Fargate,请创建一个 Fargate 配置文件。如果您没有部署到 Fargate,请跳过此步骤。您可以通过运行以下命令创建配置文件,也可以使用Amazon Web Services Management Console使用相同的值namenamespace命令中的命令中的

    eksctl create fargateprofile \ --cluster my-cluster \ --region region-code \ --name alb-sample-app \ --namespace game-2048
  2. 部署游戏2048作为示例应用程序来验证AmazonLoad Balancer 器控制器创建一个AmazonALB 作为入口对象的结果。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/examples/2048/2048_full.yaml
  3. 几分钟后,验证是否已使用以下命令创建入口资源。

    kubectl get ingress/ingress-2048 -n game-2048

    输出:

    NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 <none> * k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-west-2.elb.amazonaws.com 80 2m32s
    注意

    如果在几分钟后尚未创建入口,请运行以下命令以查看 Load Balancer 控制器日志。这些日志包含可帮助您诊断部署中任何问题的错误消息。

    kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller
  4. 打开浏览器并从上一命令输出导航到 ADDRESS URL 以查看示例应用程序。如果您没有看到任何内容,请等待几分钟,刷新浏览器。

    
                    2048 示例应用程序
  5. 在完成对示例应用程序的试验后,请使用以下命令将其删除。

    kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/examples/2048/2048_full.yaml