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

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

AWS 负载均衡器控制器

负载均衡器控制器管理 Kubernetes 集群的 AWS Elastic Load Balancer。AWS控制器预置:

  • 创建 Kubernetes AWS 时的 应用程序负载均衡器 (ALB)。Ingress

  • 在 1.18 或更高版本的 AWS 集群上使用 IP 目标创建类型为 网络负载均衡器 的 Kubernetes Service 时的 LoadBalancer (NLB)。Amazon EKS如果您要对实例目标的网络流量进行负载均衡,则可以使用树内 Kubernetes 负载均衡器控制器,并且不需要安装此控制器。有关 NLB 目标类型的更多信息,请参阅 中的目标类型Network Load Balancer 用户指南。

控制器以前名为 AWS ALB 入口控制器。它是 上托管的开源项目GitHub。 本主题可帮助您使用默认选项安装控制器。您可以在 上查看控制器的完整文档GitHub。 在部署控制器之前,我们建议您查看上的应用程序负载均衡Amazon EKS上的网络负载均衡Amazon EKS中的先决条件和注意事项。这些主题还包含部署需要控制器预置 AWS 资源的示例应用程序的步骤。

Prerequisite

使用现有 集群。如果您没有现有集群,请参阅Amazon EKS 入门

将 AWS 负载均衡器控制器部署到 Amazon EKS 集群

