如何在 Amazon EKS 中的 Amazon EC2 节点上设置 ALB 入口控制器?

上次更新日期:2020 年 10 月 2 日

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

简短描述

下面的步骤向您介绍如何在 Amazon EKS 中的 Amazon EC2 节点组上部署 ALB 入口控制器

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

解决方法

注意:如果您在运行 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 证书的指纹

为 ALB 入口控制器创建 IAM 策略

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

1.    要从 AWS GitHub 下载适用于 ALB 入口控制器的 IAM 策略文档,请运行以下命令:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/master/docs/examples/iam-policy.json

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

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

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

4.    使用现有的 IAM 角色,或为 ALB 入口控制器创建新 IAM 角色

提示:如果您使用 eksctl 创建 IAM 角色,请结合使用 -attach-policy-arn 参数与 IAM 策略 ALBIngressControllerIAMPolicy 的 ARN。

5.    要将 ALBIngressControllerIAMPolicy 附加到您此前识别的 IAM 角色,请运行以下命令:

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

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

6.    要为 ALB 入口控制器创建服务账户、集群角色和集群角色绑定,请运行以下命令:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/$VERSION/docs/examples/rbac-role.yaml

注意:请将 $VERSION 替换为您要部署的 ALB 入口控制器的版本

7.    在文本编辑器中打开 rbac-role.yaml 文件,然后仅对文件的 ServiceAccount 部分进行以下更改:

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

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

8.    保存 rbac-role.yaml 文件,然后运行以下命令:

kubectl apply -f rbac-role.yaml

部署 ALB 入口控制器

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

2.    要从 AWS GitHub 下载清单文件,请运行以下命令:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/$VERSION/docs/examples/alb-ingress-controller.yaml

注意:请将 $VERSION 替换为您要部署的 ALB 入口控制器的版本

3.    在下载的清单文件中,在 --ingress-class=alb 行之后添加您的集群的 cluster-name,然后保存并关闭文件。例如:

spec:
containers:
- args:
    - --ingress-class=alb
    - --cluster-name=cluster-name   # Add the name of your cluster

要查找 Amazon Virtual Private Cloud (Amazon VPC) ID,请在 AWS CLI 中运行以下命令:

aws eks describe-cluster --name cluster-name --query 'cluster.resourcesVpcConfig.vpcId' --output text

4.    要部署 ALB 入口控制器,请运行以下命令:

kubectl apply -f alb-ingress-controller.yaml

部署示例应用程序以测试 ALB 入口控制器

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

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

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/$VERSION/docs/examples/2048/2048-namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/$VERSION/docs/examples/2048/2048-deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/$VERSION/docs/examples/2048/2048-service.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/$VERSION/docs/examples/2048/2048-ingress.yaml

注意:请将 $VERSION 替换为您要部署的 ALB 入口控制器的版本

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

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

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

NAME           HOSTS    ADDRESS                                                                 PORTS       AGE
2048-ingress   *        example-2048game-2048ingr-6fa0-352729433.us-west-2.elb.amazonaws.com    80          24h

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

kubectl logs -n kube-system deployment.apps/alb-ingress-controller

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

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

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

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/$VERSION/docs/examples/2048/2048-namespace.yaml

注意:请将 $VERSION 替换为您要部署的 ALB 入口控制器的版本。</p


这篇文章对您有帮助吗?


您是否需要账单或技术支持?