如何在用于 Fargate 的 Amazon EKS 集群上设置 ALB 入口控制器?

上次更新时间:2020 年 9 月 25 日

我想在用于 AWS Fargate 的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上设置 Application Load Balancer (ALB)。

简短描述

完成解决方法部分中的步骤之前,请考虑以下事项:

  • 在 YAML 文件中使用空格而非制表符正确地缩进。
  • 在命令中看到 <placeholder-value> 时,将占位符值替换为您自己的值。
  • 请注意,--region 变量中不用于下列任何命令,因为使用的是您的 AWS 区域的默认值。要检查默认值,请运行 aws configure 命令。要更改 AWS 区域,请使用 -region 标记。
  • 请注意,Amazon EKS for Fargate 仅在以下 AWS 区域中可用:美国东部(弗吉尼亚北部)、美国东部(俄亥俄)、欧洲(爱尔兰)和亚太地区(东京)。
  • 使用 eksctl 0.11.1 版或更高版本。

解决方法

创建 Amazon EKS 集群、服务账户策略和 RBAC 策略

1.    要使用 eksctl 创建用于 Fargate 的 Amazon EKS 集群,请运行以下命令:

$ eksctl create cluster --name your-cluster-name --version 1.14 --fargate

注意:您无需为仅使用 Fargate pod 的集群创建 Fargate pod 执行角色 (--fargate)。您可以使用现有的 Amazon EKS 集群,但该集群必须运行 Kubernetes 1.14 版和 Amazon EKS 平台 eks.5 版。

2.    要允许集群对服务账户使用 AWS Identity and Access Management (IAM) 集成,请运行以下命令:

$ eksctl utils associate-iam-oidc-provider --cluster your-cluster-name --approve

注意:FargateExecutionRolekubeletkube-proxy 用于运行 Fargate pod 的角色,但不是用于 Fargate pod 的角色(即 alb-ingress-controller)。对于 Fargate pod,您必须使用该服务账户的 IAM 角色。

3.    使用来自 Kubernetes GitHub 网站的正确权限为服务账户创建 IAM 策略,然后记下 IAM 策略的 Amazon 资源名称 (ARN)。

注意:ALB 入口控制器需要通过多次 API 调用来为入口资源类型预置 ALB 组件。

4.    要创建服务账户,请运行以下命令:

$ eksctl create iamserviceaccount --name your-service-account-name --namespace kube-system --cluster your-cluster-name --attach-policy-arn IAM-policy-arn --approve --override-existing-serviceaccounts

5.    要验证已创建了新服务角色,请运行以下命令:

$ eksctl get iamserviceaccount --cluster your-cluster-name --name your-service-account-name --namespace your-namespace

注意:角色名称以 eksctl-<cluster-name>-addon-iamserviceaccount- 开头。

6.    要为 ALB 入口控制器创建 RBAC 权限和服务账户,请运行以下命令:

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

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::YOUR_AWS_ACCOUNT_ID:role/YOUR_IAM_ROLE_NAME    # Add the IAM role
  name: alb-ingress-controller
  namespace: kube-system

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

$ kubectl apply -f rbac-role.yaml

设置 ALB 入口控制器

要将 ALB 入口控制器作为 Fargate pod 运行,您必须使用 iam-for-pods

注意:只有出于测试目的时,才可以添加 AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY 作为 alb-ingress-controller.yaml 文件中的环境变量。最佳方法是为服务账户创建 IAM 角色

1.    要下载用于控制器的 YAML 文件,请运行以下命令:

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

2.    在文本编辑器中打开 alb-ingress-controller.yaml 文件,然后进行以下更改:

    spec:
      containers:
      - args:
        - --ingress-class=alb
        - --cluster-name=your-cluster-name    #<-- Add the cluster name
        - --aws-vpc-id=vpc-xxxxxxxxxxxxxxxxx    #<-- Add the VPC ID 
        - --aws-region=eu-west-1    #<-- Add the region 
        image: docker.io/amazon/aws-alb-ingress-controller:v1.1.4    #<======= Please make sure the Image is 1.1.4 and above. 
        imagePullPolicy: IfNotPresent

3.    要应用 alb-ingress-controller.yaml 文件,请运行以下命令:

$ kubectl apply -f alb-ingress-controller.yaml

4.    要检查 alb-ingress-controller 的部署状态,请运行以下命令:

$ kubectl rollout status deployment alb-ingress-controller -n kube-system

测试 ALB 入口控制器

您可以创建 ALB 入口资源和 Fargate 配置文件来测试 ALB 入口控制器。

1.    在 Amazon EKS 控制台中,为命名空间 2048-game 创建 Fargate 配置文件,或运行以下命令以使用 eksctl 创建配置文件:

$ eksctl create fargateprofile --namespace 2048-game --cluster your-cluster-name

注意:如果您使用 Amazon EKS 控制台创建配置文件,请使用与您的 Amazon Virtual Private Cloud (Amazon VPC) 关联的私有子网。在 Fargate 上运行的 Pod 未分配公有 IP 地址。Fargate 配置文件仅支持私有子网(没有到互联网网关的直接路由)。

2.    要下载 2048-ingress 文件,请运行以下命令:

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

3.    在文本编辑器中打开 2048-ingress 文件,然后对注释进行以下更改:

 annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip                       # Add this annotation
    alb.ingress.kubernetes.io/security-groups: your-security-group  # Custom security group

注意:ALB 入口控制器在 Amazon EKS for Fargate 上仅使用 IP 模式工作。有关更多信息,请参阅 AWS ALB 入口控制器网站上的入口注释

4.    要将文件应用于测试部署,请运行以下命令:

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

5.    要使用您接收的地址查看 2048 页面,请运行以下命令:

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

该命令的输出应包含负载均衡器的完全限定域名 (FQDN),以供您从 Web 浏览器进行访问。

排查 ALB 入口控制器的故障

如果您在设置 ALB 入口控制器时遇到问题,请运行以下命令:

$ kubectl logs your-alb-ingress-controller -n kube-system
$ kubectl get endpoints -A
$ kubectl get ingress/2048-ingress -n 2048-game

logs 命令的输出返回了错误消息(例如,包含标签或子网),可以帮助您排查常见错误get endpointsget ingress 命令可以显示您的未部署成功的入口资源。

如果您为入口控制器运行 YAML 文件而未将映像更改为 1.1.4,那您将会收到错误,指出 ALB 入口控制器无法找到实例 ID。要解决此错误,请参阅 Kubernetes GitHub 网站上的 aws-alb-ingress-controller

注意:映像 1.1.3v 中的配置可检查您的 Amazon Elastic Compute Cloud (Amazon EC2) 实例的网络接口。为了使 ALB 入口控制器能够在 Fargate 上运行,映像代码更改为查找关联的弹性网络接口,而非 Amazon EC2 工作线程节点。


这篇文章对您有帮助吗?


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