

 **協助改進此頁面** 

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

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

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

# 透過 Application Load Balancer 路由應用程式與 HTTP 流量
<a name="alb-ingress"></a>

**注意**  
 **新功能：**Amazon EKS 自動模式現可自動執行負載平衡的常規任務。如需詳細資訊，請參閱：  
 [將範例負載平衡器工作負載部署至 EKS 自動模式](auto-elb-example.md) 
 [建立 IngressClass 以設定 Application Load Balancer](auto-configure-alb.md) 

當您建立 Kubernetes 時`ingress`，會佈建 an AWS Application Load Balancer (ALB)，以平衡應用程式流量。如需進一步了解，請參閱《Application Load Balancer 使用者指南》中的[什麼是 Application Load Balancer？](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)和 Kubernetes 文件中的[傳入](https://kubernetes.io/docs/concepts/services-networking/ingress/)。ALBs 可與部署到節點或 AWS Fargate 的 Pod 搭配使用。您可以將 ALB 部署到公有或私有子網路。

應用程式流量會在 OSI 模型的 `L7` 平衡。若要負載平衡 `L4` 的網路流量，您可以部署 `LoadBalancer` 類型的 Kubernetes `service`。此類型佈建 AWS Network Load Balancer。如需詳細資訊，請參閱[透過 Network Load Balancer 路由 TCP 與 UDP 流量](network-load-balancing.md)。若要進一步了解兩種負載平衡類型之間的差異，請參閱 AWS 網站上的 [Elastic Load Balancing 功能](https://aws.amazon.com/elasticloadbalancing/features/)。

## 先決條件
<a name="_prerequisites"></a>

在將應用程式流量負載平衡到應用程式之前，您必須符合以下要求。
+ 擁有現有的叢集。如果沒有現有叢集，請參閱 [開始使用 Amazon EKS](getting-started.md)。如果您需要更新現有叢集的版本，請參閱 [將現有叢集更新至全新 Kubernetes 版本](update-cluster.md)。
+ 在您的叢集上部署 AWS Load Balancer控制器。如需詳細資訊，請參閱[使用 AWS Load Balancer控制器路由網際網路流量](aws-load-balancer-controller.md)。我們建議使用 `2.7.2` 版或更新版本。
+ 至少兩個子網路位於不同的可用區域。 AWS Load Balancer控制器會從每個可用區域選擇一個子網路。當在可用區域中找到多個標記的子網路時，控制器會根據其子網路 ID 依詞典編纂順序來選擇子網路。每個子網路必須至少有 8 個可用的 IP 地址。

  如果使用連接至工作節點的多個安全群組，則必須依如下方式標記一個安全群組。使用您的叢集名稱取代 *my-cluster*。
  +  **索引鍵**：`kubernetes.io/cluster/<my-cluster>`
  +  **值**：`shared` 或 `owned` 
+ 如果您使用的是 AWS Load Balancer控制器版本 `2.1.1`或更早版本，子網路必須以下列格式標記。如果使用版本 `2.1.2` 或更新版本，則不一定要加上標籤。不過，如果出現下列任何情況，我們建議您標記子網路。您有多個叢集正在相同的 VPC 中執行，或是有多個 AWS 服務在 VPC 中共用子網路。或者，您希望更好地控制為每個叢集佈建負載平衡器的位置。使用您的叢集名稱取代 *my-cluster*。
  +  **索引鍵**：`kubernetes.io/cluster/<my-cluster>`
  +  **值**：`shared` 或 `owned` 
+ 您的公有和私有子網路必須符合下列要求，除非明確指定子網路 ID 作為服務或傳入物件上的註釋。假設您透過明確指定子網路 ID 作為服務或傳入物件上的註釋來佈建負載平衡器。在此情況下，Kubernetes 和 AWS 負載平衡器控制器會直接使用這些子網路來建立負載平衡器，而且不需要下列標籤。
  +  **私有子網路**：必須使用下列格式進行標記。這是為了讓 Kubernetes 和 AWS 負載平衡器控制器知道子網路可用於內部負載平衡器。如果您在 2020 年 3 月 26 日之後使用 `eksctl`或 Amazon EKS AWS CloudFormation 範本建立 VPC，子網路會在建立時適當標記。如需 Amazon EKS AWS CloudFormation VPC 範本的詳細資訊，請參閱 [為您的 Amazon EKS 叢集建立 Amazon VPC](creating-a-vpc.md)。
    +  **索引鍵**：`kubernetes.io/role/internal-elb`
    +  **值**：`1`
  +  **公有子網路**：必須使用下列格式進行標記。這是為了讓 Kubernetes 知道只使用為外部負載平衡器指定的子網路。如此一來，Kubernetes 不會在每個可用區域中選擇公有子網路 (根據其子網路 ID 依詞典編纂順序)。如果您在 2020 年 3 月 26 日之後使用 `eksctl`或 Amazon EKS AWS CloudFormation 範本建立 VPC，子網路會在建立時適當標記。如需 Amazon EKS AWS CloudFormation VPC 範本的詳細資訊，請參閱 [為您的 Amazon EKS 叢集建立 Amazon VPC](creating-a-vpc.md)。
    +  **索引鍵**：`kubernetes.io/role/elb`
    +  **值**：`1`

  如果沒有明確新增子網路角色標籤，則 Kubernetes 服務控制器會檢查叢集 VPC 子網路的路由表。這是為了判斷子網路是私有還是公有。建議您不要依賴此行為。而是明確地新增私有或公有角色標籤。The AWS Load Balancer 控制器不會檢查路由表。其還需要存在私有和公有標籤才能成功自動探索。
+ 每當在具有 `kubernetes.io/ingress.class: alb`註釋的叢集上建立 Kubernetes 輸入 AWS 資源時，[AWS Load Balancer控制器](https://github.com/kubernetes-sigs/aws-load-balancer-controller)都會建立 ALBs 和必要的支援資源。傳入資源設定 ALB 在叢集內透過 HTTP 或 HTTPS 路由到不同的 Pod。若要確保您的輸入物件使用 AWS Load Balancer控制器，請將下列註釋新增至 Kubernetes 輸入規格。如需詳細資訊，請參閱 GitHub 上的[傳入規格](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/spec/)。

  ```
  annotations:
      kubernetes.io/ingress.class: alb
  ```
**注意**  
如果您正在負載平衡至 `IPv6` Pod，請新增以下註釋到您的傳入規格。您只能在 `IPv6` 上負載平衡至 IP 目標，而不能負載平衡執行個體目標。如果沒有此註釋，負載平衡將在 `IPv4` 上執行。

  ```
  alb.ingress.kubernetes.io/ip-address-type: dualstack
  ```
+  AWS Load Balancer控制器支援下列流量模式：
  +  **執行個體** – 將叢集中的節點註冊作為 ALB 的目標。到達 ALB 的流量被路由到服務的 `NodePort`，然後代理到您的 Pod。這是預設的流量模式。您也可以使用 `alb.ingress.kubernetes.io/target-type: instance` 註釋明確指定它。
**注意**  
您的 Kubernetes 服務必須指定要使用此流量模式的 `NodePort` 或 `LoadBalancer` 類型。
  +  **IP**：註冊 Pod 作為 ALB 的目標。到達 ALB 的流量會直接路由到服務的 Pod。您必須指定 `alb.ingress.kubernetes.io/target-type: ip` 註釋才能使用此流量模式。當目標 Pod 在 Fargate 或 Amazon EKS 混合節點上執行時，必須使用 IP 目標類型。
+ 要標記由控制器建立的 ALB，請新增以下註釋至控制器：`alb.ingress.kubernetes.io/tags`。如需 AWS Load Balancer控制器支援的所有可用註釋清單，請參閱 GitHub 上的[傳入註釋](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)。
+ 升級或降級 ALB 控制器版本可能會導致依賴控制器的功能發生重大變化。如需有關每個版本中引入的重大變更的詳細資訊，請參閱 GitHub 上的 [ALB 控制器版本備註](https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases)。

## 透過輸入群組重複使用 ALB
<a name="_reuse_albs_with_ingress_groups"></a>

您可使用 `IngressGroups` 跨多個服務資源共用 Application Load Balancer。

若要將傳入加入群組，請將下列註解新增至 Kubernetes 傳入資源規格。

```
alb.ingress.kubernetes.io/group.name: my-group
```

群組名稱必須：
+ 是 63 個字元或以下的長度。
+ 由小寫字母、數字、`-` 和 `.` 組成 
+ 開頭和結尾為字母或數字。

控制器會自動合併相同傳入群組中所有傳入的傳入規則。控制器透過單個 ALB 提供支援。在傳入中定義的大多數註解僅適用於該傳入定義的路徑。根據預設，傳入資源不屬於任何傳入群組。

**警告**  
 **潛在的安全風險**   
僅當所有具有建立或修改傳入資源之 RBAC 許可的 Kubernetes 使用者都在相同的信任界限內時，才為傳入指定傳入群組。如果您使用群組名稱新增註釋，其他 Kubernetes 使用者可以建立或修改其傳入，使其屬於同一傳入群組。這樣做可能會產生不良行為，例如以較高優先順序規則覆寫現有規則。

您可以新增傳入資源的訂單編號。

```
alb.ingress.kubernetes.io/group.order: '10'
```

該編號可以是 1 到 1000 之間的數字。系統會先評估相同傳入群組中所有傳入數量的最低數量。系統會使用 0 值評估沒有此注釋的所有傳入。具有較高數量的重複規則可以覆寫具有較低數量的規則。根據預設，相同傳入群組中傳入之間的規則順序是由命名空間和名稱依詞典編纂順序決定。

**重要**  
確定相同傳入群組中的每個傳入都有唯一的優先順序編號。您不能在整個傳入中有重複的訂單編號。

## (選用) 部署範例應用程式
<a name="application-load-balancer-sample-application"></a>
+ 叢集 VPC 中必須至少有一個公有或私有子網路。
+ 在您的叢集上部署 AWS Load Balancer控制器。如需詳細資訊，請參閱[使用 AWS Load Balancer控制器路由網際網路流量](aws-load-balancer-controller.md)。我們建議使用 `2.7.2` 版或更新版本。

您可以在具有 Amazon EC2 節點、Fargate Pod 或兩者兼有的叢集上執行範例應用程式。

1. 如果您沒有部署到 Fargate，請略過此步驟。如果您要部署到 Fargate，請建立 Fargate 描述檔。您可以透過執行下列命令來建立描述檔，也可以使用命令中 `name` 和 `namespace` 相同的值藉由 [AWS 管理主控台](fargate-profile.md#create-fargate-profile) 進行。使用自己的取代範例值。

   ```
   eksctl create fargateprofile \
       --cluster my-cluster \
       --region region-code \
       --name alb-sample-app \
       --namespace game-2048
   ```

1. 將遊戲 [2048](https://play2048.co/) 部署為範例應用程式，以確認 AWS Load Balancer控制器建立 ALB AWS 作為輸入物件的結果。針對您正在部署的子網路類型，完成相關的步驟。

   1. 如果要部署到使用 `IPv6` 系列建立的叢集中的 Pod，請跳到下一步。
      +  **公有**::

      ```
      kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/examples/2048/2048_full.yaml
      ```
      +  **私有**::

        1. 下載清單檔案。

           ```
           curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/examples/2048/2048_full.yaml
           ```

        1. 編輯檔案並尋找顯示 `alb.ingress.kubernetes.io/scheme: internet-facing` 的行。

        1. 將*面向網際網路*變更為 `internal` 並儲存檔案。

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

           ```
           kubectl apply -f 2048_full.yaml
           ```

   1. 如果要部署到使用 [IPv6 系列](cni-ipv6.md)建立的叢集中的 Pod，請完成下列步驟。

      1. 下載清單檔案。

         ```
         curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/examples/2048/2048_full.yaml
         ```

      1. 在編輯器中開啟檔案，然後在傳入規格中新增以下一行註釋。

         ```
         alb.ingress.kubernetes.io/ip-address-type: dualstack
         ```

      1. 如果您正在負載平衡至內部 Pod，而不是面向網際網路的 Pod，請變更該行，即將 `alb.ingress.kubernetes.io/scheme: internet-facing ` 變更為 `alb.ingress.kubernetes.io/scheme: internal` 

      1. 儲存檔案。

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

         ```
         kubectl apply -f 2048_full.yaml
         ```

1. 幾分鐘後，使用下列指令來驗證傳入資源已建立。

   ```
   kubectl get ingress/ingress-2048 -n game-2048
   ```

   範例輸出如下。

   ```
   NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGE
   ingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.region-code.elb.amazonaws.com   80      2m32s
   ```
**注意**  
若在私有子網路中建立負載平衡器，則先前輸出中位於 `ADDRESS` 下的值前面會加上 `internal-`。

如果您的輸入在幾分鐘後未成功建立，請執行下列命令來檢視 AWS Load Balancer控制器日誌。這些日誌可能包含錯誤訊息，您可用於診斷部署的相關問題。

```
kubectl logs -f -n kube-system -l app.kubernetes.io/instance=aws-load-balancer-controller
```

1. 如果您部署公有子網路，請開啟瀏覽器，再導覽至先前指令輸出中的 `ADDRESS` URL 查看範例應用程式。如果沒有看到任何內容，請重新整理瀏覽器，然後再試一次。如果您部署至私有子網路，則需要從 VPC 內的裝置 (例如堡壘主機) 檢視頁面。如需詳細資訊，請參閱 [AWS上的 Linux 堡壘主機](https://aws.amazon.com/quickstart/architecture/linux-bastion/)。  
![\[2048 範例應用程式\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/2048.png)

1. 完成對範例應用程式的實驗後，請透過執行下列命令之一將其刪除。
   + 如果您應用了清單檔案，而不是應用下載的複本，請使用以下命令。

     ```
     kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/examples/2048/2048_full.yaml
     ```
   + 如果您下載並編輯清單檔案，請使用下列命令。

     ```
     kubectl delete -f 2048_full.yaml
     ```