協助改善此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要提供此使用者指南,請選擇位於每個頁面右窗格中的 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Application Load Balancer 路由應用程式和 HTTP 流量
注意
新功能:Amazon EKS Auto Mode 會自動執行負載平衡的例行任務。如需詳細資訊,請參閱:
當您建立 Kubernetes 時ingress
,會佈建 an AWS Application Load Balancer (ALB),以平衡應用程式流量。如需進一步了解,請參閱《Application Load Balancer 使用者指南》中的什麼是 Application Load Balancer?和 Kubernetes 文件中的傳入
應用程式流量會在 OSI 模型的 L7
平衡。若要負載平衡 L4
的網路流量,您可以部署 LoadBalancer
類型的 Kubernetes service
。此類型佈建 AWS Network Load Balancer。如需詳細資訊,請參閱使用 Network Load Balancer 路由 TCP 和 UDP 流量。若要進一步了解兩種負載平衡類型之間的差異,請參閱 AWS 網站上的 Elastic Load Balancing 功能
先決條件
在將應用程式流量負載平衡到應用程式之前,您必須符合以下要求。
-
擁有現有的叢集。如果您沒有現有的叢集,請參閱 開始使用 Amazon EKS。如果您需要更新現有叢集的版本,請參閱 將現有叢集更新為新的 Kubernetes 版本。
-
在您的叢集上部署 AWS Load Balancer控制器。如需詳細資訊,請參閱使用 AWS Load Balancer控制器路由網際網路流量。我們建議使用
2.7.2
版或更新版本。 -
至少兩個子網路位於不同的可用區域。 AWS Load Balancer控制器會從每個可用區域選擇一個子網路。當在可用區域中找到多個標記的子網路時,控制器會根據其子網路 ID 依詞典編纂順序來選擇子網路。每個子網路必須至少有 8 個可用的 IP 地址。
如果您使用的是連接到工作者節點的多個安全群組,則只有一個安全群組必須標記如下。使用您的叢集名稱取代
my-cluster
。-
索引鍵:
kubernetes.io/cluster/<my-cluster>
-
值:
shared
或owned
-
-
如果您使用的是 AWS Load Balancer控制器版本
2.1.1
或更早版本,子網路必須以下列格式標記。如果您使用的是版本2.1.2
或更新版本,則標記是選用的。不過,如果出現下列任何情況,我們建議您標記子網路。您有多個叢集正在相同的 VPC 中執行,或有多個 AWS 服務在 VPC 中共用子網路。或者,您希望更好地控制為每個叢集佈建負載平衡器的位置。使用您的叢集名稱取代my-cluster
。-
索引鍵:
kubernetes.io/cluster/<my-cluster>
-
值:
shared
或owned
-
-
您的公有和私有子網路必須符合下列要求,除非明確指定子網路 ID 作為服務或傳入物件上的註釋。假設您透過明確指定子網路 ID 作為服務或傳入物件上的註釋來佈建負載平衡器。在此情況下,Kubernetes 和 AWS 負載平衡器控制器會直接使用這些子網路來建立負載平衡器,而不需要下列標籤。
-
私有子網路:必須使用下列格式進行標記。這樣 Kubernetes 和 AWS 負載平衡器控制器就會知道子網路可用於內部負載平衡器。如果您在 2020 年 3 月 26 日之後使用
eksctl
或 Amazon EKS AWS CloudFormation 範本來建立 VPC,則子網路會在建立時適當標記。如需 Amazon EKS AWS CloudFormation VPC 範本的詳細資訊,請參閱為您的 Amazon EKS 叢集建立 Amazon VPC。-
索引鍵:
kubernetes.io/role/internal-elb
-
值:
1
-
-
公有子網路:必須使用下列格式進行標記。這是為了讓 Kubernetes 知道只使用為外部負載平衡器指定的子網路。如此一來,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 服務控制器會檢查叢集 VPC 子網路的路由表。這是為了判斷子網路是私有還是公有。我們建議您不要依賴此行為。而是明確地新增私有或公有角色標籤。The AWS Load Balancer 控制器不會檢查路由表。其還需要存在私有和公有標籤才能成功自動探索。
-
-
每當在叢集上建立具有
kubernetes.io/ingress.class: alb
註釋的 Kubernetes 輸入 AWS 資源時,AWS Load Balancer控制器都會建立 ALBs 和必要的支援資源。傳入資源會設定 ALB 將 HTTP 或 HTTPS 流量路由到叢集中的不同 Pod。若要確保您的輸入物件使用 AWS Load Balancer控制器,請將下列註釋新增至 Kubernetes 輸入規格。如需詳細資訊,請參閱 GitHub 上的傳入規格 。 annotations: kubernetes.io/ingress.class: alb
注意
如果您要將平衡載入至
IPv6
Pod,請將下列註釋新增至您的輸入規格。您只能在IPv6
上負載平衡至 IP 目標,而不能負載平衡執行個體目標。如果沒有此註釋,負載平衡將在IPv4
上執行。
alb.ingress.kubernetes.io/ip-address-type: dualstack
-
The AWS Load Balancer 控制器支援下列流量模式:
-
執行個體 – 將叢集中的節點註冊作為 ALB 的目標。到達 ALB 的流量會針對
NodePort
您的服務路由至 ,然後代理至您的 Pod。這是預設的流量模式。您也可以使用alb.ingress.kubernetes.io/target-type: instance
註釋明確指定它。注意
您的 Kubernetes 服務必須指定要使用此流量模式的
NodePort
或 "LoadBalancer" 類型。 -
IP:註冊 Pod 作為 ALB 的目標。到達 ALB 的流量會直接路由至您服務的 Pod。您必須指定
alb.ingress.kubernetes.io/target-type: ip
註釋才能使用此流量模式。當目標 Pod 在 Fargate 或 Amazon EKS 混合節點上執行時,需要 IP 目標類型。
-
-
要標記由控制器建立的 ALB,請新增以下註釋至控制器:
alb.ingress.kubernetes.io/tags
。如需 AWS Load Balancer控制器支援的所有可用註釋清單,請參閱 GitHub 上的輸入註釋。 -
升級或降級 ALB 控制器版本可能會導致依賴控制器的功能發生重大變化。如需有關每個版本中引入的重大變更的詳細資訊,請參閱 GitHub 上的 ALB 控制器版本備註
。
將 ALBs與輸入群組重複使用
您可以使用 跨多個服務資源共用應用程式負載平衡器IngressGroups
。
若要將傳入加入群組,請將下列註解新增至 Kubernetes 傳入資源規格。
alb.ingress.kubernetes.io/group.name: my-group
群組名稱必須:
-
是 63 個字元或以下的長度。
-
由小寫字母、數字、
-
和.
組成 -
開頭和結尾為字母或數字。
控制器會自動合併相同傳入群組中所有傳入的傳入規則。控制器透過單個 ALB 提供支援。在傳入中定義的大多數註解僅適用於該傳入定義的路徑。根據預設,輸入資源不屬於任何輸入群組。
警告
潛在的安全風險
只有在擁有 RBAC 許可的所有 Kubernetes 使用者都位於相同的信任界限內時,才能指定傳入的傳入群組。如果您使用群組名稱新增註釋,其他 Kubernetes 使用者可以建立或修改其傳入,使其屬於同一傳入群組。這樣做可能會產生不良行為,例如以較高優先順序規則覆寫現有規則。
您可以新增傳入資源的訂單編號。
alb.ingress.kubernetes.io/group.order: '10'
該編號可以是 1 到 1000 之間的數字。系統會先評估相同傳入群組中所有傳入數量的最低數量。系統會使用 0 值評估沒有此注釋的所有傳入。具有較高數量的重複規則可以覆寫具有較低數量的規則。根據預設,相同傳入群組中傳入之間的規則順序是由命名空間和名稱依詞典編纂順序決定。
重要
確定相同傳入群組中的每個傳入都有唯一的優先順序編號。您無法跨輸入擁有重複的訂單號碼。
(選用) 部署範例應用程式
-
叢集 VPC 中必須至少有一個公有或私有子網路。
-
在您的叢集上部署 AWS Load Balancer控制器。如需詳細資訊,請參閱使用 AWS Load Balancer控制器路由網際網路流量。我們建議使用
2.7.2
版或更新版本。
您可以在具有 Amazon EC2 節點、Fargate Pod 或兩者兼有的叢集上執行範例應用程式。
-
如果您未部署到 Fargate,請略過此步驟。如果您要部署至 Fargate,請建立 Fargate 設定檔。您可以透過執行下列命令來建立描述檔,也可以使用命令中
name
和namespace
相同的值藉由 AWS Management Console 進行。使用自己的取代範例值
。eksctl create fargateprofile \ --cluster my-cluster \ --region region-code \ --name alb-sample-app \ --namespace game-2048
-
將遊戲 2048
部署為範例應用程式,以確認 AWS Load Balancer控制器建立 ALB AWS 作為傳入物件的結果。完成您要部署之子網路類型的步驟。 -
如果您要部署到使用
IPv6
系列建立的叢集中的 Pod,請跳到下一個步驟。-
公有:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml
-
私有:
-
下載清單檔案。
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml
-
編輯檔案並尋找顯示
alb.ingress.kubernetes.io/scheme: internet-facing
的行。 -
將
面向網際網路變更為
internal
並儲存檔案。 -
將清單檔案套用至叢集。
kubectl apply -f 2048_full.yaml
-
-
-
如果您要部署到使用 IPv6 系列建立的叢集中的 Pod,請完成下列步驟。
-
下載清單檔案。
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml
-
在編輯器中開啟檔案,然後在傳入規格中新增以下一行註釋。
alb.ingress.kubernetes.io/ip-address-type: dualstack
-
如果您要將負載平衡載入內部 Pod,而不是面向網際網路的 Pod,請將 表示 的行變更為
alb.ingress.kubernetes.io/scheme:
internet-facing
alb.ingress.kubernetes.io/scheme: internal
-
儲存檔案。
-
將清單檔案套用至叢集。
kubectl apply -f 2048_full.yaml
-
-
-
幾分鐘後,使用下列指令來驗證傳入資源已建立。
kubectl get ingress/ingress-2048 -n game-2048
範例輸出如下。
NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 <none> * k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.region-code.elb.amazonaws.com 80 2m32s
注意
若在私有子網路中建立負載平衡器,則先前輸出中位於
ADDRESS
下的值前面會加上internal-
。
如果您的輸入在幾分鐘後未成功建立,請執行下列命令來檢視 AWS Load Balancer控制器日誌。這些日誌可能包含錯誤訊息,您可用於診斷部署的相關問題。
kubectl logs -f -n kube-system -l app.kubernetes.io/instance=aws-load-balancer-controller
-
如果您部署公有子網路,請開啟瀏覽器,再導覽至先前指令輸出中的
ADDRESS
URL 查看範例應用程式。如果您沒有看到任何內容,請重新整理瀏覽器,然後再試一次。如果您部署到私有子網路,則需要從 VPC 內的裝置檢視頁面,例如堡壘主機。如需詳細資訊,請參閱 AWS上的 Linux 堡壘主機。 -
完成對範例應用程式的實驗後,請透過執行下列命令之一將其刪除。
-
如果您應用了清單檔案,而不是應用下載的複本,請使用以下命令。
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml
-
如果您下載並編輯清單檔案,請使用下列命令。
kubectl delete -f 2048_full.yaml
-