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 è destinato a sviluppatori di applicazioni, architetti cloud e specialisti di networking che progettano e realizzano l'architettura della rete della propria organizzazione. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Cloud de Confiance , consulta Ruoli utente e attività comuni di GKE.
Panoramica
L'integrazione di GKE Gateway con Cloud CDN ti consente di utilizzare risorse native di Kubernetes per gestire l'memorizzazione in una cache perimetraleg. Utilizzando la risorsa GCPHTTPFilter, puoi perfezionare configurazioni come le modalità di cache durata (TTL)L) 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 ti 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.
- Norme 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:
- Mantiene l'alta disponibilità 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 simultanee 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 parametro HTTPRoute configura la modalità di gestione delle richieste in entrata abbinando il traffico in entrata in base agli attributi, ad esempio 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 fornisce i contenuti memorizzati nella cache al client.
Requisiti e limitazioni
- Il cluster deve utilizzare GKE 1.35.2-gke.1751000 o versioni successive.
- Devi aver configurato un gateway esterno globale
utilizzando GatewayClass
gke-l7-global-external-managedogke-l7-global-external-managed-mc. - Devi aver configurato una risorsa HTTPRoute.
- Non puoi attivare sia Identity-Aware Proxy (IAP) che Cloud CDN sullo stesso gateway. Se è richiesto l'acquisto in-app, devi rimuovere l'oggetto GCPHTTPFilter prima di attivare 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 la pagina Prezzi di Cloud CDN.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva 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 essere autorizzato a 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.
Configura 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 distribuzione 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 della 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 dopodefaultTTL, Cloud CDN continua a pubblicare l'asset obsoleto dalla cache per un massimo di altre 24 ore 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 un HTTPRoute
Per applicare le norme 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 lancio progressivo.
Modifica il manifest HTTPRoute esistente (ad esempio,
store-route-external.yaml) per includere la sezionefiltersnelle regole di routing: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 Annullamento della 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 da 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 ulteriori informazioni 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 la distribuzione dei contenuti.
- Scopri come risolvere i problemi di Cloud CDN.
- Scopri di più sulle funzionalità di GatewayClass.