

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 具有資訊清單的 Install AWS Load Balancer 控制器
<a name="lbc-manifest"></a>

**提示**  
使用 Amazon EKS 自動模式，您無需安裝或升級聯網附加元件。自動模式包括 Pod 聯網和負載平衡功能。  
如需詳細資訊，請參閱[利用 EKS 自動模式自動運作叢集基礎設施](automode.md)。

本主題會說明如何透過下載和套用 Kubernetes 資訊清單來安裝控制器。您可以檢視 GitHub 上的完整控制器[文件](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/)。

在下列步驟中，使用您自己的值取代範例值。

## 先決條件
<a name="lbc-manifest-prereqs"></a>

開始本教學之前，您必須完成下列步驟：
+ 建立 Amazon EKS 叢集。若要建立服務角色，請參閱[開始使用 Amazon EKS](getting-started.md)。
+ 在您的本機電腦上安裝 [Helm](https://helm.sh/docs/helm/helm_install/)。
+ 請確保您的 Kubernetes 專用 Amazon VPC CNI 外掛程式、`kube-proxy` 及 CoreDNS 附加元件為[服務帳戶字符](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)中列出的最低版本。
+ 了解 AWS Elastic Load Balancing概念。如需詳細資訊，請參閱《[Elastic Load Balancing 使用者指南](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/)》。
+ 了解 Kubernetes [服務](https://kubernetes.io/docs/concepts/services-networking/service/)和[傳入](https://kubernetes.io/docs/concepts/services-networking/ingress/)資源。

### 考量事項
<a name="lbc-manifest-considerations"></a>

在繼續此頁面上的組態步驟之前，請考量下列情況：
+ IAM 政策和角色 (`AmazonEKSLoadBalancerControllerRole`) 可以在相同 AWS 帳戶中的多個 EKS 叢集之間重複使用。
+ 如果您要在最初建立角色 (`AmazonEKSLoadBalancerControllerRole`) 的相同叢集上安裝控制器，請在驗證角色存在後，前往[步驟 2：安裝 cert-manager](#lbc-cert)。
+ 如果您使用服務帳戶的 IAM 角色 (IRSA)，則必須為每個叢集設定 IRSA，而且角色信任政策中的 OpenID Connect (OIDC) 提供商 ARN 專屬於每個 EKS 叢集。此外，如果您要在具有現有 `AmazonEKSLoadBalancerControllerRole` 的新叢集上安裝控制器，請更新角色的信任政策，以包含新叢集的 OIDC 提供商，並使用適當的角色註釋來建立新的服務帳戶。若要判定您是否已經擁有 OIDC 提供商，或是要建立一個，則請參閱 [為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。

## 步驟 1：設定 IAM
<a name="lbc-iam"></a>

下列步驟參考 AWS Load Balancer控制器 v**2.14.1 **發行版本。如需有關所有發行版本的詳細資訊，請參閱 GitHub 上的 [AWS Load Balancer 控制器發行頁面](https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/)。

1. 下載 AWS Load Balancer控制器的 IAM 政策，允許其代表您呼叫 AWS APIs。  
**Example**  

------
#### [  AWS  ]

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
   ```

------
#### [  AWS GovCloud (US) ]

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy_us-gov.json
   ```

   ```
   mv iam_policy_us-gov.json iam_policy.json
   ```

------

1. 使用上一個步驟中下載的政策，建立 IAM 政策。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```
**注意**  
如果您在 中檢視政策 AWS 管理主控台，主控台會顯示 **ELB** 服務的警告，但不會顯示 **ELB v2** 服務的警告。發生這種情況是由於政策中存在適用於 **ELB v2** 的某些動作，但不適用於 **ELB**。您可以忽略這些對 **ELB** 發出的警告。

**Example**  

1. 使用叢集名稱取代 *my-cluster*，並使用帳戶 ID 取代 *111122223333*，然後執行命令。

   ```
   eksctl create iamserviceaccount \
     --cluster=my-cluster \
     --namespace=kube-system \
     --name=aws-load-balancer-controller \
     --role-name AmazonEKSLoadBalancerControllerRole \
     --attach-policy-arn=arn:aws: iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
     --approve
   ```

1. 擷取叢集的 OIDC 提供商 ID 並將其存放在變數中。

   ```
   oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
   ```

1. 判斷您的帳戶中是否已經有擁有叢集 ID 的 IAM OIDC 提供商。您需要為叢集和 IAM 設定 OIDC。

   ```
   aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
   ```

   如果有輸出傳回，則表示叢集已經擁有 IAM OIDC 提供商。如果未傳回任何輸出，則您必須為叢集建立 IAM OIDC 提供商。如需詳細資訊，請參閱[為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。

1. 將以下內容複製到您的裝置。使用您的帳戶 ID 取代 *111122223333*。將 *region-code* 取代為您的叢集所在的 AWS 區域。使用前一個步驟傳回的輸出值取代 *EXAMPLED539D4633E53DE1B71EXAMPLE*。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
               },
               "Action": "sts:AssumeRoleWithWebIdentity",
               "Condition": {
                   "StringEquals": {
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
                   }
               }
           }
       ]
   }
   ```

1. 建立 IAM 角色。

   ```
   aws iam create-role \
     --role-name AmazonEKSLoadBalancerControllerRole \
     --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
   ```

1. 將必要的 Amazon EKS 受管 IAM 政策連接到 IAM 角色。使用您的帳戶 ID 取代 *111122223333*。

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

1. 將以下內容複製到您的裝置。使用您的帳戶 ID 取代 *111122223333*。取代文字後，請執行已修改的命令以建立 `aws-load-balancer-controller-service-account.yaml` 檔案。

   ```
   cat >aws-load-balancer-controller-service-account.yaml <<EOF
   apiVersion: v1
   kind: ServiceAccount
   metadata:
     labels:
       app.kubernetes.io/component: controller
       app.kubernetes.io/name: aws-load-balancer-controller
     name: aws-load-balancer-controller
     namespace: kube-system
     annotations:
       eks.amazonaws.com/role-arn: arn:aws: iam::111122223333:role/AmazonEKSLoadBalancerControllerRole
   EOF
   ```

1. 在您的叢集上建立 Kubernetes 服務帳戶。名為 `aws-load-balancer-controller` 的 Kubernetes 服務帳戶使用您建立名為 *AmazonEKSLoadBalancerControllerRole* 的 IAM 角色進行註釋。

   ```
   kubectl apply -f aws-load-balancer-controller-service-account.yaml
   ```

## 步驟 2：安裝 `cert-manager`
<a name="lbc-cert"></a>

使用以下其中一個方法安裝 `cert-manager`，將憑證組態注入 Webhook。如需詳細資訊，請參閱 *cert-manager 文件*中的[入門](https://cert-manager.io/docs/installation/#getting-started)。

建議使用 `quay.io` 容器登錄檔來安裝 `cert-manager`。如果您的節點無法存取 `quay.io` 容器登錄檔，則請使用 Amazon ECR 安裝 `cert-manager` (請參閱下文)。

**Example**  

1. 如果您的節點可以存取 `quay.io` 容器登錄檔，請安裝 `cert-manager` 以將憑證組態注入 Webhook。

   ```
   kubectl apply \
       --validate=false \
       -f https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
   ```

1. 使用以下其中一個方法安裝 `cert-manager`，將憑證組態注入 Webhook。如需詳細資訊，請參閱 *cert-manager 文件*中的[入門](https://cert-manager.io/docs/installation/#getting-started)。

1. 下載清單檔案。

   ```
   curl -Lo cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
   ```

1. 提取以下映像並將其推送到節點可存取的儲存庫。有關如何提取、標記映像並將其推送到您儲存庫的詳細資訊，請參閱 [將容器映像從一個儲存庫複製到另一個儲存庫](copy-image-to-repository.md)。

   ```
   quay.io/jetstack/cert-manager-cainjector:v1.13.5
   quay.io/jetstack/cert-manager-controller:v1.13.5
   quay.io/jetstack/cert-manager-webhook:v1.13.5
   ```

1. 使用您的登錄檔名稱取代清單檔案中三個映像的 `quay.io`。下列命令假定私有儲存庫的名稱與來源儲存庫的名稱相同。使用私有登錄檔取代 *111122223333.dkr.ecr.region-code.amazonaws.com*。

   ```
   sed -i.bak -e 's|quay.io|111122223333.dkr.ecr.region-code.amazonaws.com|' ./cert-manager.yaml
   ```

1. 套用清單檔案。

   ```
   kubectl apply \
       --validate=false \
       -f ./cert-manager.yaml
   ```

## 步驟 3：Install AWS Load Balancer 控制器
<a name="lbc-install"></a>

1. 下載控制器規格。如需控制器的詳細資訊，請參閱 GitHub 上的[文件](https://kubernetes-sigs.github.io/aws-load-balancer-controller/)。

   ```
   curl -Lo v2_14_1_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_full.yaml
   ```

1. 對檔案進行以下編輯。

   1. 如果您已下載 `v2_14_1_full.yaml` 檔案，請執行下列命令以移除清單檔案中的 `ServiceAccount` 區段。如果您未移除此區段，則會覆寫您在前一個步驟中對服務帳戶所做的必要註解。如果您刪除控制器，移除此區段還可保留您在上一個步驟中建立的服務帳戶。

      ```
      sed -i.bak -e '764,772d' ./v2_14_1_full.yaml
      ```

      如果您下載不同的檔案版本，請在編輯器中開啟檔案並移除下列各行。

      ```
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        labels:
          app.kubernetes.io/component: controller
          app.kubernetes.io/name: aws-load-balancer-controller
        name: aws-load-balancer-controller
        namespace: kube-system
      ---
      ```

   1. 使用叢集名稱取代 *my-cluster*，從而使用叢集名稱取代檔案的 `Deployment` `spec` 區段中的 `your-cluster-name`。

      ```
      sed -i.bak -e 's|your-cluster-name|my-cluster|' ./v2_14_1_full.yaml
      ```

   1. 如果您的節點無法存取 Amazon EKS Amazon ECR 映像儲存庫，則需要提取下列映像並將其推送到節點可存取的儲存庫。有關如何提取、標記映像並將其推送到您儲存庫的詳細資訊，請參閱 [將容器映像從一個儲存庫複製到另一個儲存庫](copy-image-to-repository.md)。

      ```
      public.ecr.aws/eks/aws-load-balancer-controller:v2.14.1
      ```

      將您的登錄檔名稱新增至資訊清單。下列命令假定私有儲存庫的名稱與來源儲存庫的名稱相同，並將您的私有登錄檔名稱新增至檔案中。使用您的登錄檔取代 *111122223333.dkr.ecr.region-code.amazonaws.com*。此行假定您將私有儲存庫命名為與來源儲存庫相同的名稱。如果沒有，請將私有登錄檔名稱後的 `eks/aws-load-balancer-controller` 文字變更為儲存庫名稱。

      ```
      sed -i.bak -e 's|public.ecr.aws/eks/aws-load-balancer-controller|111122223333.dkr.ecr.region-code.amazonaws.com/eks/aws-load-balancer-controller|' ./v2_14_1_full.yaml
      ```

   1. (僅 Fargate 或受限制的 IMDS 需要)

      如果您要將控制器部署到[限制存取 Amazon EC2 執行個體中繼資料服務 (IMDS)](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 的 Amazon EC2 節點，或者如果您正在部署到 Fargate 或 Amazon EKS 混合節點，那麼請在 `- args:` 下新增 `following parameters`。

      ```
      [...]
      spec:
            containers:
              - args:
                  - --cluster-name=your-cluster-name
                  - --ingress-class=alb
                  - --aws-vpc-id=vpc-xxxxxxxx
                  - --aws-region=region-code
      
      
      [...]
      ```

1. 套用檔案。

   ```
   kubectl apply -f v2_14_1_full.yaml
   ```

1. 將 `IngressClass` 和 `IngressClassParams` 清單檔案下載至叢集。

   ```
   curl -Lo v2.14.1_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_ingclass.yaml
   ```

1. 將清單檔案套用至叢集。

   ```
   kubectl apply -f v2_14_1_ingclass.yaml
   ```

## 步驟 4：確認控制器已安裝
<a name="lbc-verify"></a>

1. 確認控制器已安裝。

   ```
   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
   ```

   如果使用 Helm 進行部署，則會收到先前的輸出。如果使用 Kubernetes 清單檔案進行部署，則您只有一個複本。

1. 使用控制器佈建 AWS 資源之前，您的叢集必須符合特定需求。如需詳細資訊，請參閱[透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md)及[透過 Network Load Balancer 路由 TCP 與 UDP 流量](network-load-balancing.md)。