內部負載平衡

本頁說明如何在 Google Kubernetes Engine 上建立 Compute Engine 內部負載平衡器

總覽

「內部負載平衡」可以讓叢集外的應用程式 (使用同一個虛擬私人雲端網路且位於同一個 GCP 地區) 存取您叢集的服務。例如,假設您的叢集在 us-west1 地區,且您需要讓同一個虛擬私人雲端網路中執行於該地區的某些 Compute Engine VM 執行個體存取其服務。只要在叢集的其中一個服務資源新增內部負載平衡器,就可以達到這個目的。

如不使用內部負載平衡功能,就必須設定外部負載平衡器、建立限制存取的防火牆規則,以及設定網路路徑,讓叢集以外的執行個體能夠存取應用程式的 IP 位址。

內部負載平衡功能會在叢集中建立一個私人 (RFC 1918) LoadBalancer Ingress IP 位址,用於接收同一個運算地區內的網路流量。

建立內部負載平衡器時需使用 kubectl 建立含 cloud.google.com/load-balancer-type: "Internal" 註解和 LoadBalancer 規格的服務資源。

定價

我們將按照 Compute Engine 的定價模式向您收費。詳情請參閱內部負載平衡定價頁面。

事前準備

參閱內部負載平衡功能的限制

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

建立內部負載平衡器

下列各節說明如何使用服務建立內部負載平衡器。內部負載平衡器支援服務參數,如 externalTrafficPolicysessionAffinityloadBalancerSourceRanges

編寫服務設定檔

以下為建立內部負載平衡器的 service.yaml 服務範例:

apiVersion: v1
kind: Service
metadata:
  name: [SERVICE_NAME]
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  labels:
    [KEY]: [VALUE]
spec:
  type: LoadBalancer
  loadBalancerIP: [IP_ADDRESS] # if omitted, an IP is generated
  loadBalancerSourceRanges:
  - [IP_RANGE] # defaults to 0.0.0.0/0
  ports:
  - name: [PORT_NAME]
    port: 9000
    protocol: TCP # default; can also specify UDP
  selector:
    [KEY]: [VALUE] # label selector for Pods to target

服務設定檔必須包含以下項目:

  • [SERVICE_NAME],您為服務選擇的名稱
  • cloud.google.com/load-balancer-type: "Internal" 註解,指定要設定內部負載平衡器
  • LoadBalancerport 類型欄位。

您還應包含以下項目:

  • spec: loadBalancerSourceRanges 陣列,指定虛擬私人雲端網路、子網路或 VPN 閘道所使用的一或多個 RFC 1918 範圍。 loadBalancerSourceRanges 可限制通過負載平衡器連入此欄位指定 IP 的流量。若您不手動設定此欄位,此欄位預設為 0.0.0.0,會允許所有 IPv4 流量進入節點。
  • spec: selector 欄位,用於指定服務應指向的 Pod。例如,selector 可能會指向標記為 app: web 的 Pod。

您還可以包含以下選填欄位:

  • spec: loadBalancerIP,可為負載平衡器選擇一個具體的 IP 位址。其他內部負載平衡器或服務不能使用此 IP 位址。如省略此欄位,系統會指派一個暫時的 IP 位址。有關如何在子網路中預留私人 IP 位址的詳情,請參閱預留靜態內部 IP 位址
  • spec: ports: protocol 定義內部負載平衡器的通訊埠應使用的網路通訊協定。如果省略此欄位,通訊埠會使用 TCP。

如要進一步瞭解如何設定 loadBalancerSourceRanges 以限制內部負載平衡器的存取權,請參閱設定雲端供應商的防火牆。如要進一步瞭解服務規格,請參閱 Service API 參考資料

部署服務

如要建立內部負載平衡器,請在殼層或終端機視窗中執行以下指令:

kubectl apply -f service.yaml

檢查服務

請在部署之後檢查服務,確認服務已成功設定完成。

gcloud

如要檢查內部負載平衡器,請執行下列指令:

kubectl describe service [SERVICE_NAME]

此指令會輸出類似以下的結果:

Name:     [SERVICE_NAME]
Namespace:    default
Labels:     app=echo
Annotations:    cloud.google.com/load-balancer-type=Internal
Selector:   app=echo
Type:     LoadBalancer
IP:     10.0.146.226
LoadBalancer Ingress: 10.128.0.6
Port:       9000/TCP
NodePort:   30387/TCP
Endpoints:    10.100.1.10:80,10.100.2.10:80,10.100.3.8:80
Session Affinity: ClientIP

IP 是服務的叢集 IP 位址。

主控台

如要檢查內部負載平衡器,請執行以下步驟:

  1. 前往 GCP 主控台的「Google Kubernetes Engine Services」(Google Kubernetes Engine 服務) 選單。

    前往「Services」(服務) 選單

  2. 選擇您要的服務。

