如何在用于 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
注意:FargateExecutionRole 是 kubelet 和 kube-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 命令向您显示入口资源是否已部署。