在以下步骤中,将 <example values>(包括 <>)替换为您自己的值。

  1. 确定集群是否有现有的 IAM OIDC 提供商。

    查看集群的 OIDC 提供商 URL。

    aws eks describe-cluster --name <cluster_name> --query "cluster.identity.oidc.issuer" --output text

    输出示例:

    https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

    列出您账户中的 IAM OIDC 提供商。用上一个命令返回的值替换 <EXAMPLED539D4633E53DE1B716D3041E>(包括 <>)。

    aws iam list-open-id-connect-providers | grep <EXAMPLED539D4633E53DE1B716D3041E>

    输出示例

    "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"

    如果从上一个命令返回了输出,那么您的集群已经有了提供商。如果没有返回输出,则必须创建 IAM OIDC 提供商。

    要创建 IAM OIDC 提供商,请参阅为集群创建 IAM OIDC 提供商

  2. 下载 IAM 负载均衡器控制器的 AWS 策略,该策略允许负载均衡器代表您调用 AWS APIs。您可以在 上查看策略文档GitHub。 使用与您的集群所在的 区域对应的命令。

    • 中国区域以外的所有区域。

      curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.0/docs/install/iam_policy.json
    • 北京和宁夏 中国区域。

      curl -o iam_policy_cn.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.0/docs/install/iam_policy_cn.json
  3. 使用上一步中下载的策略创建 IAM 策略。如果您改为下载该文件,请在以下命令中将 iam_policy.json 更改为 iam_policy_cn.json

    aws iam create-policy \ --policy-name <AWSLoadBalancerControllerIAMPolicy> \ --policy-document file://iam_policy.json

    记下返回的策略 ARN。

  4. 使用以下选项之一创建 IAM 角色,并在 aws-load-balancer-controller 负载均衡器控制器的 kube-system 命名空间中注释名为 AWS 的 Kubernetes 服务账户。

    • 使用 eksctl

      使用以下 命令:

      eksctl create iamserviceaccount \ --cluster=<my-cluster> \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/<AWSLoadBalancerControllerIAMPolicy> \ --override-existing-serviceaccounts \ --approve
    • 使用 AWS 管理控制台 和 kubectl

      1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

      2. 在导航窗格中,依次选择 Roles (角色)Create Role (创建角色)

      3. Select type of trusted entity (选择受信任实体的类型) 部分中,选择 Web identity (Web 身份)

      4. Choose a web identity provider (选择 Web 身份提供商) 部分中:

        1. 对于 Identity provider (身份提供商),选择您集群的 URL。

        2. 对于 Audience (受众),请选择 sts.amazonaws.com

      5. 选择 Next: Permissions (下一步:权限)

      6. Attach Policy (附加策略) 部分中,选择 您在步骤 3 中创建的用于您的服务账户的 AWSLoadBalancerControllerIAMPolicy 策略。

      7. 选择下一步: 标签

      8. Add tags (optional) (添加标签(可选)) 屏幕上,您可以为账户添加标签。选择下一步:审核

      9. 对于 Role Name (角色名称),为您的角色输入名称,例如 AmazonEKSLoadBalancerConrollerRole、 然后选择 Create Role (创建角色)

      10. 创建角色后,在控制台中选择角色以将其打开进行编辑。

      11. 选择 Trust relationships 选项卡,然后选择 Edit trust relationship

      12. 更改看上去类似于以下内容的行:

        "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

        要看上去如下所示,请将 <example values>(包括 <>)更改为您自己的内容:

        "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B716D3041E>:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
      13. 选择 Update Trust Policy (更新可信策略) 以完成操作。

      14. 记下角色的 ARN 以便在后面的步骤中使用。

      15. 将以下内容保存到名为 aws-load-balancer-controller-service-account.yaml 的文件中

        apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/AmazonEKSLoadBalancerConrollerRole
      16. 在集群上创建服务账户。

        kubectl apply -f aws-load-balancer-controller-service-account.yaml
  5. 如果您当前已安装适用于 Kubernetes 的 AWS ALB 入口控制器,请卸载它。负载均衡器控制器取代了适用于 Kubernetes 的 AWS ALB 入口控制器的功能。AWS

    1. 检查以查看当前是否已安装控制器。

      kubectl get deployment -n kube-system alb-ingress-controller

      输出(如果已安装)。跳至步骤 5b。

      NAME READY UP-TO-DATE AVAILABLE AGE alb-ingress-controller 1/1 1 1 122d

      输出(如果未安装)。如果未安装,请跳至步骤 6。

      Error from server (NotFound): deployments.apps "alb-ingress-controller" not found
    2. 如果已安装控制器,请输入以下命令将其删除。

      kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
    3. 如果您删除了适用于 Kubernetes 的 AWS ALB 入口控制器,请将以下 IAM 策略添加到在步骤 4 中创建的 IAM 角色。该策略允许 AWS 负载均衡器控制器访问由适用于 Kubernetes 的 ALB 入口控制器创建的资源。

      1. 下载 IAM 策略。您还可以查看策略

        curl -o iam_policy_v1_to_v2_additional.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.0/docs/install/iam_policy_v1_to_v2_additional.json
      2. 创建 IAM 策略并记下返回的 ARN。

        aws iam create-policy \ --policy-name <AWSLoadBalancerControllerAdditionalIAMPolicy> \ --policy-document file://iam_policy_v1_to_v2_additional.json
      3. 将 IAM 策略附加到您在步骤 4 中创建的 IAM 角色。将 <your-role-name>(包括 <>)替换为角色的名称。如果您使用 eksctl 创建角色,要查找已创建的角色名称,请打开 AWS CloudFormation 控制台并选择 eksctl-<your-cluster-name>-addon-iamserviceaccount-kube-system-aws-load-balancer-controller 堆栈。选择 Resources 选项卡。角色名称位于 Physical ID (物理 ID) 列中。如果您使用 AWS 管理控制台 创建角色,则角色名称是您为其指定的任意名称,例如 AmazonEKSLoadBalancerConrollerRole

        aws iam attach-role-policy \ --role-name eksctl-<your-role name>\ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
  6. 使用以下方法之一安装 AWS 负载均衡器控制器:

    • 有 Helm

      1. 安装 TargetGroupBinding 自定义资源定义。

        kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
      2. 添加 eks-charts 存储库。

        helm repo add eks https://aws.github.io/eks-charts
      3. 使用与集群所在的区域对应的命令安装 AWS 负载均衡器控制器。

        重要

        如果要将控制器部署到您Amazon EC2受限访问 实例元数据服务 (IMDS)Amazon EC2 的 节点,或者要部署到 Fargate,您需要将以下标记添加到您运行的命令:

        • --set region=<region-code>

        • --set vpcId=<vpc-xxxxxxxx>

        • 中国区域以外的所有区域。

          helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller \ --set clusterName=<cluster-name> \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller \ -n kube-system
        • 北京和宁夏 中国区域。

          helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller \ --set clusterName=<cluster-name> \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller \ --set image.repository=918309763551.dkr.ecr.cn-north-1.amazonaws.com.cn/amazon/aws-load-balancer-controller \ -n kube-system
        重要

        部署的图表不会自动接收安全更新。您需要在图表可用时手动升级到较新的图表。

    • 使用 Kubernetes 清单

      1. 安装 cert-manager 以将证书配置注入到 Webhook 中。

        • 在 Kubernetes 1.16 或更高版本上安装。

          kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.2/cert-manager.yaml
        • 在 Kubernetes 1.15 上安装。

          kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.2/cert-manager-legacy.yaml
      2. 安装控制器。

        1. 下载控制器规范。有关控制器的更多信息,请参阅 上的文档GitHub。

          curl -o v2_1_0_full.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.0/docs/install/v2_1_0_full.yaml
        2. 编辑保存的 yaml 文件。建议您从 yaml 规范中删除 ServiceAccount 部分。如果删除控制器,则这样做将保留您在步骤 4 中创建的服务账户。在 Deployment spec 部分中,将 --cluster-name 值设置为您的 Amazon EKS 集群名称。

        3. 应用文件。

          kubectl apply -f v2_1_0_full.yaml
  7. 验证是否已安装控制器。

    kubectl get deployment -n kube-system aws-load-balancer-controller

    输出

    NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 1/1 1 1 84s
  8. 在使用控制器预配置 AWS 资源之前,您的集群必须满足特定要求。有关更多信息,请参阅 上的应用程序负载均衡Amazon EKS上的网络负载均衡Amazon EKS