如何在 Amazon EKS 中的 Amazon EC2 节点组上使用 AWS Load Balancer 控制器设置 Application Load Balancer?

上次更新时间:2021 年 3 月 15 日

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中的 Amazon Elastic Compute Cloud (Amazon EC2) 节点组上使用 AWS Load Balancer 控制器设置 Application Load Balancer (ALB)。

简短描述

下面的步骤向您介绍如何在 Amazon EKS 中的 Amazon EC2 节点组上部署 AWS Load Balancer 控制器。如果您想创建 Network Load Balancer,请参阅 AWS Load Balancer 控制器。

要在 AWS Fargate 上部署 AWS Load Balancer 控制器,请参阅如何在用于 Fargate 的 Amazon EKS 集群上设置 AWS Load Balancer 控制器?

解决方法

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

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

要为您的集群创建 OpenID Connect (OIDC) 身份提供商,以便与服务账户的 AWS Identity and Access Management (IAM) 角色一起使用,请使用 eksctl 或 AWS 管理控制台。

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

为 AWS Load Balancer 控制器创建 IAM 策略

您创建的 Amazon EKS 策略允许 AWS Load Balancer 控制器代表您调用 AWS API。最佳做法是在授予用户对 AWS API 的访问权限时使用服务账户的 AWS IAM 角色。

1.要从 AWS GitHub 为 AWS Load Balancer 控制器下载 IAM 策略文档,请根据您的区域运行以下命令之一。

除中国区域之外的所有区域:

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

-或者-

北京和宁夏中国区域:

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_cn.json

2.要为您的工作线程节点实例配置文件创建名为 AWSLoadBalancerControllerIAMPolicy 的 IAM 策略,请运行以下命令:

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

3.记下在步骤 2 的输出中返回的策略的 Amazon 资源名称 (ARN)。

4.使用现有的 IAM 角色,或为 AWS Load Balancer 控制器创建新 IAM 角色。

提示:如果您使用 eksctl 创建 IAM 角色,请结合使用 --attach-policy-arn 参数与 IAM 策略 AWSLoadBalancerControllerIAMPolicy 的 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 Load Balancer 控制器

1.对与您的子网关联的负载均衡器,验证您拥有所需的标签。

2.安装 cert-manager,以便您可以将证书配置注入 Webhook。

对于 Kubernetes 1.16 或更高版本:

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/$VERSION/cert-manager.yaml

对于 Kubernetes 1.15 或之前版本:

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/$VERSION/cert-manager-legacy.yaml

注意:用要部署的 cert-manager 版本(来自 Jetstack GitHub 网站)替换 $VERSION

3.在从 AWS GitHub 下载的 AWS Load Balancer 控制器的清单文件中,运行以下命令:

curl -o ingress-controller.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/install/v2_1_0_full.yaml

注意:用要部署的 AWS Load Balancer 控制器的版本(来自 Kubernetes SIGs GitHub 网站)替换 $VERSION

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 替换为您的 AWS 账户 ID,将 role-name 替换为您的 IAM 角色名称。

6.要部署 AWS Load Balancer 控制器,请运行以下命令:

kubectl apply -f ingress-controller.yaml
部署示例应用程序来测试 AWS Load Balancer 控制器

部署示例应用程序,以验证 AWS Load Balancer 控制器因入口对象而创建了 Application Load Balancer。

1.要部署名为 2048 的游戏作为示例应用程序,请运行以下命令:

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

注意:用要部署的 AWS Load Balancer 控制器的版本(来自 Kubernetes SIGs GitHub 网站)替换 $VERSION

2.要验证入口资源已创建,请等待几分钟,然后运行以下命令:

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

您会收到类似如下内容的输出:

NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGE
ingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-west-2.elb.amazonaws.com   80      2m32s

如果在几分钟之后您的入口未创建,请运行以下命令以查看 AWS Load Balancer 控制器日志:

kubectl logs -n kube-system   deployment.apps/aws-load-balancer-controller

注意:AWS Load Balancer 控制器日志会显示错误消息,有助于您排查部署问题。

3.要查看示例应用程序,请打开 Web 浏览器,然后转到从步骤 2 的输出中获得的 URL 地址。

4.要清除示例应用程序,请运行以下命令:

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

注意:用要部署的 AWS Load Balancer 控制器的版本(来自 Kubernetes SIGs GitHub 网站)替换 $VERSION