建立以後端服務為基礎的外部負載平衡器

本頁面說明如何部署外部 LoadBalancer Service,建構以後端服務為基礎的區域性外部直通式網路負載平衡器。閱讀本頁面前,請確認您已熟悉下列事項:

如要進一步瞭解區域性外部直通式網路負載平衡器,請參閱「後端服務型區域性外部直通式網路負載平衡器」。

事前準備

開始之前,請確認您已執行下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。

需求條件

  • 本教學課程使用 spec.loadBalancerClass 建立以GCE_VM_IP NEG 為後端的區域性外部直通式網路負載平衡器,並以該平衡器做為後端服務。本教學課程需要 GKE 1.33.1-gke.1779000 以上版本,因為 spec.loadBalancerClass 需要 GKE 1.33.1-gke.1779000 以上版本。1.33.1-gke.1779000 以上版本也超過 NEG 後端或加權負載平衡器功能的最低 GKE 版本需求。

  • 如果叢集版本早於 1.36,則必須在叢集中啟用 HttpLoadBalancing 外掛程式。這項外掛程式預設為啟用。詳情請參閱「HttpLoadBalancing 必要條件」。

  • 如要為外部 LoadBalancer Service 啟用 Cloud Logging,GKE 叢集必須使用 1.36.0-gke.2459000 以上版本。

  • 如要搭配使用自備 IP (BYOIP) IPv6 位址和單一堆疊 IPv6 外部 LoadBalancer 服務,GKE 叢集必須使用 1.37.1-gke.2097000 以上版本。

選擇叢集

您可以建立新叢集,或選擇符合需求的現有叢集。

建立新叢集

Autopilot

如要建立新的 Autopilot 叢集,請按照下列步驟操作:

gcloud container clusters create-auto CLUSTER_NAME \
    --release-channel=RELEASE_CHANNEL \
    --cluster-version=VERSION \
    --location=COMPUTE_LOCATION

更改下列內容:

  • CLUSTER_NAME:新叢集的名稱。
  • RELEASE_CHANNEL:叢集的 GKE 發布管道名稱。
  • VERSION:叢集的 GKE 版本。
  • COMPUTE_LOCATION:叢集的 Compute Engine 區域。

如要停用 LoadBalancer Service 的虛擬私有雲防火牆規則自動建立功能,請加入 --disable-l4-lb-firewall-reconciliation 旗標。詳情請參閱「GKE LoadBalancer 服務的使用者代管防火牆規則」。

標準

如要建立新的 Standard 叢集,請按照下列步驟操作:

gcloud container clusters create CLUSTER_NAME \
    --release-channel=RELEASE_CHANNEL \
    --cluster-version=VERSION \
    --location=COMPUTE_LOCATION

更改下列內容:

  • CLUSTER_NAME:新叢集的名稱。
  • RELEASE_CHANNEL:叢集的 GKE 發布管道名稱。
  • VERSION:叢集的 GKE 版本。
  • COMPUTE_LOCATION:叢集的 Compute Engine 區域。

如要停用 LoadBalancer Service 的虛擬私有雲防火牆規則自動建立功能,請加入 --disable-l4-lb-firewall-reconciliation 旗標。詳情請參閱「GKE LoadBalancer 服務的使用者代管防火牆規則」。

升級現有叢集

使用 gcloud CLI 更新現有叢集:

gcloud container clusters upgrade CLUSTER_NAME \
    --cluster-version=VERSION \
    --master \
    --location=COMPUTE_LOCATION

更改下列內容:

如要停用 LoadBalancer Service 的虛擬私有雲防火牆規則自動建立功能,請加入 --disable-l4-lb-firewall-reconciliation 旗標。詳情請參閱「GKE LoadBalancer 服務的使用者代管防火牆規則」。

部署範例工作負載

部署下列範例工作負載,為外部 LoadBalancer Service 提供服務 Pod。

  1. 將下列 Deployment 範例儲存為 store-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store
    spec:
      replicas: 20
      selector:
        matchLabels:
          app: store
      template:
        metadata:
          labels:
            app: store
        spec:
          containers:
          - image: registry.k8s.io/echoserver:1.10
            imagePullPolicy: Always
            name: echoserver
            ports:
              - name: http
                containerPort: 8080
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f store-deployment.yaml
    
  3. 確認 Deployment 有 20 個提供服務的 Pod:

    kubectl get pods
    

    輸出結果會與下列內容相似:

    NAME                     READY   STATUS    RESTARTS   AGE
    store-cdb9bb4d6-s25vw      1/1     Running   0          10s
    store-cdb9bb4d6-vck6s      1/1     Running   0          10s
    ....
    

