本文說明如何使用 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 中的特定流量切片:
這種架構可讓您設定精細的自動邊緣快取管理機制。 HTTPRoute 會根據要求路徑等屬性比對傳入的流量,藉此設定傳入要求的處理方式。如要為特定路徑啟用快取,請將 GCPHTTPFilters 附加至 HTTPRoute 中的規則。每個 GCPHTTPFilter 都可以為圖片、網頁資產和其他內容指定不同的快取邏輯。接著,Cloud CDN 會強制執行這項快取邏輯,並將快取的內容提供給用戶端。
需求條件和限制
- 叢集必須使用 GKE 1.35.2-gke.1751000 以上版本。
- 您必須使用
gke-l7-global-external-managed或gke-l7-global-external-managed-mcGatewayClass 設定全域外部閘道。 - 您必須已設定 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 版本可能不支援執行本文件中的指令。
角色和權限
如要查看已設定的 Google Cloud 資源,請確認您具備
roles/compute.networkViewerIAM 角色。確認您有權存取 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 檔案等網頁資產。
- 第三個篩選器則會「一網打盡」剩餘流量。
將下列資訊清單儲存為
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) 為單位)。
建立第二個篩選器。請將下列資訊清單儲存為
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 小時。
建立第三個篩選器,定義不含任何參數的預設快取政策。將下列資訊清單儲存為
store-caching-default-filter.yaml:apiVersion: networking.gke.io/v1 kind: GCPHTTPFilter metadata: name: store-caching-default-filter spec: cachePolicy: {}如果您未在 GCPHTTPFilter 資源中指定任何參數,GKE 會使用快取預設值。
將篩選器套用至叢集:
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 物件中參照不同的篩選器,套用一致的快取規則。您也可以在不同規則中重複使用相同篩選器,例如在逐步推出期間,將流量分配給不同後端版本時。
修改現有的 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將更新後的 HTTPRoute 設定套用至叢集:
kubectl apply -f store-route-external.yaml確認已部署 HTTPRoute 和 Gateway:
kubectl describe httproute store-external kubectl describe gateway external-http輸出內容顯示 HTTPRoute 資源已啟用 Cloud CDN。Cloud CDN 會對流量套用已設定的快取政策,並加速傳遞靜態圖片、網路資產和其他流量。
撤銷快取內容
如要從快取清除過時內容,請提交撤銷要求。如要進一步瞭解撤銷作業的運作方式,請參閱 Cloud CDN 說明文件的「撤銷快取內容」。
找出與閘道相關聯的網址對應:
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您可以使用多種撤銷比對器撤銷內容,包括主機、路徑、快取標記、回應狀態碼、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 參照。
編輯 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將更新後的 HTTPRoute 資訊清單套用至叢集:
kubectl apply -f store-route-external.yaml
後續步驟
- 閱讀 Cloud CDN 總覽。
- 請參閱內容傳遞的最佳做法。
- 瞭解如何排解 Cloud CDN 問題。
- 瞭解 GatewayClass 功能。