透過 Network Load Balancer 路由 TCP 與 UDP 流量 - Amazon EKS

協助改進此頁面

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

透過 Network Load Balancer 路由 TCP 與 UDP 流量

注意

新功能:Amazon EKS 自動模式現可自動執行負載平衡的常規任務。如需詳細資訊,請參閱:

網路流量在 OSI 模型的 L4 處於負載平衡狀態。若要在 L7 負載平衡應用程式流量,您可以部署 Kubernetes ingress,其佈建了 AWS Application Load Balancer。如需詳細資訊,請參閱 透過 Application Load Balancer 路由應用程式與 HTTP 流量。若要進一步了解兩種負載平衡之間的差異,請參閱 AWS 網站上的 Elastic Load Balancing 功能

當您建立類型 LoadBalancer 的 Kubernetes Service 時,依預設,AWS 雲端提供者負載平衡器控制器會建立 AWS Classic Load Balancer,但也可以建立 AWS Network Load Balancer。此控制器將來僅接收關鍵錯誤修正。如需使用 AWS 雲端提供者負載平衡器的相關資訊,請參閱 Kubernetes 文件中的 AWS 雲端提供者負載平衡器。本主題中不涉及其使用方式。

建議您使用 AWS Load Balancer 控制器 的版本 2.7.2 或更新版本,而非 AWS 雲端提供者負載平衡器控制器。AWS Load Balancer 控制器建立 AWS Network Load Balancer,但不建立 AWS Classic Load Balancer。本主題的其餘部分是關於使用 AWS Load Balancer Controller 的內容。

AWS Network Load Balancer 可以將網路流量負載平衡至部署到 Amazon EC2 IP 和執行個體目標、AWS Fargate IP 目標或 Amazon EKS 混合節點 (作為 IP 目標) 的 Pod。如需詳細資訊,請參閱 GitHub 上的 AWS Load Balancer 控制器

先決條件

在使用 AWS Load Balancer 控制器負載平衡網路流量之前,您必須先達到以下要求。

  • 擁有現有的叢集。如果沒有現有叢集,請參閱 開始使用 Amazon EKS。如果您需要更新現有叢集的版本,請參閱 將現有叢集更新至全新 Kubernetes 版本

  • 在叢集上部署 AWS Load Balancer 控制器。如需詳細資訊,請參閱 透過 AWS Load Balancer 控制器路由網際網路流量。我們建議使用 2.7.2 版或更新版本。

  • 至少有一個子網路。若在可用區域中找到多個標記的子網路,控制器會根據其子網路 ID 依詞典編纂順序來選擇第一個子網路。子網路必須至少有 8 個可用的 IP 地址。

  • 若您正在使用 AWS Load Balancer 控制器版本 2.1.1 或更舊版本,則子網路必須按如下方式加上標籤。如果使用版本 2.1.2 或更新版本,則此標籤是選用的。如果有多個叢集在同一 VPC 中執行,或多個 AWS 服務共用 VPC 中的子網路,並希望更多地控制每個叢集佈建負載平衡器的位置,則可能要為子網路加上標籤。如果明確指定子網路 ID 作為服務物件上的註釋,則 Kubernetes 和 AWS Load Balancer 控制器會直接使用這些子網路來建立負載平衡器。如果選擇使用此方法來佈建負載平衡器,而且可以略過下列私有和公有子網路標記要求,則不需要標記子網路。使用您的叢集名稱取代 my-cluster

    • 索引鍵kubernetes.io/cluster/<my-cluster>

    • sharedowned

  • 您的公有和私有子網路必須符合下列要求,除非您明確指定子網路 ID 作為服務或傳入物件上的註釋。如果透過明確指定子網路 ID 作為服務或傳入物件上的註釋來佈建負載平衡器,則 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

      • 索引鍵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

      • 索引鍵kubernetes.io/role/elb

      • 1

    如果沒有明確新增子網路角色標籤,則 Kubernetes Service 控制器會檢查叢集 VPC 子網路的路由表,以判定子網路是私有還是公有。建議您不要依賴此行為,而是明確地新增私有或公有角色標籤。AWS Load Balancer 控制器不會檢查路由表,並要求私有和公有標籤出現,才能成功自動探索。

