協助改善此頁面
想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] 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
-
值:
shared
或owned
-
-
您的公有和私有子網路必須符合下列要求,除非您明確指定子網路 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 values
Allocation 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。
(選用) 部署範例應用程式
必要條件
-
叢集 VPC 中必須至少有一個公有或私有子網路。
-
將 AWS Load Balancer Controller 部署在您的叢集上。如需詳細資訊,請參閱 什麼是 AWS Load Balancer Controller?。我們建議使用
2.7.2
版或更新版本。
部署範例應用程式
-
若要部署至 Fargate,請確保 VPC 中有一個可用的私有子網路,並建立一個 Fargate 設定檔。如果您沒有部署到 Fargate,請略過此步驟。您可以透過執行下列命令來建立描述檔,也可以使用命令中
name
和namespace
相同的值藉由 AWS Management Console 進行。使用自己的取代
。example values
eksctl create fargateprofile \ --cluster
\my-cluster
\ --regionregion-code
\ --namenlb-sample-app
--namespace nlb-sample-app
-
部署範例應用程式。
-
建立應用程式的命名空間。
kubectl create namespace
nlb-sample-app
-
將下列內容儲存到電腦上名為
的檔案中。sample-deployment
.yamlapiVersion: 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 建立服務。
-
將下列內容儲存到電腦上名為
的檔案中。若要部署至 Fargate 節點,請移除sample-service
.yamlservice.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
-nnlb-sample-app
範例輸出如下。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sample-service
LoadBalancer10.100.240.137
k8s-nlbsampl
-nlbsampl
-xxxxxxxxxx
-xxxxxxxxxxxxxxxx
.elb.region-code
.amazonaws.com80
:32400
/TCP
16h注意
AWS 區域10.100.240.137
-
打開 Amazon EC2 AWS Management Console
。選取左側導覽窗格中的 Target Groups (目標群組) (在 Load Balancing (負載平衡) 下)。在 Name (名稱) 資料欄中選取目標群組名稱,其 Load Balancer (負載平衡器) 資料欄中的值必須與上一步驟中 EXTERNAL-IP
資料欄的部分輸出值名稱相符。例如,若輸出值名稱與先前的輸出值名稱相同,請選取名為k8s-default-samplese-
的目標群組。Target type (目標類型) 為xxxxxxxxxx
IP
,因為其已在範例服務清單檔案中指定。 -
選取 Target group (目標群組),然後選擇 Targets (目標) 索引標籤。在 Registered targets (已註冊目標) 下,您應該會看到在上一個步驟中部署之三個複本的三個 IP 地址。待所有目標狀態變為 healthy (狀態良好) 再繼續。可能需要幾分鐘的時間,所有目標才能變為
healthy
。目標在變更為healthy
狀態前,可能處於unhealthy
狀態。 -
將流量傳送至服務,使用
EXTERNAL-IP
在上一個步驟的輸出中傳回的值,來取代
和xxxxxxxxxx-xxxxxxxxxxxxxxxx
。如果您部署至私有子網路,則需要從 VPC 內的裝置 (例如堡壘主機) 檢視頁面。如需詳細資訊,請參閱 AWS上的 Linux 堡壘主機us-west-2
。 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