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

3 分钟阅读
0

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

简短描述

您可以在无任何应用程序负载均衡器(ALB)入口控制器的情况下设置 AWS 负载均衡器控制器。

在新的 Fargate 集群上设置 AWS 负载均衡器控制器之前,请完成以下操作:

  • 卸载适用于 Kubernetes 的 AWS ALB 入口控制器。AWS 负载均衡器控制器会取代 AWS ALB 入口控制器的功能。
  • 使用 eksctl 版本 0.109.0 或更高版本。有关更多信息,请参阅 eksctl 网站上的安装
  • 在工作站上安装 Helm
  • 将代码片段中的占位符值替换为自己的值。

解决方法

创建 Amazon EKS 集群、服务账户策略和基于角色的访问控制(RBAC)策略

要创建集群和策略,请执行以下操作:

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

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

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

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

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

    **注意:**FargateExecutionRolekubeletkube-proxy 用来运行 Fargate 容器组(pod)的角色。但它不是 Fargate 容器组(即 aws-load-balancer-controller)使用的角色。对于 Fargate 容器组,您必须使用服务账户的 IAM 角色。有关详细信息,请参阅服务账户的 IAM 角色

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

    curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.6.1/docs/install/iam_policy.json
  4. 使用您下载的策略创建 IAM 策略。请使用以下命令:

    aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json
  5. 要在 kube-system 命名空间中为 AWS 负载均衡器控制器创建名为 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 负载均衡器控制器

要安装 AWS 负载均衡器控制器,请执行以下操作:

  1. 要将 Amazon EKS 图表添加到 Helm,请运行以下命令:

    helm repo add eks https://aws.github.io/eks-charts
  2. 更新 repo 以提取最新的图表:

      helm repo update eks
  3. 运行以下命令来安装 Helm 图表。注意: 将 clusterNameregionvpcId 替换为您的值:

    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
  4. 验证控制器是否成功安装:

    $ 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 负载均衡器控制器创建入口的应用程序负载均衡器网络负载均衡器。您可以使用其中一种来创建 k8s 服务。要使用应用程序负载均衡器入口部署名为 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.6.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-

    **注意:**如果几分钟之后入口还未创建,请运行以下命令,查看 AWS 负载均衡器控制器日志:

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

    日志可能包含错误消息,有助于诊断部署问题。

  4. 要查看示例应用程序,请打开浏览器。然后,从前面的命令输出中导航到地址 URL。
    **注意:**如果未看到示例应用程序,请等待几分钟,然后刷新浏览器。

部署示例应用程序

要使用网络负载均衡器 IP 地址模式服务部署示例应用程序,请执行以下操作:

  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.6.1/docs/examples/2048/2048_full.yaml
  3. 步骤 2 的清单中,删除此 Ingress 部分:

    apiVersion: networking.k8s.io/v1kind: 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
  4. 修改 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
  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 部分中引用的 NLB 的完全限定域名(FQDN)。

排查 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

日志命令的输出会返回错误消息(如包含标签或子网)。这些错误消息有助于排查 Kubernetes GitHub 网站上列出的常见错误get endpoints 命令会显示支持的部署容器组是否已正确注册。get ingress 命令会显示是否部署了入口资源。有关详细信息,请参阅 Kubernetes 网站上的 AWS 负载均衡器控制器

AWS 官方
AWS 官方已更新 1 个月前