建立外部 LoadBalancer Service

  1. 建立外部 LoadBalancer Service,公開範例工作負載。

    1. 將下列 Service 資訊清單儲存為 store-v1-lb-svc.yaml:

      apiVersion: v1
      kind: Service
      metadata:
        name: store-v1-lb-svc
      spec:
        type: LoadBalancer
        loadBalancerClass: networking.gke.io/l4-regional-external
        selector:
          app: store
        ports:
        - name: tcp-port
          protocol: TCP
          port: 8080
          targetPort: 8080
      
    2. 將資訊清單套用至叢集:

      kubectl apply -f store-v1-lb-svc.yaml
      

    請注意下列關於這個範例資訊清單的事項:

    • 如果叢集執行 GKE 1.33.1-gke.1779000 至 1.36,您必須在資訊清單首次套用至叢集時,將 spec.loadBalancerClass 欄位設為 networking.gke.io/l4-regional-external 值。這個欄位會指示 GKE 建立以區域性後端服務為基礎的外部直通式網路負載平衡器。在 GKE 1.37 以上版本中,這項設定是預設行為,不需填寫這個欄位。如要支援 IPv6 流量和加權負載平衡等功能,必須使用後端服務型區域性外部直通式網路負載平衡器。

    • GKE 會根據叢集版本,使用 GCE_VM_IP NEG 後端或非代管執行個體群組後端。在 1.32.2-gke.1652000 版叢集中,後端服務型區域性外部直通式網路負載平衡器會使用 GCE_VM_IP NEG。在舊版中,以後端服務為基礎的區域性外部直通式網路負載平衡器會使用非代管執行個體群組。

    • 這個 spec.loadBalancerClass 欄位不可變更,且必須在建立服務時設定。這個欄位無法變更,因此您無法在「現有」LoadBalancer 服務的資訊清單中新增或修改這個欄位。任何這類嘗試都會導致錯誤,且服務更新會失敗。

    • 如要在雙重堆疊叢集中建立單一堆疊 IPv6 Service,請將 spec.ipFamilyPolicy 欄位的值設為 SingleStack,並將 spec.ipFamilies 欄位的值設為 IPv6。在單一堆疊 IPv6 叢集中,這些是預設值,您可以省略。詳情請參閱「IPv6 LoadBalancer 服務」。

在單一堆疊 IPv6 叢集上建立外部 LoadBalancer Service

在單一堆疊 IPv6 叢集或雙重堆疊叢集上建立單一堆疊 IPv6 外部 LoadBalancer 服務時,負載平衡器使用的子網路取決於叢集的節點子網路是否使用 EXTERNAL 或 INTERNAL IPv6 存取權類型。在雙堆疊叢集上,您必須將 spec.ipFamilyPolicy 欄位的值設為 SingleStack,並將 spec.ipFamilies 欄位的值設為 IPv6 (在單堆疊 IPv6 叢集上,這些是預設值,可以省略)。IPv6 外部 LoadBalancer Service 一律使用進階級中,以後端服務為基礎的區域性外部直通式網路負載平衡器。雖然這個負載平衡器變體是 GKE 1.37 以上版本的預設設定,但下列範例會明確將 spec.loadBalancerClass 欄位設為 networking.gke.io/l4-regional-external:

  • 具有外部節點的叢集 (EXTERNAL GUA 存取權類型):如果叢集節點在具有全域單點傳播位址 (GUA) 的外部子網路上執行,外部負載平衡器會自動使用現有的節點子網路。建立不含自訂子網路註解的 Service:

    apiVersion: v1
    kind: Service
    metadata:
      name: ext-ipv6-svc
    spec:
      type: LoadBalancer
      loadBalancerClass: networking.gke.io/l4-regional-external
      ipFamilyPolicy: SingleStack
      ipFamilies:
      - IPv6
      selector:
        app: store
      ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080
    
  • 具有內部節點的叢集 (INTERNAL ULA 存取權類型):如果叢集節點在具有唯一本機單點傳播位址 (ULA) 的內部子網路上執行,外部負載平衡器就無法直接使用該子網路。您必須佈建專屬的外部 (EXTERNAL) IPv6 子網路,並在 Service 中使用 networking.gke.io/load-balancer-subnet 註解參照該子網路:

    1. 建立專用的外部 IPv6 子網路:

      gcloud compute networks subnets create SUBNET_NAME \
          --stack-type=ipv6_only \
          --ipv6-access-type=EXTERNAL \
          --network=NETWORK_NAME \
          --region=COMPUTE_REGION
      

      更改下列內容:

      • SUBNET_NAME:要建立的子網路名稱。
      • NETWORK_NAME:您要在其中建立這個子網路的虛擬私有雲網路名稱。
      • COMPUTE_REGION:子網路的 Compute Engine 區域。
    2. 在 networking.gke.io/load-balancer-subnet 註解中參照專屬子網路名稱,建立 Service:

      apiVersion: v1
      kind: Service
      metadata:
        name: ext-ipv6-svc
        annotations:
          networking.gke.io/load-balancer-subnet: SUBNET_NAME
      spec:
        type: LoadBalancer
        loadBalancerClass: networking.gke.io/l4-regional-external
        ipFamilyPolicy: SingleStack
        ipFamilies:
        - IPv6
        selector:
          app: store
        ports:
        - protocol: TCP
          port: 8080
          targetPort: 8080
      
  1. 驗證指派的 Service IP 位址:

    kubectl get svc ext-ipv6-svc
    

    輸出內容會確認 CLUSTER-IP 和 EXTERNAL-IP 欄 (公開 GUA 位址) 已填入:

    NAME           TYPE           CLUSTER-IP                          EXTERNAL-IP                      PORT(S)        AGE
    ext-ipv6-svc   LoadBalancer   2600:2d00:0:4:1a1e:d3b3:de4d:c401   2600:1900:4000:2714:8000:0:0:0   80:31114/TCP   51s
    

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

