如何在用于 Fargate 的 Amazon EKS 集群上设置 AWS 负载均衡器控制器和部署 2048 游戏?

上次更新时间:2022 年 8 月 8 日

我想在用于 AWS Fargate 的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上设置 AWS 负载均衡器控制器。然后,我想部署 2048 游戏。

简短描述

下面的步骤演示了如何在新的 Fargate 集群上设置 AWS 负载均衡器控制器。您在没有任何现有 Application Load Balancer(ALB)入口控制器部署的情况下设置 AWS 负载均衡器控制器。

在开始之前,请考虑以下事项:

  • 卸载用于 Kubernetes 的 AWS ALB 入口控制器。AWS 负载均衡器控制器取代了 AWS ALB 入口控制器的功能。
  • 使用 eksctl 版本 0.97.0 或更高版本。
  • 在工作站上安装 Helm
  • --region 变量并不能一直在命令中使用,因为使用的是您的 AWS 区域的默认值。要检查默认值,请运行 aws configure 命令。要更改 AWS 区域,请使用 --region 标记。
  • Fargate 上的 Amazon EKS 已在所有的 AWS 区域提供,但中国(北京)、中国(宁夏)、AWS GovCloud(美国东部)和 AWS GovCloud(美国西部)区域除外。
  • 将代码片段中的占位符值替换为自己的值。

解决方法

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

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

eksctl create cluster --name YOUR_CLUSTER_NAME --version 1.21 --fargate

注意:您无需为仅使用 Fargate 容器组(pod)的集群创建 Fargate 容器组(pod)执行角色 (--fargate)。

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

eksctl utils associate-iam-oidc-provider --cluster YOUR_CLUSTER_NAME --approve

注意:FargateExecutionRolekubeletkube-proxy 运行 Fargate 容器组(pod)时所基于的角色。但是,这不是用于 Fargate Pod(即 aws-load-balancer-controller)的角色。对于 Fargate 容器组(pod),您必须使用该服务账户的 IAM 角色。有关更多信息,请参阅服务账户的 IAM 角色

3.    要下载允许 AWS 负载均衡器控制器代表您调用 AWS API 的 IAM policy,请运行这个命令:

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

4.    要使用您在步骤 3 中下载的策略创建 IAM policy,请运行这个命令:

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

5.    要在 AWS 负载均衡器控制器的 kube-system 命名空间中创建名为 aws-load-balancer-controller 的服务账户,请运行这个命令:

eksctl create iamserviceaccount \
  --cluster=YOUR_CLUSTER_NAME \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve

6.    要验证是否已创建新服务角色,请运行这个命令:

eksctl get iamserviceaccount --cluster YOUR_CLUSTER_NAME --name aws-load-balancer-controller --namespace kube-system

-或者-

kubectl get serviceaccount aws-load-balancer-controller --namespace kube-system

使用 Helm 安装 AWS 负载均衡器控制器

重要提示:有关详细信息,请参阅 Jetstack GitHub 网站上的 cert-manager 和 Kubernetes GitHub 网站上的 Fargate 的 Cert-manager 问题讨论主题。

1.    要将 Amazon EKS 图表存储库添加到 Helm,请运行这个命令:

helm repo add eks https://aws.github.io/eks-charts

2.    要安装 TargetGroupBinding 自定义资源定义 (CRD),请运行这个命令:

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"

3.    要安装 Helm 图表,请运行这个命令:

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
    --set clusterName=YOUR_CLUSTER_NAME \
    --set serviceAccount.create=false \
    --set region=YOUR_REGION_CODE \
    --set vpcId=<VPC_ID> \
    --set serviceAccount.name=aws-load-balancer-controller \
    -n kube-system

测试 AWS 负载均衡器控制器

您可以使用 AWS 负载均衡器控制器创建用于入口的 ALB 或用于创建 k8s 服务的网络负载均衡器。下面的步骤演示了如何使用 ALB 入口部署名为 2048 的示例应用程序。

1.    要创建游戏部署所需的 Fargate 配置文件,请运行这个命令:

eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048

2.    要部署示例游戏并验证 AWS 负载均衡器控制器是否已创建 ALB 入口资源,请运行这个命令:

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

3.    几分钟后,验证已使用这个命令创建了入口资源:

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

输出:

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

注意:如果在几分钟之后仍未创建入口,则运行这个命令以查看 AWS 负载均衡器控制器日志:

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

注意:您的日志可能包含可帮助您诊断部署问题的错误消息。

4.    打开浏览器并导航到上一个命令输出中的地址 URL 以检视示例应用程序。

注意:您可能需要等待几分钟,然后刷新浏览器。

使用 NLB IP 模式服务部署示例应用程序

要使用网络负载均衡器(NLB)IP 模式,您必须有至少运行 Kubernetes v1.16 或更高版本的集群。

1.    要创建 Fargate 配置文件,请运行这个命令:

eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048

2.    要获取部署 2048 游戏的清单,请运行这个命令:

curl -o 2048-game.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.1/docs/examples/2048/2048_full.yaml

3.    在第 2 步的清单中,删除这个 Ingress 部分:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: service-2048
              servicePort: 80

4.    修改服务对象:

apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: app-2048

5.    要创建服务和部署清单,请运行这个命令:

kubectl apply -f 2048-game.yaml

6.    要检查服务创建和网络负载均衡器的 DNS 名称,请运行这个命令:

kubectl get svc -n game-2048

输出:

NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)        AGE
service-2048   LoadBalancer   10.100.114.197   k8s-game2048-service2-xxxxxxxxxx-yyyyyyyyyy.us-east-2.elb.amazonaws.com   80:30159/TCP   23m

7.    等待几分钟,直到负载均衡器处于活动状态。然后,要检查您是否可以进入部署,请打开 Web 浏览器的 EXTERNAL-IP 部分中引用的 Network Load Balancer 的完全限定域名 (FQDN)。

排查 AWS 负载均衡器控制器的问题

如果您在设置控制器时遇到问题,请运行这个命令:

$ kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller
$ kubectl get endpoints -n game-2048
$ kubectl get ingress/2048-ingress -n 2048-game

日志命令的输出返回了错误消息(例如,包含标签或子网),可以帮助您排查常见错误(通过 Kubernetes GitHub 网站)。get endpoints 命令向您显示支持的部署 Pod 被正确注册。get ingress 命令向您显示入口资源是否已部署。


这篇文章对您有帮助吗?


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