為閘道設定 Cloud CDN

本文說明如何使用 Google Kubernetes Engine (GKE) Gateway 控制器設定 Cloud CDN。如要進一步瞭解 Cloud CDN 概念、最佳做法和疑難排解,請參閱 Cloud CDN 說明文件。

Cloud CDN 會在靠近使用者的位置快取內容,有助於縮短使用者延遲時間,並減輕來源負載。您可以使用 GCPHTTPFilter CustomResourceDefinition 啟用 Cloud CDN 快取功能。

本文適用於負責設計及建構機構網路的應用程式開發人員、雲端架構師和網路專家。如要進一步瞭解 Cloud de Confiance 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

總覽

GKE Gateway 與 Cloud CDN 整合後,您就能使用 Kubernetes 原生資源管理邊緣快取。使用 GCPHTTPFilter 資源,即可微調不同流量區塊的設定,例如快取模式和存留時間 (TTL)。

如要啟用 Cloud CDN,請建立 GCPHTTPFilter 物件,並在 HTTPRoute 規則中參照該物件。您可以建立多個 GCPHTTPFilter 物件,為不同類型的流量定義不同的快取行為。舉例來說,您可以為靜態圖片建立一個篩選器,並為使用 Cloud CDN 建議預設值的預設政策建立另一個篩選器。

您可以使用 GCPHTTPFilter 資源設定下列項目:

  • 快取模式:控制 Cloud CDN 快取來源回應的方式。
  • 存留時間 (TTL) 設定:設定物件在快取中保留的時間長度。
  • 快取鍵:定義要求中的哪些元素 (標頭、Cookie、查詢字串) 用於產生快取鍵。
  • negative caching:快取常見錯誤回應或重新導向,以減少失敗期間的來源負載。
  • 快取政策:控管 Cloud CDN 處理可快取要求的方式。舉例來說,您可以啟用 Cloud CDN 來執行下列操作:
    • 即使後端服務無法使用,仍可繼續提供快取內容,維持高可用性。
    • 定義特定要求標頭,略過快取,直接從後端擷取資料。
    • 將多項並行的相同資源要求合併為單一要求,以減少後端負載。

GCPHTTPFilter 資源必須與所附加的 HTTPRoute 資源位於相同命名空間。設定 GCPHTTPFilter 後,篩選器會合併至路徑的篩選器鏈結。

下圖說明如何使用 GCPHTTPFilter,將不同的快取設定套用至 HTTPRoute 內的特定流量切片:

圖 1. 使用 HTTPRoute 內的 GCPHTTPFilter 進行不同的快取設定。
圖 1:HTTPRoute 中的快取設定。

這個架構可讓您設定精細的自動邊緣快取管理。 HTTPRoute 會根據要求路徑等屬性比對傳入流量,設定如何處理傳入要求。如要為特定路徑啟用快取,請將 GCPHTTPFilters 附加至 HTTPRoute 中的規則。每個 GCPHTTPFilter 都可以為圖片、網頁素材資源和其他內容指定不同的快取邏輯。接著,Cloud CDN 會強制執行這項快取邏輯,並將快取的內容提供給用戶端。

需求條件和限制

  • 叢集必須使用 GKE 1.35.2-gke.1751000 以上版本。
  • 您必須使用 gke-l7-global-external-managed 或 gke-l7-global-external-managed-mc GatewayClass 設定全域外部閘道。
  • 您必須已設定 HTTPRoute 資源。
  • 您無法在同一個閘道上同時啟用 Identity-Aware Proxy (IAP) 和 Cloud CDN。如果需要 IAP,則必須先移除 GCPHTTPFilter 物件,才能啟用 GCPBackendPolicy。
  • 您只能將一個 GCPHTTPFilter 物件附加至 HTTPRoute 中的特定路徑規則。

定價

啟用快取時,適用 Cloud CDN 定價。詳情請參閱「Cloud CDN 定價」。

事前準備

開始之前,請務必先完成下列工作:

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

角色和權限

  1. 如要查看已設定的 Cloud de Confiance 資源,請確保您具備 roles/compute.networkViewer IAM 角色。

  2. 確認您有權存取 GKE 叢集,並有權執行必要操作。下列程式碼片段顯示所需的最低 RBAC 權限:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: gateway-caching-admin
    rules:
    # 1. Full access to manage HTTPRoutes
    - apiGroups: ["gateway.networking.k8s.io"]
      resources: ["httproutes"]
      verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
    # 2. Read-only access to view the Gateway
    - apiGroups: ["gateway.networking.k8s.io"]
      resources: ["gateways"]
      verbs: ["get", "list", "watch"]
    # 3. Full access to manage caching filters
    - apiGroups: ["networking.gke.io"]
      resources: ["gcphttpfilters"]
      verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
    

