Solucionar problemas de perda de pacotes do Cloud NAT em um cluster

Em clusters do Google Kubernetes Engine (GKE) nativos da VPC, os nós sem endereços IP externo aumentam a segurança. Esses nós usam o Cloud NAT para conexões de saída da Internet. A perda de pacotes pode ocorrer se uma VM de nó esgotar as portas e os endereços IP do Cloud NAT alocados, geralmente sob alta carga de saída, interrompendo o tráfego de saída.

Use este documento para aprender a registrar e monitorar pacotes descartados, investigar sua configuração do Cloud NAT e implementar medidas para reduzir a perda de pacotes no futuro.

Essas informações são importantes para administradores e operadores da plataforma e administradores de rede que gerenciam clusters do GKE com nós sem acesso à Internet e dependem do Cloud NAT para conectividade externa. Para mais informações sobre os papéis comuns e as tarefas de exemplo referenciados no conteúdo doGoogle Cloud , consulte Funções e tarefas de usuário comuns do GKE.

Diagnosticar perdas de pacotes

As seções a seguir explicam como registrar pacotes descartados usando o Cloud Logging e diagnosticar a causa deles usando o Cloud Monitoring.

Registrar pacotes descartados

Registre pacotes descartados com a seguinte consulta no Cloud Logging:

resource.type="nat_gateway"
resource.labels.region=REGION
resource.labels.gateway_name=GATEWAY_NAME
jsonPayload.allocation_status="DROPPED"

Substitua:

  • REGION: o nome da região em que o cluster está.
  • GATEWAY_NAME: o nome do gateway do Cloud NAT.

Esse comando retorna uma lista de todos os pacotes descartados por um gateway do Cloud NAT, mas não identifica a causa.

Monitorar as causas de perdas de pacotes

Para identificar as causas de pacotes descartados, consulte o Observador de métricas no Cloud Monitoring. Os pacotes são descartados por um destes três motivos:

  • OUT_OF_RESOURCES
  • ENDPOINT_INDEPENDENT_CONFLICT
  • NAT_ALLOCATION_FAILED

Para identificar pacotes descartados devido a códigos de erro OUT_OF_RESOURCES ou ENDPOINT_ALLOCATION_FAILED, use a seguinte consulta:

fetch nat_gateway
  metric 'router.googleapis.com/nat/dropped_sent_packets_count'
  filter (resource.gateway_name == GATEWAY_NAME)
  align rate(1m)
  every 1m
  group_by [metric.reason],
    [value_dropped_sent_packets_count_aggregate:
       aggregate(value.dropped_sent_packets_count)]

Se você identificar pacotes descartados devido a esses motivos, consulte Pacotes descartados com o motivo: sem recursos e Pacotes descartados com o motivo: conflito independente de endpoint, para receber conselhos de solução de problemas.

Para identificar pacotes descartados devido ao código de erro NAT_ALLOCATION_FAILED, use esta consulta:

fetch nat_gateway
  metric 'router.googleapis.com/nat/nat_allocation_failed'
  group_by 1m,
    [value_nat_allocation_failed_count_true:
       count_true(value.nat_allocation_failed)]
  every 1m

Se você identificar pacotes descartados por esse motivo, consulte É necessário alocar mais endereços IP.

Investigar a configuração do Cloud NAT

Se as consultas anteriores retornarem resultados vazios e os pods do GKE não conseguirem se comunicar com endereços IP externos, use a tabela a seguir para resolver o problema da configuração:

