負載平衡器子網路

本頁面說明 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=*"
    

後續步驟