如何在 Amazon EKS 集群上为 Fargate 设置 AWS 负载均衡器控制器?

4 分钟阅读
0

我想在 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 账户策略和基于角色的访问控制策略

完成以下步骤:

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

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

    **注意:**请将 YOUR_CLUSTER_NAME 替换为您的集群名称。您无需为仅使用 Fargate 容器组 (pod) (--fargate) 的集群创建 Fargate 容器组 (pod) 执行角色

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

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

    **注意:**请将 YOUR_CLUSTER_NAME 替换为您的集群名称。kubeletkube-proxy 使用 FargateExecutionRole 来运行您的 Fargate 容器组 (pod)。但是,FargateExecutionRole 不是 Fargate 容器组 (pod) 的 IAM 角色。对于 Fargate 容器组 (pod),您必须使用服务账户的 IAM 角色

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

  4.  curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json
  5. 要使用下载的策略创建 IAM 策略,请运行以下 AWS CLI 命令 create-policy

    aws iam create-policy \
      --policy-name AWSLoadBalancerControllerIAMPolicy \
      --policy-document file://iam_policy.json
  6. 要为 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 的服务账户。

  7. 要验证新服务角色是否已创建,请运行以下命令之一:

    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 负载均衡器控制器

完成以下步骤:

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

    helm repo add eks https://aws.github.io/eks-charts
  2. 要更新存储库并拉取最新的图表,请运行以下命令:

    helm repo update eks
  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=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。

  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 负载均衡器控制器创建以下资源之一:

  • 用于入口的应用程序负载均衡器
  • 网络负载均衡器,其中对于 Service(服务),Type(类型)为 LoadBalancer

入口资源会根据 URI、主机名和路径等 Web 概念将流量路由到不同的服务。最佳做法是使用入口资源以与多个服务共享一个负载均衡器或控制服务路由。使用 Service(服务)LoadBalancer 为您的服务分配专用的负载均衡器。

**注意:**以下测试步骤将部署一个名为 2048 的示例游戏应用程序。

创建应用程序负载均衡器

要创建用于入口的应用程序负载均衡器,请完成以下步骤:

  1. 要创建游戏部署所需的 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 替换为您的区域。

  2. 要部署应用程序,请运行以下命令:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml
  3. 等待几分钟。然后,运行以下命令,以验证 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

    查看日志中的错误消息,以帮助您诊断部署问题。

  4. 要查看应用程序,请打开浏览器,然后导航到入口资源命令输出中的 URL。
    **注意:**如果未看到应用程序,请等待几分钟,然后刷新浏览器。

创建网络负载均衡器

要使用网络负载均衡器 IP 地址模式服务部署应用程序,请完成以下步骤:

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

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

    **注意:**请将 your-cluster 替换为您的集群名称,将 your-region-code 替换为您的集群所在的区域。

  2. 要获取 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
  3. 在清单中,删除以下 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
  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:xxxxx/TCP   23m
  7. 等待几分钟,直到负载均衡器处于活动状态。要验证您是否可以访问部署,请打开 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

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