使用清单安装 AWS Load Balancer Controller - Amazon EKS

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

使用清单安装 AWS Load Balancer Controller

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

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

先决条件

在开始使用本教程之前,您必须安装并配置创建和管理 Amazon EKS 集群所需的以下工具和资源。

步骤 1:配置 IAM

注意

您只需为 AWS Load Balancer Controller 创建一个角色,每个 AWS 账户一个。检查 IAM 控制台中是否存在 AmazonEKSLoadBalancerControllerRole。如果此角色存在,则请跳至 步骤 2:安装 cert-manager

创建一个 IAM 策略。
  1. 下载 AWS Load Balancer Controller 的 IAM 策略,该策略允许负载均衡器代表您调用 AWS API。

    AWS
    $ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy.json
    AWS GovCloud (US)
    $ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/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
    注意

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

eksctl
使用 eksctl 创建 IAM 角色
  • 请将 my-cluster 替换为您的集群的名称,将 111122223333 替换为您的账户 ID,然后运行命令。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:

    $ eksctl create iamserviceaccount \ --cluster=my-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name AmazonEKSLoadBalancerControllerRole \ --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --approve
AWS CLI and kubectl
使用 AWS CLI 和 kubectl 创建 IAM 角色
  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 替换为集群所在的 AWS 区域。EXAMPLED539D4633E53DE1B71EXAMPLE 替换为上一步中返回的输出。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:替换文本后,运行修改后的命令可创建 load-balancer-role-trust-policy.json 文件。

    cat >load-balancer-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws: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 策略附加到 IAM 角色。请将 111122223333 替换为您的账户 ID。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --role-name AmazonEKSLoadBalancerControllerRole
  6. 将以下内容复制到您的设备。请将 111122223333 替换为您的账户 ID。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:替换文本后,运行修改后的命令可创建 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: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 文档中的 入门

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

Quay.io
使用 Quay.io 安装 cert-manager
  • 如果您的节点有权访问 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
使用 Amazon ECR 安装 cert-manager
  1. 使用以下方法之一安装 cert-manager 以将证书配置注入 Webhook。有关更多信息,请参阅 cert-manager 文档中的 入门

  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:安装 AWS Load Balancer Controller

使用 Kubernetes 清单安装 AWS Load Balancer Controller
  1. 下载控制器规范。有关控制器的更多信息,请参阅 GitHub 上的文档

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

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

      $ sed -i.bak -e '612,620d' ./v2_7_2_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_7_2_full.yaml
    3. 如果您的节点无权访问 Amazon EKS Amazon ECR 镜像存储库,则需要提取以下镜像并将其推送到节点有权访问的存储库。有关如何提取、标记和推送镜像到您自己的存储库的更多信息,请参阅 将容器镜像从一个存储库复制到另一个存储库

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

      请为清单添加注册表的名称。以下命令假定您的私有存储库名称与源存储库的名称相同,并将您的私有注册表名称添加到文件中。将 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_7_2_full.yaml
    4. (只有 Fargate 或受限的 IMDS 才需要此选项)

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

      [...] 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_7_2_full.yaml
  4. IngressClassIngressClassParams 清单下载到您的集群。

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

    $ kubectl apply -f v2_7_2_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. 在使用控制器预置AWS资源前,您的集群必须满足特定要求。有关更多信息,请参阅使用 Application Load Balancers 路由应用程序和 HTTP 流量使用 Network Load Balancers 路由 TCP 和 UDP 流量