安装 Amazon Load Balancer Controller 附加组件 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

安装 Amazon Load Balancer Controller 附加组件

Amazon负载均衡器控制器管理适用于 Kubernetes 集群的 Amazon Elastic Load Balancer。此控制器预置以下资源。

  • 当您创建 Kubernetes Ingress 时预置 Amazon Application Load Balancer (ALB)。

  • 当您创建 LoadBalancer 类型的 Kubernetes 服务时的 Amazon Network Load Balancer (NLB)。在过去,实例目标使用 Kubernetes 网络负载均衡器,而 IP 目标使用 Amazon Load Balancer Controller。使用 Amazon Load Balancer Controller 2.3.0 版或更高版本,您可以使用任一目标类型创建 NLB。有关 NLB 目标类型的更多信息,请参阅 Network Load Balancer 用户指南中的目标类型

Amazon Load Balancer Controller 以前称为 Amazon ALB Ingress Controller。它是托管在 GitHub 上的一个开源项目。本主题描述如何使用原定设置选项安装该控制器。您可以在 GitHub 上查看关于该控制器的完整文档。在部署控制器之前,我们建议您查看 Amazon EKS 上的应用程序负载均衡Amazon EKS 上的网络负载均衡 的先决条件和注意事项。这些主题还包括如何部署需要使用 Amazon Load Balancer Controller 来预置 Amazon ALB 和 NLB 的示例应用程序。

先决条件

  • 现有 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS。要使用控制器的 2.4.0 版本(本主题中使用的版本),您的集群必须为 1.19 版或更高版本。如果您的集群早于 1.19 版本,则我们建议使用 2.3.1 版本。

  • 集群的现有 Amazon Identity and Access Management (IAM) OpenID Connect (OIDC) 提供程序。要确定您是否已经拥有一个或是否要创建一个,请参阅 为集群创建 IAM OIDC 提供商

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