Configuração Solução de problemas
Cloud NAT configurado para ser aplicado somente ao intervalo de endereços IP primário da sub-rede. Quando o Cloud NAT é configurado apenas para o intervalo de endereços IP primário da sub-rede, os pacotes enviados do cluster para endereços IP externos precisam ter um endereço IP do nó de origem. Nesta configuração do Cloud NAT:
  • Os pods poderão enviar pacotes para endereços IP externos se esses destinos estiverem sujeitos a mascaramento de IP. Ao implantar o ip-masq-agent, verifique se a lista nonMasqueradeCIDRs não contém o endereço IP e a porta de destino. Os pacotes enviados para esses destinos são primeiro convertidos em endereços IP do nó de origem antes de serem processados pelo Cloud NAT.
  • Para permitir que os pods se conectem a todos os endereços IP externos com essa configuração do Cloud NAT, verifique se o ip-masq-agent é implantado e que o nonMasqueradeCIDRs contém apenas os intervalos de endereços IP do nó e do pod do cluster. Os pacotes enviados para destinos fora do cluster são primeiro convertidos em endereços IP do nó de origem antes de serem processados pelo Cloud NAT.
  • Para impedir que os pods enviem pacotes para alguns endereços IP externos, é necessário bloquear explicitamente esses endereços para que não sejam mascarados. Quando ip-masq-agent for implantado, adicione os endereços IP externos que você quer bloquear à lista nonMasqueradeCIDRs. Os pacotes enviados para esses destinos saem do nó com as origens de endereços IP originais do pod. Os endereços IP do pod são provenientes de um intervalo de endereços IP secundário da sub-rede do cluster. Nessa configuração, o Cloud NAT não opera nesse intervalo secundário.
Cloud NAT configurado para ser aplicado apenas ao intervalo de endereços IP secundário da sub-rede usado para IPs de pod.

Quando o Cloud NAT é configurado apenas para o intervalo de endereços IP secundário da sub-rede usado pelos IPs de pod do cluster, os pacotes enviados do cluster para os endereços IP externos precisam ter um endereço IP do pod de origem. Nesta configuração do Cloud NAT:

  • Usar um agente de mascaramento de IP faz com que os pacotes percam o endereço IP do pod de origem quando são processados pelo Cloud NAT. Para manter esse endereço, especifique os intervalos de endereços IP de destino em uma lista nonMasqueradeCIDRs. Com o ip-masq-agent implantado, todos os pacotes enviados aos destinos na lista nonMasqueradeCIDRs mantêm os endereços IP do pod de origem antes de serem processados pelo Cloud NAT.
  • Para permitir que os pods se conectem a todos os endereços IP externos com essa configuração do Cloud NAT, verifique se ip-masq-agent foi implantado e se a lista nonMasqueradeCIDRs é a maior possível (0.0.0.0/0 especifica todos os destinos de endereços IP). Os pacotes enviados a todos os destinos retêm os endereços IP do pod de origem antes de serem processados pelo Cloud NAT.

Reduzir as perdas de pacotes

Depois de diagnosticar a causa da perda de pacotes, use as recomendações a seguir para reduzir a probabilidade de recorrência do problema no futuro:

  • Configure o gateway do Cloud NAT para usar a alocação de porta dinâmica e aumentar o número máximo de portas por VM.

  • Se você estiver usando a alocação de porta estática, aumente o número mínimo de portas por VM.

  • Reduza a taxa de pacotes de saída do app. Quando um aplicativo cria várias conexões de saída com a mesma porta e o mesmo endereço IP de destino, ele pode consumir rapidamente todas as conexões estabelecidas pelo Cloud NAT com esse destino usando o número de endereços de origem NAT alocados e as tuplas da porta de origem.

    Para detalhes sobre como o Cloud NAT usa endereços e portas de origem NAT para estabelecer conexões, incluindo os limites no número de conexões simultâneas com um destino, consulte Portas e conexões.

    Para reduzir a taxa de conexões de saída do app, reutilize as conexões estabelecidas. Os métodos comuns de reutilização de conexões incluem o pooling de conexão, a multiplexação de conexões com protocolos como HTTP/2 ou o estabelecimento de conexões persistentes reutilizadas para várias solicitações. Para mais informações, consulte Portas e conexões.

A seguir

  • Se você não encontrar uma solução para seu problema na documentação, consulte Receber suporte para mais ajuda, incluindo conselhos sobre os seguintes tópicos: