如何在 Amazon EKS 叢集上為 Fargate 設定 AWS Load Balancer Controller?

4 分的閱讀內容
0

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集上為 AWS Fargate 設定 AWS Load Balancer Controller。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

您可以在未部署任何現有 Application Load Balancer 輸入控制器的情況下,設定 AWS Load Balancer Controller

先決條件:

  • 解除安裝現有的 AWS ALB Ingress Controller for Kubernetes。AWS Load Balancer Controller 取代了其功能。
  • 請使用 eksctl 0.109.0 版或更新版本。如需詳細資訊,請參閱 eksctl 網站上的安裝
  • 在您的工作站上安裝 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. 若要下載允許 WS Load Balancer Controller 代表您呼叫 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 政策,請執行下列 create-policy AWS CLI 命令:

    aws iam create-policy \
      --policy-name AWSLoadBalancerControllerIAMPolicy \
      --policy-document file://iam_policy.json
  6. 若要為 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

    **注意:**將 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 Load Balancer Controller

請完成下列步驟:

  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 Load Balancer Controller

若要測試您的實作,請使用 AWS Load Balancer Controller 來建立下列其中一個資源:

  • 用於輸入的 Application Load Balancer
  • Network Load Balancer,在 Service (服務) 中,Type (類型) 為 LoadBalancer

輸入資源會根據網頁概念 (如 URI、主機名稱和路徑) 將流量路由到不同的服務。最佳做法是使用輸入資源與多個服務共用負載平衡器,或控制服務路由。使用Service (服務) LoadBalancer 為您的服務指派專用負載平衡器。

**注意:**以下測試步驟會部署一個名為 2048 的遊戲應用程式範例。

建立 Application Load Balancer

若要為輸入建立 Application Load Balancer,請完成下列步驟:

  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 Load Balancer Controller 是否建立了輸入資源:

    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 Load Balancer Controller 日誌:

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

    檢查日誌中的錯誤訊息,協助您診斷部署問題。

  4. 若要查看應用程式,請開啟瀏覽器,然後瀏覽至輸入資源命令輸出中的網址。
    **注意:**如果您沒有看到應用程式,請稍候幾分鐘,然後重新整理瀏覽器。

建立 Network Load Balancer

若要使用 Network Load Balancer 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. 若要檢查服務建立情況和 Network Load Balancer 的 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 Load Balancer Controller 進行疑難排解

如果您在設定 AWS Load Balancer Controller 時遇到問題,請執行下列命令:

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 網站上的問題。另請參閱如何對使用 AWS Load Balancer Controller 建立負載平衡器時出現的問題進行疑難排解?

get endpoints 命令會顯示您是否正確註冊了支援的部署 Pod。get ingress 命令會顯示您是否已部署輸入資源。

如需詳細資訊,請參閱 Kubernetes 網站上的 AWS Load Balancer Controller

AWS 官方
AWS 官方已更新 2 個月前