使用政策設定閘道資源


本頁說明如何設定負載平衡器。當您在 GKE 叢集中部署 Gateway 時,Google Kubernetes Engine (GKE) 會建立負載平衡器。

部署 Gateway 時,GatewayClass 設定會決定 GKE 建立的負載平衡器。這個代管負載平衡器已預先設定預設設定,您可以使用政策修改這些設定。

您可以將政策附加至閘道、服務或 ServiceImports,自訂閘道資源,以符合基礎架構或應用程式需求。套用或修改政策後,您不需要刪除或重新建立閘道、路徑或服務資源,閘道控制器會處理政策,並根據 (新) 政策 (重新) 設定基礎負載平衡器資源。

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

GKE Gateway 控制器需求

  • 如果是標準叢集,則須使用 GKE 1.24 以上版本。
  • 如果是 Autopilot,則須為 GKE 1.26 以上版本。
  • Google Cloud CLI 407.0.0 以上版本。
  • 閘道 API 僅支援虛擬私有雲原生叢集。
  • 如果您使用內部 GatewayClass,則必須啟用僅限 Proxy 的子網路
  • 叢集必須啟用 HttpLoadBalancing 外掛程式。
  • 如果您使用 Istio,請務必將 Istio 升級至下列其中一個版本:
    • 1.15.2 以上版本
    • 1.14.5 以上版本
    • 1.13.9 以上版本。
  • 如果您使用共用虛擬私有雲,則需要在主機專案中,將 Compute Network User 角色指派給服務專案的 GKE 服務帳戶。

限制

除了 GKE Gateway 控制器的限制,套用至 Gateway 資源的政策還受到下列限制:

  • GCPGatewayPolicy 資源只能附加至 gateway.networking.k8s.io Gateway

  • GCPGatewayPolicy 資源必須與目標 Gateway 位於相同命名空間。

  • 使用單一叢集 Gateway 時,GCPBackendPolicyHealthCheckPolicy 資源必須參照 Service 資源。

  • 使用多叢集閘道時,GCPBackendPolicyHealthCheckPolicy 資源必須參照 ServiceImport 資源。

  • 服務一次只能附加一個 GCPBackendPolicy。 如果建立的兩項 GCPBackendPolicy 政策指定了相同的 ServiceServiceImport,系統會優先採用較舊的政策,並無法附加第二項政策。

  • GKE Gateway 不支援階層式政策。

  • HealthCheckPolicyGCPBackendPolicy 資源必須與目標 ServiceServiceImport 資源位於相同命名空間。

  • GCPBackendPolicyHealthCheckPolicy 資源的結構只能參照一個後端服務。

  • GCPBackendPolicy 不支援工作階段親和性的 HEADER_FIELDHTTP_COOKIE 選項。

為區域內部閘道設定全域存取權

本節說明 GKE 叢集 (須執行 1.24 以上版本) 提供的功能。

如要透過內部閘道啟用全域存取權,請將政策附加至閘道資源。

下列 GCPGatewayPolicy 資訊清單可啟用區域內部閘道,供全域存取:

apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
  name: my-gateway-policy
  namespace: default
spec:
  default:
    allowGlobalAccess: true
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: my-gateway

設定多叢集閘道的區域

本節說明 GKE 叢集 (執行 1.30.3-gke.1225000 以上版本) 提供的功能。

如果車隊的叢集遍布多個區域,您可能需要在不同區域部署區域閘道,以因應各種用途,例如跨區域備援、低延遲和資料主權。在多叢集閘道設定叢集中,您可以指定要部署區域閘道的區域。如果未指定地區,預設地區為設定叢集的地區。

如要為多叢集閘道設定地區,請使用 GCPGatewayPolicy 中的 region 欄位。在下列範例中,閘道是在 us-central1 區域中設定:

apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
  name: my-gateway-policy
  namespace: default
spec:
  default:
    region: us-central1
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: my-regional-gateway

設定 SSL 政策,確保用戶端到負載平衡器的流量安全

本節說明 GKE 叢集 (須執行 1.24 以上版本) 提供的功能。

如要保護用戶端到負載平衡器的流量,請將政策名稱新增至 GCPGatewayPolicy,藉此設定 SSL 政策。根據預設,閘道不會定義及附加任何 SSL 政策。

請務必建立 SSL 政策,再於 GCPGatewayPolicy 中參照該政策。

下列 GCPGatewayPolicy 資訊清單會指定名為 gke-gateway-ssl-policy 的安全性政策:

apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
  name: my-gateway-policy
  namespace: team1
spec:
  default:
    sslPolicy: gke-gateway-ssl-policy
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: my-gateway

設定健康狀態檢查

本節說明 GKE 叢集 (須執行 1.24 以上版本) 提供的功能。

根據預設,對於使用 HTTPkubernetes.io/h2c 應用程式通訊協定的後端服務,HealthCheck 為 HTTP 類型。如果是 HTTPS 通訊協定,預設的健康狀態檢查類型為 HTTPS。如果是 HTTP2 通訊協定,預設的健康狀態檢查為 HTTP2 類型。

您可以使用 HealthCheckPolicy 控制負載平衡器健康狀態檢查設定。每種健康狀態檢查 (httphttpsgrpchttp2) 都有可定義的參數。 Google Cloud會為每個 GKE 服務的每個後端服務建立專屬的健康狀態檢查。

如果健康狀態檢查路徑不是標準的「/」,您可能需要為負載平衡器設定自訂 HealthCheckPolicy,負載平衡器才能正常運作。如果路徑需要特殊標頭,或您需要調整健康狀態檢查參數,也必須進行這項設定。舉例來說,如果預設要求路徑為「/」,但您的服務無法透過該要求路徑存取,而是使用「/health」回報健康狀態,則您必須在 HealthCheckPolicy 中相應地設定 requestPath

以下 HealthCheckPolicy 資訊清單顯示設定健康狀態檢查政策時的所有可用欄位:

服務

apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
  name: lb-healthcheck
  namespace: lb-service-namespace
spec:
  default:
    checkIntervalSec: INTERVAL
    timeoutSec: TIMEOUT
    healthyThreshold: HEALTHY_THRESHOLD
    unhealthyThreshold: UNHEALTHY_THRESHOLD
    logConfig:
      enabled: ENABLED
    config:
      type: PROTOCOL
      httpHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      httpsHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      grpcHealthCheck:
        grpcServiceName: GRPC_SERVICE_NAME
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
      http2HealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多叢集服務

apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
  name: lb-healthcheck
  namespace: lb-service-namespace
spec:
  default:
    checkIntervalSec: INTERVAL
    timeoutSec: TIMEOUT
    healthyThreshold: HEALTHY_THRESHOLD
    unhealthyThreshold: UNHEALTHY_THRESHOLD
    logConfig:
      enabled: ENABLED
    config:
      type: PROTOCOL
      httpHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      httpsHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      grpcHealthCheck:
        grpcServiceName: GRPC_SERVICE_NAME
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
      http2HealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

更改下列內容:

  • INTERVAL:指定每個健康狀態檢查探測器的檢查間隔 (以秒為單位)。這是指從某個探測器開始檢查,到下一次檢查開始之間的時間。如果省略這個參數,且未指定 HealthCheckPolicy,預設值為 15 秒;如果指定 HealthCheckPolicy 但沒有 checkIntervalSec 值,預設值則為 5 秒。 Google Cloud 詳情請參閱多個探測器和頻率
  • TIMEOUT:指定Google Cloud 等待探測回應的時間長度。TIMEOUT 的值必須小於或等於 INTERVAL。單位為秒。每次探測都必須在探測逾時前傳送 HTTP 200 (OK) 回應碼。
  • HEALTHY_THRESHOLDUNHEALTHY_THRESHOLD:指定至少一個探測器必須連續成功或失敗多少次連線嘗試,才能將健康狀態從良好變更為不良,或從不良變更為良好。如果省略其中一個參數, Google Cloud 預設為 2。
  • PROTOCOL:指定探測系統用於健康狀態檢查的通訊協定。詳情請參閱「HTTP、HTTPS 和 HTTP/2 的成功標準」和「gRPC 的成功標準」。此為必要參數。
  • ENABLED:指定是否啟用或停用記錄功能。
  • PORT_SPECIFICATION:指定健康狀態檢查是否使用固定通訊埠 (USE_FIXED_PORT)、具名通訊埠 (USE_NAMED_PORT) 或服務通訊埠 (USE_SERVING_PORT)。如未指定,健康狀態檢查會遵循 portportName 欄位中指定的行為。如未指定 portportName,這個欄位會預設為 USE_SERVING_PORT
  • PORT:HealthCheckPolicy 僅支援使用通訊埠編號指定負載平衡器健康檢查通訊埠。如果省略這個參數,預設值為 80。 Google Cloud 由於負載平衡器會直接將探測傳送至 Pod 的 IP 位址,因此即使 containerPort 是由服務的 targetPort 參照,您也應選取與服務 Pod 的 containerPort 相符的通訊埠。您不限於服務 targetPort 參照的 containerPorts
  • PORT_NAME:指定通訊埠名稱,如 InstanceGroup.NamedPort.name 中所定義。如果同時定義 portportName, Google Cloud 會優先考量 port 值。
  • HOST:健康狀態檢查要求中主機標頭的值。這個值會使用主機名稱的 RFC 1123 定義,但不得使用數字 IP 位址。如未指定或留空,這個值預設為健康檢查的 IP 位址。
  • REQUEST_PATH:指定健康狀態檢查要求的 request-path。如未指定或留空,則預設為 /
  • RESPONSE:指定要比對回應資料開頭的位元組。如果未指定或留空,GKE 會將任何回應解讀為正常。回應資料只能是 ASCII。
  • PROXY_HEADER:指定 Proxy 標頭類型。 您可以使用 NONEPROXY_V1。預設值為 NONE
  • GRPC_SERVICE_NAME:gRPC 服務的選用名稱。如要指定所有服務,請省略這個欄位。

