Configurar o Cloud CDN para o gateway

Este documento descreve como usar o controlador de gateway do Google Kubernetes Engine (GKE) para configurar o Cloud CDN. Encontre informações detalhadas sobre conceitos, práticas recomendadas e solução de problemas do Cloud CDN na documentação do Cloud CDN.

O Cloud CDN ajuda a melhorar a latência do usuário final e reduz a carga de origem armazenando conteúdo em cache perto dos usuários. É possível ativar os recursos de armazenamento em cache do Cloud CDN usando a CustomResourceDefinition GCPHTTPFilter.

Este documento é destinado a desenvolvedores de aplicativos, arquitetos de nuvem e especialistas em redes que projetam e arquitetam a rede da organização. Para saber mais sobre papéis comuns e tarefas de exemplo referenciados no conteúdo do Cloud de Confiance , consulte Tarefas e funções de usuário comuns do GKE.

Visão geral

A integração do GKE Gateway com o Cloud CDN permite usar recursos nativos do Kubernetes para gerenciar o armazenamento em cache de borda. Com o recurso GCPHTTPFilter, é possível ajustar configurações como modos de cache e time to live (TTL) para diferentes partes do tráfego.

Para ativar o Cloud CDN, crie um objeto GCPHTTPFilter e faça referência a ele em uma regra HTTPRoute. É possível criar vários objetos GCPHTTPFilter para definir comportamentos de cache diferentes para diferentes tipos de tráfego. Por exemplo, você pode criar um filtro para imagens estáticas e outro para uma política padrão que usa os valores padrão recomendados do Cloud CDN.

O recurso GCPHTTPFilter permite configurar o seguinte:

  • Modos de cache: controlam como o Cloud CDN armazena em cache as respostas da sua origem.
  • Configuração de tempo de vida (TTL): configure por quanto tempo os objetos permanecem no cache.
  • Chaves de cache: definem quais elementos de uma solicitação (cabeçalhos, cookies, strings de consulta) são usados para gerar chaves de cache.
  • Armazenamento em cache negativo: armazene em cache respostas de erro ou redirecionamentos comuns para reduzir a carga de origem durante falhas.
  • Políticas de cache: controlam como o Cloud CDN processa suas solicitações armazenáveis em cache. Por exemplo, é possível ativar o Cloud CDN para fazer o seguinte:
    • Manter a alta disponibilidade continuando a veicular conteúdo armazenado em cache, mesmo que os serviços de back-end fiquem indisponíveis.
    • Defina cabeçalhos de solicitação específicos que ignoram o cache para buscar dados diretamente do back-end.
    • Mescle várias solicitações simultâneas para o mesmo recurso em uma única solicitação para reduzir a carga do back-end.

O recurso GCPHTTPFilter precisa estar no mesmo namespace que o recurso HTTPRoute a que ele está anexado. Depois de configurar o GCPHTTPFilter, o filtro será combinado à cadeia de filtros da sua rota.

O diagrama a seguir ilustra como usar o GCPHTTPFilter para aplicar diferentes configurações de cache a partes específicas do tráfego em uma HTTPRoute:

Figura 1. Diferentes configurações de cache feitas com GCPHTTPFilter em uma HTTPRoute.
Figura 1. Configurações de cache em uma HTTPRoute.

Essa arquitetura permite configurar o gerenciamento granular e automatizado de cache de borda. Uma HTTPRoute configura como as solicitações recebidas são processadas, correspondendo ao tráfego de entrada com base em atributos como o caminho da solicitação. Para ativar o armazenamento em cache de rotas específicas, os GCPHTTPFilters são anexados às regras na HTTPRoute. Cada GCPHTTPFilter pode especificar uma lógica de armazenamento em cache diferente para imagens, recursos da Web e outros conteúdos. Essa lógica de armazenamento em cache é aplicada pelo Cloud CDN, que disponibiliza o conteúdo armazenado em cache para o cliente.

Requisitos e limitações

  • Seu cluster precisa estar na versão 1.35.2-gke.1751000 ou mais recente do GKE.
  • Você precisa ter configurado um gateway externo global usando a GatewayClass gke-l7-global-external-managed ou gke-l7-global-external-managed-mc.
  • Você precisa ter configurado um recurso HTTPRoute.
  • Não é possível ativar o Identity-Aware Proxy (IAP) e o Cloud CDN no mesmo gateway. Se a IAP for necessária, remova o objeto GCPHTTPFilter antes de ativar a GCPBackendPolicy.
  • Só é possível anexar um objeto GCPHTTPFilter a uma regra de caminho específica em uma HTTPRoute.

Preços

Os preços do Cloud CDN são aplicáveis quando o armazenamento em cache está ativado. Para mais informações, consulte Preços do Cloud CDN.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ative a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.

Papéis e permissões

  1. Para ver os recursos Cloud de Confiance configurados, verifique se você tem o papel do IAMroles/compute.networkViewer.

  2. Verifique se você tem acesso ao cluster do GKE e se está autorizado a realizar as ações necessárias. O snippet a seguir mostra as permissões mínimas necessárias do 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"]
    

Para mais informações sobre o uso do RBAC e do IAM, consulte Interação com o Identity and Access Management.

Configurar o armazenamento em cache com GCPHTTPFilter

Para ativar e configurar o Cloud CDN, crie um ou mais recursos GCPHTTPFilter e faça referência a eles no objeto HTTPRoute.

