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

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

当您创建 Kubernetes Ingress 时,会预置一个 AWS Application Load Balancer,以实现应用程序流量负载均衡。要了解详情,请参阅 Application Load Balancer 用户指南中的“什么是 Application Load Balancer?”,以及 Kubernetes 文档中的入口。ALB 可以与部署到节点或 AWS Fargate 的 Pod 一起使用。您可以将 ALB 部署到公有子网或私有子网。

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

Prerequisites

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

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

  • 您的集群上已预置AWS负载均衡器控制器。有关更多信息,请参阅 AWS负载均衡器控制器

  • 至少两个子网位于不同的可用区。AWS负载均衡器控制器从每个可用区中选择一个子网。如果在一个可用区中发现多个标记子网,则该控制器会按子网 ID 的字母表顺序选择第一个子网。

  • 如果您使用的是AWS负载均衡器控制器版本 v2.1.1 或更早版本,则必须按如下方式标记子网。如果使用版本 2.1.2 或更高版本,则此标记是可选的。如果您在同一 VPC 中运行多个集群,或者 VPC 中有多个AWS服务共享子网,并且希望对每个集群中预置负载均衡器的位置时效性更多控制,则可能需要标记子网。将 cluster-name 替换为您的集群名称。

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

    • sharedowned

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

    • 私有子网 – 必须按如下方式标记,以便 Kubernetes 和AWS负载均衡器控制器知道子网可用于内部负载均衡器。如果您在 2020 年 3 月 26 日之后使用 eksctl 或 Amazon EKS AWS AWS CloudFormation 模板创建 VPC,则在创建子网时会对子网进行适当标记。有关 Amazon EKS AWS AWS CloudFormation VPC 模板的更多信息,请参阅 为 Amazon EKS 集群创建 VPC

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

      • 1

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

      • 密钥kubernetes.io/role/elb

      • 1

    如果未显式添加子网角色标记,则 Kubernetes 服务控制器将检查您的集群 VPC 子网的路由表,以确定子网是私有子网还是公有子网。我们建议您不要依赖此行为,而是显式添加私有或公有角色标记。AWS负载均衡器控制器不会检查路由表,并且需要存在私有和公有标记才能成功地自动发现。

Considerations

  • 每当使用 kubernetes.io/ingress.class: alb 注释在集群上创建 Kubernetes 入口资源时,AWS负载均衡器控制器就会创建 ALB 和必要的支持AWS资源。入口资源会配置 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 或“LoadBalancer”类型,才能使用此流量模式。

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

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

使用 IngressGroups 跨多个入口资源共享 Application Load Balancer

要将入口加入到入口组,请将以下注释添加到 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,请跳过此步骤。您可以通过运行以下命令来创建配置文件,也可以使用该命令中 namenamespace 的相同值,利用 AWS Management Console 创建配置文件。

    eksctl create fargateprofile \ --cluster my-cluster \ --region region-code \ --name alb-sample-app \ --namespace game-2048
  2. 将游戏 2048 部署为示例应用程序,以确认作为入口对象的结果,AWS负载均衡器控制器是否会创建 AWS ALB。

    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
    注意

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

    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