如何在 Amazon EKS 中的 Amazon EC2 節點群組上使用 AWS 負載平衡器控制器設定 Application Load Balancer?

3 分的閱讀內容
0

我想要在 Amazon Elastic Kubernetes Service (Amazon EKS) 的 Amazon Elastic Compute Cloud (Amazon EC2) 節點群組中,透過 AWS 負載平衡器控制器設定 Application Load Balancer。

簡短描述

將 AWS 負載平衡器控制器連接至下列其中一個 AWS 服務端點:

  • AWS Identity and Access Management (IAM)
  • Amazon EC2
  • AWS Certificate Manager (ACM)
  • Elastic Load Balancing (ELB)
  • Amazon Cognito
  • AWS WAF
  • AWS Shield

為使 AWS 負載平衡器控制器運作,您必須具有網際網路出埠連線。如需詳細資訊,請參閱如何設定 Amazon EKS 叢集的子網路?

若要在 AWS Fargate 中部署 AWS 負載平衡器控制器,請參閱如何在適用於 Fargate 的 Amazon EKS 叢集中設定 AWS 負載平衡器控制器與部署 2048 遊戲?

解決方法

標記子網路以允許自動探索

在 Amazon EKS 叢集中標記 Amazon Virtual Private Cloud (Amazon VPC) 子網路。這可讓 AWS 負載平衡器控制器在您建立 Application Load Balancer 資源時自動探索子網路。

如為公有 Application Load Balancer,您的叢集 VPC 中必須具有至少兩個使用下列標籤的公有子網路:

kubernetes.io/role/elb

如為內部 Application Load Balancer,您的叢集 VPC 中必須具有至少兩個使用下列標籤的私有子網路:

kubernetes.io/role/internal-elb

為叢集建立 OIDC 身分提供者

使用 eksctl 或 AWS 管理主控台建立 OpenID Connect (OIDC) 身分提供者,以與服務帳戶的 IAM 角色一起使用。

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

或者,使用 AWSL CLI 為叢集建立 OIDC 身分提供者。例如:

ISSUER_URL=$(aws eks describe-cluster --name cluster-name \  --query "cluster.identity.oidc.issuer" --region region-name --output text)
aws iam create-open-id-connect-provider \
  --url ${ISSUER_URL} \
  --thumbprint-list ca-thumbprint \
  --client-id-list sts.amazonaws.com \
  --region region-name

**注意:**請使用叢集名稱取代 cluster-name、使用 AWS 區域取代 region-name,以及使用根 CA 憑證指紋取代 ca-thumbprint。您可以取得叢集使用的 oidc.eks.region-name.amazonaws.com根 CA 憑證指紋搭配使用。

為 AWS 負載平衡器控制器建立 IAM 政策

您建立的 Amazon EKS 政策允許 AWS 負載平衡器控制器呼叫 AWS API。當您授予 AWS API 存取權時,最佳做法是使用服務帳戶的 AWS IAM 角色

  1. 從 GitHub 下載 AWS 負載平衡器控制器的 IAM 政策。根據您的區域,執行下列其中一個命令。
    除中國區域外的所有區域:

    ISSUER_URL=$(aws eks describe-cluster --name cluster-name \  --query "cluster.identity.oidc.issuer" --region region-name --output text)
    aws iam create-open-id-connect-provider \
      --url ${ISSUER_URL} \
      --thumbprint-list ca-thumbprint \
      --client-id-list sts.amazonaws.com \
      --region region-name

    中國北京與寧夏區域:

    curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_cn.json
  2. 若要為工作節點執行個體設定檔建立名為 AWSLoadBalancerControllerIAMPolicy 的 IAM 政策,請執行下列命令:

    aws iam create-policy \    --policy-name AWSLoadBalancerControllerIAMPolicy \
        --policy-document file://iam-policy.json
  3. 記下輸出中傳回的政策的 ARN。

  4. 對 AWS 負載平衡器控制器使用現有的 IAM 角色或建立新的 IAM 角色
    **注意:**若要使用 eksctl 建立 IAM 角色,請搭配使用使用 --attach-policy-arn 參數與 AWSLoadBalancerControllerIAMPolicy IAM 政策的 ARN。

  5. 若要將 AWSLoadBalancerControllerIAMPolicy 附加至 IAM 角色,請執行下列命令:

    aws iam attach-role-policy \--policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
    --role-name role-name

    **注意:**使用 AWS 帳戶 ID 取代 111122223333,並使用 IAM 角色名稱取代 role-name

