使用清单安装 Amazon 负载均衡器控制器 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

使用清单安装 Amazon 负载均衡器控制器

提示

使用 Amazon EKS 自动模式时,您无需安装或升级联网附加组件。自动模式包含容器组联网和负载均衡功能。

有关更多信息,请参阅 使用 EKS 自动模式实现集群基础设施自动化

本主题介绍如何通过下载和应用 Kubernetes 清单来安装控制器。您可以在 GitHub 上查看关于该控制器的完整文档

在以下步骤中,将 example values 替换为您自己的值。

先决条件

在开始本教程之前,请完成以下步骤:

注意事项

在继续执行本页面的配置步骤之前,请注意以下事项:

  • IAM 策略和角色 (AmazonEKSLoadBalancerControllerRole) 可以在同一 Amazon 账户中的多个 EKS 集群中重复使用。

  • 如果要在最初创建角色 (AmazonEKSLoadBalancerControllerRole) 的同一集群上安装控制器,请先确认角色存在,然后转到步骤 2:安装 cert-manager

  • 如果使用的是服务账户的 IAM 角色(IRSA),则必须为每个集群设置 IRSA,并且角色信任策略中的 OpenID Connect(OIDC)提供者 ARN 应特定于每个 EKS 集群。此外,如果要在具有现有 AmazonEKSLoadBalancerControllerRole 的新集群上安装控制器,请更新该角色的信任策略以包含新集群的 OIDC 提供者,并通过适当的角色注释创建一个新的服务账户。要确定是否已经拥有 OIDC 提供者或者要创建一个 OIDC 提供者,请参阅为集群创建 IAM OIDC 提供商

步骤 1:配置 IAM

以下步骤参考 Amazon 负载均衡器控制器 v2.11.0 发行版。有关所有发行版的更多信息,请参阅 GitHub 上的 Amazon Load Balancer Controller Release 页面。

  1. 下载Amazon负载均衡器控制器的 IAM 策略,该策略允许负载均衡器代表您调用 Amazon API。

    Amazon
    curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json
    Amazon GovCloud (US)
    curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy_us-gov.json
    mv iam_policy_us-gov.json iam_policy.json
  2. 使用上一步中下载的策略创建一个 IAM 策略。

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

    如果您在Amazon Web Services Management Console中查看策略,则控制台会显示有关 ELB 服务的警告,但不会显示有关 ELB v2 服务的警告。之所以发生这种情况,是因为策略中的某些操作适用于 ELB v2,但不适用于 ELB。您可以忽略有关 ELB 的警告。

eksctl
  1. 请将 my-cluster 替换为您的集群的名称,将 111122223333 替换为您的账户 ID,然后运行命令。

    eksctl create iamserviceaccount \ --cluster=my-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name AmazonEKSLoadBalancerControllerRole \ --attach-policy-arn=arn:aws-cn:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --approve
Amazon CLI and kubectl
  1. 检索集群的 OIDC 提供者 ID 并将其存储在变量中。

    oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
  2. 确定账户中是否已存在具有集群 ID 的 IAM OIDC 提供者。您需要为集群和 IAM 配置 OIDC。

    aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

    如果返回输出,则表示集群已有 IAM OIDC 提供者。如果没有返回输出,则您必须为集群创建 IAM OIDC 提供者。有关更多信息,请参阅 为集群创建 IAM OIDC 提供商

  3. 将以下内容复制到您的设备。请将 111122223333 替换为您的账户 ID。将 region-code 替换为您的集群所在的 Amazon 区域。将 EXAMPLED539D4633E53DE1B71EXAMPLE 替换为上一步中返回的输出。

    cat >load-balancer-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws-cn:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller" } } } ] } EOF
  4. 创建 IAM 角色。

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

    aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --role-name AmazonEKSLoadBalancerControllerRole
  6. 将以下内容复制到您的设备。请将 111122223333 替换为您的账户 ID。替换文本后,运行修改后的命令可创建 aws-load-balancer-controller-service-account.yaml 文件。

    cat >aws-load-balancer-controller-service-account.yaml <<EOF 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-cn:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole EOF
  7. 在集群上创建 Kubernetes 服务账户。使用您创建的名为 AmazonEKSLoadBalancerControllerRole 的 IAM 角色注释名为 aws-load-balancer-controller 的 Kubernetes 服务账户。

    kubectl apply -f aws-load-balancer-controller-service-account.yaml

