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


Nesta página, mostramos como resolver problemas de perdas de pacotes do Cloud NAT em um cluster particular do Google Kubernetes Engine (GKE) nativo de VPC.

As VMs de nó nos clusters particulares do GKE nativos de VPC não têm endereços IP externos. Isso significa que os clientes na Internet não podem se conectar aos endereços IP dos nós. É possível usar o Cloud NAT para alocar as portas e os endereços IP externos que permitem que os clusters particulares estabeleçam conexões públicas.

Se uma VM do nó ficar sem sua alocação de portas externas e endereços IP do Cloud NAT, os pacotes serão descartados. Para evitar isso, reduza a taxa de pacotes de saída ou aumente a alocação de endereços IP e portas de origem do Cloud NAT disponíveis. As seções a seguir descrevem como diagnosticar e solucionar problemas de perda de pacotes do Cloud NAT no contexto de clusters particulares 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 receber ajuda ao 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 precisar de mais ajuda, entre em contato com o Cloud Customer Care.