Amazon EKS 上的網路負載平衡 - Amazon EKS

協助改善此頁面

想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。

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

Amazon EKS 上的網路負載平衡

網路流量在 OSI 模型的 L4 處於負載平衡狀態。若要在負載平衡應用程式流量L7,請部署佈建Kubernetesingress AWS 應用程式負載平衡器的應用程式流量。如需詳細資訊,請參閱 Amazon EKS 上的應用程式負載平衡。若要深入瞭解這兩種負載平衡類型之間的差異,請參閱 AWS 網站上的 E lastic Load Balancing 功能

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

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

AWS Network Load Balancer 可以負載平衡Pods部署到 Amazon EC2 IP 和執行個體目標或 AWS Fargate IP 目標的網路流量。如需詳細資訊,請參閱 GitHub 上的 AWS Load Balancer Controller

必要條件

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

  • 擁有現有的叢集。如果沒有現有叢集,請參閱 Amazon EKS 入門。如果您需要更新現有叢集的版本,請參閱 更新 Amazon EKS 叢集 Kubernetes 版本

  • 將 AWS Load Balancer Controller 部署在您的叢集上。如需詳細資訊,請參閱 什麼是 AWS Load Balancer Controller?。我們建議使用 2.7.2 版或更新版本。

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

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

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

    • sharedowned

  • 您的公有和私有子網路必須符合下列要求,除非您明確指定子網路 ID 作為服務或傳入物件上的註釋。如果透過明確指定子網路 ID 作為服務或傳入物件上的註釋來佈建負載平衡器,則 Kubernetes 和 AWS Load Balancer Controller 會直接使用這些子網路來建立負載平衡器,且不需要以下標籤。

    • 私有子網路:必須使用下列格式進行標記。這Kubernetes樣,Load Bal AWS ancer 控制器就知道子網路可用於內部負載平衡器。如果您在 2020 年 3 月 26 日之後使用eksctl或 Amazon EKS AWS AWS CloudFormation 範本建立 VPC,則子網路在建立時會適當地標記這些子網路。如需 Amazon EKS AWS AWS CloudFormation VPC 範本的詳細資訊,請參閱 為 Amazon EKS 叢集建立 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 叢集建立 VPC

      • 索引鍵kubernetes.io/role/elb

      • 1

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

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

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

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

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

    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 應用程式負載平衡器所需的規則比網路負載平衡器少。您可在多個輸入之間共用 ALB。如需詳細資訊,請參閱 Amazon EKS 上的應用程式負載平衡。您不能在多個服務之間共用 Network Load Balancer。

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

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

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

建立 Network Load Balancer

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

IP targets

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

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

service.beta.kubernetes.io/aws-load-balancer-type: "external" service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
注意

如果您正在負載平衡至 IPv6 Pods,請新增以下註釋。您只能在 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"

重要

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

Instance targets

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

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

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

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

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

  • 將 AWS Load Balancer Controller 部署在您的叢集上。如需詳細資訊,請參閱 什麼是 AWS Load Balancer Controller?。我們建議使用 2.7.2 版或更新版本。

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

    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.137 AWS 區域

  5. 打開 Amazon EC2 AWS Management Console。選取左側導覽窗格中的 Target Groups (目標群組) (在 Load Balancing (負載平衡) 下)。在 Name (名稱) 資料欄中選取目標群組名稱,其 Load Balancer (負載平衡器) 資料欄中的值必須與上一步驟中 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