使用自備 IPv6 位址 (BYOIPv6)

在 GKE 1.37.1-gke.2097000 以上版本中,您可以設定單一堆疊 IPv6 外部 LoadBalancer Service,使用EXTERNAL_IPV6_FORWARDING_RULE_CREATION模式中公開委派前置字元 (PDP) 的區域 IPv6 子前置字元,自備 IPv6 位址 (BYOIPv6)。

建立 Service 之前,請確認您符合下列規定:

  • 叢集執行 GKE 1.37.1-gke.2097000 以上版本。叢集可以是單一堆疊 IPv6 或雙重堆疊 (在這兩種情況下,Service 都必須是單一堆疊 IPv6),且叢集的子網路可以有 INTERNAL 或 EXTERNAL IPv6 存取類型;由於位址範圍來自公開委派前置碼,因此不需要外部 IPv6 子網路範圍。
  • 您在 EXTERNAL_IPV6_FORWARDING_RULE_CREATION 模式中擁有區域 IPv6 子前置字元,可分配的前置字元長度為 /96,狀態為 ANNOUNCED,與叢集位於相同區域。如需操作說明,請參閱「建立 IPv6 子前置字串」。
  • GKE 服務代理 (service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com) 在擁有公開委派前置字元的專案中,具備 Compute 公開 IP 管理員角色 (roles/compute.publicIpAdmin)。如要授予角色,請執行下列指令:

    gcloud projects add-iam-policy-binding PDP_PROJECT_ID \
        --member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role="roles/compute.publicIpAdmin"
    

    更改下列內容:

    • PDP_PROJECT_ID:擁有公開委派前置字元的專案 ID。
    • PROJECT_NUMBER:叢集所在專案的專案編號。
  • Service 是單一堆疊 IPv6 Service (spec.ipFamilyPolicy: SingleStack 和 spec.ipFamilies: ["IPv6"]),會將 spec.loadBalancerClass 欄位設為 networking.gke.io/l4-regional-external,並使用進階級。BYOIPv6 不支援雙重堆疊服務、IPv4 服務和標準級。

  • 服務不含 networking.gke.io/load-balancer-subnet 註解,無法與 networking.gke.io/ip-collection-v6 註解合併。

