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:
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-managedougke-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
Para ver os recursos Cloud de Confiance configurados, verifique se você tem o papel do IAM
roles/compute.networkViewer.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.
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: 12hNeste 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 comoCACHE_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).
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: 24hEsse 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 odefaultTTL, 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.
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.
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.
Modifique o manifesto HTTPRoute atual (por exemplo,
store-route-external.yaml) para incluir a seçãofiltersnas 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-filterAplique a configuração atualizada do HTTPRoute ao cluster:
kubectl apply -f store-route-external.yamlVerifique se o HTTPRoute e o Gateway foram implantados:
kubectl describe httproute store-external kubectl describe gateway external-httpA 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.
Encontre o mapa de URL associado ao gateway:
kubectl describe gateway external-httpProcure 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É 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=404Substitua
URL_MAP_NAMEpelo 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.
Edite o manifesto do HTTPRoute e remova o bloco
filtersque 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: 8080Aplique o manifesto HTTPRoute atualizado ao cluster:
kubectl apply -f store-route-external.yaml
A seguir
- Leia uma visão geral do Cloud CDN.
- Leia as práticas recomendadas para envio de conteúdo.
- Saiba como resolver problemas com o Cloud CDN.
- Saiba mais sobre os recursos da GatewayClass.