建立內部負載平衡器

本頁說明如何部署內部 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 外掛程式。這項外掛程式預設為啟用。

  • 如要為內部 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 或 Cloud de Confiance 控制台。

控制台

  1. 在 Cloud de Confiance 控制台中,前往「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、Cloud de Confiance 控制台,或將叢集升級至 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: 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 雙重堆疊服務」。
      • 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 指派給服務;在本範例中,指派的通訊埠為 30521。nodePort 與內部直通式網路負載平衡器無關。
  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 子集的服務則不會顯示。

啟用後端服務的記錄功能

您可以啟用、停用及查看內部直通式網路負載平衡器的記錄功能。如要為後端服務啟用記錄功能,必須先啟用 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%。

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

    kubectl apply -f svc-l4lb-config.yaml
    
  3. 將 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
    
  4. 將 Service 資訊清單套用至叢集:

    kubectl apply -f ilb-svc.yaml
    

透過可用區相依性擴充工作負載

由於 HorizontalPodAutoscaler (HPA) 是根據叢集匯總指標 (而非每個可用區的負載) 調度 Pod,請依可用區分離工作負載,避免可用區過載。請為叢集運作的每個區域建立個別的 Deployment 和 HPA,而不是建立單一叢集範圍的 Deployment 和 HPA。單一內部 LoadBalancer 服務可同時將流量轉送至所有這些獨立的區域工作負載。

架構總覽

  • 每個可用區一個工作負載:為每個可用區建立個別的部署作業 (例如 zone-a、zone-b)。
  • 節點選取器:使用 topology.kubernetes.io/zone 節點選取器,將每個 Deployment 繫結至特定區域。
  • 每個區域各有一個 HPA:將 HPA 附加至每個特定部署作業,讓 Pod 可根據本地化指標獨立調整資源配置。
  • 一個共用服務:透過設定區域親和性 (使用相同選取器) 的單一內部 LoadBalancer 服務,公開所有這些部署作業。

設定獨立區域工作負載

以下範例說明如何在兩個區域中實作此架構。

  1. 為每個區域建立個別的 Deployment。部署作業共用相同的 app 標籤,但有嚴格的 nodeSelector 將其繫結至特定區域。

    將下列資訊清單儲存為 zonal-deployments.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app-zone-a
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-app
          zone: zone-a
      template:
        metadata:
          labels:
            app: my-app
            zone: zone-a
        spec:
          nodeSelector:
            topology.kubernetes.io/zone: "COMPUTE_ZONE_A"
          containers:
          - name: echoserver
            image: gcr.io/google_containers/echoserver:1.10
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: "100m"
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app-zone-b
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-app
          zone: zone-b
      template:
        metadata:
          labels:
            app: my-app
            zone: zone-b
        spec:
          nodeSelector:
            topology.kubernetes.io/zone: "COMPUTE_ZONE_B"
          containers:
          - name: echoserver
            image: gcr.io/google_containers/echoserver:1.10
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: "100m"
    

    將 COMPUTE_ZONE_A 和 COMPUTE_ZONE_B 替換為實際區域 (例如 us-central1-a 和 us-central1-b)。

  2. 套用資訊清單:

    kubectl apply -f zonal-deployments.yaml
    
  3. 為每個可用區部署作業建立獨立的 HPA。

    將下列資訊清單儲存為 zonal-hpas.yaml:

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: hpa-zone-a
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: my-app-zone-a
      minReplicas: 2
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 70
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: hpa-zone-b
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: my-app-zone-b
      minReplicas: 2
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 70
    
  4. 套用資訊清單:

    kubectl apply -f zonal-hpas.yaml
    
  5. 確認服務以共用標籤 (app: my-app) 為目標,並已啟用區域親和性。

    將下列資訊清單儲存為 zonal-service.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service-internal
    spec:
      type: LoadBalancer
      loadBalancerClass: networking.gke.io/l4-regional-internal
      trafficDistribution: PreferSameZone
      selector:
        app: my-app
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
        targetPort: 8080
    
  6. 套用資訊清單:

    kubectl apply -f zonal-service.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-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:要運作的後端服務運算區域。
  • 確認服務已啟用 Cloud Logging:

    kubectl get svc SERVICE_NAME --output yaml
    

    更改下列內容:

    • SERVICE_NAME:服務名稱。

    在輸出內容中,確認 Status.Conditions 欄位含有 Type: LoggingConfigManaged 和 Reason: Reconciled。

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

內部直通式網路負載平衡器只能在同一個 VPC 網路 (或連線網路) 內存取。根據預設,負載平衡器的轉送規則會停用全域存取權,因此用戶端 VM、Cloud VPN 通道或 Cloud Interconnect 連結 (VLAN) 必須與內部直通式網路負載平衡器位於相同區域。如要支援所有區域的用戶端,您可以在服務資訊清單中加入 global access 註解,在負載平衡器的轉送規則中啟用全域存取權。

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

curl LOAD_BALANCER_IP:80

請將 LOAD_BALANCER_IP 替換為負載平衡器的轉送規則 IP 位址。

回應會顯示 ilb-deployment 的輸出:

Hello, world!
Version: 1.0.0
Hostname: ilb-deployment-77b45987f7-pw54n

刪除內部 LoadBalancer 服務和負載平衡器資源

您可以使用 kubectl delete 或Cloud de Confiance 控制台刪除 Deployment 和 Service。

kubectl

刪除部署作業

如要刪除 Deployment,請執行下列指令:

kubectl delete deployment ilb-deployment

刪除服務

如要刪除 Service,請執行下列指令:

kubectl delete service ilb-svc

控制台

刪除部署作業

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

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

    前往「Workloads」(工作負載)

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

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

刪除服務

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

  1. 前往 Cloud de Confiance 控制台的「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 位址,才能啟用共用功能。如果您在共用虛擬私有雲中建立靜態內部 IP 位址,則必須在與使用該 IP 位址的執行個體相同的服務專案中建立 IP 位址,即使 IP 位址的值來自共用虛擬私有雲網路所選共用子網路的可用 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
    

    如果叢集位於共用虛擬私有雲服務專案中,但使用主專案中的共用虛擬私有雲網路:

    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 位址, Cloud de Confiance 會從所選子網路的主要 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 控制器仍會在「進階」網路層級中建立內部直通式網路負載平衡器。

後續步驟