協助改善此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
想要為此使用者指南做出貢獻? 捲動至此頁面底部,然後選取編輯此頁面 GitHub。您的貢獻將幫助我們的使用者指南更適合每個人。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Network Load Balancer 的路由TCP和UDP流量
注意
新功能:Amazon EKS Auto Mode 可自動執行負載平衡的例行任務。如需詳細資訊,請參閱:
網路流量在 OSI 模型L4
的負載平衡。若要在 載入平衡應用程式流量L7
,您可以部署 Kubernetes ingress
,佈建 a AWS Application Load Balancer。如需詳細資訊,請參閱使用 Application Load Balancer 路由應用程式和HTTP流量。若要進一步了解兩種負載平衡類型之間的差異,請參閱 AWS 網站上的 Elastic Load Balancing 功能
當您建立 Kubernetes Service
類型為 LoadBalancer
的 AWS 雲端提供者負載平衡器控制器預設會建立 AWS Classic Load Balancer,但也可以建立 AWS Network Load Balancer。此控制器將來僅接收關鍵錯誤修正。如需使用 AWS 雲端提供者負載平衡器 的詳細資訊,請參閱 中的AWS 雲端提供者負載平衡器控制器
我們建議您使用版本 2.7.2
或更新版本的 AWS Load Balancer Controller,而非 AWS 雲端提供者負載平衡器控制器。所以此 AWS Load Balancer Controller 會建立 AWS Network Load Balancer,但不會建立 AWS Classic Load Balancer。本主題的其餘部分是關於使用 AWS Load Balancer控制器。
AWS Network Load Balancer 可以將網路流量負載平衡至 Pods 部署到 Amazon EC2 IP 和執行個體目標、 AWS Fargate IP 目標或 Amazon EKS混合節點做為 IP 目標。如需詳細資訊,請參閱 上的AWS Load Balancer控制器
必要條件
使用 載入平衡網路流量之前 AWS Load Balancer Controller,您必須符合下列要求。
-
擁有現有的叢集。如果您沒有現有的叢集,請參閱 開始使用 Amazon EKS。如果您需要更新現有叢集的版本,請參閱 將現有叢集更新為新的 Kubernetes 版本。
-
擁有 AWS Load Balancer Controller 部署在您的叢集上。如需詳細資訊,請參閱使用 AWS Load Balancer控制器路由網際網路流量。我們建議使用
2.7.2
版或更新版本。 -
至少有一個子網路。若在可用區域中找到多個標記的子網路,控制器會根據其子網路 ID 依詞典編纂順序來選擇第一個子網路。子網路必須至少有 8 個可用的 IP 地址。
-
如果您使用的是 AWS Load Balancer Controller 或
2.1.1
更早版本的子網路必須標記如下。如果使用版本2.1.2
或更新版本,則此標籤是選用的。如果您在相同的 中執行多個叢集VPC,或在 中共用多個 AWS 服務子網路,並想要更進一步控制為每個叢集佈建負載平衡器的位置VPC,您可能想要標記子網路。如果您明確指定子網路IDs做為服務物件上的註釋,則 Kubernetes 和 AWS Load Balancer Controller 直接使用這些子網路來建立負載平衡器。如果您選擇使用此方法來佈建負載平衡器,則不需要子網路標記,而且您可以略過下列私有和公有子網路標記要求。使用您的叢集名稱取代my-cluster
。-
索引鍵:
kubernetes.io/cluster/<my-cluster>
-
值:
shared
或owned
-
-
您的公有和私有子網路必須符合下列要求,除非您在服務或輸入物件上明確指定子網路IDs做為註釋。如果您透過明確指定子網路IDs做為服務或輸入物件的註釋來佈建負載平衡器,則 Kubernetes 和 AWS Load Balancer Controller 直接使用這些子網路來建立負載平衡器,不需要下列標籤。
-
私有子網路:必須使用下列格式進行標記。這樣一來 Kubernetes 和 the AWS Load Balancer 控制器知道子網路可用於內部負載平衡器。如果您在 2020 年 3 月 26 日VPC之後使用
eksctl
或 Amazon EKS AWS AWS CloudFormation 範本來建立 ,則子網路會在建立時適當地加上標籤。如需 Amazon EKS AWS AWS CloudFormation VPC 範本的詳細資訊,請參閱 VPC 為您的 Amazon EKS叢集建立 Amazon。-
索引鍵:
kubernetes.io/role/internal-elb
-
值:
1
-
-
公有子網路:必須使用下列格式進行標記。這樣一來 Kubernetes 知道只將這些子網路用於外部負載平衡器,而不是選擇每個可用區域中的公有子網路 (根據子網路 的語義順序)IDs。如果您在 2020 年 3 月 26 日VPC之後使用
eksctl
或 Amazon EKS AWS CloudFormation 範本來建立 ,則子網路會在建立時適當地加上標籤。如需 Amazon EKS AWS CloudFormation VPC 範本的詳細資訊,請參閱 VPC 為您的 Amazon EKS叢集建立 Amazon。-
索引鍵:
kubernetes.io/role/elb
-
值:
1
-
如果未明確新增子網路角色標籤,Kubernetes 服務控制器會檢查叢集VPC子網路的路由表,以判斷子網路是私有還是公有。我們建議您不要依賴此行為,而是明確新增私有或公有角色標籤。所以此 AWS Load Balancer Controller 不會檢查路由表,並且需要有私有和公有標籤才能成功自動探索。
-
考量事項
-
負載平衡器的組態是由加入至該服務清單檔案的註釋所控制。使用 時,服務註釋會有所不同 AWS Load Balancer Controller 比使用 AWS 雲端提供者負載平衡器控制器時多。請務必檢閱 的註釋
AWS Load Balancer Controller 部署 服務之前。 -
使用適用於 Kubernetes 的 Amazon VPCCNI外掛程式時, AWS Load Balancer Controller 可以將平衡載入 Amazon EC2 IP 或執行個體目標和 Fargate IP 目標。使用替代相容CNI外掛程式時,控制器只能將平衡載入執行個體目標,除非您要將平衡載入 Amazon EKS混合節點。對於混合節點,控制器可以載入平衡 IP 目標。如需 Network Load Balancer 目標類型的詳細資訊,請參閱 Network Load Balancer 使用者指南中的目標類型。
-
如果您想要在建立負載平衡器時或之後將標籤新增至負載平衡器,請在您的服務規格中新增下列註釋。如需詳細資訊,請參閱 中的AWS 資源標籤
AWS Load Balancer Controller 文件中)。 service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags
-
您可以透過新增以下注釋將彈性 IP 地址指派至 Network Load Balancer。使用彈性 IP 地址的
Allocation IDs
取代example values
。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
將流量傳送至您的服務。The AWS Application Load Balancer 所需的規則比 Network Load Balancer 少。您可以在多個輸入ALB之間共用 。如需詳細資訊,請參閱使用 Application Load Balancer 路由應用程式和HTTP流量。您無法跨多個 服務共用 Network Load Balancer。 -
將叢集部署到多個帳戶。
-
-
如果您的 Pods 在 上執行 Windows 在 Amazon EKS叢集中,具有負載平衡器的單一服務最多可支援 1024 個後端 Pods。 每個 Pod 有自己的唯一 IP 地址。
-
我們建議僅使用 建立新的 Network Load Balancer AWS Load Balancer Controller。 嘗試取代使用 AWS 雲端提供者負載平衡器控制器建立的現有 Network Load Balancer 可能會導致多個 Network Load Balancer,這可能會導致應用程式停機。
建立 Network Load Balancer
您可以建立具有 IP 或執行個體目標的 Network Load Balancer。
建立網路負載平衡器 — IP 目標
-
您可以搭配 使用 IP 目標 Pods 部署到 Amazon EC2節點、Fargate 或 Amazon EKS混合節點。您的 Kubernetes 服務必須建立為類型
LoadBalancer
。如需詳細資訊,請參閱在 LoadBalancer中輸入 Kubernetes 文件中)。 若要建立使用 IP 目標的負載平衡器,請將下列註解新增至服務清單檔案,然後部署您的服務。
external
的值aws-load-balancer-type
是導致 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: "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。您可以在叢集 的任何子網路中啟動 Network Load BalancerVPC,包括建立叢集時未指定的子網路。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"
。重要
建立服務後,請勿編輯註釋。如果需要進行修改,請刪除服務物件,並使用此註釋所需的值重新建立服務物件。
建立網路負載平衡器 — 執行個體目標
-
AWS 雲端提供者負載平衡器控制器只會使用執行個體目標建立 Network Load Balancer。版本
2.2.0
AWS Load Balancer控制器也會建立具有執行個體目標的 Network Load Balancer。我們建議您使用它,而不是 AWS 雲端供應商負載平衡器控制器,來建立新的 Network Load Balancer。您可以使用 Network Load Balancer 執行個體目標搭配 Pods 部署至 Amazon EC2節點,但不會部署至 Fargate。跨 載入平衡網路流量 Pods 部署到 Fargate,您必須使用 IP 目標。若要將 Network Load Balancer 部署至私有子網路,則您的服務規格必須具有下列註釋。您可以檢視具有注釋的範例服務清單檔案。
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"
重要
建立服務後,請勿編輯註釋。如果需要進行修改,請刪除服務物件,並使用此註釋所需的值重新建立服務物件。
(選用) 部署範例應用程式
-
叢集 中至少有一個公有或私有子網路VPC。
-
擁有 AWS Load Balancer Controller 部署在您的叢集上。如需詳細資訊,請參閱使用 AWS Load Balancer控制器路由網際網路流量。我們建議使用
2.7.2
版或更新版本。-
如果您要部署至 Fargate,請確定您的 中具有可用的私有子網路,VPC並建立 Fargate 設定檔。如果您未部署到 Fargate,請略過此步驟。您可以透過執行下列命令來建立描述檔,也可以使用命令中
name
和namespace
相同的值藉由 AWS Management Console 進行。使用自己的取代example values
。eksctl create fargateprofile \ --cluster my-cluster \ --region region-code \ --name nlb-sample-app \ --namespace nlb-sample-app
-
部署範例應用程式。
-
建立應用程式的命名空間。
kubectl create namespace nlb-sample-app
-
將下列內容儲存至您電腦上名為
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
-
將清單檔案套用至叢集。
kubectl apply -f sample-deployment.yaml
-
-
使用負載平衡至 IP 目標的網際網路取向的 Network Load Balancer 建立服務。
-
將下列內容儲存至您電腦上名為
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
-
將清單檔案套用至叢集。
kubectl apply -f sample-service.yaml
-
-
確認服務已部署。
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
和xxxxxxxxxx
-xxxxxxxxxxxxxxxx
的值將與範例輸出不同 (它們對於您的負載平衡器而言是唯一的),而且us-west-2
可能有所不同,取決於叢集所在的 AWS 區域。 -
開啟 Amazon EC2 AWS Management Console
。選取左側導覽窗格中的 Target Groups (目標群組) (在 Load Balancing (負載平衡) 下)。在名稱欄中,選取目標群組的名稱,其中負載平衡器欄中的值與上一個步驟中輸出 EXTERNAL-IP
欄中的一部分名稱相符。例如,k8s-default-samplese-
如果您的輸出與上一個輸出相同,您可以選擇名為 的目標群組。Target type (目標類型) 為xxxxxxxxxx
IP
,因為其已在範例服務清單檔案中指定。 -
選取 Target group (目標群組),然後選擇 Targets (目標) 索引標籤。在 Registered targets (已註冊目標) 下,您應該會看到在上一個步驟中部署之三個複本的三個 IP 地址。待所有目標狀態變為 healthy (狀態良好) 再繼續。可能需要幾分鐘的時間,所有目標才能變為
healthy
。目標在變更為healthy
狀態前,可能處於unhealthy
狀態。 -
將流量傳送至服務,使用
EXTERNAL-IP
在上一個步驟的輸出中傳回的值,來取代xxxxxxxxxx-xxxxxxxxxxxxxxxx
和us-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> [...]
-
當您完成範例部署、服務和命名空間時,請將其移除。
kubectl delete namespace nlb-sample-app
-