跳至内容

如何使用 AWS 负载均衡器控制器在 Amazon EKS 中的 Amazon EC2 节点组上控制器设置应用程序负载均衡器?

3 分钟阅读
0

我想使用 AWS 负载均衡器控制器在 Amazon Elastic Kubernetes Service (Amazon EKS) 中的 Amazon Elastic Compute Cloud (Amazon EC2) 节点组上设置应用程序负载均衡器。

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

先决条件:配置您的子网以允许从您的 Worker 节点出站访问互联网。AWS 负载均衡器控制器需要出站互联网连接。

要在 AWS Fargate 上部署 AWS 负载均衡器控制器,请参阅如何在 Amazon EKS 集群上为 Fargate 设置 AWS 负载均衡器控制器?

标记您的子网

在您的 Amazon EKS 集群中标记 Amazon Virtual Private Cloud (Amazon VPC) 子网。在标记您的子网后,您的 AWS 负载均衡器控制器会在您创建应用程序负载均衡器资源时自动发现子网。

对于公有应用程序负载均衡器,您的集群的 VPC 中必须至少有两个带有 kubernetes.io/role/elb 标签的公有子网。

对于私有应用程序负载均衡器,您的集群的 VPC 中必须至少有两个带有 kubernetes.io/role/internal-elb 标签的私有子网。

创建 OIDC 身份提供者

使用 Amazon EKS 控制台、AWSL CLI 或 eksctl 创建 OIDC 身份提供者,以配合服务账户 (IRSA) 的 AWS Identity and Access Management (IAM) 角色使用。

Amazon EKS 控制台

要使用控制台,请参阅创建 OIDC 身份提供者(AWS 管理控制台)

AWSL CLI

找到您的集群使用的根证书颁发机构 (CA) 的指纹。然后,运行以下 create-open-id-connect-provider 命令:

ISSUER_URL=$(aws eks describe-cluster --name cluster-name \  --query "cluster.identity.oidc.issuer" --region region-name --output text)aws iam create-open-id-connect-provider \  
  --url ${ISSUER_URL} \  
  --thumbprint-list ca-thumbprint \  
  --client-id-list sts.amazonaws.com \  
  --region region-name

**注意:**将 cluster-name 替换为您的集群名称,将 region-name 替换为您的 AWS 区域,将 ca-thumbprint 替换为根 CA 证书的指纹。

eksctl

要使用 eksctl 命令行工具,请参阅创建 OIDC 身份提供者 (eksctl)

创建 IAM 策略

创建 IAM 策略,允许 AWS 负载均衡器控制器调用 AWS API。

**重要事项:**最佳做法是在授予对 AWS API 的访问权限时使用 IRSA。

完成以下步骤:

  1. 根据您的区域运行以下命令之一,从 GitHub 下载适用于 AWS 负载均衡器控制器的 IAM 策略。
    对于除北京和中国宁夏区域之外的所有区域,运行以下 describe-cluster 命令:

    ISSUER_URL= aws eks describe-cluster --name example-cluster-name \  --query "cluster.identity.oidc.issuer" --region example-region-name --output text  
    aws iam create-open-id-connect-provider \  
      --url example-issuer-url \  
      --thumbprint-list ca-thumbprint \  
      --client-id-list sts.amazonaws.com \  --region example-region-name

    **注意:**将 example-cluster-name 替换为您的集群名称,将 example-region-name 替换为您的区域,将 example-issuer-url 替换为您的发布者的 URL。
    对于中国北京和宁夏区域,运行以下 curl 命令:

    curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_cn.json
  2. 运行以下 create-policy 命令以便为您的 Worker 节点实例配置文件创建名为 AWSLoadBalancerControllerIAMPolicy 的 IAM 策略:

    aws iam create-policy \    --policy-name AWSLoadBalancerControllerIAMPolicy \    --policy-document file://iam-policy.json
  3. 记下该命令返回的策略的 Amazon 资源名称 (ARN)。

  4. 使用现有的 IAM 角色,或为 AWS 负载均衡器控制器创建新的 IAM 角色
    **注意:**要使用 eksctl 创建 IAM 角色,请将 --attach-policy-arn 参数与 AWSLoadBalancerControllerIAMPolicy IAM 策略的 ARN 一起使用。

  5. 运行以下 attach-role-policy 命令将 AWSLoadBalancerControllerIAMPolicy 附加到您的 IAM 角色:

    aws iam attach-role-policy \--policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \--role-name role-name  
    

    **注意:**将 111122223333 替换为您的 AWS 账户 ID,将 role-name 替换为您的 IAM 角色名称。

部署 AWS 负载均衡器控制器

完成以下步骤:

  1. 确认您拥有与子网关联的负载均衡器所需的标签

  2. 在 Kubernetes 1.16 或更高版本中运行以下命令来安装 cert-manager

    kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/example-version/cert-manager.yaml
  3. 在您从 GitHub 下载的清单文件中,运行以下命令:

    curl -Lo ingress-controller.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/example-version/v2_13_3_full.yaml  
    

    **注意:**将 example-version 替换为要部署的 AWS 负载均衡器控制器版本。要验证 AWS 负载均衡器控制器版本,请参阅 GitHub 网站上的 Kubernetes SIGs。请务必修改文件名以匹配您的版本。在前面的代码示例中,v2_13_3_full.yaml 与 AWS 负载均衡器控制器 v2.13.3 相匹配。有关详细信息,请参阅 GitHub 网站上的 aws-load-balancer-controller

  4. .yaml 文件的 ServiceAccount 部分进行以下更新:

    spec:        containers:  
        - args:  
            - --cluster-name=example-cluster-name  
            - --ingress-class=alb

    **注意:**将 example-cluster-name 替换为您的集群名称。
    在以下示例中,111122223333 是账户 ID,example-role-name 是 IAM 角色名称:

    apiVersion: v1  
    kind: ServiceAccount  
    metadata:  
      labels:  
        app.kubernetes.io/component: controller  
        app.kubernetes.io/name: aws-load-balancer-controller  
      annotations:                                                                         
        eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/example-role-name       
      name: aws-load-balancer-controller  
      namespace: kube-system
  5. 运行以下命令以部署 AWS 负载均衡器控制器:

    kubectl apply -f ingress-controller.yaml

部署示例应用程序

部署示例应用程序以验证 AWS 负载均衡器控制器是否因为入站对象而创建了公有应用程序负载均衡器。

完成以下步骤:

  1. 运行以下命令来部署名为 2048 的游戏:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/example-version/docs/examples/2048/2048_full.yaml

    **注意:**将 example-version 替换为要部署的 AWS 负载均衡器控制器版本。要验证 AWS 负载均衡器控制器版本,请参阅 GitHub 网站上的 Kubernetes SIGs

  2. 几分钟后,运行以下命令来验证 Kubernetes 是否创建了入站资源:

    kubectl get ingress/ingress-2048 -n game-2048

    输出示例:

    NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGEingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-west-2.elb.amazonaws.com   80      2m32s
  3. 如果 Kubernetes 未创建您的入站资源,请运行以下命令来查看 AWS 负载均衡器控制器日志中是否有部署错误消息:

    kubectl logs -n kube-system   deployment.apps/aws-load-balancer-controller
  4. 要查看游戏,请打开 Web 浏览器,然后输入步骤 2 中输出的 URL 地址。

  5. 运行以下命令删除游戏:

    kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/example-version/docs/examples/2048/2048_full.yaml

    **注意:**将 example-version 替换为要部署的 AWS 负载均衡器控制器版本。

AWS 官方已更新 1 年前