本文說明如何使用 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 內的特定流量切片:
這個架構可讓您設定精細的自動邊緣快取管理。 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 版本可能不支援執行本文件中的指令。
角色和權限
如要查看已設定的 Cloud de Confiance 資源,請確保您具備
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,請參閱「與 Identity and Access Management 互動」。
使用 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 和閘道已部署:
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 功能。