服務詳細資料選單包含以下項目:

  • 外部端點
  • 叢集 IP
  • 負載平衡器 IP
  • 服務提供的 Pod 清單

使用內部負載平衡器

您可以使用叢集 IP 位址從叢集內部存取服務。若要從叢集外部存取服務,請使用 LoadBalancer Ingress IP 位址。

現有輸入資源的注意事項

如果您的叢集有輸入資源,該資源必須使用 RATE 平衡模式。UTILIZATION 平衡模式與內部負載平衡器不相容。

之前由 Kubernetes 輸入資源物件建立的 BackendService 資源未指定平衡模式。根據預設,API 會在 HTTP 負載平衡器使用 UTILIZATION 平衡模式。然而,內部負載平衡器無法指向其他使用 UTILIZATION 的負載平衡器的執行個體群組。

為確保內部負載平衡器與輸入資源相容,您可能需要執行一些手動步驟。

確定您的輸入是否相容

如要確定您的輸入是否相容,請在殼層或終端機視窗中執行以下指令:

GROUPNAME=`kubectl get configmaps ingress-uid -o jsonpath='k8s-ig--{.data.uid}' --namespace=kube-system`
gcloud compute backend-services list --format="table(name,backends[].balancingMode,backends[].group)" | grep $GROUPNAME

這些指令會匯出一個殼層變數 GROUPNAME,用以擷取叢集的執行個體群組名稱。接著,系統會輪詢專案的 Compute Engine BackendService 資源,並根據 $GROUPNAME 的內容縮小結果範圍。

此指令會輸出類似以下的結果:

k8s-be-31210--...  [u'RATE']       us-central1-b/instanceGroups/k8s-ig--...
k8s-be-32125--...  [u'RATE']       us-central1-b/instanceGroups/k8s-ig--...

如果輸出傳回 RATE 項目或零項目,表示內部負載平衡器彼此相容,無須額外進行處理。

如果輸出傳回有 UTILIZATION 標記的項目,表示您的輸入彼此不相容。

更新現有的輸入

只有在沒有任何 HTTP(S) 負載平衡器指向叢集的情況下,您才可以變更輸入平衡模式類型。

若要更新您的輸入資源,使其與內部負載平衡器相容,您可以建立一個執行 Kubernetes 1.7.2 或更高版本的新叢集,然後將您的服務遷移到該叢集。遷移到新的叢集可確保輸入都會擁有相容的平衡模式。

內部負載平衡器的限制

  • 您的主要執行個體和節點必須執行 Kubernetes 1.7.2 或更高版本。
  • 只能在同一個網路和地區內部存取內部負載平衡器。
  • 內部負載平衡器通訊埠只能透過「一種」通訊協定 (TCP 或 UDP) 提供流量。內部負載平衡器會使用「Service」(服務) 定義中指定的第一個通訊埠的通訊協定。
  • 內部負載平衡器不支援同時使用 UDP 和 sessionAffinity: ClientIP
  • 若執行 Kubernetes 1.7.4 以上的叢集版本,除自動模式子網路以外,也可以使用內部負載平衡器搭配自訂模式子網路
  • 如執行 Kubernetes 1.7.X 版叢集,雖然 clusterIP 維持不變,但不能預留內部負載平衡器 IP 位址。變更通訊埠、通訊協定或工作階段相依性可能也會變更這些 IP 位址。
  • Google Kubernetes Engine (GKE) 目前不支援使用內部負載平衡器轉寄規則 (測試中) 指定所有通訊埠

限制

內部轉寄規則 (ILB) 數目限制是每個虛擬私人雲端網路共用虛擬私人雲端網路 50 次。若虛擬私人雲端與另一個虛擬私人雲端對等互連,則所有共用虛擬私人雲端共用該項限制。

類型為 Loadbalancer 且含 cloud.google.com/load-balancer-type: Internal 註解的 Kubernetes 服務會建立以該 Kubernetes 服務為目標的 ILB。因此,GKE 不支援在單一虛擬私人雲端或共用虛擬私人雲端網路中建立超過 50 項此類 Kubernetes 服務,對等互連虛擬私人雲端也包括在內。

在 GKE 叢集中,內部轉寄規則會指向該叢集中的所有節點。叢集中的每個節點均為該 ILB 的後端 VM。ILB 後端 VM 數目上限是 250 個,不論這些 VM 與執行個體群組是否具有關聯。因此,一個有 ILB 的 GKE 叢集,節點數目不可超過 250 個。若您啟用了叢集的自動調度資源功能,必須確認該項功能進行自動調度時不會導致叢集數目超過 250 個。

有關這些限制的詳情,請參閱虛擬私人雲端資源配額

如要瞭解內部負載平衡器的限制,請參閱「Compute Engine 內部負載平衡頁面」的限制一節。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件