

 **協助改進此頁面** 

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

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

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

# 透過 Network Load Balancer 路由 TCP 與 UDP 流量
<a name="network-load-balancing"></a>

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

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

當您建立類型為 `Service`的 Kubernetes 時`LoadBalancer`， AWS 雲端提供者負載平衡器控制器預設會建立 AWS [Classic Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html)，但也可以建立 AWS [Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html)。此控制器將來僅接收關鍵錯誤修正。如需使用 AWS 雲端提供者負載平衡器 的詳細資訊，請參閱 Kubernetes 文件中的[AWS 雲端提供者負載平衡器控制器](https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)。本主題中不涉及其使用方式。

我們建議您使用版本 `2.7.2`或更新版本的 [AWS Load Balancer Controller](aws-load-balancer-controller.md)，而非 AWS 雲端提供者負載平衡器控制器。The AWS Load Balancer 控制器會建立 AWS Network Load Balancer，但不會建立 AWS Classic Load Balancer。本主題的其餘部分是關於使用 AWS Load Balancer控制器。

 AWS Network Load Balancer 可以將網路流量負載平衡至部署至 Amazon EC2 IP 和執行個體[目標](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#target-type)的 Pod、 AWS Fargate IP 目標或部署至 Amazon EKS 混合節點做為 IP 目標。如需詳細資訊，請參閱 GitHub 上的 [AWS Load Balancer 控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/targetgroupbinding/targetgroupbinding/#targettype)。

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

您必須先符合下列要求，才能使用 AWS Load Balancer控制器來負載平衡網路流量。
+ 擁有現有的叢集。如果沒有現有叢集，請參閱 [開始使用 Amazon EKS](getting-started.md)。如果您需要更新現有叢集的版本，請參閱 [將現有叢集更新至全新 Kubernetes 版本](update-cluster.md)。
+ 在您的叢集上部署 AWS Load Balancer控制器。如需詳細資訊，請參閱[使用 AWS Load Balancer控制器路由網際網路流量](aws-load-balancer-controller.md)。我們建議使用 `2.7.2` 版或更新版本。
+ 至少有一個子網路。若在可用區域中找到多個標記的子網路，控制器會根據其子網路 ID 依詞典編纂順序來選擇第一個子網路。子網路必須至少有 8 個可用的 IP 地址。
+ 如果您使用的是 AWS Load Balancer控制器版本 `2.1.1`或更早版本，子網路必須標記如下。如果使用版本 `2.1.2` 或更新版本，則此標籤是選用的。如果您有多個叢集在相同 VPC 中執行，或多個 AWS 服務在 VPC 中共用子網路，並希望進一步控制為每個叢集佈建負載平衡器的位置，您可能會想要標記子網路。如果您明確指定子網路 IDs做為服務物件上的註釋，則 Kubernetes 和 AWS Load Balancer控制器會直接使用這些子網路來建立負載平衡器。如果選擇使用此方法來佈建負載平衡器，而且可以略過下列私有和公有子網路標記要求，則不需要標記子網路。使用您的叢集名稱取代 *my-cluster*。
  +  **索引鍵**：`kubernetes.io/cluster/<my-cluster>`
  +  **值**：`shared` 或 `owned` 
+ 您的公有和私有子網路必須符合下列要求，除非您明確指定子網路 ID 作為服務或傳入物件上的註釋。如果您透過明確指定子網路 IDs做為服務或輸入物件的註釋來佈建負載平衡器，則 Kubernetes 和 AWS Load Balancer控制器會直接使用這些子網路來建立負載平衡器，而且不需要下列標籤。
  +  **私有子網路**：必須使用下列格式進行標記。這是為了讓 Kubernetes 和 AWS Load Balancer控制器知道子網路可用於內部負載平衡器。2020 年 3 月 26 日之後，若使用 `eksctl` 或 Amazon EKS AWS AWS CloudFormation 範本建立 VPC，則建立子網路時會適當加上標籤。如需 Amazon EKS AWS AWS CloudFormation VPC 範本的詳細資訊，請參閱 [為您的 Amazon EKS 叢集建立 Amazon VPC](creating-a-vpc.md)。
    +  **索引鍵**：`kubernetes.io/role/internal-elb`
    +  **值**：`1`
  +  **公有子網路**：必須使用下列格式進行標記。這是為了讓 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 Service 控制器會檢查叢集 VPC 子網路的路由表，以判定子網路是私有還是公有。建議您不要依賴此行為，而是明確地新增私有或公有角色標籤。The AWS Load Balancer 控制器不會檢查路由表，需要私有和公有標籤才能成功自動探索。

## 考量事項
<a name="_considerations"></a>
+ 負載平衡器的組態是由加入至該服務清單檔案的註釋所控制。使用 AWS Load Balancer控制器的服務註釋與使用 AWS 雲端提供者負載平衡器控制器的服務註釋不同。部署服務之前，請務必檢閱 AWS Load Balancer控制器[的註釋](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/)。
+ 使用適用於 [Kubernetes 的 Amazon VPC CNI 外掛程式](managing-vpc-cni.md)時， AWS Load Balancer控制器可以將平衡負載到 Amazon EC2 IP 或執行個體目標和 Fargate IP 目標。當使用[替代相容 CNI 外掛程式](alternate-cni-plugins.md)時，控制器僅能針對執行個體目標進行負載平衡，除非您要對 Amazon EKS 混合節點進行負載平衡。對於混合節點，控制器可以對 IP 目標進行負載平衡。如需 Network Load Balancer 目標類型的詳細資訊，請參閱 Network Load Balancer 使用者指南中的[目標類型](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#target-type)。
+ 如果要在建立負載平衡器時或之後將標籤新增至負載平衡器，請在服務規格中新增下列註釋。如需詳細資訊，請參閱 AWS Load Balancer控制器文件中[AWS 的資源標籤](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/#aws-resource-tags)。

  ```
  service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags
  ```
+ 您可以透過新增以下注釋將[彈性 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)指派至 Network Load Balancer。使用彈性 IP 地址`Allocation IDs`的 取代範例值。`Allocation IDs` 的數量必須與負載平衡器所使用的子網路數量一致。如需詳細資訊，請參閱 [AWS Load Balancer 控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/#eip-allocations)說明文件。

  ```
  service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-xxxxxxxxxxxxxxxxx,eipalloc-yyyyyyyyyyyyyyyyy
  ```
+ Amazon EKS 會為用戶端流量新增一個傳入規則到節點的安全群組，並為 VPC 中的每個負載平衡器子網路新增一個規則，以對您所建立的每個 Network Load Balancer 進行運作狀態檢查。如果 Amazon EKS 嘗試建立超過安全群組允許之規則數量上限配額的規則，則 `LoadBalancer` 類型的服務部署可能會失敗。如需詳細資訊，請參閱《Amazon VPC 使用者指南》中 Amazon VPC 配額的[安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-security-groups)。請考慮下列選項，將超過安全群組規則數量上限的機會降至最低：
  + 請求提高每個安全群組規則的配額。如需詳細資訊，請參閱《Service Quotas 使用者指南》中的[請求提高配額](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)。
  + 使用 IP 目標，而不是執行個體目標。使用 IP 目標時，您可以共用相同目標連接埠的規則。您可以使用註釋手動指定負載平衡器子網路。如需詳細資訊，請參閱 GitHub 上的[注釋](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/)。
  + 使用傳入，而不是類型服務 `LoadBalancer` 將流量傳送至您的服務。The AWS Application Load Balancer 所需的規則少於 Network Load Balancer。您可在多個輸入之間共用 ALB。如需詳細資訊，請參閱[透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md)。您不能在多個服務之間共用 Network Load Balancer。
  + 將叢集部署到多個帳戶。
+ 如果您的 Pod 在 Windows 上執行，則在 Amazon EKS 叢集中，具有負載平衡器的單一服務最多可支援 1024 個後端 Pod。每個 Pod 都有自己的唯一 IP 地址。
+ 我們建議僅使用負載平衡器控制器建立新的 Network AWS Load Balancer。嘗試取代使用 AWS 雲端提供者負載平衡器控制器建立的現有 Network Load Balancer 可能會導致多個 Network Load Balancer，這可能會導致應用程式停機。

## 建立 Network Load Balancer
<a name="network-load-balancer"></a>

您可以建立具有 IP 或執行個體目標的 Network Load Balancer。

### 建立 Network Load Balancer — IP 目標
<a name="_create_network_load_balancerip_targets"></a>
+ 您可以將 IP 目標與部署到 Amazon EC2 節點、Fargate 或 Amazon EKS 混合節點的 Pod 搭配使用。您的 Kubernetes 服務必須以 `LoadBalancer` 類型建立。如需詳細資訊，請參閱 Kubernetes 文件中的 [LoadBalancer 類型](https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)。

  若要建立使用 IP 目標的負載平衡器，請將下列註解新增至服務清單檔案，然後部署您的服務。`external` 的值`aws-load-balancer-type`是導致 AWS Load Balancer控制器而非 AWS 雲端提供者負載平衡器控制器建立 Network Load Balancer 的原因。您可以檢視具有注釋的[範例服務清單檔案](#network-load-balancing-service-sample-manifest)。

  ```
  service.beta.kubernetes.io/aws-load-balancer-type: "external"
  service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
  ```
**注意**  
如果您要對 `IPv6` Pod 進行負載平衡，請新增以下註釋。您只能在 `IPv6` 上負載平衡至 IP 目標，而不能負載平衡執行個體目標。如果沒有此註釋，負載平衡將在 `IPv4` 上執行。

  ```
  service.beta.kubernetes.io/aws-load-balancer-ip-address-type: dualstack
  ```

  依預設，使用 `internal` `aws-load-balancer-scheme` 建立 Network Load Balancer。您可以在叢集 VPC 的任何子網路中啟動 Network Load Balancer，包括建立叢集時未指定的子網路。

  Kubernetes 會檢查您子網路的路由表，以判別其為公有或私有。公有子網路具備使用網際網路閘道直接通向網際網路的路由，而私有子網路則不然。

  若要在公有子網路中建立 Network Load Balancer 對 Amazon EC2 節點進行負載平衡 (Fargate 只能為私有)，請指定具有以下註釋的 `internet-facing`：

  ```
  service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
  ```
**注意**  
仍支援 `service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"` 註釋以提供回溯相容性。不過，建議您針對新的負載平衡器使用先前的註釋，而不是 `service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"`。
**重要**  
建立服務後，請勿編輯註釋。如果需要進行修改，請刪除服務物件，並使用此註釋所需的值重新建立服務物件。

### 建立 Network Load Balancer — 執行個體目標
<a name="_create_network_load_balancerinstance_targets"></a>
+  AWS 雲端提供者負載平衡器控制器只會使用執行個體目標建立 Network Load Balancer。版本 `2.2.0` AWS Load Balancer控制器也會建立具有執行個體目標的 Network Load Balancer。我們建議您使用它，而不是 AWS 雲端提供者負載平衡器控制器，來建立新的 Network Load Balancer。您可以將 Network Load Balancer 執行個體目標與部署至 Amazon EC2 節點 (而非 Fargate) 的 Pod 搭配使用。若要在部署到 Fargate 的 Pod 之間負載平衡網路流量，則必須使用 IP 目標。

  若要將 Network Load Balancer 部署至私有子網路，則您的服務規格必須具有下列註釋。您可以檢視具有注釋的[範例服務清單檔案](#network-load-balancing-service-sample-manifest)。`external` 的值`aws-load-balancer-type`是導致 AWS Load Balancer控制器而非 AWS 雲端提供者負載平衡器控制器建立 Network Load Balancer 的原因。

  ```
  service.beta.kubernetes.io/aws-load-balancer-type: "external"
  service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"
  ```

  依預設，使用 `internal` `aws-load-balancer-scheme` 建立 Network Load Balancer。若為內部 Network Load Balancer，您的 Amazon EKS 叢集必須設定至少使用 VPC 中的一個私有子網路。Kubernetes 會檢查您子網路的路由表，以判別其為公有或私有。公有子網路具備使用網際網路閘道直接通向網際網路的路由，而私有子網路則不然。

  若要在公有子網路中建立 Network Load Balancer 對 Amazon EC2 節點進行負載平衡，請指定具有以下註釋的 `internet-facing`：

  ```
  service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
  ```
**重要**  
建立服務後，請勿編輯註釋。如果需要進行修改，請刪除服務物件，並使用此註釋所需的值重新建立服務物件。

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

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

     ```
     eksctl create fargateprofile \
         --cluster my-cluster \
         --region region-code \
         --name nlb-sample-app \
         --namespace nlb-sample-app
     ```

  1. 部署範例應用程式。

     1. 建立應用程式的命名空間。

        ```
        kubectl create namespace nlb-sample-app
        ```

     1. 將下列內容儲存到電腦上名為 `sample-deployment.yaml` 的檔案中。

        ```
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: nlb-sample-app
          namespace: nlb-sample-app
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: nginx
          template:
            metadata:
              labels:
                app: nginx
            spec:
              containers:
                - name: nginx
                  image: public.ecr.aws/nginx/nginx:1.23
                  ports:
                    - name: tcp
                      containerPort: 80
        ```

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

        ```
        kubectl apply -f sample-deployment.yaml
        ```

  1. 使用負載平衡至 IP 目標的網際網路取向的 Network Load Balancer 建立服務。

     1.  將下列內容儲存到電腦上名為 `sample-service.yaml` 的檔案中。若要部署至 Fargate 節點，請移除 `service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing` 行。

        ```
        apiVersion: v1
        kind: Service
        metadata:
          name: nlb-sample-service
          namespace: nlb-sample-app
          annotations:
            service.beta.kubernetes.io/aws-load-balancer-type: external
            service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
            service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
        spec:
          ports:
            - port: 80
              targetPort: 80
              protocol: TCP
          type: LoadBalancer
          selector:
            app: nginx
        ```

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

        ```
        kubectl apply -f sample-service.yaml
        ```

  1.  確認服務已部署。

     ```
     kubectl get svc nlb-sample-service -n nlb-sample-app
     ```

     範例輸出如下。

     ```
     NAME            TYPE           CLUSTER-IP         EXTERNAL-IP                                                                    PORT(S)        AGE
     sample-service  LoadBalancer   10.100.240.137   k8s-nlbsampl-nlbsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.region-code.amazonaws.com  80:32400/TCP   16h
     ```
**注意**  
*10.100.240.137* 和 *xxxxxxxxxxxxxx*-*xxxxxxxxxxxxxxxx* 的值將與範例輸出不同 （它們對您的負載平衡器是唯一的），而且 *us-west-2* 可能有所不同，具體取決於叢集所在的 AWS 區域。

  1. 開啟 [Amazon EC2 AWS 管理主控台](https://console.aws.amazon.com/ec2)。選取左側導覽窗格中的 **Target Groups** (目標群組) (在 **Load Balancing** (負載平衡) 下)。在**名稱**資料欄中選取目標群組名稱，其**負載平衡器**資料欄中的值必須與上一個步驟中 `EXTERNAL-IP` 資料欄的部分輸出值名稱相符。例如，若輸出值名稱與先前的輸出值名稱相同，請選取名為 `k8s-default-samplese-xxxxxxxxxx ` 的目標群組。**Target type** (目標類型) 為 `IP`，因為其已在範例服務清單檔案中指定。

  1. 選取 **Target group** (目標群組)，然後選擇 **Targets** (目標) 索引標籤。在 **Registered targets** (已註冊目標) 下，您應該會看到在上一個步驟中部署之三個複本的三個 IP 地址。待所有目標狀態變為 **healthy** (狀態良好) 再繼續。可能需要幾分鐘的時間，所有目標才能變為 `healthy`。目標在變更為 `healthy` 狀態前，可能處於 `unhealthy` 狀態。

  1. 將流量傳送至服務，使用 `EXTERNAL-IP` 在[上一個步驟](#nlb-sample-app-verify-deployment)的輸出中傳回的值，來取代 *xxxxxxxxxx-xxxxxxxxxxxxxxxx* 和 *us-west-2*。如果您部署至私有子網路，則需要從 VPC 內的裝置 (例如堡壘主機) 檢視頁面。如需詳細資訊，請參閱 [AWS上的 Linux 堡壘主機](https://aws.amazon.com/quickstart/architecture/linux-bastion/)。

     ```
     curl k8s-default-samplese-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.region-code.amazonaws.com
     ```

     範例輸出如下。

     ```
     <!DOCTYPE html>
     <html>
     <head>
     <title>Welcome to nginx!</title>
     [...]
     ```

  1. 在完成範例部署、服務和命名空間後，請將其移除。

     ```
     kubectl delete namespace nlb-sample-app
     ```