如要進一步瞭解 HealthCheckPolicy 欄位,請參閱healthChecks 參考資料

設定 Google Cloud Armor 後端安全性政策,保護後端服務

本節說明 GKE 叢集 (須執行 1.24 以上版本) 提供的功能。

將安全性政策名稱新增至 GCPBackendPolicy,即可設定 Google Cloud Armor 後端安全性政策,保護後端服務。根據預設,閘道不會定義及附加任何 Google Cloud Armor 後端安全政策。

請務必建立 Google Cloud Armor 後端安全性政策,再於 GCPBackendPolicy 中參照該政策。如果您要啟用區域閘道,則必須建立區域 Google Cloud Armor 後端安全性政策。

下列 GCPBackendPolicy 資訊清單指定名為 example-security-policy 的後端安全性政策:

服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    securityPolicy: example-security-policy
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多叢集服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    securityPolicy: example-security-policy
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

設定 IAP

本節說明 GKE 叢集 (執行 1.24 以上版本) 提供的功能。

Identity-Aware Proxy (IAP) 會對與 HTTPRoute 相關聯的後端服務強制執行存取控制政策。強制執行這項措施後,只有經過驗證的使用者或應用程式,且已指派正確的 Identity and Access Management (IAM) 角色,才能存取這些後端服務。

根據預設,後端服務不會套用 IAP,您需要在 GCPBackendPolicy 中明確設定 IAP。

如要透過 Gateway 設定 IAP,請按照下列步驟操作:

  1. 為 GKE 啟用 IAP 請勿設定後端 (設定 BackendConfig),因為 BackendConfig 只在 Ingress 部署作業中有效。

  2. 為 IAP 建立密鑰:

    1. 前往 Google Cloud 控制台的「憑證」頁面:

      前往「憑證」

    2. 按一下用戶端名稱,然後下載 OAuth 用戶端檔案。

    3. 從 OAuth 用戶端檔案中,將 OAuth 密碼複製到剪貼簿。

    4. 建立名為 iap-secret.txt 的檔案。

    5. 使用下列指令,將 OAuth 密鑰貼到 iap-secret.txt 檔案中:

      echo -n CLIENT_SECRET > iap-secret.txt
      kubectl create secret generic SECRET_NAME --from-file=key=iap-secret.txt
      
  3. 如要指定參照密鑰的 IAP 政策,請按照下列步驟操作:

    1. 建立下列 GCPBackendPolicy 資訊清單,並分別取代 SECRET_NAMECLIENT_ID。將資訊清單儲存為 backend-policy.yaml

      服務

      apiVersion: networking.gke.io/v1
      kind: GCPBackendPolicy
      metadata:
        name: backend-policy
      spec:
        default:
          iap:
            enabled: true
            oauth2ClientSecret:
              name: SECRET_NAME
            clientID: CLIENT_ID
        targetRef:
          group: ""
          kind: Service
          name: lb-service
      

      多叢集服務

      apiVersion: networking.gke.io/v1
      kind: GCPBackendPolicy
      metadata:
        name: backend-policy
      spec:
        default:
          iap:
            enabled: true
            oauth2ClientSecret:
              name: SECRET_NAME
            clientID: CLIENT_ID
        targetRef:
          group: net.gke.io
          kind: ServiceImport
          name: lb-service
      
    2. 套用 backend-policy.yaml 資訊清單:

      kubectl apply -f backend-policy.yaml
      
  4. 驗證設定:

    1. 確認建立 GCPBackendPolicy 後,系統是否已套用政策 (使用 IAP):

      kubectl get gcpbackendpolicy
      

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

      NAME             AGE
      backend-policy   45m
      
    2. 如要取得更多詳細資料,請使用 describe 指令:

      kubectl describe gcpbackendpolicy
      

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

      Name:         backend-policy
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPBackendPolicy
      Metadata:
        Creation Timestamp:  2023-05-27T06:45:32Z
        Generation:          2
        Resource Version:    19780077
        UID:                 f4f60a3b-4bb2-4e12-8748-d3b310d9c8e5
      Spec:
        Default:
          Iap:
            Client ID:  441323991697-luotsrnpboij65ebfr13hlcpm5a4heke.apps.googleusercontent.com
            Enabled:    true
            oauth2ClientSecret:
              Name:  my-iap-secret
        Target Ref:
          Group:
          Kind:   Service
          Name:   lb-service
      Status:
        Conditions:
          Last Transition Time:  2023-05-27T06:48:25Z
          Message:
          Reason:                Attached
          Status:                True
          Type:                  Attached
      Events:
        Type     Reason  Age                 From                   Message
        ----     ------  ----                ----                   -------
        Normal   ADD     46m                 sc-gateway-controller  default/backend-policy
        Normal   SYNC    44s (x15 over 43m)  sc-gateway-controller  Application of GCPBackendPolicy "default/backend-policy" was a success
      

