建立內部負載平衡器

本頁說明如何部署內部 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_IP NEG 後端。本教學課程需要使用 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 外掛程式。這項外掛程式預設為啟用。

驗證並啟用 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 屬性的 TrueFalse。請依下列方式解讀輸出內容:

  • 如果控制層版本為 1.36 以上,無論 networkConfig.enableL4ilbSubsetting 屬性是 TrueFalse,系統都會啟用 GKE 子集。
  • 如果控制層版本早於 1.36:
    • True 表示已啟用 GKE 子集。
    • False 表示 GKE 子集功能已停用。

如要在執行 GKE 1.18.19-gke.1400 以上版本,但低於 GKE 1.36 版的叢集中啟用 GKE 子設定,請使用 gcloud CLI 或 Google Cloud 控制台。

控制台

  1. 在 Google Cloud 控制台中,前往「Google Kubernetes Engine」頁面。

    前往 Google Kubernetes Engine

  2. 在叢集清單中,按一下您要修改的叢集名稱。

  3. 在「網路」下,點選「L4 內部負載平衡器的子設定」欄位旁的 「啟用 L4 內部負載平衡器的子設定」

  4. 勾選「啟用 L4 內部負載平衡器的子設定」核取方塊。

  5. 按一下 [儲存變更]。

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。

  1. 將資訊清單儲存為 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
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f ilb-deployment.yaml
    

建立內部 LoadBalancer 服務

  1. (選用) 停用自動建立虛擬私有雲防火牆規則:

    GKE 會自動建立虛擬私有雲防火牆規則,允許流量傳送至內部負載平衡器,但您可以選擇停用自動建立虛擬私有雲防火牆規則的功能,自行管理防火牆規則。只有在為內部 LoadBalancer Service 啟用 GKE 子設定時,才能停用虛擬私有雲防火牆規則。不過,管理虛擬私有雲防火牆規則是選用功能,您也可以使用自動規則。

    停用自動建立虛擬私有雲防火牆規則前,請務必定義允許規則,允許流量傳送至負載平衡器和應用程式 Pod。

    如要進一步瞭解如何管理虛擬私有雲防火牆規則,請參閱「管理自動建立的防火牆規則」一文。如要瞭解如何停用自動建立防火牆規則的功能,請參閱「GKE LoadBalancer Service 的使用者代管防火牆規則」一文。

  2. 下列範例會使用 TCP 連接埠 80 建立內部 LoadBalancer 服務。GKE 會部署內部直通式網路負載平衡器,其轉送規則使用通訊埠 80,但會將流量轉送至通訊埠 8080 的後端 Pod:

    1. 將資訊清單儲存為 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: PreferClose
        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 相符。
        • porttargetPort 的值不必相同。節點一律會執行目的地 NAT,將目的地負載平衡器轉送規則 IP 位址和 port 變更為目的地 Pod IP 位址和 targetPort。詳情請參閱負載平衡器服務概念說明文件中的「節點上的目的地網路位址轉譯」。

      資訊清單可包含下列項目:

      • spec.ipFamilyPolicyipFamilies,定義 GKE 如何將 IP 位址分配給 Service。GKE 支援單一堆疊 (僅限 IPv4 或 IPv6),或雙重堆疊 IP LoadBalancer 服務。雙重堆疊 LoadBalancer 服務會透過兩個不同的內部直通網路負載平衡器轉送規則實作:一個用於 IPv4 流量,另一個用於 IPv6 流量。GKE 雙堆疊 LoadBalancer Service 適用於 1.29 以上版本。詳情請參閱「IPv4/IPv6 雙重堆疊服務」。
      • spec.trafficDistribution (搶先版) 定義 GKE 如何轉送傳入流量。如要啟用區域相依性,請將這個欄位的值設為 PreferSameZone。 區域相依性是指 GKE 會優先將來自某個區域的流量,轉送至該區域內的節點和 Pod。如果該可用區沒有健康狀態良好的 Pod,流量就會轉送至其他可用區。如為 1.35.0-gke.1811000 之前的叢集版本,請改用 PreferClose 做為值。如要使用區域親和性,必須啟用 GKE 子集。

      詳情請參閱「LoadBalancer 服務參數」。

    2. 將資訊清單套用至叢集:

      kubectl apply -f ilb-svc.yaml
      
  3. 取得服務的詳細資訊:

    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。
    • 用戶端會使用這個 loadBalancer IP 位址,以及 Service 資訊清單的 port 欄位中指定的 TCP 目的地通訊埠來呼叫 Service。如要瞭解節點收到封包後如何轉送,請參閱封包處理
    • GKE 為服務指派了 nodePort;在本範例中,指派的通訊埠為 30521nodePort 與內部直通式網路負載平衡器無關。
  4. 檢查服務網路端點群組:

    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 子集的服務則不會顯示。

