

 **協助改進此頁面** 

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

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

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

# 使用 AWS Load Balancer控制器路由網際網路流量
<a name="aws-load-balancer-controller"></a>

**提示**  
 [註冊](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即將舉行的 Amazon EKS 研討會。

The AWS Load Balancer 控制器會管理 Kubernetes 叢集的 AWS Elastic Load Balancer。您可透過此控制器將叢集應用程式開放至網際網路。控制器會佈建指向叢集服務或輸入資源的 AWS 負載平衡器。換言之，控制器會建立單一 IP 位址或 DNS 名稱，並將其指向叢集中的多個 Pod。

![\[架構圖。示意圖流程：網際網路使用者的流量到達 Amazon 負載平衡器。負載平衡器將流量分散至叢集中的 Pod。\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/lbc-overview.png)


控制器會持續監控 Kubernetes Ingress 或 Service 資源。為了回應，它會建立適當的 AWS Elastic Load Balancing資源。您可透過在 Kubernetes 資源上套用註解，設定負載平衡器的特定行為。例如，您可以使用註釋將 AWS 安全群組連接至負載平衡器。

控制器會佈建以下資源：

 **Kubernetes `Ingress` **   
LBC 會在您建立 `Ingress` 時，建立 [AWS Application Load Balancer (ALB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)。[請檢閱可套用至 Ingress 資源的註釋。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)

 **類型為 `LoadBalancer` 的 Kubernetes 服務**   
LBC 會在您建立類型 `LoadBalancer` 的 Kubernetes 服務時，建立 [AWS Network Load Balancer (NLB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html)。[請檢閱可套用至 Service 資源的註釋。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/)  
在過去，Kubernetes Network Load Balancer 用於*執行個體*目標，但 LBC 用於 *IP* 目標。使用 AWS Load Balancer控制器版本 `2.3.0` 或更新版本，您可以使用任一目標類型建立 NLBs。如需 NLB 目標類型的詳細資訊，請參閱《Network Load Balancer 使用者指南》中的[目標類型](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#target-type)。

此控制器是託管於 GitHub 上的 [開源專案](https://github.com/kubernetes-sigs/aws-load-balancer-controller)。

在部署控制器之前，我們建議您先檢閱[透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md)與 [透過 Network Load Balancer 路由 TCP 與 UDP 流量](network-load-balancing.md) 中的先決條件和考量事項。在這些主題中，您將部署包含 AWS 負載平衡器的範例應用程式。

 **Kubernetes `Gateway` API**   
使用 AWS Load Balancer控制器版本 `2.14.0`或更新版本時，LBC 會在您建立 Kubernetes 時建立 [AWS Application Load Balancer (ALB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)`Gateway`。Kubernetes Gateway 會將比輸入更多的組態標準化，這需要許多常見選項的自訂註釋。[檢閱您可以套用至閘道資源的組態。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/gateway/gateway/)如需 `Gateway` API 的詳細資訊，請參閱 Kubernetes 文件中的[閘道 API](https://kubernetes.io/docs/concepts/services-networking/gateway/)。

## 安裝控制器
<a name="lbc-overview"></a>

您可以使用下列其中一個程序來安裝 AWS Load Balancer控制器：
+ 如果您是初次使用 Amazon EKS，我們建議您使用 Helm 進行安裝，因為它可簡化 AWS Load Balancer控制器安裝。如需詳細資訊，請參閱[搭配 Helm 的 Install AWS Load Balancer 控制器](lbc-helm.md)。
+ 若需進階設定，如對公有容器登錄庫的網路存取受限的叢集，請使用 Kubernetes 資訊清單。如需詳細資訊，請參閱[具有資訊清單的 Install AWS Load Balancer 控制器](lbc-manifest.md)。

## 從已淘汰的控制器版本移轉
<a name="lbc-deprecated"></a>
+ 如果您已安裝已棄用版本的 AWS Load Balancer控制器，請參閱 [從已棄用的 ALB 傳入控制器移轉應用程式](lbc-remove.md)。
+ 已棄用的版本無法升級。必須移除它們，並安裝目前版本的 AWS Load Balancer控制器。
+ 已棄用的版本包含：
  +  AWS 適用於 Kubernetes 的 ALB 傳入控制器 (「傳入控制器」)，是 AWS Load Balancer控制器的前身。
  + 任何`0.1.x `版本的 AWS Load Balancer控制器

## 舊版雲端供應商
<a name="lbc-legacy"></a>

Kubernetes 包含 AWS的舊版雲端供應商。舊版雲端提供者能夠佈建 AWS 負載平衡器，類似於 AWS Load Balancer控制器。舊版雲端供應商建立的是 Classic Load Balancer。如果您未安裝 AWS Load Balancer控制器，Kubernetes 會預設為使用舊版雲端提供者。您應該安裝 AWS Load Balancer控制器，並避免使用舊版雲端提供者。

**重要**  
在 2.5 版和更新版本中， AWS Load Balancer控制器會使用 成為 Kubernetes *服務*資源的預設控制器，`type: LoadBalancer`並為每個服務建立 AWS Network Load Balancer (NLB)。它透過為服務製作變異的 webhook 來做到這一點，此 webhook 會為 `type: LoadBalancer` 的新服務將 `spec.loadBalancerClass` 欄位設定至 `service.k8s.aws/nlb`。您可以關閉此功能並恢復為使用[舊式雲端供應商](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/#legacy-cloud-provider)作為預設控制器，方法是將 Helm Chart 值 `enableServiceMutatorWebhook` 設定為 `false`。除非您關閉此功能，否則叢集不會為您的服務佈建新的 Classic Load Balancer。現有的 Classic Load Balancer 會繼續運作。

# 搭配 Helm 的 Install AWS Load Balancer 控制器
<a name="lbc-helm"></a>

**提示**  
 [註冊](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即將舉行的 Amazon EKS 研討會。

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

本主題說明如何使用 Helm、Kubernetes 套件管理員 和 安裝 AWS Load Balancer控制器`eksctl`。已使用預設選項安裝控制器。如需有關控制器的詳細資訊，包括使用註釋設定控制器的詳細資訊，請參閱 GitHub 上的[AWS Load Balancer 控制器文件](https://kubernetes-sigs.github.io/aws-load-balancer-controller/)。

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

## 先決條件
<a name="lbc-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-considerations"></a>

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

## 步驟 1：使用 `eksctl` 建立 IAM 角色
<a name="lbc-helm-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。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
   ```
   + 如果您是非標準 AWS 分割區，例如政府或中國區域，[請檢閱 GitHub 上的政策](https://github.com/kubernetes-sigs/aws-load-balancer-controller/tree/main/docs/install)，並下載適用於您區域的適當政策。

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

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

1. 取代叢集名稱、區域代碼和帳戶 ID 的值。

   ```
   eksctl create iamserviceaccount \
       --cluster=<cluster-name> \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws: iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region <aws-region-code> \
       --approve
   ```

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

1. 新增 `eks-charts` Helm Chart 儲存庫。 會在 GitHub 上 AWS 維護[此儲存庫](https://github.com/aws/eks-charts)。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. 更新您的本機儲存庫，以確定您擁有最新的圖表。

   ```
   helm repo update eks
   ```

1. 安裝 AWS Load Balancer控制器。

   如果您要將控制器部署到[限制存取 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 混合節點，則請將以下旗標新增到以下 `helm` 命令中：
   +  `--set region=region-code ` 
   +  `--set vpcId=vpc-xxxxxxxx ` 

     使用您叢集的名稱取代 *my-cluster*。在下列命令中，`aws-load-balancer-controller` 是您在上一個步驟中建立的 Kubernetes 服務帳戶。

     如需設定 Helm Chart 的詳細資訊，請參閱 GitHub 上的 [values.yaml](https://github.com/aws/eks-charts/blob/master/stable/aws-load-balancer-controller/values.yaml)。

     ```
     helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
       -n kube-system \
       --set clusterName=my-cluster \
       --set serviceAccount.create=false \
       --set serviceAccount.name=aws-load-balancer-controller \
       --version 1.14.0
     ```

**重要**  
部署的圖表不會自動接收安全更新。當圖表可用時，您需要手動升級到較新的圖表。升級時，請將先前命令中的*安裝*變更為 `upgrade`。

`helm install` 命令會自動安裝控制器的自訂資源定義 (CRD)。`helm upgrade` 命令則不會。如果您使用 `helm upgrade,`，則必須手動安裝 CRD。執行下列命令以安裝 CRD：

```
wget https://raw.githubusercontent.com/aws/eks-charts/master/stable/aws-load-balancer-controller/crds/crds.yaml
kubectl apply -f crds.yaml
```

## 步驟 3：確認控制器已安裝
<a name="lbc-helm-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)。

# 具有資訊清單的 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)。

# 從已棄用的 ALB 傳入控制器移轉應用程式
<a name="lbc-remove"></a>

本主題會說明如何從已棄用的控制器版本移轉。更具體地說，它描述了如何移除已棄用版本的 AWS Load Balancer控制器。
+ 已棄用的版本無法升級。您必須先將其移除，然後再安裝目前版本。
+ 已棄用的版本包含：
  +  AWS 適用於 Kubernetes 的 ALB 傳入控制器 (「傳入控制器」)，是 AWS Load Balancer控制器的前身。
  + 任何`0.1.x `版本的 AWS Load Balancer控制器

## 移除已棄用的控制器版本
<a name="lbc-remove-desc"></a>

**注意**  
您可能已經使用 Helm 或手動使用 Kubernetes 資訊清單安裝已棄用的版本。請使用最初使用安裝的工具來完成此程序。

1. 如果您安裝了 `incubator/aws-alb-ingress-controller` Helm Chart，請將其解除安裝。

   ```
   helm delete aws-alb-ingress-controller -n kube-system
   ```

1. 如果您安裝了第 `0.1.x ` 版的 `eks-charts/aws-load-balancer-controller` 圖表，請將其解除安裝。由於與 Webhook API 版本不相容，無法從 `0.1.x ` 升級至版本 `1.0.0`。

   ```
   helm delete aws-load-balancer-controller -n kube-system
   ```

1. 檢查目前是否已安裝控制器。

   ```
   kubectl get deployment -n kube-system alb-ingress-controller
   ```

   如果未安裝控制器，則此為輸出。

   ```
   Error from server (NotFound): deployments.apps "alb-ingress-controller" not found
   ```

   如果已安裝控制器，則此為輸出。

   ```
   NAME                   READY UP-TO-DATE AVAILABLE AGE
   alb-ingress-controller 1/1   1          1         122d
   ```

1. 輸入下列命令以移除控制器。

   ```
   kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml
   kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
   ```

## 遷移至 AWS Load Balancer控制器
<a name="lbc-migrate"></a>

若要從 Kubernetes 的 ALB 傳入控制器遷移至 AWS Load Balancer控制器，您需要：

1. 移除 ALB 傳入控制器 (請參閱上文)。

1.  [安裝 AWS Load Balancer控制器。](aws-load-balancer-controller.md#lbc-overview)

1. 將其他政策新增至 AWS Load Balancer控制器所使用的 IAM 角色。此政策允許 LBC 管理適用於 Kubernetes 的 ALB 傳入控制器建立的資源。

1. 下載 IAM 政策。此政策允許 AWS Load Balancer控制器管理由適用於 Kubernetes 的 ALB 傳入控制器建立的資源。您也可以[檢視政策](https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_v1_to_v2_additional.json)。

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

1. 如果您的叢集位於 AWS GovCloud （美國東部） 或 AWS GovCloud （美國西部） AWS 區域，請將 取代` arn:aws: `為 `arn:aws-us-gov:`。

   ```
   sed -i.bak -e 's|arn:aws:|arn:aws-us-gov:|' iam_policy_v1_to_v2_additional.json
   ```

1. 建立 IAM 政策並記下傳回的 ARN。

   ```
   aws iam create-policy \
     --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy \
     --policy-document file://iam_policy_v1_to_v2_additional.json
   ```

1. 將 IAM 政策連接至 AWS Load Balancer控制器所使用的 IAM 角色。將 *your-role-name* 取代為角色的名稱，例如 `AmazonEKSLoadBalancerControllerRole`。

   如果使用 `eksctl` 建立角色，然後要尋找已建立的角色名稱，請開啟 [AWS CloudFormation 主控台](https://console.aws.amazon.com/cloudformation)，然後選取 **eksctl-*my-cluster*-addon-iamserviceaccount-kube-system-aws-load-balancer-controller** 堆疊。選取 **Resources (資源)** 標籤。角色名稱位於 **Physical ID** (實體 ID) 欄。

   ```
   aws iam attach-role-policy \
     --role-name your-role-name \
     --policy-arn arn:aws: iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
   ```