如要進一步瞭解如何使用 RBAC 和 IAM,請參閱「與 Identity and Access Management 互動」。

使用 GCPHTTPFilter 設定快取

如要啟用及設定 Cloud CDN,請建立一或多個 GCPHTTPFilter 資源,然後在 HTTPRoute 物件中參照這些資源。

建立 GCPHTTPFilter

GCPHTTPFilter 資源會定義快取政策。在下列範例中,您會建立三個 GCPHTTPFilters:

  • 第一個篩選器會快取靜態圖片,以便更快傳送給使用者。
  • 第二個篩選器會快取 CSS 檔案等網頁資產。
  • 第三個篩選器則做為其餘流量的「全部涵蓋」篩選器。
  1. 將下列資訊清單儲存為 store-caching-images-filter.yaml,建立第一個篩選器:

    apiVersion: networking.gke.io/v1
    kind: GCPHTTPFilter
    metadata:
      name: store-caching-images-filter
    spec:
      cachePolicy:
        cacheKeyPolicy:
          includeQueryString: false
        cacheMode: CACHE_ALL_STATIC
        defaultTTL: 12h
    

    在這個資訊清單中,適用下列項目:

    • includeQueryString:指示 Cloud CDN 忽略快取鍵中的查詢參數。這有助於確保同一張圖片的不同使用者要求,會收到相同的快取副本。
    • cacheMode:設為 CACHE_ALL_STATIC,會自動快取圖片等靜態內容。
    • defaultTTL:指示 Cloud CDN 將圖片快取 12 小時。時間單位可以是小時 (h)、分鐘 (m) 或秒 (s)。
  2. 建立第二個篩選器。將下列資訊清單儲存為 store-caching-webassets-filter.yaml:

    apiVersion: networking.gke.io/v1
    kind: GCPHTTPFilter
    metadata:
      name: store-caching-webassets-filter
    spec:
      cachePolicy:
        cacheKeyPolicy:
          includeQueryString: false
        serveWhileStale: 24h
        cacheMode: CACHE_ALL_STATIC
        defaultTTL: 24h
    

    這個資訊清單與第一個篩選器有部分相同的設定,但有以下差異:

    • serveWhileStale:設為 24 小時。如果網頁素材資源 (例如 CSS 檔案) 在 defaultTTL 後過期,Cloud CDN 會繼續從快取提供該過時素材資源,最長可達 24 小時,並在背景重新驗證內容。
    • defaultTTL:設為較長的 24 小時。
  3. 建立第三個篩選器,定義不含任何參數的預設快取政策。將下列資訊清單儲存為 store-caching-default-filter.yaml:

    apiVersion: networking.gke.io/v1
    kind: GCPHTTPFilter
    metadata:
      name: store-caching-default-filter
    spec:
      cachePolicy: {}
    

    如未在 GCPHTTPFilter 資源中指定任何參數,GKE 會使用快取的預設值。

  4. 將篩選器套用至叢集:

    kubectl apply -f store-caching-images-filter.yaml
    kubectl apply -f store-caching-webassets-filter.yaml
    kubectl apply -f store-caching-default-filter.yaml
    

將篩選器附加至 HTTPRoute

如要套用快取政策,請更新現有的 HTTPRoute 資訊清單,以參照篩選器。

您可以在同一個 HTTPRoute 物件中參照不同篩選器,套用一致的快取規則。您也可以在不同規則中重複使用相同篩選器,例如在逐步推出期間,將流量分配給不同後端版本時。

  1. 修改現有的 HTTPRoute 資訊清單 (例如 store-route-external.yaml),在路由規則中加入 filters 部分:

    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1
    metadata:
      name: store-external
    spec:
      parentRefs:
      - kind: Gateway
        name: external-http
      hostnames:
      - "store.example.com"
      rules:
      # RULE 1: Default /img/ traffic to store-v1
      - matches:
        - path:
            value: /img/
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-images-filter
        backendRefs:
        - name: store-v1
          port: 8080
      # RULE 2: Default /web/ traffic to store-v1
      - matches:
        - path:
            value: /web/
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-webassets-filter
        backendRefs:
        - name: store-v1
          port: 8080
      # RULE 3: Canary /img/ traffic (header + path match) to store-v2
      - matches:
        - headers:
          - name: env
            value: canary
          path:
            value: /img/
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-images-filter
        backendRefs:
        - name: store-v2
          port: 8080
      # RULE 4: Canary /web/ traffic (header + path match) to store-v2
      - matches:
        - headers:
          - name: env
            value: canary
          path:
            value: /web/
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-webassets-filter
        backendRefs:
        - name: store-v2
          port: 8080
      # RULE 5: Default (catch-all) traffic to store-v1
      - backendRefs:
        - name: store-v1
          port: 8080
        # If you need caching for default traffic, it can be enabled by placing
        # filters directly under backendRefs
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-default-filter
    
  2. 將更新後的 HTTPRoute 設定套用至叢集:

    kubectl apply -f store-route-external.yaml
    
  3. 確認 HTTPRoute 和閘道已部署:

    kubectl describe httproute store-external
    kubectl describe gateway external-http
    

    輸出內容會顯示 HTTPRoute 資源已啟用 Cloud CDN。Cloud CDN 會對流量套用已設定的快取政策,並加快傳遞靜態圖片、網路資產和其他流量。