選擇要分配臨時外部 BYOIPv6 位址範圍,還是使用預留的靜態外部 BYOIPv6 位址範圍:

  • 臨時外部 BYOIPv6 位址範圍:將 networking.gke.io/ip-collection-v6 註解新增至 Service 資訊清單,並設為區域子前置字元的完整資源網址或部分資源路徑:

    apiVersion: v1
    kind: Service
    metadata:
      name: ext-byoipv6-svc
      annotations:
        networking.gke.io/ip-collection-v6: "projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME"
    spec:
      type: LoadBalancer
      loadBalancerClass: networking.gke.io/l4-regional-external
      ipFamilyPolicy: SingleStack
      ipFamilies:
      - IPv6
      selector:
        app: store
      ports:
      - name: tcp-port
        protocol: TCP
        port: 80
        targetPort: 8080
    

    更改下列內容:

    • PROJECT_ID:子前置字元所在專案的 ID。
    • REGION:叢集所在的區域。
    • SUB_PREFIX_NAME:EXTERNAL_IPV6_FORWARDING_RULE_CREATION 模式中區域子前置字串的名稱。

    如果之後變更 networking.gke.io/ip-collection-v6 註解,GKE 會使用新前置字元的新位址重新建立 IPv6 轉送規則,這會短暫中斷傳送至 Service 的流量。如果移除註解,Service 會還原為 Google 提供的位址,該位址來自具有外部 IPv6 範圍的子網路。如果叢集的子網路有內部 IPv6 範圍,請同時新增 networking.gke.io/load-balancer-subnet 註解。

  • 靜態外部 BYOIPv6 位址範圍:從子前置字串預留區域性靜態外部 /96 IPv6 位址範圍,並使用 networking.gke.io/load-balancer-ip-addresses 註解參照該範圍:

    1. 從子前置字串建立區域性靜態外部 IPv6 位址範圍:

      gcloud compute addresses create STATIC_BYOIPV6_NAME \
          --region=REGION \
          --ip-version=IPV6 \
          --endpoint-type=NETLB \
          --ip-collection=projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME
      

      更改下列內容:

      • STATIC_BYOIPV6_NAME:靜態 IPv6 位址資源的名稱。
      • REGION:叢集所在的區域。
      • PROJECT_ID:包含子前置字串的專案 ID。
      • SUB_PREFIX_NAME:EXTERNAL_IPV6_FORWARDING_RULE_CREATION 模式中區域子前置字串的名稱。

      使用靜態外部 BYOIPv6 位址範圍時,networking.gke.io/ip-collection-v6 註解為選用。如果設定這個註解,註解必須參照您預留位址範圍的相同子前置碼。

    2. 在 Service 資訊清單中,參照預留的靜態 IPv6 位址資源名稱:

      apiVersion: v1
      kind: Service
      metadata:
        name: ext-static-byoipv6-svc
        annotations:
          networking.gke.io/load-balancer-ip-addresses: STATIC_BYOIPV6_NAME
      spec:
        type: LoadBalancer
        loadBalancerClass: networking.gke.io/l4-regional-external
        ipFamilyPolicy: SingleStack
        ipFamilies:
        - IPv6
        selector:
          app: store
        ports:
        - name: tcp-port
          protocol: TCP
          port: 80
          targetPort: 8080
      

詳情請參閱「自備 IPv6 位址 (BYOIPv6)」。

啟用加權負載平衡

如要根據每個節點上提供服務、就緒和未終止的 Pod 數量,按比例將新連線分配給節點,請在 Service 資訊清單中新增 networking.gke.io/weighted-load-balancing: "pods-per-node" 註解,啟用加權負載平衡。

  1. 將 networking.gke.io/weighted-load-balancing: "pods-per-node" 註解新增至 store-v1-lb-svc.yaml Service 資訊清單,並確保您也設定了 externalTrafficPolicy: Local 值,如下所示:

    apiVersion: v1
    kind: Service
    metadata:
      name: store-v1-lb-svc
      annotations:
        networking.gke.io/weighted-load-balancing: "pods-per-node"
    spec:
      type: LoadBalancer
      loadBalancerClass: networking.gke.io/l4-regional-external
      externalTrafficPolicy: Local
      selector:
        app: store
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
        targetPort: 8080
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f store-v1-lb-svc.yaml
    

關於這個加權負載平衡範例,請注意下列事項:

  • Service 資訊清單使用 externalTrafficPolicy: Local。如果不需要啟用加權負載平衡,也可以使用 externalTrafficPolicy: Cluster。如要進一步瞭解 externalTrafficPolicy 如何定義節點分組、哪些節點通過負載平衡器健康狀態檢查,以及封包的處理方式,請參閱「LoadBalancer 服務概念」。

  • 啟用加權負載平衡後,GKE 不會禁止您使用 externalTrafficPolicy: Cluster,但 externalTrafficPolicy: Cluster 會有效停用加權負載平衡,因為封包可能會在負載平衡器之後轉送至其他節點。

您也可以使用 kubectl edit svc service-name,在現有的外部 LoadBalancer Service 啟用加權負載平衡。kubectl edit 指令會在設定的文字編輯器中開啟現有負載平衡器的 Service 資訊清單,您可以在其中修改資訊清單並儲存變更。編輯現有的外部 LoadBalancer Service 時,請注意下列事項:

  • 現有的外部 LoadBalancer Service 必須已建立後端服務型區域性外部直通式網路負載平衡器。如果叢集執行的 GKE 版本低於 1.37,這項規定代表現有的外部 LoadBalancer Service 在資訊清單首次套用至叢集時,必須將 spec.loadBalancerClass 欄位設為 networking.gke.io/l4-regional-external。

    如果現有的外部 LoadBalancer 服務使用以目標集區為基礎的區域性外部直通式網路負載平衡器,則在該服務中新增 networking.gke.io/weighted-load-balancing: "pods-per-node" 註解不會有任何作用。

  • 更新現有的外部 LoadBalancer Service 資訊清單時,請務必設定 externalTrafficPolicy: Local 值。使用 externalTrafficPolicy: Cluster 會有效停用加權負載平衡,因為封包可能會在負載平衡器之後轉送至其他節點。

停用加權負載平衡

如要將新連線分配至節點,而不考慮每個節點上有多少個提供服務的 Pod,請從 Service 資訊清單中移除 networking.gke.io/weighted-load-balancing: "pods-per-node" 註解,停用加權負載平衡。

啟用後端服務的記錄功能

您可以啟用、停用及查看後端服務型區域性外部直通式網路負載平衡器的記錄。

如要設定 Cloud Logging,請建立 L4LBConfig 自訂資源,並指定記錄設定。L4LBConfig 資源會連結至 Service 資訊清單中的 Kubernetes Service。套用資訊清單後,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,並將指定負載平衡器 Service 的取樣率設為 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 註解新增至 store-v1-lb-svc.yaml Service 資訊清單:

    apiVersion: v1
    kind: Service
    metadata:
      name: store-v1-lb-svc
      annotations:
        cloud.google.com/l4-rbs: "enabled"
        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 store-v1-lb-svc.yaml
    

驗證外部 LoadBalancer 服務及其元件

  1. 確認 Service 是否正在運作:

    kubectl get svc store-v1-lb-svc
    

    輸出結果會與下列內容相似:

    NAME               TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)          AGE
    store-v1-lb-svc   LoadBalancer   10.44.196.160     35.193.28.231   8080:32466/TCP   11m
    

    GKE 已為區域性外部直通式網路負載平衡器指派 EXTERNAL_IP。

  2. 測試能否連線至負載平衡器:

    curl EXTERNAL_IP:PORT
    

    更改下列內容:

    • EXTERNAL_IP:為區域性外部直通式網路負載平衡器分配的 IP 位址。
    • PORT:為區域性外部直通式網路負載平衡器分配的通訊埠編號。

    輸出結果會與下列內容相似:

    Hostname: store-v1-lb-svc-cdb9bb4d6-hflxd
    
    Pod Information:
      -no pod information available-
    
    Server values:
      server_version=nginx: 1.13.3 - lua: 10008
    
    Request Information:
      client_address=10.128.0.50
      method=GET
      real path=/
      query=
      request_version=1.1
      request_scheme=http
      request_uri=EXTERNAL_IP
    
    Request Headers:
      accept=*/*
      host=EXTERNAL_IP
      user-agent=curl/7.81.0
    
    Request Body:
      -no body in request-
    
    
  3. 檢查 LoadBalancer Service 和描述其Google Cloud 資源的註解集:

    kubectl describe svc store-v1-lb-svc
    

    輸出結果會與下列內容相似:

    Name:                     store-v1-lb-svc
    Namespace:                default
    Labels:                   <none>
    Annotations:              cloud.google.com/neg-status: {"network_endpoint_groups":{"0":"k8s2-qvveq1d8-default-my-service-ext-5s55db85"},"zones":["us-central1-c"]} #This annotation appears in the output only if the service uses NEG backends.
                              networking.gke.io/weighted-load-balancing: pods-per-node #This annotation appears in the output only if weighted load balancing is enabled.
                              service.kubernetes.io/backend-service: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/firewall-rule: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/firewall-rule-for-hc: k8s2-qvveq1d8-default-my-service-ext-5s55db85-fw
                              service.kubernetes.io/healthcheck: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/tcp-forwarding-rule: a808124abf8ce406ca51ab3d4e7d0b7d
    Selector:                 app=store
    Type:                     LoadBalancer
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.18.102.23
    IPs:                      10.18.102.23
    LoadBalancer Ingress:     35.184.160.229
    Port:                     tcp-port  8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 tcp-port  31864/TCP
    Endpoints:                10.20.1.28:8080,10.20.1.29:8080
    Session Affinity:         None
    External Traffic Policy:  Local
    HealthCheck NodePort:     30394
    
    Events:
      Type    Reason                Age                    From                     Message
      ----    ------                ----                   ----                     -------
      Normal  ADD                   4m55s                  loadbalancer-controller  default/my-service-ext
    

    有幾個欄位會指出,後端服務型區域性外部直通式網路負載平衡器及其 Google Cloud 資源已成功建立:

    • Events 欄位。如果 LoadBalancer 服務及其資源建立成功,這個欄位會留空。如果發生錯誤,會列在這裡。
    • 已啟用 Annotations 的清單:GKE 會將下列唯讀註解清單新增至 Service 資訊清單。每個名稱開頭為 service.kubernetes.io/ 的註解,都用於表示Google Cloud 資源的名稱,該資源是做為負載平衡器的一部分或支援負載平衡器而建立。

      • networking.gke.io/weighted-load-balancing: pods-per-node 註解表示已套用加權負載平衡,且負載平衡器會根據每個節點上執行的 Pod 數量,將流量分配至後端 Pod。
      • service.kubernetes.io/backend-service 註解表示負載平衡器的後端服務名稱。
      • service.kubernetes.io/healthcheck 註解表示後端服務使用的負載平衡器健康狀態檢查名稱。
      • service.kubernetes.io/tcp-forwarding-rule 或 service.kubernetes.io/udp-forwarding-rule 註解會指出負載平衡器的轉送規則名稱。
      • service.kubernetes.io/firewall-rule 註解會指出建立的防火牆規則名稱,用於允許流量傳送至叢集節點。您可以使用 spec.loadBalancerSourceRanges[] 自訂這項防火牆規則的來源範圍。如要進一步瞭解 LoadBalancer 服務的防火牆規則,請參閱「防火牆規則和來源 IP 位址許可清單」。
      • service.kubernetes.io/firewall-rule-for-hc 註解表示負載平衡器健康狀態檢查所需的防火牆規則名稱。
      • cloud.google.com/neg-status 註解會指出負載平衡器使用的 NEG 及其可用區。只有在同時符合下列兩項條件時,系統才會顯示這項註解:

        • 將資訊清單套用至叢集時,叢集執行的是 GKE 1.32.2-gke.1652000 以上版本。
        • 將資訊清單套用至叢集時,設為 networking.gke.io/l4-regional-external 值的 spec.loadBalancerClass 欄位會出現在 Service 資訊清單中。
  4. 確認已為外部 LoadBalancer 服務建立負載平衡器資源和防火牆規則:

    • 執行下列指令,查看轉送規則:

        gcloud compute forwarding-rules describe FWD_RULE_NAME \
          --region=REGION_NAME
      

      更改下列內容:

      • FWD_RULE_NAME:由 service.kubernetes.io/tcp-forwarding-rule 或 service.kubernetes.io/udp-forwarding-rule 唯讀註解提供的轉送規則名稱。如要檢查這些註解,請執行 kubectl describe svc SERVICE_NAME。
      • REGION_NAME:叢集所在的 Google Cloud 區域。如果是可用區叢集,區域會包含叢集使用的可用區。
    • 執行下列指令,查看後端服務:

      gcloud compute backend-services describe BACKEND_SERVICE_NAME \
        --region=REGION_NAME
      

      更改下列內容:

      • BACKEND_SERVICE_NAME:service.kubernetes.io/backend-service 唯讀註解提供的後端服務名稱。如要查看這個唯讀註解,請執行 kubectl describe svc SERVICE_NAME。
      • REGION_NAME:叢集所在的 Google Cloud 區域。如果是可用區叢集,區域會包含叢集使用的可用區。
    • 如要查看負載平衡器健康狀態檢查,請執行下列指令:

      gcloud compute health-checks describe HEALTH_CHECK_NAME \
        --region=REGION_NAME
      

      更改下列內容:

      • HEALTH_CHECK_NAME:負載平衡器的健康狀態檢查名稱。健康狀態檢查的名稱由 service.kubernetes.io/healthcheck 唯讀註解提供。如要檢查這個唯讀註解,請執行 kubectl describe svc SERVICE_NAME。
      • REGION_NAME:叢集所在的 Google Cloud 區域。如果是可用區叢集,區域會包含叢集使用的可用區。
    • 執行下列指令,查看防火牆規則:

      gcloud compute firewall-rules describe FIREWALL_RULE_NAME
      
      gcloud compute firewall-rules describe HEALTH_CHECK_FIREWALL_RULE_NAME
      

      更改下列內容:

      • FIREWALL_RULE_NAME:允許流量傳送至負載平衡器的防火牆規則名稱。這個防火牆規則的名稱是由 service.kubernetes.io/firewall-rule 唯讀註解提供。如要查看這個唯讀註解,請執行 kubectl describe svc SERVICE_NAME。
      • HEALTH_CHECK_FIREWALL_RULE_NAME:防火牆規則的名稱,允許對負載平衡器的後端 (叢集的節點) 進行健康狀態檢查。這項防火牆規則的名稱是由 service.kubernetes.io/firewall-rule-for-hc 唯讀註解提供。如要查看這個唯讀註解,請執行 kubectl describe svc SERVICE_NAME。
    • 如要查看負載平衡器 NEG,請執行下列指令:

      gcloud compute network-endpoint-groups describe NEG_NAME \
        --zone=ZONE_NAME
      

      更改下列內容:

      • NEG_NAME:負載平衡器的 NEG 名稱。NEG 的名稱由 cloud.google.com/neg-status 唯讀註解提供。如要查看這個唯讀註解,請執行 kubectl describe svc SERVICE_NAME 指令。註解包含結構化資料,內含負載平衡器使用的 NEG 名稱和可用區資訊。如果是可用區叢集,這個註解會包含一個 NEG 的相關資訊。如果是區域叢集,這項註解會包含叢集所在各可用區的 NEG 相關資訊。
      • ZONE_NAME:包含 NEG 的 Google Cloud 可用區。
  5. 確認後端服務已啟用 Cloud Logging:

    kubectl get svc SERVICE_NAME --output yaml
    

    更改下列內容:

    • SERVICE_NAME:後端服務的名稱。

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

刪除外部 LoadBalancer Service

如要刪除範例 store-v1-lb-svc 外部 LoadBalancer 服務,請使用下列指令:

kubectl delete service store-v1-lb-svc

GKE 會自動移除為外部 LoadBalancer Service 建立的所有負載平衡器資源。

遷移至 GCE_VM_IP NEG 後端

如果外部 LoadBalancer 服務是在 GKE 1.37 以上版本建立、為 spec.loadBalancerClass 欄位指定 networking.gke.io/l4-regional-external 值,或包含 cloud.google.com/l4-rbs: "enabled" 註解,則會建立以後端服務為基礎的區域性外部直通式網路負載平衡器。視叢集的 GKE 版本而定,GKE 會使用 GCE_VM_IP 網路端點群組或非代管執行個體群組做為後端:

  • 如果 Service 資訊清單套用至執行 GKE 1.32.2-gke.1652000 以上版本的叢集,產生的區域性外部直通式網路負載平衡器會使用 GCE_VM_IP 網路端點群組 (NEG) 後端。

  • 如果 Service 資訊清單套用至執行舊版 GKE 的叢集,產生的區域性外部直通式網路負載平衡器會使用非代管執行個體群組後端。

詳情請參閱「關於 LoadBalancer 服務」中的「節點分組」。

如果現有 Service 使用下列其中一種負載平衡器,您可以建立新的外部 LoadBalancer Service,由以後端服務為基礎的區域性外部直通式網路負載平衡器提供支援,並使用 GCE_VM_IP NEG 後端:

  • 後端服務型區域性外部直通式網路負載平衡器,具有執行個體群組後端
  • 目標集區型區域性外部直通式網路負載平衡器

如要在切換至以後端服務為基礎的區域性外部直通式網路負載平衡器 (使用 GCE_VM_IP NEG 後端) 時保留外部 IPv4 位址,請按照下列步驟操作 (IPv6 外部 LoadBalancer 服務不需要這項遷移作業):

  1. 如果尚未升級,請將叢集升級至 GKE 1.32.2-gke.1652000 以上版本。

  2. 找出要切換至以後端服務為基礎的區域性外部直通式網路負載平衡器的外部 LoadBalancer Service,該負載平衡器使用 GCE_VM_IP NEG 後端。使用下列指令說明 Service:

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    更改下列內容:

    • SERVICE_NAME:現有外部 LoadBalancer 服務的名稱。

    • SERVICE_NAMESPACE:現有外部 LoadBalancer 服務的命名空間。

    在指令輸出內容中,記下列在 LoadBalancer Ingress 後方的負載平衡器外部 IPv4 位址。

  3. 擷取現有 LoadBalancer Service 的 Service 資訊清單:

    • 最好有先前套用至叢集的原始 Service 資訊清單。例如,您可能將其儲存在原始碼控管存放區中。

    • 如果您沒有原始 Service 資訊清單:

      • 執行下列指令,取得代表負載平衡器目前實作的 Service 資訊清單 YAML 副本:

        kubectl get svc SERVICE_NAME -n SERVICE_NAMESPACE -o yaml
        
      • 將資訊清單 YAML 複製到文字編輯器。移除 status 屬性和下列 metadata 屬性:

        • 下列所有註解:
          • kubectl.kubernetes.io/last-applied-configuration 註解
          • 所有開頭為 service.kubernetes.io 的註解
        • creationTimestamp
        • finalizers
        • resourceVersion
        • uid
    • 確認資訊清單包含 spec.loadBalancerClass 欄位,且值設為 networking.gke.io/l4-regional-external。如果您是從以目標集區為基礎的區域性外部直通式網路負載平衡器遷移,則必須新增這個欄位。

    儲存資訊清單檔案,並記下儲存位置。本程序其餘部分會將資訊清單的儲存路徑稱為 MANIFEST_FILE_PATH。

  4. 設定靜態外部 IPv4 位址資源,保留現有負載平衡器使用的外部 IPv4 位址:

    gcloud compute addresses create IP_ADDRESS_NAME --region=CLUSTER_REGION --addresses LB_EXTERNAL_IP
    

    更改下列內容:

    • IP_ADDRESS_NAME:靜態外部 IP 位址的名稱。名稱必須符合 Compute Engine 資源的命名慣例。

    • CLUSTER_REGION:叢集所在的區域。如果是可用區叢集,則是指叢集可用區所在的區域。

    • LB_EXTERNAL_IP:目前負載平衡器使用的外部 IPv4 位址,在程序第二步中決定。

  5. 確認靜態外部 IPv4 位址資源已建立:

    gcloud compute addresses describe IP_ADDRESS_NAME --region=CLUSTER_REGION
    

    按照上一個步驟的指示替換變數。

  6. 刪除現有 Service:

    kubectl delete svc SERVICE_NAME -n SERVICE_NAMESPACE
    
  7. 將下列註解新增至 MANIFEST_FILE_PATH Service 資訊清單檔案:

    networking.gke.io/load-balancer-ip-addresses: IP_ADDRESS_NAME
    

    如要進一步瞭解這個註解,請參閱 LoadBalancer 服務參數中的「靜態 IP 位址」。

  8. 將更新後的 Service 資訊清單套用至叢集:

    kubectl apply -f MANIFEST_FILE_PATH
    
  9. (選用) 釋出靜態 IPv4 位址資源。

    gcloud compute addresses delete IP_ADDRESS_NAME --region=CLUSTER_REGION
    

疑難排解

本節說明設定以後端服務為基礎的外部 LoadBalancer Service 時,可能會遇到的問題。

加權負載平衡的外部流量政策有誤

如果在啟用加權負載平衡時未設定 externalTrafficPolicy: Local 值,使用下列指令描述 Service 時,可能會收到警告事件:

kubectl describe svc store-v1-lb-svc`
Events:
  Type     Reason                   Age      From                     Message
  ----     ------                   ----     ----                     -------
  Warning  UnsupportedConfiguration 4m55s    loadbalancer-controller  Weighted load balancing by pods-per-node has no effect with External Traffic Policy: Cluster.

如要有效啟用加權負載平衡,您必須設定 externalTrafficPolicy: Local 值。

在標準級建立 IPv6 負載平衡器時發生錯誤

如果 IPv6 外部 LoadBalancer Service 顯示 SyncExternalLoadBalancerFailed 事件,並附帶 Network tier Standard is not supported for IPv6 External Load Balancer 訊息,請從 Service 資訊清單中移除 cloud.google.com/network-tier: Standard 註解。IPv6 外部 LoadBalancer 服務僅支援進階級。

設定自備 IPv6 位址 (BYOIPv6) 時發生錯誤

為外部 LoadBalancer Service 設定自備 IPv6 位址 (BYOIPv6) 時,執行 kubectl describe service SERVICE_NAME 指令可能會看到 SyncExternalLoadBalancerFailed 警告事件。事件訊息開頭為 Error ensuring Resource for L4 External LoadBalancer, err:,後方會顯示下列其中一項錯誤:

  • networking.gke.io/ip-collection-v6 is currently only supported for IPv6-only Services:請確認 Service 資訊清單指定 spec.ipFamilyPolicy: SingleStack 和 spec.ipFamilies: ["IPv6"]。
  • static IPv6 address "ADDRESS_NAME" is a BYOIP address from IP collection "SUB_PREFIX", which is currently only supported for IPv6-only Services:請確認服務資訊清單指定 spec.ipFamilyPolicy: SingleStack 和 spec.ipFamilies: ["IPv6"]。這項錯誤表示 Service 為雙重堆疊或 IPv4,但參照靜態 BYOIPv6 位址。
  • cannot specify both networking.gke.io/load-balancer-subnet ("SUBNET") and networking.gke.io/ip-collection-v6 ("SUB_PREFIX") for LoadBalancer:使用 networking.gke.io/ip-collection-v6 註解時,請從 Service 資訊清單中移除 networking.gke.io/load-balancer-subnet 註解。
  • invalid networking.gke.io/ip-collection-v6 "VALUE": expected projects/PROJECT/regions/REGION/publicDelegatedPrefixes/NAME 或 invalid networking.gke.io/ip-collection-v6 "VALUE": the public delegated prefix must be in the cluster region REGION:將註解設為與叢集位於相同區域的子前置字元完整資源網址或部分資源路徑 (projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME)。不接受單純的子前置字串名稱。
  • reserved address ("ADDRESS_NAME") is not valid, err: ipCollection mismatch, expected "SUB_PREFIX_A", actual: "SUB_PREFIX_B":請確認 networking.gke.io/ip-collection-v6 註解與您用來預留靜態 IPv6 位址的公開委派前置字串相符,或是在使用 networking.gke.io/load-balancer-ip-addresses 註解時省略 networking.gke.io/ip-collection-v6 註解。
  • googleapi: Error 403: Required 'compute.publicDelegatedPrefixes.use' permission for 'SUB_PREFIX', forbidden:在擁有公開委派前置字元的專案中,將 Compute 公開 IP 管理員角色 (roles/compute.publicIpAdmin) 授予 GKE 服務代理 (service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com)。GKE 每次同步處理 Service 時都需要這項權限,因此請勿在 GKE 建立 Service 後移除角色。

後續步驟