設定後端服務逾時

本節說明 GKE 叢集 (須執行 1.24 以上版本) 提供的功能。

下列 GCPBackendPolicy 資訊清單指定 40 秒的後端服務逾時時間。「timeoutSec」欄位預設為 30 秒。

服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    timeoutSec: 40
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多叢集服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    timeoutSec: 40
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

使用 GCPBackendPolicy 設定後端選取項目

GCPBackendPolicy 中的 CUSTOM_METRICS 平衡模式可讓您設定特定自訂指標,藉此影響負載平衡器的後端服務分配流量的方式。這個平衡模式可根據您定義的自訂指標,以及應用程式後端回報的指標,進行負載平衡。

詳情請參閱「Traffic management with custom metrics-based load balancing」(根據自訂指標執行負載平衡,管理流量)。

backends[] 欄位中的 customMetrics[] 陣列包含下列欄位:

  • name:指定自訂指標的使用者定義名稱。
  • maxUtilization:為這項指標設定目標或最高使用率。有效範圍為 [0, 100]。
  • dryRun:布林值欄位。如果為 true,指標資料會回報給 Cloud Monitoring,但不會影響負載平衡決策。

示例

以下範例顯示 GCPBackendPolicy 資訊清單,可設定後端選取和端點層級路由的自訂指標。

  1. 將下列資訊清單儲存為 my-backend-policy.yaml

    kind: GCPBackendPolicy
    apiVersion: networking.gke.io/v1
    metadata:
    name: my-backend-policy
    namespace: team-awesome
    spec:
    targetRef:
      kind: Service
      name: super-service
    default:
      backends:
      - location: "*"
        balancingMode: RATE
        maxRatePerEndpoint: 9000
      - location: us-central1-a  # specific block applies to given zone / region only.
        # maxRatePerEndpoint: 9000 inherited from unnamed
        balancingMode: CUSTOM_METRICS
        customMetrics:
        - name: gpu-load
          maxUtilization: 100 # value ranges from 0 to 100 and maps to the floating pointrange [0.0, 1.0]
          dryRun: false
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f my-backend-policy.yaml
    

負載平衡器會根據RATE平衡模式 和自訂gpu-load指標分配流量。

使用 GCPTrafficDistributionPolicy 設定端點層級的路由

GCPTrafficDistributionPolicy 會設定後端中端點挑選的負載平衡演算法。選取 WEIGHTED_ROUND_ROBIN 時,負載平衡器會使用從回報指標 (包括自訂指標) 衍生出的權重,將流量分配至個別執行個體或端點。

GCPTrafficDistributionPolicy 資源的 WEIGHTED_ROUND_ROBIN localityLbPolicy 欄位會指定負載平衡演算法,用於選取後端中的個別執行個體或端點。使用這個演算法時,政策會利用自訂指標計算負載指派的權重。