考量事項

  • 負載平衡器的組態是由加入至該服務清單檔案的註釋所控制。使用 AWS Load Balancer 控制器時的服務註釋與使用 AWS 雲端提供者負載平衡器控制器時的服務註釋有所不同。部署服務之前,請務必檢閱 AWS Load Balancer 控制器的註釋

  • 當使用 Kubernetes 專用 Amazon VPC CNI 外掛程式時,AWS Load Balancer 控制器可以針對 Amazon EC2 IP 或執行個體目標和 Fargate IP 目標進行負載平衡。當使用替代相容 CNI 外掛程式時,控制器僅能針對執行個體目標進行負載平衡,除非您要對 Amazon EKS 混合節點進行負載平衡。對於混合節點,控制器可以對 IP 目標進行負載平衡。如需 Network Load Balancer 目標類型的詳細資訊,請參閱 Network Load Balancer 使用者指南中的目標類型

  • 如果要在建立負載平衡器時或之後將標籤新增至負載平衡器,請在服務規格中新增下列註釋。如需詳細資訊,請參閱 AWS Load Balancer 控制器說明文件中的 AWS 資源標籤

    service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags
  • 您可以透過新增以下注釋將彈性 IP 地址指派至 Network Load Balancer。使用彈性 IP 位址的 Allocation IDs 取代範例值Allocation IDs 的數量必須與負載平衡器所使用的子網路數量一致。如需詳細資訊,請參閱 AWS Load Balancer 控制器說明文件。

    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 配額的安全群組。請考慮下列選項,將超過安全群組規則數量上限的機會降至最低:

    • 請求提高每個安全群組規則的配額。如需詳細資訊,請參閱《Service Quotas 使用者指南》中的請求提高配額

    • 使用 IP 目標,而不是執行個體目標。使用 IP 目標時,您可以共用相同目標連接埠的規則。您可以使用註釋手動指定負載平衡器子網路。如需詳細資訊,請參閱 GitHub 上的注釋

    • 使用傳入,而不是類型服務 LoadBalancer 將流量傳送至您的服務。AWS Application Load Balancer 所需的規則少於 Network Load Balancer。您可在多個輸入之間共用 ALB。如需詳細資訊,請參閱 透過 Application Load Balancer 路由應用程式與 HTTP 流量。您不能在多個服務之間共用 Network Load Balancer。

    • 將叢集部署到多個帳戶。

  • 如果您的 Pod 在 Windows 上執行,則在 Amazon EKS 叢集中,具有負載平衡器的單一服務最多可支援 1024 個後端 Pod。每個 Pod 都有自己的唯一 IP 地址。

  • 建議只使用 AWS Load Balancer 控制器建立新的 Network Load Balancer。嘗試取代以 AWS 雲端提供者負載平衡器控制器建立的現有 Network Load Balancer 可能會影響多個 Network Load Balancer,從而導致應用程式停機。

建立 Network Load Balancer

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

建立 Network Load Balancer — IP 目標

  • 您可以將 IP 目標與部署到 Amazon EC2 節點、Fargate 或 Amazon EKS 混合節點的 Pod 搭配使用。您的 Kubernetes 服務必須以 LoadBalancer 類型建立。如需詳細資訊,請參閱 Kubernetes 文件中的 LoadBalancer 類型

    若要建立使用 IP 目標的負載平衡器,請將下列註解新增至服務資訊清單,然後部署您的服務。aws-load-balancer-typeexternal 值是 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: "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 — 執行個體目標

  • AWS 雲端提供者 Load Balancer 控制器僅能建立具有執行個體目標的 Network Load Balancer。版本 2.2.0 和更新版本的 AWS Load Balancer Controller 也會建立具有執行個體目標的 Network Load Balancer。我們建議使用它,而不是 AWS 雲端提供者負載平衡器控制器,來建立新的 Network Load Balancer。您可以將 Network Load Balancer 執行個體目標與部署至 Amazon EC2 節點 (而非 Fargate) 的 Pod 搭配使用。若要在部署到 Fargate 的 Pod 之間負載平衡網路流量,則必須使用 IP 目標。

    若要將 Network Load Balancer 部署至私有子網路,則您的服務規格必須具有下列註釋。您可以檢視具有注釋的範例服務清單檔案aws-load-balancer-typeexternal 值是 AWS Load Balancer Controller 比 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"
    重要

    建立服務後,請勿編輯註釋。如果需要進行修改,請刪除服務物件,並使用此註釋所需的值重新建立服務物件。

(選用) 部署範例應用程式

  • 叢集 VPC 中必須至少有一個公有或私有子網路。

  • 在叢集上部署 AWS Load Balancer 控制器。如需詳細資訊,請參閱 透過 AWS Load Balancer 控制器路由網際網路流量。我們建議使用 2.7.2 版或更新版本。

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

      eksctl create fargateprofile \ --cluster my-cluster \ --region region-code \ --name nlb-sample-app \ --namespace nlb-sample-app
    2. 部署範例應用程式。

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

        kubectl create namespace nlb-sample-app
      2. 將下列內容儲存到電腦上名為 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
      3. 將清單檔案套用至叢集。

        kubectl apply -f sample-deployment.yaml
    3. 使用負載平衡至 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
      2. 將清單檔案套用至叢集。

        kubectl apply -f sample-service.yaml
    4. 確認已部署服務。

      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.137xxxxxxxxxx-xxxxxxxxxxxxxxxx 的值會與範例輸出不同 (會根據您的負載平衡器產生唯一值),us-west-2 也可能因叢集所在的 AWS 區域而有所不同。

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

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

    7. 將流量傳送至服務,使用 EXTERNAL-IP上一個步驟的輸出中傳回的值,來取代 xxxxxxxxxx-xxxxxxxxxxxxxxxxus-west-2。如果您部署至私有子網路,則需要從 VPC 內的裝置 (例如堡壘主機) 檢視頁面。如需詳細資訊,請參閱 AWS 上的 Linux 堡壘主機

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

      範例輸出如下。

      <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
    8. 在完成範例部署、服務和命名空間後,請將其移除。

      kubectl delete namespace nlb-sample-app