本頁面說明 GKE on AWS 如何與 AWS 搭配運作,為 Service 負載平衡器選擇子網路,以及如何標記子網路,以便在建立 Service 負載平衡器時自動探索。
為什麼需要指定子網路
建立負載平衡器時,AWS 需要知道要將負載平衡器放在哪個子網路中。子網路會決定負載平衡器的可用區、IP 位址和端點。
通常,負載平衡器會分配給每個可用區的一個子網路,其中包含節點集區。AWS 至少需要一個可用子網路才能建立網路負載平衡器 (NLB),至少需要兩個子網路才能建立應用程式負載平衡器 (ALB)。
所有 AWS 子網路不是公開 (具有公開 IP 和通往 VPC 網際網路閘道的路徑),就是私有 (缺少這些功能)。連結至網際網路的負載平衡器必須位於公開子網路中。內部負載平衡器可位於公用或私有子網路中。
如果沒有可用的已標記子網路
如果 GKE on AWS 需要建立負載平衡器,但沒有可用的標記子網路或容量,系統可能會在其他子網路中建立負載平衡器。為避免發生這種情況,並控管負載平衡器所在的子網路,請為所有子網路加上標記。
自動探索子網路
GKE on AWS 會列出虛擬私有雲中的所有子網路,並從每個可用區選取最多一個子網路,自動探索要用於負載平衡器的子網路。
如要讓 GKE on AWS 自動探索子網路,子網路必須符合下列條件:
- 標記為
kubernetes.io/role/elb
(適用於連結網際網路的負載平衡器) - 標記為
kubernetes.io/role/internal-elb
(適用於內部負載平衡器) - 不含前置字串為
kubernetes.io/cluster/
的任何標記,或包含標記kubernetes.io/cluster/CLUSTER_UID
,其中CLUSTER_UID
是目前叢集的 UID。
此外,用於連結網際網路的負載平衡器的子網路,必須有通往虛擬私有雲網際網路閘道的路徑。
如果可用區有多個子網路符合負載平衡器的需求,GKE on AWS 會依子網路 ID 排序子網路。
為子網路加上標記,指出預期用途
如要讓 GKE on AWS 自動探索負載平衡器的子網路,您必須將下列其中一個標記套用至子網路,表示子網路可用。包括:
kubernetes.io/role/elb
:將這個標記套用至子網路,標示為可供面向網際網路的負載平衡器使用。這必須是具有虛擬私有雲網際網路閘道路徑的公用子網路。將標記設為1
。 如要套用這個標記,請執行下列指令:aws ec2 create-tags \ --resources SUBNET_ID \ --tags "Key=kubernetes.io/role/elb,Value=1"
kubernetes.io/role/internal-elb
:將這個標記套用至子網路,標示為可供內部負載平衡器使用。將標記的值設為1
。如要套用這個標記,請執行下列指令:aws ec2 create-tags \ --resources SUBNET_ID \ --tags Key=kubernetes.io/role/internal-elb,Value=1
更改下列內容:
SUBNET_ID
:要標記的子網路 ID
為子網路加上 kubernetes.io/role
標記後,您也可以使用一或多個 kubernetes.io/cluster/CLUSTER_UID
標記,其中 CLUSTER_UID 是 GKE on AWS 叢集的 UID。這樣一來,未列在其中一個標記中的任何叢集,就不會自動探索子網路,供負載平衡器使用。
如要進一步瞭解 aws ec2 create-tags
指令,請參閱 Amazon aws ec2 create-tags 說明文件。
疑難排解
負載平衡器設定最常見的問題是子網路標記錯誤。這可能會導致自動探索演算法選取錯誤的子網路。如要診斷及解決這個問題,請按照下列步驟操作:
如果您要建立面向網際網路的負載平衡器,請確保每個包含節點集區的可用區中,至少有一個公用子網路,且子網路已標記
kubernetes.io/role/elb
。如果您要建立內部負載平衡器,請確保每個包含節點集區的可用區中,至少有一個子網路,且子網路已標記
kubernetes.io/role/internal-elb
。檢查要自動探索的子網路是否含有
kubernetes.io/cluster/CLUSTER_UID
形式的任何標記。如果子網路有任何這類標記來命名叢集,則子網路只能由已命名的叢集自動探索。如要解決這個問題,請刪除所有叢集名稱標記 (讓系統從任何叢集自動探索子網路),或新增叢集名稱標記,並將 GKE on AWS 叢集 UID 和shared
值一併加入。使用下列指令檢查 Kubernetes 事件記錄:
kubectl get events -A | grep LoadBalancer
舉例來說,事件訊息
could not find any suitable subnets for creating the ELB
表示系統無法自動探索任何子網路。如果收到這則警告,請確認子網路及其標記正確無誤且完整。如要列出可自動探索的子網路,以供網際網路連線負載平衡器使用,請執行下列指令:
aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/elb,Values=*"
將
VPC_ID
替換為 VPC 的 ID。如要列出可供內部負載平衡器自動探索的子網路,請執行下列指令:
aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/internal-elb,Values=*"
後續步驟
進一步瞭解網路負載平衡