部署 AWS 負載平衡器控制器

  1. 針對與子網路相關聯的負載平衡器,確認您擁有必要的標籤

  2. 安裝 cert-manager,使您可將憑證組態插入 Webhook。使用 Kubernetes 1.16 或更新版本來執行下列命令:

    kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/$VERSION/cert-manager.yaml
  3. 在您從 GitHub 下載的資訊清單檔案中,執行下列命令:

    curl -Lo ingress-controller.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/$VERSION/v2_6_2_full.yaml

    **注意:**使用您要部署的 AWS 負載平衡器控制器版本取代 $VERSION,並修改檔案名稱,例如 v2.6.2 的 v2_6_2_full.yaml。如需詳細資訊,請參閱 GitHub 上的 Kubernetes 儲存庫

  4. 編輯叢集的 cluster-name。例如:

    spec:    
        containers:
        - args:
            - --cluster-name=your-cluster-name # edit the cluster name
            - --ingress-class=alb
  5. 僅更新檔案的 ServiceAccount 區段。例如:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/name: aws-load-balancer-controller
      annotations:                                                                        # Add the annotations line
        eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/role-name              # Add the IAM role
      name: aws-load-balancer-controller
      namespace: kube-system

    **注意:**使用您的帳戶 ID 取代 111122223333,並使用您的 IAM 角色名稱取代 role-name

  6. 若要部署 AWS 負載平衡器控制器,請執行下列命令:

    kubectl apply -f ingress-controller.yaml

部署範例應用程式以測試 AWS 負載平衡器控制器

部署範例應用程式,以確認 AWS 負載平衡器控制器是否因為輸入物件而建立公有 Application Load Balancer。

  1. 若要部署名為 2048 的遊戲作為範例應用程式,請執行下列命令:
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/examples/2048/2048_full.yaml
    **注意:**使用您想要部署之 AWS 負載平衡器控制器的版本 (從 Kubernetes SIGs GitHub 網站取得) 取代 $VERSION
  2. 若要驗證輸入資源是否已建立,請稍候數分鐘,然後執行下列命令:
    kubectl get ingress/ingress-2048 -n game-2048
    您會收到類似於下列範例的輸出:
    NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGEingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-west-2.elb.amazonaws.com   80      2m32s
     
  3. 如果輸出在數分鐘後未建立,請執行下列命令以檢視 AWS 負載平衡器控制器日誌:
    kubectl logs -n kube-system   deployment.apps/aws-load-balancer-controller
    **注意:**AWS 負載平衡器控制器日誌通常顯示錯誤訊息,以協助您針對部署相關的問題進行疑難排解。
  4. 若要查看範例應用程式,請開啟網頁瀏覽器,然後前往步驟 2 中輸出的網址。
  5. 若要清理範例應用程式,請執行下列命令:
    kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/examples/2048/2048_full.yaml
    **注意:**使用您想要部署之 AWS 負載平衡器控制器的版本 (從 Kubernetes SIGs GitHub 網站取得) 取代 $VERSION

相關資訊

如何疑難排解由 Amazon EKS 中 Kubernetes 服務控制器建立的負載平衡器?

如何對使用 AWS 負載平衡器控制器建立負載平衡器時出現的問題進行疑難排解?

AWS 官方
AWS 官方已更新 1 年前