在以下步骤中,将 example values 替换为您自己的值:。如果您的集群早于 1.19 版本,请将 2.4.0 的所有实例更改为 2.3.1,并将 v2_4_0_full.yaml 的所有实例更改为 v2_3_1_full.yaml

  1. 创建一个 IAM 策略。

    1. 下载Amazon负载均衡器控制器的 IAM 策略,该策略允许负载均衡器代表您调用 Amazon API。您可以查看 GitHub 上的策略文档

      curl -o iam_policy_cn.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.0/docs/install/iam_policy_cn.json
    2. 使用上一步中下载的策略创建一个 IAM 策略。

      aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy_cn.json
      注意

      如果您在 Amazon Web Services Management Console 中查看策略,则可能会看到 ELB 的警告。您可以安全地忽略这些操作,因为有些操作仅适用于 ELB v2。您不会看到 ELB v2 的警告。

  2. 使用 eksctl 或 Amazon CLI 和 kubectl 创建 IAM 角色并注释Amazon负载均衡器控制器的 kube-system 命名空间中名为 aws-load-balancer-controller 的 Kubernetes 服务账户。

    eksctl

    my-cluster 替换为您的集群的名称,并将 111122223333 替换为您的账户 ID,然后运行命令。集群名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母字符开头,且不得超过 128 个字符。

    eksctl create iamserviceaccount \ --cluster=my-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve
    Amazon CLI and kubectl

    使用 Amazon CLI 和 kubectl

    1. 查看集群的 OIDC 提供商 URL。

      aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text

      输出示例:

      https://oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B716D3041E

      如果没有返回输出,则您必须为集群创建 IAM OIDC 提供程序

    2. 将以下内容复制到名为 load-balancer-role-trust-policy.json 的文件中。将 111122223333 替换为您的账户 ID,将 region-code 替换为集群所在的 Amazon Web Services 区域,并将 EXAMPLED539D4633E53DE1B716D3041E 替换为上一步返回的输出。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com.cn/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller" } } } ] }
    3. 创建角色。

      aws iam create-role \ --role-name AmazonEKSLoadBalancerControllerRole \ --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
    4. 将所需的 Amazon EKS 托管 IAM 策略附加到角色。将 111122223333 替换为您的账户 ID。

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --role-name AmazonEKSLoadBalancerControllerRole
    5. 将以下内容保存到名为 aws-load-balancer-controller-service-account.yaml 的文件中,将 111122223333 替换为您的账户 ID。

      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::111122223333:role/AmazonEKSLoadBalancerControllerRole
    6. 在集群上创建账户。

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

    1. 检查当前是否安装了该控制器。

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

      这是未安装控制器情况下的输出。跳至安装控制器步骤。

      Error from server (NotFound): deployments.apps "alb-ingress-controller" not found

      这是安装了控制器情况下的输出。

      NAME READY UP-TO-DATE AVAILABLE AGE alb-ingress-controller 1/1 1 1 122d
    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. 将以下 IAM 策略添加到在前一步骤中创建的 IAM 角色。该策略允许Amazon负载均衡器控制器访问由适用于 Kubernetes 的 ALB 入口控制器创建的资源。

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

        curl -o iam_policy_v1_to_v2_additional.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.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 策略附加到您在前一步骤中创建的 IAM 角色。将 your-role-name 替换为角色的名称。如果您使用 eksctl 创建该角色,请找到已创建的角色名称,打开 Amazon CloudFormation 控制台并选择 eksctl-your-cluster-name-addon-iamserviceaccount-kube-system-aws-load-balancer-controller 堆栈。选择 Resources 选项卡。角色名称位于 Physical ID(物理 ID)列。如果您使用 Amazon Web Services Management Console 来创建角色,那么角色名称就是您命名的名称,例如 AmazonEKSLoadBalancerControllerRole

        aws iam attach-role-policy \ --role-name your-role name \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
  4. 使用 Helm V3 或更高版本或通过应用 Kubernetes 清单来安装 Amazon Load Balancer Controller。如果要在 Fargate 上部署控制器,请使用 Helm 程序,因为它不依赖于 cert-manager

    Helm V3 or later
    1. 添加 eks-charts 存储库。

      helm repo add eks https://aws.github.io/eks-charts
    2. 更新您的本地存储库,以确保您拥有最新的图表。

      helm repo update
    3. 如果您的节点无权访问 Amazon EKS Amazon ECR 镜像存储库,则需要对 Amazon Web Services 区域中的注册表进行身份验证并提取以下镜像。将 accountregion-code 替换为 Amazon 容器镜像注册表 中列出的 Amazon Web Services 区域的值。

      account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller:2.4.0

      提取镜像后,将其推送到节点有权访问的存储库。有关如何提取、标记和推送镜像到您自己的存储库的更多信息,请参阅 将容器镜像从一个存储库复制到另一个存储库

    4. 安装Amazon负载均衡器控制器。如果要将控制器部署到被限制访问 Amazon EC2 实例元数据服务 (IMDS) 的 Amazon EC2 节点,或者部署到 Fargate 节点,则需要在以下 helm 命令中添加以下标志:

      • --set region=region-code

      • --set vpcId=vpc-xxxxxxxx

      如果要部署到除 us-west-2 以外的任何 Amazon Web Services 区域,然后将以下标志添加到 helm 命令中,请将 accountregion-code 替换为在 Amazon 容器镜像注册表 中列出的您所在 Amazon Web Services 区域的值。如果您已提取镜像并将其推送到自己的存储库中,请将完整的注册表和存储库替换为您自己的注册表和存储库。

      --set image.repository=account.dkr.ecr.region-code.amazonaws.com.cn/amazon/aws-load-balancer-controller

      使用自己的名称替换 cluster-name

      helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=cluster-name \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller \ --set enableShield=false \ --set enableWaf=false \ --set enableWafv2=false
      重要

      已部署的图表不会自动接收安全更新。当新图表可用时,您需要手动升级到新图表。升级时,请将 install 更改为上一个命令中的 upgrade,但在运行上一个命令前,运行以下命令以安装 TargetGroupBinding 自定义资源定义。

      kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
    Kubernetes manifest
    1. 使用以下方法之一安装 cert-manager 以将证书配置注入 Webhook。

      • 如果您的节点有权访问 quay.io 容器注册表,请安装 cert-manager 以将证书配置注入 Webhook。

        kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
      • 如果您的节点无权访问 quay.io,请完成以下任务:

        1. 下载清单。

          curl -Lo cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
        2. 提取以下镜像并将其推送到节点有权访问的存储库。有关如何提取、标记和推送镜像到您自己的存储库的更多信息,请参阅 将容器镜像从一个存储库复制到另一个存储库

          quay.io/jetstack/cert-manager-cainjector:v1.5.4 quay.io/jetstack/cert-manager-cainjector:v1.5.4 quay.io/jetstack/cert-manager-webhook:v1.5.4
        3. 将三个镜像的清单中的 quay.io 替换为您自己的注册表名称。以下命令假定您的私有存储库名称与源存储库的名称相同。将 111122223333.dkr.ecr.region-code.amazonaws.com.cn 替换为您的私有注册表。

          sed -i.bak -e 's|quay.io|111122223333.dkr.ecr.region-code.amazonaws.com.cn|' ./cert-manager.yaml
        4. 应用清单

          kubectl apply \ --validate=false \ -f ./cert-manager.yaml
    2. 安装控制器。

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

        curl -Lo v2_4_0_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.0/v2_4_0_full.yaml
      2. 对文件进行以下编辑。

        • 在编辑器中打开文件,然后移除以下行。删除此部分可防止在部署控制器时覆盖在上一步中添加的 IAM 角色注释。如果删除控制器,系统会保留您在上一步中创建的服务账户。

          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 ---
        • 将文件 Deployment spec 部分中的 your-cluster-name 替换为您的集群名称,并在 --ingress-class=alb 下添加 following parameters

          ... spec: containers: - args: - --cluster-name=your-cluster-name - --ingress-class=alb --enable-shield=false --enable-waf=false --enable-wafv2=false ...
        • 如果要将控制器部署到被限制访问 Amazon EC2 实例元数据服务 (IMDS) 的 Amazon EC2 节点,或者部署到 Fargate,则需要在 following parameters 下添加 - args:

          ... spec: containers: - args: - --cluster-name=your-cluster-name - --ingress-class=alb --enable-shield=false --enable-waf=false --enable-wafv2=false - --aws-vpc-id=vpc-xxxxxxxx - --aws-region=region-code ...
      3. 应用文件。

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

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

    输出

    NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s

    如果使用 Helm 进行部署,则会收到之前的输出结果。如果您使用 Kubernetes 清单进行部署,则只有一个副本。

  6. 在使用控制器预置Amazon资源前,您的集群必须满足特定要求。有关更多信息,请参阅 Amazon EKS 上的应用程序负载均衡Amazon EKS 上的网络负载均衡