Questo documento descrive come utilizzare il controller Gateway di Google Kubernetes Engine (GKE) per configurare Cloud CDN. Puoi trovare informazioni dettagliate su concetti, best practice e risoluzione dei problemi di Cloud CDN nella documentazione di Cloud CDN.
Cloud CDN contribuisce a migliorare la latenza dell'utente finale e a ridurre il carico dell'origine memorizzando nella cache i contenuti più vicini agli utenti. Puoi attivare le funzionalità di memorizzazione nella cache di Cloud CDN utilizzando la CustomResourceDefinition GCPHTTPFilter.
Questo documento è rivolto a sviluppatori di applicazioni, architetti cloud e specialisti di networking che progettano e creano l'architettura della rete della propria organizzazione. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Cloud de Confiance contenuti, consulta Ruoli utente e attività comuni di GKE.
Panoramica
L'integrazione del gateway GKE con Cloud CDN ti consente di utilizzare risorse native di Kubernetes per gestire l'memorizzazione in una cache perimetrale. Utilizzando la risorsa GCPHTTPFilter, puoi ottimizzare configurazioni come le modalità cache e il durata (TTL) per diverse sezioni del traffico.
Per abilitare Cloud CDN, crea un oggetto GCPHTTPFilter e fai riferimento all'oggetto in una regola HTTPRoute. Puoi creare più oggetti GCPHTTPFilter per definire comportamenti di memorizzazione nella cache diversi per diversi tipi di traffico. Ad esempio, puoi creare un filtro per le immagini statiche e un altro per un criterio predefinito che utilizza i valori predefiniti consigliati di Cloud CDN.
La risorsa GCPHTTPFilter consente di configurare quanto segue:
- Modalità cache: controllano il modo in cui Cloud CDN memorizza nella cache le risposte dalla tua origine.
- Configurazione della durata (TTL): configura per quanto tempo gli oggetti rimangono nella cache.
- Chiavi cache: definiscono quali elementi di una richiesta (intestazioni, cookie, stringhe di query) vengono utilizzati per generare le chiavi cache.
- Memorizzazione nella cache negativa: memorizza nella cache le risposte di errore comuni o i reindirizzamenti per ridurre il carico sull'origine durante gli errori.
- Policy di gestione della cache: controllano il modo in cui Cloud CDN gestisce le richieste memorizzabili nella cache. Ad esempio, puoi abilitare Cloud CDN per eseguire le seguenti operazioni:
- Mantenere l'alta affidabilità continuando a pubblicare contenuti memorizzati nella cache anche se i servizi di backend non sono più disponibili.
- Definisci intestazioni delle richieste specifiche che bypassano la cache per recuperare i dati direttamente dal backend.
- Unisci più richieste in parallelo per la stessa risorsa in un'unica richiesta per ridurre il carico del backend.
La risorsa GCPHTTPFilter deve trovarsi nello stesso spazio dei nomi della risorsa HTTPRoute a cui è collegata. Dopo aver configurato GCPHTTPFilter, il filtro viene unito alla catena di filtri per la tua route.
Il seguente diagramma mostra come utilizzare GCPHTTPFilter per applicare diverse configurazioni di memorizzazione nella cache a segmenti specifici di traffico all'interno di un HTTPRoute:
Questa architettura ti consente di configurare una gestione granulare e automatizzata della memorizzazione nella cache perimetrale. Un HTTPRoute configura il modo in cui le richieste in entrata vengono gestite abbinando il traffico in entrata in base ad attributi come il percorso della richiesta. Per abilitare la memorizzazione nella cache per route specifiche, i GCPHTTPFilter vengono collegati alle regole all'interno di HTTPRoute. Ogni GCPHTTPFilter può specificare una logica di memorizzazione nella cache diversa per immagini, asset web e altri contenuti. Questa logica di memorizzazione nella cache viene poi applicata da Cloud CDN, che pubblica i contenuti memorizzati nella cache per il client.
Requisiti e limitazioni
- Il cluster deve essere su GKE versione 1.35.2-gke.1751000 o successive.
- Devi aver configurato un gateway esterno globale utilizzando la classe GatewayClass
gke-l7-global-external-managedogke-l7-global-external-managed-mc. - Devi aver configurato una risorsa HTTPRoute.
- Non puoi abilitare sia Identity-Aware Proxy (IAP) che Cloud CDN sullo stesso gateway. Se è richiesto IAP, devi rimuovere l'oggetto GCPHTTPFilter prima di abilitare GCPBackendPolicy.
- Puoi collegare un solo oggetto GCPHTTPFilter a una regola di percorso specifica all'interno di un HTTPRoute.
Prezzi
I prezzi di Cloud CDN vengono applicati quando la memorizzazione nella cache è abilitata. Per ulteriori informazioni, consulta Prezzi di Cloud CDN.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Per utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Ruoli e autorizzazioni
Per visualizzare le risorse Cloud de Confiance configurate, assicurati di disporre del ruolo IAM
roles/compute.networkViewer.Assicurati di avere accesso al cluster GKE e di disporre dell'autorizzazione per eseguire le azioni necessarie. Il seguente snippet mostra le autorizzazioni RBAC minime richieste:
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"]
Per saperne di più sull'utilizzo di RBAC e IAM, consulta Interazione con Identity and Access Management.
Configurare la memorizzazione nella cache con GCPHTTPFilter
Per abilitare e configurare Cloud CDN, crea una o più risorse GCPHTTPFilter e poi fai riferimento a queste nell'oggetto HTTPRoute.
Crea un GCPHTTPFilter
La risorsa GCPHTTPFilter definisce la tua policy di memorizzazione nella cache. Nell'esempio
seguente, crei tre GCPHTTPFilters:
- Il primo filtro memorizza nella cache le immagini statiche per una pubblicazione più rapida agli utenti finali.
- Il secondo filtro memorizza nella cache gli asset web, come i file CSS.
- Il terzo filtro funge da "catch-all" per il traffico rimanente.
Crea il primo filtro salvando il seguente manifest come
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: 12hIn questo manifest si applica quanto segue:
includeQueryString: indica a Cloud CDN di ignorare i parametri di query nella chiave cache. In questo modo, le diverse richieste utente per la stessa immagine ricevono copie identiche memorizzate nella cache.cacheMode: è impostato suCACHE_ALL_STATIC, che memorizza automaticamente nella cache i contenuti statici come le immagini.defaultTTL: indica a Cloud CDN di memorizzare nella cache le immagini per 12 ore. Puoi specificare l'ora in ore (h), minuti (m) o secondi (s).
Crea il secondo filtro. Salva il seguente manifest come
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: 24hQuesto manifest ha alcune delle stesse impostazioni del primo filtro, ad eccezione delle seguenti differenze:
serveWhileStale: è impostato su 24 ore. Se un asset web (ad esempio un file CSS) scade dopo ildefaultTTL, Cloud CDN continua a pubblicare l'asset obsoleto dalla cache per un massimo di 24 ore aggiuntive e convalida nuovamente i contenuti in background.defaultTTL: è impostato su una durata più lunga di 24 ore.
Crea un terzo filtro per definire una policy di memorizzazione nella cache predefinita senza parametri. Salva il seguente manifest come
store-caching-default-filter.yaml:apiVersion: networking.gke.io/v1 kind: GCPHTTPFilter metadata: name: store-caching-default-filter spec: cachePolicy: {}Quando non specifichi alcun parametro nella risorsa GCPHTTPFilter, GKE utilizza i valori predefiniti per la memorizzazione nella cache.
Applica i filtri al tuo cluster:
kubectl apply -f store-caching-images-filter.yaml kubectl apply -f store-caching-webassets-filter.yaml kubectl apply -f store-caching-default-filter.yaml
Collega il filtro a una risorsa HTTPRoute
Per applicare le policy di memorizzazione nella cache, aggiorna il manifest HTTPRoute esistente in modo che faccia riferimento ai filtri.
Puoi fare riferimento a filtri diversi all'interno dello stesso oggetto HTTPRoute per applicare regole di memorizzazione nella cache coerenti. Puoi anche riutilizzare lo stesso filtro in regole diverse, ad esempio quando suddividi il traffico tra diverse versioni di backend durante un'implementazione progressiva.
Modifica il manifest HTTPRoute esistente (ad esempio,
store-route-external.yaml) per includere la sezionefiltersnelle regole di instradamento: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-filterApplica la configurazione HTTPRoute aggiornata al tuo cluster:
kubectl apply -f store-route-external.yamlVerifica che HTTPRoute e Gateway siano implementati:
kubectl describe httproute store-external kubectl describe gateway external-httpL'output mostra che Cloud CDN è abilitato per la risorsa HTTPRoute. Cloud CDN applica le norme di memorizzazione nella cache configurate al tuo traffico e accelera la distribuzione di immagini statiche, asset web e altro traffico.
Annulla la convalida dei contenuti memorizzati nella cache
Per eliminare i contenuti obsoleti dalla cache, devi inviare una richiesta di annullamento della convalida. Per informazioni dettagliate sul funzionamento dell'annullamento della convalida, consulta Annullare la convalida dei contenuti memorizzati nella cache nella documentazione di Cloud CDN.
Trova la mappa URL associata al tuo gateway:
kubectl describe gateway external-httpCerca l'annotazione
networking.gke.io/url-maps. Ad esempio: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-map1Puoi invalidare i contenuti utilizzando diversi criteri di corrispondenza per l'invalidazione, tra cui host, percorso, tag della cache, codice di stato della risposta, tipo MIME e backend. Ad esempio, per inviare la richiesta di annullamento della convalida utilizzando i matcher di host e codice di stato, esegui questo comando:
gcloud compute url-maps invalidate-cdn-cache URL_MAP_NAME --host="store.example.com" --status=404Sostituisci
URL_MAP_NAMEcon il nome identificato nel passaggio precedente, ad esempiogkegw-url-map1.
Monitorare il rendimento di Cloud CDN
Puoi utilizzare Cloud Logging e Cloud Monitoring per monitorare le percentuali di successo della cache e le prestazioni.
I log di Cloud CDN sono associati al bilanciatore del carico di cui è stato eseguito il provisioning dal GKE Gateway Controller. I log vengono indicizzati in base alla regola di forwarding e alla mappa URL del bilanciatore del carico. Per recuperare i log recenti, esegui questo comando:
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 esporta le metriche in Cloud Monitoring. Puoi utilizzare il filtro
matched_url_path_rule nelle query di monitoraggio per restringere
le metriche a una HTTPRoute specifica.
Per saperne di più sulla visualizzazione dei log e sul monitoraggio di Cloud CDN, consulta Log e metriche per la memorizzazione nella cache.
Disabilita Cloud CDN
Per disattivare la memorizzazione nella cache, rimuovi i riferimenti a GCPHTTPFilter da HTTPRoute.
Modifica il manifest HTTPRoute e rimuovi il blocco
filtersche fa riferimento a GCPHTTPFilter. L'esempio seguente mostra un manifest HTTPRoute con i filtri rimossi: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: 8080Applica il manifest HTTPRoute aggiornato al tuo cluster:
kubectl apply -f store-route-external.yaml
Passaggi successivi
- Leggi una panoramica di Cloud CDN.
- Leggi le best practice per l'importazione dei contenuti.
- Scopri come risolvere i problemi relativi a Cloud CDN.
- Scopri di più sulle funzionalità di GatewayClass.