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

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

上的应用程序负载均衡Amazon EKS

在创建 Kubernetes Ingress 时,会预配置 AWS 应用程序负载均衡器 来使应用程序流量达到负载均衡。要了解更多信息,请参阅 Application Load Balancer 用户指南 中的什么是 Application Load Balancer?和 Kubernetes 文档中的入口。ALBs 可以与部署到节点或 AWS Fargate 的 Pod 一起使用。您可以将 ALB 部署到公有或私有子网。

应用程序流量在 OSI 模型的 L7 处均衡。要在 L4 处对网络流量进行负载均衡,您需要部署类型为 Service 的 Kubernetes LoadBalancer,这会预置 AWS 网络负载均衡器。有关更多信息,请参阅上的网络负载均衡Amazon EKS。要了解有关两种类型的负载均衡之间的差异的更多信息,请参阅 网站上的 Elastic Load Balancing 功能AWS。

Prerequisites

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

  • 拥有现有集群。如果您没有现有集群,请参阅开始使用 Amazon EKS。如果您需要更新现有集群的版本,请参阅更新集群

  • 集群上预配置的 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

  • 每次在具有 注释的集群上创建 Kubernetes 入口资源时,AWS Load Balancer 控制器ALBs将创建 AWS 以及必要的支持 kubernetes.io/ingress.class: alb 资源。入口资源会配置 ALB 以便将 HTTP 或 HTTPS 流量路由到集群中的其他 Pod。要确保您的入口对象使用 AWS 负载均衡器控制器,请将以下注释添加到 Kubernetes 入口规范中。有关更多信息,请参阅 上的入口规范GitHub。

    annotations: kubernetes.io/ingress.class: alb
  • AWS 负载均衡器控制器支持以下流量模式:

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

      注意

      您的 Kubernetes 服务必须指定 NodePort 类型,才能使用此流量模式。

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

  • 要标记控制器创建的 ALBs,请将以下注释添加到控制器:alb.ingress.kubernetes.io/tags。 有关 AWS 负载均衡器控制器支持的所有可用注释列表,请参阅 上的入口注释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 Pod 的集群上运行示例应用程序。

  1. 如果您要部署到 Fargate,请创建一个 Fargate 配置文件。如果您不部署到 Fargate,请跳过此步骤。后面的命令仅适用于使用 eksctl 创建的集群。 如果您未使用 eksctl 创建集群,则可以使用 AWS 管理控制台 创建配置文件,并对以下命令中的 namenamespace 使用相同的值。

    eksctl create fargateprofile --cluster <my-cluster> --region <region-code> --name <alb-sample-app> --namespace game-2048
  2. 将游戏 2048 作为示例应用程序部署,以验证 AWS Load Balancer Controller 创建 AWS ALB 作为入口对象的结果。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.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
    注意

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

    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.1.0/docs/examples/2048/2048_full.yaml