Criar um GCPHTTPFilter

O recurso GCPHTTPFilter define sua política de armazenamento em cache. No exemplo a seguir, você cria três GCPHTTPFilters:

  • O primeiro filtro armazena imagens estáticas em cache para entrega mais rápida aos usuários finais.
  • O segundo filtro armazena em cache recursos da Web, como arquivos CSS.
  • O terceiro filtro serve como um "catch-all" para o tráfego restante.
  1. Crie o primeiro filtro salvando o manifesto a seguir como 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
    

    Neste manifesto, o seguinte se aplica:

    • includeQueryString: instrui o Cloud CDN a ignorar os parâmetros de consulta na chave de cache. Isso ajuda a garantir que diferentes solicitações de usuários para a mesma imagem recebam cópias idênticas em cache.
    • cacheMode: é definido como CACHE_ALL_STATIC, que armazena automaticamente em cache conteúdo estático, como imagens.
    • defaultTTL: instrui o Cloud CDN a armazenar imagens em cache por 12 horas. Você pode especificar o tempo em horas (h), minutos (m) ou segundos (s).
  2. Crie o segundo filtro. Salve o seguinte manifesto como 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
    

    Esse manifesto tem algumas das mesmas configurações do primeiro filtro, exceto pelas seguintes diferenças:

    • serveWhileStale: está definido como 24 horas. Se um recurso da Web (como um arquivo CSS) expirar após o defaultTTL, o Cloud CDN continuará veiculando esse recurso desatualizado do cache por até mais 24 horas e revalidará o conteúdo em segundo plano.
    • defaultTTL: é definido para uma duração maior de 24 horas.
  3. Crie um terceiro filtro para definir uma política de cache padrão sem parâmetros. Salve o seguinte manifesto como store-caching-default-filter.yaml:

    apiVersion: networking.gke.io/v1
    kind: GCPHTTPFilter
    metadata:
      name: store-caching-default-filter
    spec:
      cachePolicy: {}
    

    Quando você não especifica parâmetros no recurso GCPHTTPFilter, o GKE usa os valores padrão para armazenamento em cache.

  4. Aplique os filtros ao 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
    

Anexar o filtro a uma HTTPRoute

Para aplicar as políticas de armazenamento em cache, atualize o manifesto HTTPRoute atual para referenciar os filtros.

É possível referenciar filtros diferentes no mesmo objeto HTTPRoute para aplicar regras de armazenamento em cache consistentes. Também é possível reutilizar o mesmo filtro em regras diferentes, por exemplo, ao dividir o tráfego entre diferentes versões de back-end durante um lançamento progressivo.

  1. Modifique o manifesto HTTPRoute atual (por exemplo, store-route-external.yaml) para incluir a seção filters nas regras de roteamento:

    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. Aplique a configuração atualizada do HTTPRoute ao cluster:

    kubectl apply -f store-route-external.yaml
    
  3. Verifique se o HTTPRoute e o Gateway foram implantados:

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

    A saída mostra que o Cloud CDN está ativado para o recurso HTTPRoute. O Cloud CDN aplica as políticas de cache configuradas ao seu tráfego e acelera a entrega de imagens estáticas, recursos da Web e outros tipos de tráfego.

Invalidar conteúdo armazenado em cache

Para limpar conteúdo desatualizado do cache, envie uma solicitação de invalidação. Para informações detalhadas sobre como a invalidação funciona, consulte Invalidar conteúdo armazenado em cache na documentação do Cloud CDN.

  1. Encontre o mapa de URL associado ao gateway:

    kubectl describe gateway external-http
    

    Procure a anotação networking.gke.io/url-maps. Exemplo:

    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. É possível invalidar conteúdo usando vários correspondentes de invalidação, incluindo host, caminho, tags de cache, código de status da resposta, tipo MIME e back-end. Por exemplo, para enviar a solicitação de invalidação usando os comparadores de host e código de status, execute o seguinte comando:

    gcloud compute url-maps invalidate-cdn-cache URL_MAP_NAME
        --host="store.example.com" 
        --status=404
    

    Substitua URL_MAP_NAME pelo nome identificado na etapa anterior, por exemplo, gkegw-url-map1.

Monitorar a performance do Cloud CDN

Use o Cloud Logging e o Cloud Monitoring para acompanhar as taxas de ocorrência em cache e o desempenho.

Os registros do Cloud CDN estão associados ao balanceador de carga provisionado pelo GKE Gateway Controller. Os registros são indexados pela regra de encaminhamento e pelo mapa de URL do balanceador de carga. Para recuperar registros recentes, execute o comando a seguir:

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

O Cloud CDN exporta métricas para o Cloud Monitoring. Use o filtro matched_url_path_rule nas consultas de monitoramento para restringir as métricas a uma HTTPRoute específica.

Para mais informações sobre como visualizar registros e monitorar o Cloud CDN, consulte Registros e métricas para armazenamento em cache.

Desativar o Cloud CDN

Para desativar o cache, remova as referências GCPHTTPFilter da sua HTTPRoute.

  1. Edite o manifesto do HTTPRoute e remova o bloco filters que faz referência ao GCPHTTPFilter. O exemplo a seguir mostra um manifesto HTTPRoute com os filtros removidos:

    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. Aplique o manifesto HTTPRoute atualizado ao cluster:

    kubectl apply -f store-route-external.yaml
    

A seguir