Soluciona problemas de pérdida de paquetes de Cloud NAT desde un clúster


En esta página, se muestra cómo resolver problemas con la pérdida de paquetes de Cloud NAT desde un clúster de Google Kubernetes Engine (GKE) nativo de la VPC con nodos privados habilitados.

Las VMs de nodo en clústeres de GKE nativos de la VPC con nodos privados no tienen direcciones IP externas. Esto significa que los clientes en Internet no se pueden conectar a las direcciones IP de los nodos. Puedes usar Cloud NAT para asignar las direcciones IP externas y los puertos que permiten que los clústeres con nodos privados establezcan conexiones públicas.

Si una VM de nodo se queda sin su asignación de puertos IP y direcciones IP externas de Cloud NAT, los paquetes se descartarán. Para evitar esto, puedes reducir la frecuencia de paquetes salientes o aumentar la asignación de puertos y direcciones IP de origen de Cloud NAT disponibles. En las siguientes secciones, se describe cómo diagnosticar y solucionar problemas de pérdida de paquetes de Cloud NAT en el contexto de clústeres de GKE con nodos privados.

Diagnostica la pérdida de paquetes

En las siguientes secciones, se explica cómo registrar paquetes descartados con Cloud Logging y diagnosticar la causa de los paquetes descartados mediante Cloud Monitoring.

Registra paquetes descartados

Puedes registrar paquetes descartados con la siguiente consulta en Cloud Logging:

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

Reemplaza lo siguiente:

  • REGION: es el nombre de la región en la que se encuentra el clúster.
  • GATEWAY_NAME: el nombre de la puerta de enlace de Cloud NAT.

Este comando muestra una lista de todos los paquetes que descartó una puerta de enlace de Cloud NAT, pero no identifica la causa.

Supervisa las causas de la pérdida de paquetes

Para identificar las causas de los paquetes descartados, consulta el observador de métricas en Cloud Monitoring. Los paquetes se descartan por uno de tres motivos:

  • OUT_OF_RESOURCES
  • ENDPOINT_INDEPENDENT_CONFLICT
  • NAT_ALLOCATION_FAILED

Para identificar los paquetes descartados debido a códigos de error OUT_OF_RESOURCES o ENDPOINT_ALLOCATION_FAILED, usa la siguiente 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)]

Si identificas paquetes que se descartan por estos motivos, consulta Paquetes descartados con el motivo: recursos insuficientes y Paquetes descartados con el motivo: conflicto independiente de extremo para obtener sugerencias de solución de problemas.

Para identificar los paquetes descartados debido al código de error NAT_ALLOCATION_FAILED, usa la siguiente 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

Si identificas paquetes que se descartaron por este motivo, consulta Es necesario asignar más direcciones IP.

Investiga la configuración de Cloud NAT

Si las consultas anteriores muestran resultados vacíos y los Pods de GKE no pueden comunicarse con direcciones IP externas, usa la siguiente tabla para solucionar los problemas de configuración:

Configuration Soluciona problemas
Cloud NAT configurado para aplicarse solo al rango de direcciones IP principal de la subred. Cuando Cloud NAT se configura solo para el rango de direcciones IP principal de la subred, los paquetes enviados desde el clúster hacia direcciones IP externas deben tener una dirección IP de nodo de origen. En esta configuración de Cloud NAT, haz lo siguiente:
  • Los Pods pueden enviar paquetes a direcciones IP externas si esos destinos de direcciones IP externas están sujetos al enmascaramiento de IP. Cuando implementes ip-masq-agent, verifica que la lista nonMasqueradeCIDRs no contenga la dirección IP y el puerto de destino. Los paquetes enviados a esos destinos se convierten primero en direcciones IP de nodo de origen antes de que Cloud NAT los procese.
  • Para permitir que los Pods se conecten a todas las direcciones IP externas con esta configuración de Cloud NAT, asegúrate de que se implemente ip-masq-agent y que la lista nonMasqueradeCIDRs solo contiene los rangos de direcciones IP del nodo y el Pod del clúster. Los paquetes enviados a destinos fuera del clúster primero se convierten en direcciones IP del nodo de origen antes de que Cloud NAT los procese.
  • Para evitar que los Pods envíen paquetes a algunas direcciones IP externas, debes bloquear esas direcciones de forma explícita para que no se enmascaren. Cuando se implemente ip-masq-agent, agrega las direcciones IP externas que deseas bloquear a la lista nonMasqueradeCIDRs. Los paquetes enviados a esos destinos salen del nodo con sus fuentes de dirección IP de Pod originales. Las direcciones IP del pod provienen de un rango de direcciones IP secundario de la subred del clúster. En esta configuración, Cloud NAT no funcionará en ese rango secundario.
Cloud NAT configurado para aplicarse solo al rango de direcciones IP secundario de la subred utilizado para las IP de Pods.

Cuando Cloud NAT se configura solo para el rango de direcciones IP secundario de la subred que usan las IP del Pod del clúster, los paquetes enviados desde el clúster hacia direcciones IP externas deben tener una dirección IP del Pod de origen. En esta configuración de Cloud NAT, se dan las siguientes situaciones:

  • El uso de un agente de enmascaramiento de IP hace que los paquetes pierdan su dirección IP de Pod de origen cuando se procesa con Cloud NAT. Para conservar la dirección IP del Pod de origen, especifica los rangos de direcciones IP de destino en una lista nonMasqueradeCIDRs. Con la ip-masq-agent implementada, cualquier paquete enviado a los destinos en la lista nonMasqueradeCIDRs conserva sus direcciones IP de Pod de origen antes de que Cloud NAT las procese.
  • Para permitir que los Pods se conecten a todas las direcciones IP externas con esta configuración de Cloud NAT, asegúrate de que ip-masq-agent esté implementado y que la lista nonMasqueradeCIDRs sea lo más grande posible (0.0.0.0/0 especifica todos los destinos de direcciones IP). Los paquetes enviados a todos los destinos conservan las direcciones IP del Pod de origen antes de que Cloud NAT las procese.

Reduce la pérdida de paquetes

Después de diagnosticar la causa de la pérdida de paquetes, considera usar las siguientes recomendaciones para reducir la probabilidad de que el problema vuelva a ocurrir en el futuro:

  • Configurar la puerta de enlace de Cloud NAT para usar la asignación de puerto dinámica y aumentar la cantidad máxima de puertos por VM

  • Si usas la asignación de puertos estática, aumenta la cantidad de puertos mínimos por VM.

  • Reduce la tasa de paquetes salientes de tu aplicación. Cuando una aplicación realiza varias conexiones salientes a la misma dirección IP y puerto de destino, puede consumir con rapidez todas las conexiones que Cloud NAT puede realizar a ese destino mediante la cantidad de direcciones de origen de NAT y tuplas de puertos de origen asignadas.

    Para obtener detalles sobre cómo Cloud NAT usa direcciones de origen y puertos de origen para realizar conexiones, incluidos los límites de la cantidad de conexiones simultáneas a un destino, consulta Puertos y conexiones.

    Para reducir la tasa de conexiones salientes desde la aplicación, reutiliza las conexiones abiertas. Los métodos comunes para reutilizar conexiones incluyen la agrupación de conexiones, la multiplexación de conexiones con protocolos como HTTP/2 o el establecimiento de conexiones persistentes reutilizadas para varias solicitudes. Para obtener más información, consulta Puertos y conexiones.

¿Qué sigue?

Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.