Configura Cloud CDN per il gateway

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&#39memorizzazione 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:

Figura 1. Diverse configurazioni di memorizzazione nella cache effettuate con GCPHTTPFilter all'interno di un HTTPRoute.
Figura 1. Configurazioni della memorizzazione nella cache 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-managed o gke-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

  1. Per visualizzare le risorse Cloud de Confiance configurate, assicurati di disporre del ruolo IAM roles/compute.networkViewer.

  2. 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.
  1. 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: 12h
    

    In 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 su CACHE_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).
  2. 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: 24h
    

    Questo 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 defaultTTL, 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.
  3. 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.

  4. 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.

  1. Modifica il manifest HTTPRoute esistente (ad esempio, store-route-external.yaml) per includere la sezione filters nelle 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-filter
    
  2. Applica la configurazione HTTPRoute aggiornata al tuo cluster:

    kubectl apply -f store-route-external.yaml
    
  3. Verifica che HTTPRoute e Gateway siano implementati:

    kubectl describe httproute store-external
    kubectl describe gateway external-http
    

    L'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.

  1. Trova la mappa URL associata al tuo gateway:

    kubectl describe gateway external-http
    

    Cerca 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-map1
    
  2. Puoi 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=404
    

    Sostituisci URL_MAP_NAME con il nome identificato nel passaggio precedente, ad esempio gkegw-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.

  1. Modifica il manifest HTTPRoute e rimuovi il blocco filters che 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: 8080
    
  2. Applica il manifest HTTPRoute aggiornato al tuo cluster:

    kubectl apply -f store-route-external.yaml
    

Passaggi successivi