Resolva problemas de perda de pacotes do Cloud NAT a partir de um cluster


Esta página mostra como resolver problemas de perda de pacotes do Cloud NAT de um cluster do Google Kubernetes Engine (GKE) nativo da VPC com nós privados ativados.

As VMs de nós em clusters do GKE nativos da VPC com nós privados não têm endereços IP externos. Isto significa que os clientes na Internet não podem estabelecer ligação aos endereços IP dos nós. Pode usar o Cloud NAT para atribuir os endereços IP externos e as portas que permitem que os clusters com nós privados façam ligações públicas.

Se uma VM de nó ficar sem a respetiva atribuição de portas externas e endereços IP do Cloud NAT, os pacotes são ignorados. Para evitar esta situação, pode reduzir a taxa de pacotes de saída ou aumentar a atribuição de endereços IP de origem e portas do Cloud NAT disponíveis. As secções seguintes descrevem como diagnosticar e resolver problemas de perda de pacotes do Cloud NAT no contexto de clusters do GKE com nós privados.

Diagnostique a perda de pacotes

As secções seguintes explicam como registar pacotes rejeitados através do Cloud Logging e diagnosticar a causa dos pacotes rejeitados através do Cloud Monitoring.

Registe pacotes rejeitados

Pode registar pacotes rejeitados 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 o seguinte:

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

Este comando devolve uma lista de todos os pacotes rejeitados por uma gateway do Cloud NAT, mas não identifica a causa.

Monitorize as causas da perda de pacotes

Para identificar as causas dos pacotes perdidos, consulte o observador de métricas no Cloud Monitoring. Os pacotes são ignorados por um de três motivos:

  • OUT_OF_RESOURCES
  • ENDPOINT_INDEPENDENT_CONFLICT
  • NAT_ALLOCATION_FAILED

Para identificar pacotes rejeitados devido aos 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 identificar pacotes que são ignorados por estes motivos, consulte os artigos Pacotes ignorados com o motivo: sem recursos e Pacotes ignorados com o motivo: conflito independente do ponto final para obter sugestões de resolução de problemas.

Para identificar pacotes rejeitados devido ao código de erro NAT_ALLOCATION_FAILED, use a seguinte 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 identificar pacotes que foram rejeitados por este motivo, consulte a secção Precisa de atribuir mais endereços IP.

Investigue a configuração do Cloud NAT

Se as consultas anteriores devolverem resultados vazios e os pods do GKE não conseguirem comunicar com endereços IP externos, use a tabela seguinte para ajudar a resolver problemas com a sua configuração:

Configuração Resolução de problemas
O Cloud NAT está configurado para se aplicar apenas ao intervalo de endereços IP principal da sub-rede. Quando o Cloud NAT está configurado apenas para o intervalo de endereços IP principal da sub-rede, os pacotes enviados do cluster para endereços IP externos têm de ter um endereço IP do nó de origem. Nesta configuração do Cloud NAT:
  • Os pods podem enviar pacotes para endereços IP externos se esses destinos de endereços IP externos estiverem sujeitos a ocultação de IP. Quando implementar 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 liguem a todos os endereços IP externos com esta configuração do Cloud NAT, certifique-se de que o ip-masq-agent está implementado e que a lista 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, tem de bloquear explicitamente esses endereços para que não sejam mascarados. Quando o ip-masq-agent estiver implementado, adicione os endereços IP externos que quer bloquear à lista nonMasqueradeCIDRs. Os pacotes enviados para esses destinos saem do nó com as respetivas origens de endereço IP do pod. Os endereços IP dos pods provêm de um intervalo de endereços IP secundário da sub-rede do cluster. Nesta configuração, o Cloud NAT não funciona nesse intervalo secundário.
Cloud NAT configurado para aplicar apenas ao intervalo de endereços IP secundários da sub-rede usado para IPs de pods.

Quando o Cloud NAT está configurado apenas para o intervalo de endereços IP secundários da sub-rede usado pelos IPs dos pods do cluster, os pacotes enviados do cluster para endereços IP externos têm de ter um endereço IP do pod de origem. Nesta configuração do Cloud NAT:

  • A utilização de um agente de mascaramento de IP faz com que os pacotes percam o respetivo endereço IP do pod de origem quando processados pelo Cloud NAT. Para manter o endereço IP do pod de origem, especifique intervalos de endereços IP numa lista nonMasqueradeCIDRs. Com o ip-masq-agent implementado, todos os pacotes enviados para destinos na lista nonMasqueradeCIDRs mantêm os respetivos endereços IP do pod de origem antes de serem processados pelo Cloud NAT.
  • Para permitir que os pods se liguem a todos os endereços IP externos com esta configuração do Cloud NAT, certifique-se de que o ip-masq-agent está implementado e que a lista nonMasqueradeCIDRs é o maior possível (0.0.0.0/0 especifica todos os destinos de endereços IP). Os pacotes enviados para todos os destinos retêm os endereços IP do pod de origem antes de serem processados pelo Cloud NAT.

Reduza a perda de pacotes

Depois de diagnosticar a causa da perda de pacotes, considere usar as seguintes recomendações para reduzir a probabilidade de o problema ocorrer novamente no futuro:

  • Configure o gateway NAT da nuvem para usar a atribuição dinâmica de portas e aumentar o número máximo de portas por VM.

  • Se estiver a usar a atribuição de portas estáticas, aumente o número mínimo de portas por MV.

  • Reduza a taxa de pacotes de saída da sua aplicação. Quando uma aplicação faz várias ligações de saída para o mesmo endereço IP e porta de destino, pode consumir rapidamente todas as ligações que o Cloud NAT pode fazer a esse destino através do número de endereços de origem NAT e tuplos de portas de origem atribuídos.

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

    Para reduzir a taxa de ligações de saída da aplicação, reutilize as ligações abertas. Os métodos comuns de reutilização de ligações incluem o agrupamento de ligações, a multiplexagem de ligações através de protocolos como o HTTP/2 ou o estabelecimento de ligações persistentes reutilizadas para vários pedidos. Para mais informações, consulte Portas e ligações.

O que se segue?