GCPTrafficDistributionPolicy 設定中的 customMetrics[] 陣列包含下列欄位:

  • name:指定自訂指標的使用者定義名稱。
  • dryRun:布林值欄位。如果為 true,指標資料會回報給 Cloud Monitoring,但不會影響負載平衡。

詳情請參閱「Traffic management with custom metrics-based load balancing」(使用以自訂指標為準的負載平衡機制管理流量)。

示例

以下範例顯示 GCPTrafficDistributionPolicy 資訊清單,其中同時使用 WEIGHTED_ROUND_ROBIN 負載平衡演算法和自訂指標,設定端點層級的路由。

  1. 將下列範例資訊清單儲存為 GCPTrafficDistributionPolicy.yaml

    apiVersion: networking.gke.io/v1
    kind: GCPTrafficDistributionPolicy
    metadata:
      name: echoserver-v2
      namespace: team1
    spec:
      targetRefs:
      - kind: Service
        group: ""
        name: echoserver-v2
      default:
        localityLbAlgorithm: WEIGHTED_ROUND_ROBIN
        customMetrics:
        - name: orca.named_metrics.bescm11
          dryRun: false
        - name: orca.named_metrics.bescm12
          dryRun: true
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f GCPTrafficDistributionPolicy.yaml
    

負載平衡器會根據 WEIGHTED_ROUND_ROBIN 演算法和提供的自訂指標,將流量分配給端點。

設定工作階段相依性

本節說明 GKE 叢集 (須執行 1.24 以上版本) 提供的功能。

您可以根據下列條件設定工作階段相依性

  • 用戶端 IP 位址
  • 產生的 Cookie

為 Service 設定工作階段親和性時,閘道的 localityLbPolicy 設定會設為 MAGLEV

GCPBackendPolicy 移除工作階段相依性設定後,Gateway 會將 localityLbPolicy 設定還原為預設值 ROUND_ROBIN

下列 GCPBackendPolicy 資訊清單會根據用戶端 IP 位址指定工作階段相依性:

服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: CLIENT_IP
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多叢集服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: CLIENT_IP
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

下列 GCPBackendPolicy 資訊清單會根據產生的 Cookie 指定工作階段相依性,並將 Cookie 的存留時間設為 50 秒:

服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: GENERATED_COOKIE
      cookieTtlSec: 50
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多叢集服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: GENERATED_COOKIE
      cookieTtlSec: 50
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

您可以在 sessionAffinity.type 欄位中使用下列值:

  • CLIENT_IP
  • GENERATED_COOKIE
  • NONE

設定連線排除逾時

本節說明 GKE 叢集 (執行 1.24 以上版本) 提供的功能。

您可以使用 GCPBackendPolicy 設定連線排除逾時。連線排除逾時是指等待連線排除的時間 (以秒計算)。逾時時間長度可介於 0 至 3,600 秒之間。 預設值為 0,這也會停用連線排除功能。

下列 GCPBackendPolicy 資訊清單指定連線排除逾時為 60 秒:

服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    connectionDraining:
      drainingTimeoutSec: 60
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多叢集服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    connectionDraining:
      drainingTimeoutSec: 60
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

在指定的逾時時間長度內,GKE 會等待傳送至已移除後端的現有要求完成。負載平衡器不會將新的要求傳送至已移除的後端。逾時時間長度屆滿之後,GKE 就會關閉所有剩餘的後端連線。

HTTP 存取記錄

本節說明 GKE 叢集 (須執行 1.24 以上版本) 提供的功能。

根據預設:

  • 閘道控制器會將用戶端的所有 HTTP 要求記錄至 Cloud Logging
  • 取樣率為 1,000,000,表示系統會記錄所有要求。
  • 系統不會記錄任何選填欄位。

您可以使用 GCPBackendPolicy,透過三種方式在 Gateway 上停用存取記錄

  • 您可以將「沒有 GCPBackendPolicy」部分留空。logging
  • 你可以將 logging.enabled 設為 false
  • 您可以將 logging.enabled 設為 true,並將 logging.sampleRate 設為 0

您也可以設定存取記錄取樣率和選用欄位清單,例如「tls.cipher」或「orca_load_report」。

如要啟用選填欄位的記錄功能,請按照下列步驟操作:

  • logging.OptionalMode 設為 CUSTOM
  • 請提供要記錄在 logging.optionalFields 中的選填欄位清單。如需支援的欄位清單,請參閱「記錄和監控」。