撤銷快取內容

如要從快取中清除過時內容,您必須提交撤銷要求。如要進一步瞭解撤銷機制的運作方式,請參閱 Cloud CDN 說明文件中的「撤銷快取內容」。

  1. 找出與閘道相關聯的網址對應:

    kubectl describe gateway external-http
    

    尋找 networking.gke.io/url-maps 註解。例如:

    Name: external-http
    Namespace: foo
    API Version: gateway.networking.k8s.io
    Kind: Gateway
    Annotations: networking.gke.io/backend-services: gkegw-service1
                 networking.gke.io/firewalls: gkegw-l7-fw
                 networking.gke.io/forwarding-rules: gkegw-fr1
                 networking.gke.io/health-checks: gkegw-hc1
                 networking.gke.io/ssl-certificates:
                 networking.gke.io/target-proxies: gkegw-tp1
                 networking.gke.io/url-maps: gkegw-url-map1
    
  2. 您可以使用多種撤銷比對器撤銷內容,包括主機、路徑、快取標記、回應狀態碼、MIME 類型和後端。舉例來說,如要使用主機和狀態碼比對器提交撤銷要求,請執行下列指令:

    gcloud compute url-maps invalidate-cdn-cache URL_MAP_NAME
        --host="store.example.com" 
        --status=404
    

    將 URL_MAP_NAME 替換為上一個步驟中識別的名稱,例如 gkegw-url-map1。

監控 Cloud CDN 效能

您可以使用 Cloud Logging 和 Cloud Monitoring 追蹤快取命中率和效能。

Cloud CDN 記錄檔會與 GKE Gateway 控制器佈建的負載平衡器建立關聯。系統會依據負載平衡器的轉送規則和網址對應關係,為記錄建立索引。如要擷取最近的記錄,請執行下列指令:

gcloud logging read 'resource.type="http_load_balancer" AND 
    resource.labels.url_map_name="URL_MAP_NAME" AND 
    logName="projects/PROJECT_ID/logs/cloudcdn_googleapis_com%2Frequests"' 
    --project PROJECT_ID --limit 100 --format json

Cloud CDN 會將指標匯出至 Cloud Monitoring。您可以在監控查詢中使用 matched_url_path_rule 篩選器,將指標範圍縮小至特定 HTTPRoute。

如要進一步瞭解如何查看 Cloud CDN 的記錄和監控資料,請參閱「快取的記錄和指標」。

停用 Cloud CDN

如要停用快取功能,請從 HTTPRoute 移除 GCPHTTPFilter 參照。

  1. 編輯 HTTPRoute 資訊清單,並移除參照 GCPHTTPFilter 的 filters 區塊。以下範例顯示已移除篩選器的 HTTPRoute 資訊清單:

    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1
    metadata:
      name: store-external
    spec:
      parentRefs:
      - kind: Gateway
        name: external-http
      hostnames:
      - "store.example.com"
      rules:
      # RULE 1: Default /img/ traffic to store-v1
      - matches:
        - path:
            value: /img/
        backendRefs:
        - name: store-v1
          port: 8080
      # RULE 2: Canary /img/ traffic (header match) to store-v2
      - matches:
        - headers:
          - name: env
            value: canary
          path:
            value: /img/
        backendRefs:
        - name: store-v2
          port: 8080
      # RULE 3: Default (catch-all) traffic to store-v1
      - backendRefs:
        - name: store-v1
          port: 8080
    
  2. 將更新後的 HTTPRoute 資訊清單套用至叢集:

    kubectl apply -f store-route-external.yaml
    

後續步驟