步骤 2:安装 cert-manager

使用以下方法之一安装 cert-manager 以将证书配置注入 Webhook。有关更多信息,请参阅 cert-manager 文档中的 Getting Started

我们建议使用 quay.io 容器注册表安装 cert-manager。如果您的节点无权访问 quay.io 容器注册表,则请使用 Amazon ECR 安装 cert-manager(见下文)。

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

    kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
Amazon ECR
  1. 使用以下方法之一安装 cert-manager 以将证书配置注入 Webhook。有关更多信息,请参阅 cert-manager 文档中的 Getting Started

  2. 下载清单。

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

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

    sed -i.bak -e 's|quay.io|111122223333.dkr.ecr.region-code.amazonaws.com|' ./cert-manager.yaml
  5. 运用该清单。

    kubectl apply \ --validate=false \ -f ./cert-manager.yaml

步骤 3:安装 Amazon 负载均衡器控制器

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

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

    1. 如果您已下载 v2_11_0_full.yaml 文件,请运行以下命令以删除清单中的 ServiceAccount 部分。如果您不删除此部分,系统将覆盖您在上一步中对服务账户所做的必需注释。如果删除此部分,若您删除了控制器,系统还会保留您在上一步中创建的服务账户。

      sed -i.bak -e '690,698d' ./v2_11_0_full.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 ---
    2. 请将 my-cluster 替换为您的集群名称,将文件的 Deployment spec 部分中的 your-cluster-name 替换为您的集群名称。

      sed -i.bak -e 's|your-cluster-name|my-cluster|' ./v2_11_0_full.yaml
    3. 如果您的节点无权访问 Amazon EKS Amazon ECR 镜像存储库,则需要提取以下镜像并将其推送到节点有权访问的存储库。有关如何提取、标记和推送镜像到您自己的存储库的更多信息,请参阅 将容器镜像从一个存储库复制到另一个存储库

      public.ecr.aws/eks/aws-load-balancer-controller:v2.11.0

      请为清单添加注册表的名称。以下命令假定您的私有存储库名称与源存储库的名称相同,并将您的私有注册表名称添加到文件中。请将 111122223333.dkr.ecr.region-code.amazonaws.com 替换为您的注册表。此行假定您的私有存储库名称与源存储库的名称相同。如果不相同,请将私有注册表名称后面的 eks/aws-load-balancer-controller 文本给更改为您的存储库名称。

      sed -i.bak -e 's|public.ecr.aws/eks/aws-load-balancer-controller|111122223333.dkr.ecr.region-code.amazonaws.com/eks/aws-load-balancer-controller|' ./v2_11_0_full.yaml
    4. (只有 Fargate 或受限的 IMDS 才需要此选项)

      如果要将控制器部署到限制访问 Amazon EC2 实例元数据服务(IMDS)的 Amazon EC2 节点,或者部署到 Fargate 节点或 Amazon EKS 混合节点功能,则需要在 - args: 下添加 following parameters

      [...] spec: containers: - args: - --cluster-name=your-cluster-name - --ingress-class=alb - --aws-vpc-id=vpc-xxxxxxxx - --aws-region=region-code [...]
  3. 应用文件。

    kubectl apply -f v2_11_0_full.yaml
  4. IngressClassIngressClassParams 清单下载到您的集群。

    curl -Lo v2_11_0_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.11.0/v2_11_0_ingclass.yaml
  5. 将清单应用于集群。

    kubectl apply -f v2_11_0_ingclass.yaml

步骤 4:验证控制器是否已安装

  1. 验证控制器是否已安装。

    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 清单进行部署,则只有一个副本。

  2. 在使用控制器预置Amazon资源前,您的集群必须满足特定要求。有关更多信息,请参阅使用应用程序负载均衡器路由应用程序和 HTTP 流量使用网络负载均衡器路由 TCP 和 UDP 流量