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

3 分钟阅读
0

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

概述

将 AWS 负载均衡器控制器连接到以下任一 AWS 服务端点:

  • AWS Identity and Access Management(IAM)
  • Amazon EC2
  • AWS Certificate Manager(ACM)
  • 弹性负载均衡(ELB)
  • Amazon Cognito
  • AWS WAF
  • AWS Shield

要使 AWS 负载均衡器控制器正常工作,您必须有出站互联网连接。有关更多信息,请参阅如何为 Amazon EKS 集群配置我得子网?

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

解决方案

标记您的子网以允许自动发现

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

对于公有应用程序负载均衡器,您的集群的 VPC 中必须至少有两个带有以下标签的公有子网:

kubernetes.io/role/elb

对于内部应用程序负载均衡器,您的集群的 VPC 中必须至少有两个带有以下标签的私有子网:

kubernetes.io/role/internal-elb

为您的集群创建 OIDC 身份提供商

使用 eksctl 或 AWS 管理控制台创建 OpenID Connect (OIDC) 身份提供商,用于服务账户的 IAM 角色

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

或者,使用 AWSL CLI 为您的集群创建 OIDC 身份提供商。例如:

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-thumbrint 替换为根 CA 证书的指纹。您可以通过oidc.eks.region-name.amazonaws.com 获得您的集群使用的根 CA 证书的指纹

为 AWS 负载均衡器控制器创建 IAM 策略

您创建的 Amazon EKS 策略允许 AWS 负载均衡器控制器调用 AWS API。当您授予对 AWS API 的访问权限时,最佳做法是为服务账户使用 AWS IAM 角色

  1. 从 GitHub 下载适用于 AWS 负载均衡器控制器的 IAM 政策。根据您的配置,运行以下命令之一:
    除中国以外的所有地区:

    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

    中国北京和宁夏地区:

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

    aws iam create-policy \    --policy-name AWSLoadBalancerControllerIAMPolicy \
        --policy-document file://iam-policy.json
  3. 记下输出中返回的策略的 ARN。

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

  5. 要将 ** 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. 安装 cert-manager 这样您就可以将证书配置注入到网络挂钩中。使用 Kubernetes 1.16 或更高版本运行以下命令:

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

    curl -Lo ingress-controller.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/$VERSION/v2_6_2_full.yaml

    **注意:**将 $VERSION 替换为要部署的 AWS 负载均衡器控制器版本,并修改文件名,例如 v2.6.2 的 v2_6_2_2_full.yaml。有关更多信息,请参阅 GitHub The Kubernetes repository

  4. 编辑集群的 cluster-name。例如:

    spec:    
        containers:
        - args:
            - --cluster-name=your-cluster-name # edit the cluster name
            - --ingress-class=alb
  5. 仅更新文件的 ServiceAccount 部分。例如:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/name: aws-load-balancer-controller
      annotations:                                                                        # Add the annotations line
        eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/role-name              # Add the IAM role
      name: aws-load-balancer-controller
      namespace: kube-system

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

  6. 要部署 AWS 负载均衡器控制器,请运行以下命令:

    kubectl apply -f ingress-controller.yaml

部署示例应用程序来测试 AWS 负载均衡器控制器

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

  1. 将部署名为 2048 的游戏作为示例应用程序,请运行以下命令:
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/examples/2048/2048_full.yaml
    **注意:**将 $VERSION 替换为要部署的 AWS 负载均衡器控制器的版本(来自 GitHub 网站 的 Kubernetes SIG)。
  2. 要验证 Ingress 资源是否已创建,请等待几分钟,然后运行以下命令:
    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. 如果几分钟之后 Ingress 还未创建,请运行以下命令,查看 AWS 负载均衡器控制器日志:
    kubectl logs -n kube-system   deployment.apps/aws-load-balancer-controller
    **注意:**AWS 负载均衡器控制器日志经常显示错误消息,以帮助您解决部署问题。
  4. 要查看示例应用程序,请打开 Web 浏览器,然后转到步骤 2 的输出中的 URL 地址。
  5. 要清理示例应用程序,请运行以下命令:
    kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/examples/2048/2048_full.yaml
    **注意:**将 $VERSION 替换为要部署的 AWS 负载均衡器控制器的版本(来自 GitHub 网站 的 Kubernetes SIG)。

相关信息

如何对 Amazon EKS 中由 Kubernetes 服务控制器创建的负载均衡器进行故障排除?

如何排查使用 AWS 负载均衡器控制器创建负载均衡器时出现的问题?

AWS 官方
AWS 官方已更新 1 年前