Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在 Amazon EKS 集群上为 Fargate 设置 AWS 负载均衡器控制器?
我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上为 AWS Fargate 设置 AWS 负载均衡器控制器。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
您可以未部署任何现有应用程序负载均衡器入口控制器的情况下设置 AWS 负载均衡器控制器。
先决条件:
- 卸载适用于 Kubernetes 的现有 AWS ALB 入口控制器。AWS 负载均衡器控制器取代了其功能。
- 使用 eksctl 版本 0.109.0 或更高版本。有关详细信息,请参阅 eksctl 网站上的 Installation。
- 在您的工作站上安装 Helm。
创建 Amazon EKS 集群、服务 AWS 账户策略和基于角色的访问控制策略
完成以下步骤:
-
要使用 eksctl 创建 Amazon EKS 集群,请运行以下命令:
eksctl create cluster \ --name YOUR_CLUSTER_NAME \ --version 1.28 \ --fargate**注意:**请将 YOUR_CLUSTER_NAME 替换为您的集群名称。您无需为仅使用 Fargate 容器组 (pod) (--fargate) 的集群创建 Fargate 容器组 (pod) 执行角色。
-
要允许集群使用服务账户的 AWS Identity and Access Management (IAM),请运行以下命令:
eksctl utils associate-iam-oidc-provider \ --cluster YOUR_CLUSTER_NAME \ --approve**注意:**请将 YOUR_CLUSTER_NAME 替换为您的集群名称。kubelet 和 kube-proxy 使用 FargateExecutionRole 来运行您的 Fargate 容器组 (pod)。但是,FargateExecutionRole 不是 Fargate 容器组 (pod) 的 IAM 角色。对于 Fargate 容器组 (pod),您必须使用服务账户的 IAM 角色。
-
要下载允许 AWS 负载均衡器控制器代表您调用 AWS API 的 IAM 策略,请运行以下命令:
-
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json -
要使用下载的策略创建 IAM 策略,请运行以下 AWS CLI 命令 create-policy:
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json -
要为 AWS 负载均衡器控制器创建服务账户,请运行以下命令:
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**注意:**请将 YOUR_CLUSTER_NAME 替换为您的集群名称,将 AWS_ACCOUNT_ID 替换为您的账户 ID。上述命令会在 kube-system 命名空间中创建一个名为 aws-load-balancer-controller 的服务账户。
-
要验证新服务角色是否已创建,请运行以下命令之一:
eksctl get iamserviceaccount \ --cluster=YOUR_CLUSTER_NAME \ --name=aws-load-balancer-controller \ --namespace=kube-system**注意:**请将 YOUR_CLUSTER_NAME 替换为您的集群名称。
-或-kubectl get serviceaccount aws-load-balancer-controller \ --namespace kube-system \ -o yaml
使用 Helm 安装 AWS 负载均衡器控制器
完成以下步骤:
-
要将 Amazon EKS 图表添加到 Helm,请运行以下命令:
helm repo add eks https://aws.github.io/eks-charts -
要更新存储库并拉取最新的图表,请运行以下命令:
helm repo update eks -
要安装 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=EKS_CLUSTER_VPC_ID \ --set serviceAccount.name=aws-load-balancer-controller \ --version 1.11.0 \ -n kube-system**注意:**请将 YOUR_CLUSTER_NAME 替换为您的集群名称,将 YOUR_REGION_CODE 替换为您的集群所在的 AWS 区域。此外,请将 EKS_CLUSTER_VPC_ID 替换为集群的虚拟私有云 (VPC) ID。
-
要验证是否已正确安装控制器,请运行以下命令:
kubectl get deployment -n kube-system aws-load-balancer-controller输出示例:
NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s
测试 AWS 负载均衡器控制器
要测试您的实施,请使用 AWS 负载均衡器控制器创建以下资源之一:
- 用于入口的应用程序负载均衡器
- 网络负载均衡器,其中对于 Service(服务),Type(类型)为 LoadBalancer
入口资源会根据 URI、主机名和路径等 Web 概念将流量路由到不同的服务。最佳做法是使用入口资源以与多个服务共享一个负载均衡器或控制服务路由。使用 Service(服务)LoadBalancer 为您的服务分配专用的负载均衡器。
**注意:**以下测试步骤将部署一个名为 2048 的示例游戏应用程序。
创建应用程序负载均衡器
要创建用于入口的应用程序负载均衡器,请完成以下步骤:
-
要创建游戏部署所需的 Fargate 配置文件,请运行以下命令:
eksctl create fargateprofile \ --cluster YOUR_CLUSTER_NAME \ --region YOUR_REGION_CODE \ --name your-alb-sample-app \ --namespace game-2048**注意:**请将 YOUR_CLUSTER_NAME 替换为您的集群名称,将 YOUR_REGION_CODE 替换为您的区域。
-
要部署应用程序,请运行以下命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml -
等待几分钟。然后,运行以下命令,以验证 AWS 负载均衡器控制器是否创建了入口资源:
kubectl get ingress/ingress-2048 -n game-2048输出示例:
NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 alb * k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.region.elb.amazonaws.com 80 3d4h如果几分钟之后您未看到入口资源,请运行以下命令以查看 AWS 负载均衡器控制器日志:
kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller查看日志中的错误消息,以帮助您诊断部署问题。
-
要查看应用程序,请打开浏览器,然后导航到入口资源命令输出中的 URL。
**注意:**如果未看到应用程序,请等待几分钟,然后刷新浏览器。
创建网络负载均衡器
要使用网络负载均衡器 IP 地址模式服务部署应用程序,请完成以下步骤:
-
要创建 Fargate 配置文件,请运行以下命令:
eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048**注意:**请将 your-cluster 替换为您的集群名称,将 your-region-code 替换为您的集群所在的区域。
-
要获取 2048 游戏的部署清单,请运行以下命令:
curl -o 2048-game.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml -
在清单中,删除以下 Ingress(入口)部分:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: game-2048 name: ingress-2048 annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Prefix backend: service: name: service-2048 port: number: 80 -
修改 Service(服务)对象,使其使用以下值:
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 -
要创建服务和部署清单,请运行以下命令:
kubectl apply -f 2048-game.yaml -
要检查服务创建情况和网络负载均衡器的 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:xxxxx/TCP 23m -
等待几分钟,直到负载均衡器处于活动状态。要验证您是否可以访问部署,请打开 Web 浏览器。然后,打开命令输出中 EXTERNAL-IP 下的完全限定域名 (FQDN)。
排查 AWS 负载均衡器控制器存在的问题
如果您在设置 AWS 负载均衡器控制器时遇到问题,请运行以下命令:
kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller kubectl get endpoints -n game-2048 kubectl get ingress/ingress-2048 -n game-2048
检查 logs 命令的输出中是否存在错误消息,例如标签或子网问题。有关常见错误的故障排除步骤,请参阅 GitHub 网站上的 Issues。此外,请参阅如何排查使用 AWS 负载均衡器控制器创建负载均衡器时出现的问题?
get endpoints 命令会向您显示是否已正确注册了支持的部署容器组 (pod)。get ingress 命令会向您显示是否部署了入口资源。
有关详细信息,请参阅 Kubernetes 网站上的 AWS Load Balancer Controller。

