為閘道設定 Cloud CDN

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

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

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

總覽

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

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

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

  • 快取模式:控制 Cloud CDN 快取來源回應的方式。
  • 存留時間 (TTL) 設定:設定物件在快取中保留的時間長度。
  • 快取金鑰:定義要求中的哪些元素 (標頭、Cookie、查詢字串) 用於產生快取金鑰。
  • 負面快取:快取常見錯誤回應或重新導向,以減少故障期間的來源負載。
  • 快取政策:控管 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-managedgke-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. 如要查看已設定的 Google Cloud 資源,請確認您具備 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,請參閱「與身分與存取權管理互動」。

使用 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 和 Gateway:

    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
    

後續步驟