驗證內部直通式網路負載平衡器元件

本節說明如何驗證內部直通式網路負載平衡器的主要元件。

  • 確認服務正在執行:

    kubectl get service SERVICE_NAME --output yaml
    

    SERVICE_NAME 替換為服務資訊清單的名稱。

    如果啟用區域親和性,輸出內容會包含 spec.trafficDistribution 參數。如果叢集版本低於 1.35.0-gke.1811000,這個欄位的值會設為 PreferSameZonePreferClose

  • 確認內部直通式網路負載平衡器的轉送規則 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_IP NEG 或 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:要執行的後端服務運算區域

測試與內部直通式網路負載平衡器的連線

在與叢集相同的區域中執行下列指令:

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,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 選取要刪除的部署作業,然後按一下「刪除」

  3. 系統提示您確認時,請勾選「刪除與所選 Deployment 相關聯的水平 Pod 自動配置器」核取方塊,然後按一下「刪除」

刪除服務

如要刪除服務,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Services & Ingress」(服務與 Ingress) 頁面。

    前往「Services & Ingress」(服務與 Ingress)

  2. 選取要刪除的服務,然後按一下 「刪除」

  3. 當系統提示時,按一下「Delete」(刪除)

共用 IP

內部直通式網路負載平衡器可在多個轉送規則之間共用虛擬 IP 位址。這項功能有助於擴充同一 IP 上的並行通訊埠數量,或在同一 IP 上接受 UDP 和 TCP 流量。每個 IP 位址最多可公開 50 個通訊埠。GKE 叢集上的內部 LoadBalancer 服務原生支援共用 IP。部署時,系統會使用「服務」的 loadBalancerIP 欄位,指出應在「服務」之間共用的 IP。

限制

多個負載平衡器共用 IP 時,有以下限制和功能:

  • 每個轉送規則最多可有五個通訊埠 (連續或不連續皆可),也可以設定為比對及轉送所有通訊埠的流量。如果 Internal LoadBalancer Service 定義超過五個通訊埠,轉送規則會自動設為比對所有通訊埠。
  • 最多十個服務 (轉送規則) 可以共用一個 IP 位址。因此每個共用 IP 最多只能有 50 個通訊埠。
  • 共用相同 IP 位址的每個轉送規則,都必須使用不重複的通訊協定和通訊埠組合。因此,每個內部 LoadBalancer 服務都必須使用一組不重複的通訊協定和連接埠。
  • 在同一個共用 IP 上,系統支援僅限 TCP 和僅限 UDP 的服務組合,但您無法在同一個服務中公開 TCP 和 UDP 連接埠。

啟用共用 IP

如要讓內部 LoadBalancer 服務共用 IP,請按照下列步驟操作:

  1. 使用 --purpose SHARED_LOADBALANCER_VIP 建立靜態內部 IP。您必須建立專用的 IP 位址,才能啟用共用功能。如果您在 Shared VPC 中建立靜態內部 IP 位址,則必須在與使用該 IP 位址的執行個體相同的服務專案中建立 IP 位址,即使 IP 位址的值來自 Shared VPC 虛擬私有雲網路所選共用子網路的可用 IP 範圍也一樣。詳情請參閱「佈建 Shared VPC」頁面上的保留靜態內部 IP 一節。

  2. 使用 loadBalancerIP 欄位中的這個靜態 IP,最多可部署十個內部 LoadBalancer 服務。內部直通式網路負載平衡器會由 GKE 服務控制器進行協調,並使用相同的前端 IP 進行部署。

以下範例說明如何完成這項操作,以支援相同內部負載平衡器 IP 的多個 TCP 和 UDP 連接埠。

  1. 在與 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
    

    如果叢集位於 Shared VPC 服務專案中,但使用主專案中的 Shared VPC 網路:

    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:共用子網路的名稱。
  2. 將下列 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
    
  3. 將這項 Service 定義套用至叢集:

    kubectl apply -f tcp-service.yaml
    
  4. 將下列 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
    
  5. 將這個檔案套用至叢集:

    kubectl apply -f udp-service.yaml
    
  6. 列出負載平衡器轉送規則並篩選靜態 IP,確認 VIP 在這些規則之間共用。這表示 UDP 和 TCP 轉送規則都在共用 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 控制器仍會在進階網路層級中建立內部直通式網路負載平衡器。

後續步驟