您可以透過下列兩種方式停用選填欄位的記錄功能:

  • 你可以移除 logging.optionalFields 中的所有項目。
  • 您可以將 logging.OptionalMode 設為 EXCLUDE_ALL_OPTIONAL

下列 GCPBackendPolicy 資訊清單會修改存取記錄的預設取樣率,並將其設為 HTTP 要求的 50%。資訊清單也允許記錄特定 Service 資源的兩個選填欄位:

服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    logging:
      enabled: true
      sampleRate: 500000
      optionalMode: CUSTOM
      optionalFields:
      - tls.cipher
      - orca_load_report.cpu_utilization
  targetRef:
    group: ""
    kind: Service
    name: lb-service

多叢集服務

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    logging:
      enabled: true
      sampleRate: 500000
      optionalMode: CUSTOM
      optionalFields:
      - tls.cipher
      - orca_load_report.cpu_utilization
  targetRef:
    group: net.gke.io
    kind: ServiceImport
    name: lb-service

這個資訊清單包含下列欄位:

  • enable: true:明確啟用存取記錄。記錄檔位於 Logging。
  • sampleRate: 500000:指定要記錄 50% 的封包。您可以使用介於 0 到 1,000,000 之間的值。GKE 會將這個值除以 1, 000,000,轉換為介於 [0,1] 範圍內的浮點值。只有在 enable 設為 true 時,這個欄位才適用。sampleRate 是選填欄位,但如果設定這個欄位,則必須一併設定 enable: true。如果 enable 設為 true,但未提供 sampleRate,則 GKE 會將 enable 設為 false
  • optionalMode: CUSTOM:指定記錄項目中應包含一組 optionalFields
  • optionalFields: tls.cipher, orca_load_report.cpu_utilization:指定記錄項目應包含 TLS 交握使用的密碼名稱和服務的 CPU 使用率 (如有)。

為單一叢集閘道設定以流量為準的自動調度資源功能

確認 GKE 叢集執行的是 1.31.1-gke.2008000 以上版本。

如要在單一叢集 Gateway 中啟用以流量為準的自動調度資源功能,以及以容量為準的負載平衡功能,可以設定 Service 容量。服務容量是指服務可接收的流量容量,超過這個容量後,系統就會自動調度 Pod,或將流量溢流至其他可用叢集。

如要設定服務容量,請建立服務和相關聯的GCPBackendPolicyGCPBackendPolicy 資訊清單使用 maxRatePerEndpoint 欄位,定義服務中每個 Pod 的每秒要求數 (RPS) 上限值。下列 GCPBackendPolicy 資訊清單定義的 RPS 上限為 10:

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: store
spec:
  default:
    maxRatePerEndpoint: 10
  targetRef:
    group: ""
    kind: Service
    name: store

如要進一步瞭解以流量為準的自動調度資源功能,請參閱「根據負載平衡器流量自動調度資源」。

疑難排解

多個 GCPBackendPolicy 附加至同一個 Service

症狀:

GCPBackendPolicy 附加至 ServiceServiceImport 時,可能會出現下列狀態條件:

status:
  conditions:
    - lastTransitionTime: "2023-09-26T20:18:03Z"
      message: conflicted with GCPBackendPolicy "[POLICY_NAME]" of higher precedence, hence not applied
      reason: Conflicted
      status: "False"
      type: Attached

原因:

這個狀態條件表示您嘗試將第二個 GCPBackendPolicy套用至已附加 GCPBackendPolicyServiceServiceImport

GKE Gateway 不支援將多個 GCPBackendPolicy 連接至同一個 ServiceServiceImport。詳情請參閱「限制」一節。

解決方法:

設定單一 GCPBackendPolicy,其中包含所有自訂設定,並將其附加至 ServiceServiceImport

找不到 Google Cloud Armor 安全性政策

症狀:

在區域閘道上啟用 Google Cloud Armor 時,可能會出現下列錯誤訊息:

Invalid value for field 'resource': '{
"securityPolicy":"projects/123456789/regions/us-central1/securityPolicies/<policy_name>"}'.
The given security policy does not exist.

原因:

這則錯誤訊息表示您 Google Cloud 專案中沒有指定的區域性 Google Cloud Armor 安全性政策。

解決方法:

在專案中建立區域 Google Cloud Armor 安全性政策,並在 GCPBackendPolicy 中參照這項政策。

後續步驟