本頁說明如何部署內部 LoadBalancer 服務,以建構內部直通式網路負載平衡器。閱讀本頁面之前,請先熟悉下列項目:
如要進一步瞭解內部直通式網路負載平衡器,請參閱內部直通式網路負載平衡器總覽。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。舊版 gcloud CLI 可能不支援執行本文中的指令。
- 請確認您有現有的 Autopilot 或 Standard 叢集。如要建立新叢集,請參閱「建立 Autopilot 叢集」。
需求條件
本教學課程會使用
spec.loadBalancerClass建立內部直通式網路負載平衡器,並搭配GCE_VM_IPNEG 後端。本教學課程需要使用 GKE 1.33.1-gke.1779000 以上版本,因為spec.loadBalancerClass需要 GKE 1.33.1-gke.1779000 以上版本。區域親和性需要 GKE 1.33.3-gke.1392000 以上版本。
叢集必須啟用 GKE 子集:
執行 1.36 以上版本的叢集預設會啟用 GKE 子設定。對於這些版本,無論叢集的子集化標記值為何,子集化都會處於啟用狀態。
在 1.36 版之前的支援 GKE 版本中,您必須明確啟用 GKE 子設定。您可以在建立新叢集時或更新現有叢集時啟用 GKE 子設定。啟用後,GKE 子設定就無法停用。詳情請參閱「驗證及啟用 GKE 子設定」。
如果叢集版本低於 1.36,請務必在叢集中啟用
HttpLoadBalancing外掛程式。這項外掛程式預設為啟用。如要為內部 LoadBalancer 服務啟用 Cloud Logging,GKE 叢集必須使用 1.36.0-gke.2459000 以上版本。
驗證並啟用 GKE 子設定
確認已啟用 GKE 子集:
在 GKE 1.36 以上版本中,GKE 子設定一律會啟用。
您可以在執行 GKE 1.18.19-gke.1400 以上版本 (但低於 GKE 1.36 版) 的新舊 Standard 和 Autopilot 叢集中,手動啟用 GKE 子設定。啟用 GKE 子集後,就無法停用。
如要瞭解 GKE 子集為何重要,請參閱內部 LoadBalancer 服務的特殊考量。
如要判斷是否已啟用 GKE 子集,請執行下列指令:
gcloud container clusters describe CLUSTER_NAME \
--location=LOCATION \
--format="get(currentMasterVersion, networkConfig.enableL4ilbSubsetting)"
更改下列內容:
CLUSTER_NAME:叢集名稱。LOCATION:叢集的可用區或區域。
指令輸出內容會顯示叢集的控制層版本,後面接著 networkConfig.enableL4ilbSubsetting 屬性的 True 或 False。請依下列方式解讀輸出內容:
- 如果控制層版本為 1.36 以上,無論
networkConfig.enableL4ilbSubsetting屬性是True或False,系統都會啟用 GKE 子集。 - 如果控制層版本早於 1.36:
True表示已啟用 GKE 子集。False表示 GKE 子集已停用。
如要在執行 GKE 1.18.19-gke.1400 以上版本 (但低於 GKE 1.36 版) 的叢集中啟用 GKE 子設定,請使用 gcloud CLI 或 Google Cloud 控制台。
控制台
在 Google Cloud 控制台中,前往「Google Kubernetes Engine」頁面。
在叢集清單中,按一下您要修改的叢集名稱。
在「網路」下方,點選「L4 內部負載平衡器的子設定」欄位旁的 edit「啟用 L4 內部負載平衡器的子設定」。
勾選「啟用 L4 內部負載平衡器的子設定」核取方塊。
按一下 [儲存變更]。
gcloud
gcloud container clusters update CLUSTER_NAME \
--location=LOCATION
--enable-l4-ilb-subsetting
更改下列內容:
CLUSTER_NAME:叢集名稱。LOCATION:叢集的可用區或區域。
啟用 GKE 子集化功能 (使用 gcloud CLI、Google Cloud 控制台,或將叢集升級至 1.36 以上版本) 不會修改現有的內部 LoadBalancer 服務。如要遷移現有的內部 LoadBalancer 服務,改用 GCE_VM_IP NEG 後端,請部署替代服務資訊清單。
部署工作負載
下列資訊清單說明執行範例網路應用程式容器映像檔的 Deployment。
將資訊清單儲存為
ilb-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: ilb-deployment spec: replicas: 3 selector: matchLabels: app: ilb-deployment template: metadata: labels: app: ilb-deployment spec: containers: - name: hello-app image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0將資訊清單套用至叢集:
kubectl apply -f ilb-deployment.yaml
建立內部 LoadBalancer 服務
(選用) 停用自動建立虛擬私有雲防火牆規則:
GKE 會自動建立虛擬私有雲防火牆規則,允許流量傳送至內部負載平衡器,但您可以選擇停用自動建立虛擬私有雲防火牆規則的功能,自行管理防火牆規則。如要停用虛擬私有雲防火牆規則,您必須為內部 LoadBalancer Service 啟用 GKE 子網路。不過,管理虛擬私有雲防火牆規則是選用功能,您可以依賴自動規則。
停用自動建立虛擬私有雲防火牆規則前,請務必定義允許規則,允許流量傳送至負載平衡器和應用程式 Pod。
如要進一步瞭解如何管理虛擬私有雲防火牆規則,請參閱「管理自動建立的防火牆規則」一文。如要瞭解如何停用自動建立的防火牆規則,請參閱「GKE LoadBalancer Service 的使用者代管防火牆規則」一文。
下列範例會使用 TCP 連接埠
80建立內部 LoadBalancer 服務。GKE 會部署內部直通式網路負載平衡器,其轉送規則使用通訊埠80,但會將流量轉送至通訊埠8080的後端 Pod:將資訊清單儲存為
ilb-svc.yaml:apiVersion: v1 kind: Service metadata: name: ilb-svc spec: type: LoadBalancer # Request an internal load balancer. loadBalancerClass: networking.gke.io/l4-regional-internal # Evenly route external traffic to all endpoints. externalTrafficPolicy: Cluster # Prioritize routing traffic to endpoints that are in the same zone. trafficDistribution: PreferSameZone selector: app: ilb-deployment # Forward traffic from TCP port 80 to port 8080 in backend Pods. ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080資訊清單必須包含下列內容:
- 內部 LoadBalancer 服務的
name,在本例中為ilb-svc。 spec.loadBalancerClass欄位設為networking.gke.io/l4-regional-internal值,可指定內部 LoadBalancer 服務,如範例資訊清單所示。type: LoadBalancer。spec: selector欄位,用於指定服務應指向的 Pod,例如app: hello。- 通訊埠資訊:
port代表目的地通訊埠,內部直通式網路負載平衡器的轉送規則會透過該通訊埠接收封包。targetPort必須與每個服務 Pod 上定義的containerPort相符。port和targetPort的值不必相同。節點一律會執行目的地 NAT,將目的地負載平衡器轉送規則 IP 位址和port變更為目的地 Pod IP 位址和targetPort。詳情請參閱「LoadBalancer 服務概念」說明文件中的「節點上的目的地網路位址轉譯」。
資訊清單可包含下列項目:
spec.ipFamilyPolicy和ipFamilies,定義 GKE 如何將 IP 位址分配給服務。GKE 支援單一堆疊 (僅限 IPv4 或 IPv6),或雙重堆疊 IP LoadBalancer 服務。雙重堆疊 LoadBalancer 服務會透過兩個不同的內部直通網路負載平衡器轉送規則實作:一個用於 IPv4 流量,另一個用於 IPv6 流量。GKE 雙堆疊 LoadBalancer Service 適用於 1.29 以上版本。詳情請參閱「IPv4/IPv6 雙重堆疊服務」。,定義 GKE 如何轉送傳入流量。如要啟用區域親和性,請將這個欄位的值設為
PreferSameZone。區域親和性是指 GKE 會優先將來自某個區域的流量,轉送至該區域內的節點和 Pod。如果該區域沒有可用的健康狀態 Pod,流量就會轉送至其他區域。如果是 1.35.0-gke.1811000 之前的叢集版本,請改用PreferClose做為值。區域親和性需要啟用 GKE 子集。spec.trafficDistribution
詳情請參閱「LoadBalancer 服務參數」。
- 內部 LoadBalancer 服務的
將資訊清單套用至叢集:
kubectl apply -f ilb-svc.yaml
取得服務的詳細資訊:
kubectl get service ilb-svc --output yaml輸出結果會與下列內容相似:
apiVersion: v1 kind: Service metadata: annotations: cloud.google.com/neg: '{"ingress":true}' cloud.google.com/neg-status: '{"network_endpoint_groups":{"0":"k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r"},"zones":["ZONE_NAME","ZONE_NAME","ZONE_NAME"]}' kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"networking.gke.io/load-balancer-type":"Internal"},"name":"ilb-svc","namespace":"default"},"spec":{"externalTrafficPolicy":"Cluster","ports":[{"name":"tcp-port","port":80,"protocol":"TCP","targetPort":8080}],"selector":{"app":"ilb-deployment"},"type":"LoadBalancer"}} networking.gke.io/load-balancer-type: Internal service.kubernetes.io/backend-service: k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r service.kubernetes.io/firewall-rule: k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r service.kubernetes.io/firewall-rule-for-hc: k8s2-pn2h9n5f-l4-shared-hc-fw service.kubernetes.io/healthcheck: k8s2-pn2h9n5f-l4-shared-hc service.kubernetes.io/tcp-forwarding-rule: k8s2-tcp-pn2h9n5f-default-ilb-svc-3bei4n1r creationTimestamp: "2022-07-22T17:26:04Z" finalizers: - gke.networking.io/l4-ilb-v2 - service.kubernetes.io/load-balancer-cleanup name: ilb-svc namespace: default resourceVersion: "51666" uid: d7a1a865-7972-44e1-aa9e-db5be23d6567 spec: allocateLoadBalancerNodePorts: true clusterIP: 10.88.2.141 clusterIPs: - 10.88.2.141 externalTrafficPolicy: Cluster internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: tcp-port # Kubernetes automatically allocates a port on the node during the # process of implementing a Service of type LoadBalancer. nodePort: 30521 port: 80 protocol: TCP targetPort: 8080 selector: app: ilb-deployment sessionAffinity: None trafficDistribution: PreferSameZone type: LoadBalancer status: # IP address of the load balancer forwarding rule. loadBalancer: ingress: - ip: 10.128.15.245輸出內容具有下列屬性:
- 內部直通式網路負載平衡器轉送規則的 IP 位址會納入
status.loadBalancer.ingress。這個 IP 位址與clusterIP的值不同。在本範例中,負載平衡器的轉送規則 IP 位址為10.128.15.245。 - 任何具有
app: ilb-deployment標籤的 Pod 都是這項 Service 的服務 Pod。這些 Pod 會接收內部直通式網路負載平衡器轉送的封包。 - 用戶端會使用這個
loadBalancerIP 位址,以及服務資訊清單的port欄位中指定的 TCP 目的地通訊埠來呼叫服務。如要瞭解節點收到封包後如何轉送封包,請參閱「封包處理」。 - GKE 已將
nodePort指派給服務;在本範例中,指派的通訊埠為30521。nodePort與內部直通式網路負載平衡器無關。
- 內部直通式網路負載平衡器轉送規則的 IP 位址會納入
檢查服務網路端點群組:
kubectl get svc ilb-svc -o=jsonpath="{.metadata.annotations.cloud\.google\.com/neg-status}"輸出結果會與下列內容相似:
{"network_endpoint_groups":{"0":"k8s2-knlc4c77-default-ilb-svc-ua5ugas0"},"zones":["ZONE_NAME"]}回應指出 GKE 已建立名為
k8s2-knlc4c77-default-ilb-svc-ua5ugas0的網路端點群組。使用 GKE 子集的LoadBalancer類型服務會顯示這項註解,未使用 GKE 子集的服務則不會顯示。
啟用後端服務的記錄功能
您可以啟用、停用及查看內部直通式網路負載平衡器的記錄功能。如要為後端服務啟用記錄功能,必須啟用 GKE 子設定。
如要設定 Cloud Logging,請建立 L4LBConfig 自訂資源,指定記錄設定。L4LBConfig 資源會連結至 Service 資訊清單中的 Kubernetes 服務。套用資訊清單後,GKE 控制器會為後端服務設定記錄功能。如果未將 L4LBConfig 資源連結至 Service,控制器會停止管理記錄設定,並將後端服務維持在最後已知的狀態。詳情請參閱「瞭解滑行行為」。
您可以設定下列欄位:
enabled:如果設為true,則會啟用這項服務的記錄功能,且記錄檔會顯示在 Cloud Logging 中。否則,系統會停用這項服務的記錄功能。sampleRate:指定介於0到1,000,000(預設值) 之間的值,其中0表示不會記錄任何封包,1,000,000則代表會記錄所有封包。sampleRate欄位為選填,且只有在enable欄位的值設為true時才適用。optionalMode:控制負載平衡器產生的記錄中包含哪些選用中繼資料欄位。這個欄位接受下列其中一個字串值:EXCLUDE_ALL_OPTIONAL:如果未指定optionalMode,則為預設設定。設定後,記錄檔不會包含任何選填欄位,提供最簡潔的記錄格式。INCLUDE_ALL_OPTIONAL:啟用所有可用選填欄位的記錄功能,提供最詳細的記錄項目。CUSTOM:指定要納入記錄的選填欄位自訂清單。使用CUSTOM模式時,您也必須使用optionalFields參數,提供以半形逗號分隔的所需欄位清單。
optionalFields:以半形逗號分隔的欄位名稱字串。定義要納入所產生記錄的確切選用中繼資料欄位。只有在optionalMode設為CUSTOM時,才會使用這個欄位,否則系統會忽略任何值。
如要設定 Cloud Logging,請在與 Service 資源相同的命名空間中建立 L4LBConfig 資源。下列 L4LBConfig 資訊清單範例會啟用 Cloud Logging,並將特定負載平衡器服務的要求取樣率設為 50%。
將下列資訊清單儲存為
svc-l4lb-config.yaml:apiVersion: networking.gke.io/v1 kind: L4LBConfig metadata: name: svc-l4lb-config namespace: default spec: logging: enabled: true # must be included sampleRate: 500000 optionalMode: "INCLUDE_ALL_OPTIONAL"將 L4LBConfig 資訊清單套用至叢集:
kubectl apply -f svc-l4lb-config.yaml將
networking.gke.io/l4lb-config註解新增至ilb-svc.yaml服務資訊清單:apiVersion: v1 kind: Service metadata: name: ilb-svc annotations: networking.gke.io/load-balancer-type: "Internal" networking.gke.io/l4lb-config: "svc-l4lb-config" spec: type: LoadBalancer selector: app: store ports: - name: tcp-port protocol: TCP port: 8080 targetPort: 8080將 Service 資訊清單套用至叢集:
kubectl apply -f ilb-svc.yaml
驗證內部直通式網路負載平衡器元件
本節說明如何驗證內部直通式網路負載平衡器的主要元件。
確認服務正在執行:
kubectl get service SERVICE_NAME --output yaml將
SERVICE_NAME替換為服務資訊清單的名稱。如果您已啟用區域親和性,輸出內容會包含
spec.trafficDistribution參數。如果叢集版本低於 1.35.0-gke.1811000,這個欄位的值會設為PreferSameZone或PreferClose。確認內部直通式網路負載平衡器的轉送規則 IP 位址。在「建立內部 LoadBalancer 服務」一節的範例中,內部直通式網路負載平衡器的轉送規則 IP 位址為
10.128.15.245。使用 Google Cloud CLI 驗證這個轉送規則是否包含在叢集專案的轉送規則清單中:gcloud compute forwarding-rules list --filter="loadBalancingScheme=INTERNAL"輸出內容會包含相關的內部直通式網路負載平衡器轉送規則、其 IP 位址,以及轉送規則參照的後端服務 (本例中為
k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r)。NAME ... IP_ADDRESS ... TARGET ... k8s2-tcp-pn2h9n5f-default-ilb-svc-3bei4n1r 10.128.15.245 ZONE_NAME/backendServices/k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r使用 Google Cloud CLI 描述負載平衡器的後端服務:
gcloud compute backend-services describe k8s2-tcp-pn2h9n5f-default-ilb-svc-3bei4n1r --region=COMPUTE_REGION將
COMPUTE_REGION替換為後端服務的 Compute 區域。如果您已啟用可用區相依性:
networkPassThroughLbTrafficPolicy.zonalAffinity.spillover欄位應設為ZONAL_AFFINITY_SPILL_CROSS_ZONE值。networkPassThroughLbTrafficPolicy.zonalAffinity.spilloverRatio欄位應設為0或不包含在內。
輸出內容包含服務的後端
GCE_VM_IPNEG 或 NEG (本例中為k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r)。backends: - balancingMode: CONNECTION group: .../ZONE_NAME/networkEndpointGroups/k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r ... kind: compute#backendService loadBalancingScheme: INTERNAL name: aae3e263abe0911e9b32a42010a80008 networkPassThroughLbTrafficPolicy: zonalAffinity: spillover: ZONAL_AFFINITY_SPILL_CROSS_ZONE protocol: TCP ...如果停用可用區親和性,
networkPassThroughLbTrafficPolicy.zonalAffinity.spillover欄位應設為ZONAL_AFFINITY_DISABLED或不包含在內。請注意,如果叢集版本低於 1.33.3-gke.1392000,系統會自動停用區域親和性。判斷服務子集中的節點清單:
gcloud compute network-endpoint-groups list-network-endpoints NEG_NAME \ --zone=COMPUTE_ZONE更改下列內容:
NEG_NAME:由 GKE 控制器建立的網路端點群組名稱。COMPUTE_ZONE:要執行的網路端點群組運算可用區。
判斷內部直通式網路負載平衡器的健康節點清單:
gcloud compute backend-services get-health SERVICE_NAME \ --region=COMPUTE_REGION更改下列內容:
SERVICE_NAME:後端服務的名稱。這個值與 GKE 控制器建立的網路端點群組名稱相同。COMPUTE_REGION:要運作的後端服務運算區域。
確認服務已啟用 Cloud Logging:
kubectl get svc SERVICE_NAME --output yaml更改下列內容:
SERVICE_NAME:服務名稱。
在輸出內容中,確認
Status.Conditions欄位含有Type: LoggingConfigManaged和Reason: Reconciled。
測試與內部直通式網路負載平衡器的連線
在與叢集相同的區域中執行下列指令:
curl LOAD_BALANCER_IP:80
請將 LOAD_BALANCER_IP 替換為負載平衡器的轉送規則 IP 位址。
回應會顯示 ilb-deployment 的輸出:
Hello, world!
Version: 1.0.0
Hostname: ilb-deployment-77b45987f7-pw54n
內部直通式網路負載平衡器只能在同一個 VPC 網路 (或連線網路) 內存取。根據預設,負載平衡器的轉送規則會停用全域存取權,因此用戶端 VM、Cloud VPN 通道或 Cloud Interconnect 連結 (VLAN) 必須與內部直通式網路負載平衡器位於相同區域。如要支援所有區域的用戶端,您可以在服務資訊清單中加入 global access 註解,在負載平衡器的轉送規則中啟用全域存取權。
刪除內部 LoadBalancer 服務和負載平衡器資源
您可以使用 kubectl delete 或Google Cloud 控制台刪除 Deployment 和 Service。
kubectl
刪除部署作業
如要刪除 Deployment,請執行下列指令:
kubectl delete deployment ilb-deployment
刪除服務
如要刪除 Service,請執行下列指令:
kubectl delete service ilb-svc
控制台
刪除部署作業
如要刪除 Deployment,請執行下列步驟:
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
選取要刪除的部署作業,然後按一下「刪除」delete。
系統提示確認時,請勾選「刪除與所選 Deployment 相關聯的水平 Pod 自動配置器」核取方塊,然後按一下「刪除」。
刪除服務
如要刪除服務,請執行下列步驟:
前往 Google Cloud 控制台的「Services & Ingress」(服務和 Ingress) 頁面。
選取要刪除的服務,然後按一下 delete「刪除」。
當系統提示時,按一下「Delete」(刪除)。
共用 IP
內部直通式網路負載平衡器可讓多個轉送規則共用虛擬 IP 位址。這項功能有助於擴充同一 IP 上的並行通訊埠數量,或在同一 IP 上接受 UDP 和 TCP 流量。每個 IP 位址最多可公開 50 個通訊埠。內部 LoadBalancer 服務的 GKE 叢集原生支援共用 IP。部署時,系統會使用「服務」的「loadBalancerIP」欄位,指出應在「服務」之間共用的 IP。
限制
多個負載平衡器共用 IP 時,有以下限制和功能:
- 每項轉送規則最多可有五個通訊埠 (連續或不連續),也可以設定為比對並轉送所有通訊埠的流量。如果內部負載平衡器服務定義的通訊埠超過五個,轉送規則會自動設為比對所有通訊埠。
- 最多十個服務 (轉送規則) 可以共用一個 IP 位址。因此,每個共用 IP 最多可有 50 個通訊埠。
- 共用相同 IP 位址的每個轉送規則,都必須使用不重複的通訊協定和通訊埠組合。因此,每個內部 LoadBalancer 服務都必須使用一組不重複的通訊協定和連接埠。
- 在同一個共用 IP 上,系統支援僅限 TCP 和僅限 UDP 的服務組合,但您無法在同一個服務中公開 TCP 和 UDP 連接埠。
啟用共用 IP
如要讓內部 LoadBalancer 服務共用 IP,請按照下列步驟操作:
使用
--purpose SHARED_LOADBALANCER_VIP建立靜態內部 IP。您必須為此目的建立 IP 位址,才能啟用共用功能。如果您在共用虛擬私有雲中建立靜態內部 IP 位址,則必須在與將使用該 IP 位址的執行個體相同的服務專案中建立 IP 位址,即使 IP 位址的值來自共用虛擬私有雲網路所選共用子網路中的可用 IP 範圍也是如此。如需更多資訊,請參閱「佈建共用虛擬私有雲」頁面中的「保留靜態內部 IP」。在
loadBalancerIP欄位中,使用這個靜態 IP 位址部署最多十個內部 LoadBalancer 服務。內部直通網路負載平衡器會由 GKE 服務控制器進行協調,並使用相同的前端 IP 位址部署。
以下範例說明如何執行這項操作,以支援相同內部負載平衡器 IP 的多個 TCP 和 UDP 連接埠。
在與 GKE 叢集相同的區域中建立靜態 IP。子網路必須與負載平衡器使用的子網路相同,預設為 GKE 叢集節點 IP 使用的子網路。
如果叢集和虛擬私有雲網路位於相同專案:
gcloud compute addresses create IP_ADDR_NAME \ --project=PROJECT_ID \ --subnet=SUBNET \ --addresses=IP_ADDRESS \ --region=COMPUTE_REGION \ --purpose=SHARED_LOADBALANCER_VIP如果叢集位於共用虛擬私有雲服務專案中,但使用主專案中的共用虛擬私有雲網路:
gcloud compute addresses create IP_ADDR_NAME \ --project=SERVICE_PROJECT_ID \ --subnet=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET \ --addresses=IP_ADDRESS \ --region=COMPUTE_REGION \ --purpose=SHARED_LOADBALANCER_VIP更改下列內容:
IP_ADDR_NAME:IP 位址物件的名稱。SERVICE_PROJECT_ID:服務專案的 ID。PROJECT_ID:專案 ID (單一專案)。HOST_PROJECT_ID:Shared VPC 主專案的 ID。COMPUTE_REGION:包含共用子網路的運算區域。IP_ADDRESS:所選子網路主要 IP 位址範圍中未使用的內部 IP 位址。如果省略指定 IP 位址, Google Cloud 會從所選子網路的主要 IP 位址範圍中,選取未使用的內部 IP 位址。如要判斷自動選取的地址,請執行gcloud compute addresses describe。SUBNET:共用子網路的名稱。
將下列 TCP 服務設定儲存至名為
tcp-service.yaml的檔案,然後部署至叢集。將IP_ADDRESS替換為您在上一個步驟中選擇的 IP 位址。apiVersion: v1 kind: Service metadata: name: tcp-service namespace: default spec: type: LoadBalancer # Request an internal load balancer. loadBalancerClass: networking.gke.io/l4-regional-internal # Use an IP address that you create. loadBalancerIP: IP_ADDRESS selector: app: myapp ports: - name: 8001-to-8001 protocol: TCP port: 8001 targetPort: 8001 - name: 8002-to-8002 protocol: TCP port: 8002 targetPort: 8002 - name: 8003-to-8003 protocol: TCP port: 8003 targetPort: 8003 - name: 8004-to-8004 protocol: TCP port: 8004 targetPort: 8004 - name: 8005-to-8005 protocol: TCP port: 8005 targetPort: 8005將這個 Service 定義套用至叢集:
kubectl apply -f tcp-service.yaml將下列 UDP 服務設定儲存至名為
udp-service.yaml的檔案,然後部署。這項設定也會使用您在上一個步驟中指定的IP_ADDRESS。apiVersion: v1 kind: Service metadata: name: udp-service namespace: default spec: type: LoadBalancer # Request an internal load balancer. loadBalancerClass: networking.gke.io/l4-regional-internal # Use the same IP address that you used for the TCP Service. loadBalancerIP: IP_ADDRESS selector: app: my-udp-app ports: - name: 9001-to-9001 protocol: UDP port: 9001 targetPort: 9001 - name: 9002-to-9002 protocol: UDP port: 9002 targetPort: 9002將這個檔案套用至叢集:
kubectl apply -f udp-service.yaml列出負載平衡器轉送規則並篩選靜態 IP,驗證 VIP 是否在這些規則之間共用。這會顯示 UDP 和 TCP 轉送規則都在共用
IP_ADDRESS上監聽七個不同的通訊埠,在本範例中,共用IP_ADDRESS為10.128.2.98。gcloud compute forwarding-rules list | grep 10.128.2.98 ab4d8205d655f4353a5cff5b224a0dde us-west1 10.128.2.98 UDP us-west1/backendServices/ab4d8205d655f4353a5cff5b224a0dde acd6eeaa00a35419c9530caeb6540435 us-west1 10.128.2.98 TCP us-west1/backendServices/acd6eeaa00a35419c9530caeb6540435
已知問題
在 Standard 層級建立負載平衡器時發生錯誤
在專案中建立內部直通式網路負載平衡器時,如果專案預設網路層級設為「標準級」,系統會顯示下列錯誤訊息:
Error syncing load balancer: failed to ensure load balancer: googleapi: Error 400: STANDARD network tier (the project's default network tier) is not supported: Network tier other than PREMIUM is not supported for loadBalancingScheme=INTERNAL., badRequest
如要在 1.23.3-gke.900 之前的 GKE 版本中解決這個問題,請將專案預設網路層級設為「進階」。
啟用 GKE 子集後,GKE 1.23.3-gke.900 以上版本會解決這個問題。
即使專案預設網路層級設為「標準」,GKE 控制器仍會在「進階」網路層級中建立內部直通式網路負載平衡器。
後續步驟
- 閱讀 GKE 網路總覽。
- 進一步瞭解 Compute Engine 負載平衡器。
- 瞭解如何建立 VPC 原生叢集。
- 排解 GKE 中的負載平衡問題。
- 瞭解 IP 偽裝代理程式。
- 瞭解如何設定授權網路。