Controla la comunicación con direcciones IP persistentes en Pods de GKE


En esta página, se muestra cómo implementar direcciones IP persistentes en los Pods de Google Kubernetes Engine (GKE). Puedes controlar las herramientas de redes de tus Pods de GKE con la asignación de direcciones IP persistentes personalizada. Para obtener más información sobre las direcciones IP persistentes, sus casos de uso y beneficios, consulta Información sobre las direcciones IP persistentes para el Pod de GKE.

Requisitos

  • GKE versión 1.29 o posterior.
  • Elige entre reservar direcciones IP proporcionadas por Google (direcciones IP proporcionadas por Google) o usar tus propias direcciones IP (BYOIP).
  • Configura la aplicación que se ejecuta dentro de los Pods para que reconozca y use las direcciones IP persistentes asignadas.
  • Las direcciones IP persistentes para los Pods de GKE requieren GKE Dataplane V2 y clústeres habilitados para varias redes.

Limitaciones

  • La red predeterminada no admite direcciones IP persistentes. Debes habilitar las redes múltiples durante la creación del clúster.
  • Configura tus aplicaciones para que usen direcciones IP persistentes asignadas. GKE no agrega de forma automática la configuración de la dirección IP a las interfaces de red del Pod.
  • Puedes asociar cada dirección IP persistente con un solo pod a la vez. Cuando tienes varios Pods disponibles, GKE suele enviar tráfico al Pod más reciente. Sin embargo, GKE solo hace esto si el Pod más reciente está en buen estado, lo que significa que el Pod tiene el estado de condición Ready como True de forma predeterminada. Puedes configurar este comportamiento y cambiarlo mediante la configuración reactionMode en GKEIPRoute.
  • GKE solo admite direcciones IPv4 como direcciones IP persistentes.
  • GKE solo admite varias redes de capa 3 o tipo de dispositivo para direcciones IP persistentes.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Precios

Las siguientes funciones de Network Function Optimizer (NFO) solo se admiten en clústeres que están en proyectos habilitados con GKE Enterprise:

Para comprender los cargos que se aplican por habilitar la edición Google Kubernetes Engine (GKE) Enterprise, consulta Precios de GKE Enterprise.

Implementa direcciones IP persistentes para Pods de GKE

Las direcciones IP persistentes en GKE ofrecen una forma de otorgar a los Pods una identidad de red estable, incluso si los Pods se actualizan o se mueven.

En esta sección, se resume el flujo de trabajo a fin de implementar direcciones IP persistentes para los Pods de GKE:

  1. Crea un clúster: Crea un clúster que tenga habilitadas la API de Gateway, GKE Dataplane V2 y las redes múltiples.
  2. Reserva una dirección IP: Decide si necesitas una dirección IP externa (de acceso público) o interna (solo de Google Cloud) y guárdala. Elige la misma región que tu clúster de GKE.
  3. Crea una puerta de enlace: Configura el objeto de puerta de enlace de Kubernetes que contenga las direcciones IP persistentes reservadas y te permite crear reglas (GKEIPRoutes) sobre qué Pods de tu clúster pueden usar esas direcciones IP persistentes.
  4. Crea o identifica cargas de trabajo con redes adicionales para direcciones IP persistentes: Prepara los Pods para usar direcciones IP persistentes mediante la habilitación de varias interfaces de red y define la red en la que residen las direcciones IP persistentes.
  5. Crea el objeto GKEIPRoute para las cargas de trabajo seleccionadas: Configura GKEIPRoute a fin de asignar la dirección IP persistente a un Pod específico. Puedes usar etiquetas para orientar a los Pods correctos y, de forma opcional, configurar la forma en que reacciona el enrutamiento a los cambios de los Pods.
  6. Configura el conocimiento de tu aplicación: Configura tu aplicación dentro del Pod para usar de forma activa la dirección IP persistente.
  7. Supervisión: realiza un seguimiento del estado de los objetos Gateway y GKEIPRoute para asegurarte de que todo funcione según lo esperado.

Para implementar una dirección IP persistente en los Pods de GKE, sigue estos pasos:

Paso 1: Crea un clúster de GKE Dataplane V2 y un clúster de GKE habilitado con varias redes

A fin de habilitar las capacidades avanzadas de enrutamiento de red y administración de direcciones IP necesarias para implementar direcciones IP persistentes en Pods de GKE, debes crear un clúster habilitado para GKE Dataplane V2 y varias redes.

Paso 2: Reserva una dirección IP persistente

A fin de establecer identidades de red confiables para los Pods y configurar direcciones IP persistentes, primero debes adquirir direcciones IP persistentes. Puedes elegir entre reservar direcciones IP proporcionadas por Google o usar tus propias (BYOIP).

Paso 2a: Reserva las direcciones IP proporcionadas por Google

Para reservar direcciones IP externas, ejecuta el siguiente comando:

gcloud compute addresses create ADDRESS_NAME \
   --region=REGION

Reemplaza lo siguiente:

  • ADDRESS_NAME: Es el nombre que deseas asociar a esta dirección.
  • REGION: Es la región en la que deseas reservar esta dirección. Esta región debe ser la misma que el recurso al que deseas conectar la dirección IP.

    Nota: Debes especificar una región cuando reservas una dirección IP, ya que las reglas de reenvío, que controlan el enrutamiento de tráfico para direcciones IP persistentes, son regionales. Tu dirección IP y el clúster de GKE deben estar en la misma región para que el enrutamiento funcione de forma correcta.

Para reservar direcciones IP internas, ejecuta el siguiente comando:

gcloud compute addresses create ADDRESS_NAME \
    --region REGION
    --subnet SUBNETWORK \
    --addresses IP_ADDRESS

Reemplaza lo siguiente:

  • ADDRESS_NAME: Son los nombres de una o más direcciones que deseas reservar. En el caso de varias direcciones, especifica todas las direcciones como una lista, separadas por espacios. Por ejemplo, example-address-1 example-address-2 example-address-3
  • REGION: Es la región para esta solicitud.
  • SUBNETWORK: Es la subred para esta dirección IPv4 interna.

Para garantizar que el tráfico se enrute de forma correcta dentro de tu red privada, las direcciones IP internas deben pertenecer a una subred designada.

Para obtener más información sobre las direcciones IP internas y externas, consulta Reserva una dirección IP externa estática y Reserva una dirección IP interna estática.

Paso 2b: Traslada tus propias direcciones IP (BYOIP)

Puedes proporcionar tus propias direcciones IP (BYOIP), en lugar de depender de las direcciones IP proporcionadas por Google. BYOIP es útil si necesitas direcciones IP específicas para tus aplicaciones o si trasladas sistemas existentes a Google Cloud. Si quieres usar BYOIP, Google valida que eres el propietario del rango de direcciones IP y, después de importar las direcciones IP a Google Cloud, puedes asignarlas como las direcciones IP persistentes para los Pods de GKE. Para obtener más información, consulta Usa tus propias direcciones IP.

Paso 3: Crea objetos Gateway

Los objetos de puerta de enlace contienen las direcciones IP y definen qué Pods son aptos para usarlas. Para controlar cómo se asignan las direcciones IP persistentes a tus Pods de GKE, usarás objetos Gateway.

  1. Crea un objeto Gateway de Kubernetes de la clase adecuada:
    • gke-persistent-regional-external-managed para direcciones IP externas (públicas).
    • gke-persistent-regional-internal-managed para direcciones IP internas (solo de Google Cloud).
  2. Dentro de la sección de direcciones de la puerta de enlace, enumera las direcciones IP persistentes (proporcionadas por Google o BYOIP) que administra esta puerta de enlace.
  3. Usa la sección Listeners para determinar qué Pods (y sus objetos GKEIPRoute asociados) pueden usar las direcciones IP de la puerta de enlace. Listeners actúa como un filtro según el espacio de nombres de GKEIPRoute en el que existe un objeto GKEIPRoute.

    Puedes elegir entre las siguientes opciones de selección de espacios de nombres de Kubernetes:

    • Todos los espacios de nombres: cualquier GKEIPRoute en el clúster.
    • Selector: GKEIPRoute en los espacios de nombres de GKEIPRoute que coinciden con una etiqueta específica.
    • Mismo espacio de nombres: Solo GKEIPRoutes dentro del mismo espacio de nombres de GKEIPRoute que la puerta de enlace.

En el siguiente ejemplo, se proporciona acceso de todo el clúster a direcciones IP persistentes externas, lo que permite que cualquier Pod las use.

Guarda el siguiente manifiesto de muestra como allowed-pod-ips.yaml:

kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  namespace: default
  name: allowed-pod-ips
spec:
  gatewayClassName: gke-persistent-regional-external-managed

  listeners:
    - name: default
      port: 443
      protocol: none
      allowedRoutes:
        namespaces:
          from: All

  addresses:
    - value: "34.123.10.1/32"
      type: "gke.networking.io/cidr"
    - value: "34.123.10.2/32"
      type: "gke.networking.io/cidr"

Donde:

  • addresses: Enumera todas las direcciones IP cuyos permisos administran la puerta de enlace específica.
  • listeners: Se usa para identificar los espacios de nombres desde los que los objetos GKEIPRoute pueden hacer referencia a esta puerta de enlace.

Aplica el manifiesto al clúster:

kubectl apply -f allowed-pod-ips.yaml

Paso 4: Crea o identifica cargas de trabajo con redes adicionales para direcciones IP persistentes

Configura Pods de varias redes y crea objetos de red que denoten redes a las que pertenece la dirección IP persistente.

Paso 5: Crea el objeto GKEIPRoute para las cargas de trabajo seleccionadas

Para asignar una dirección IP persistente a un Pod seleccionado, crea un objeto GKEIPRoute.

Guarda el siguiente manifiesto de muestra como my-ip-route.yaml:

kind: GKEIPRoute
apiVersion: networking.gke.io/v1
metadata:
  namespace: default
  name: my-ip-route
spec:
  parentRefs:
  - name: allowed-pod-ips
    namespace: default
  addresses:
  - value: "34.123.10.1/32"
    type: "gke.networking.io/cidr"
  network: blue-network
  reactionMode: ReadyCondition
  podSelector: # Only one pod is selected.
    matchLabels:
      component: proxy

Donde:

  • parentRefs: apunta a la puerta de enlace desde la que se usan las direcciones IP persistentes. Este campo es inmutable.
  • addresses: Enumera todas las direcciones IP persistentes que se enrutan al Pod identificado con podSelector. Este campo es mutable. Para IPv4, solo se admiten direcciones /32.
  • podSelector: Especifica etiquetas que identifican el Pod al que se enrutan las direcciones IP persistentes. Este campo es mutable y se aplica al mismo espacio de nombres en el que se coloca GKEIPRoute. Si seleccionas varios Pods, se tienen en cuenta dos factores adicionales: la hora de creación del Pod (GKE elige el más reciente) y la configuración del campo reactionMode.
  • reactionMode: especifica cómo se comporta esta función cuando se crea o borra un Pod específico (seleccionado por podSelector). Este campo es opcional y el valor predeterminado es ReadyCondition. El campo ReadyCondition es inmutable. Puedes configurar reactionMode para controlar cómo actúa la función cuando se crean, borran o actualizan Pods.
  • network: apunta a la interfaz de red en un Pod al que se enrutan las direcciones IP persistentes. Este campo es inmutable.

Aplica el manifiesto al clúster:

kubectl apply -f my-ip-route.yaml

Asigna direcciones IP persistentes a los Pods de StatefulSet

Para asignar una dirección IP persistente a un Pod específico dentro de un StatefulSet, usa el nombre de host predecible del Pod y el etiquetado automático de Kubernetes, como se muestra en el siguiente ejemplo:

Guarda el siguiente manifiesto de muestra como my-pod-ips.yaml:

kind: GKEIPRoute
apiVersion: networking.gke.io/v1
metadata:
  namespace: proxy-ss-ns
  name: my-pod-ips
spec:
  parentRefs:
  - name: allowed-pod-ips
    namespace: default
  addresses:
  - value: "34.123.10.1/32"
    type: "gke.networking.io/cidr"
  - value: "34.123.10.2/32"
    type: "gke.networking.io/cidr"
  network: blue-network
  reactionMode: ReadyCondition
  podSelector:
    matchLabels:
      statefulset.kubernetes.io/pod-name: proxy-ss-1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: proxy-ss-ns
  name: proxy-ss
spec:
  selector:
    matchLabels:
      component: proxy
  serviceName: "proxy"
  replicas: 3
  template:
    metadata:
      annotations:
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: '[{"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"blue-network"}]'
      labels:
        component: proxy
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Aplica el manifiesto al clúster (asegúrate de tener una red llamada “blue-network”):

kubectl apply -f my-pod-ips.yaml

Asigna direcciones IP persistentes a los Pods de implementación

Para asignar una dirección IP persistente al Pod más reciente en una implementación, aplica un GKEIPRoute con la siguiente configuración:

Guarda el siguiente manifiesto de muestra como my-pod-ips.yaml:

kind: GKEIPRoute
apiVersion: networking.gke.io/v1
metadata:
  namespace: proxy-deploy-ns
  name: my-pod-ips
spec:
  parentRefs:
  - name: allowed-pod-ips
    namespace: default
  addresses:
  - value: "34.123.10.1/32"
    type: "gke.networking.io/cidr"
  - value: "34.123.10.2/32"
    type: "gke.networking.io/cidr"
  network: blue-network
  reactionMode: ReadyCondition
  podSelector:
    matchLabels:
      component: proxy
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: proxy-deploy-ns
  name: proxy-deploy
spec:
  selector:
    matchLabels:
      component: proxy
  replicas: 4 # Latest Pod is used
  template:
    metadata:
      annotations:
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: '[{"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"blue-network"}]'
      labels:
        component: proxy
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Aplica el manifiesto al clúster (asegúrate de tener una red llamada “blue-network”):

kubectl apply -f my-ip-route.yaml

Paso 6: Usa direcciones IP persistentes dentro del Pod

Asignar una dirección IP persistente a un Pod de GKE mediante un GKEIPRoute no hace que la aplicación pueda usar de forma automática las direcciones IP. Las direcciones IP persistentes se manejan a nivel de enrutamiento de red, pero la configuración predeterminada del Pod no lo tendrá en cuenta. Debes establecer la configuración de tu aplicación para que reconozca y use la dirección dentro del Pod. Para lograrlo, tu Pod requerirá permisos de privilegios.

Para configurar tu aplicación, considera las siguientes opciones:

  1. net.ipv4.ip_nonlocal_bind: Modifica una configuración del sistema para permitir que tu aplicación use direcciones IP no asignadas directamente a su interfaz.
  2. ip address add: Usa este comando en la lógica de tu aplicación para agregar manualmente la dirección IP persistente a una interfaz.
  3. Sockets sin procesar: Para obtener aún más control, la aplicación puede interactuar directamente con la pila de red (avanzado).
  4. Pila de direcciones IP del espacio de usuario: en casos especializados, se puede ejecutar una aplicación distinta dentro del Pod para administrar la dirección IP (muy avanzada).

Personaliza el comportamiento de las direcciones IP persistentes durante los cambios de Pod

En esta sección, se describe cómo se comporta la dirección IP persistente para el Pod de GKE cuando se crea o borra el Pod objetivo. El controlador de GKE supervisa tus Pods y la configuración de GKEIPRoute. Cuando detecta que ocurre una actualización, reasigna la dirección IP persistente de forma automática a un Pod adecuado según el reactionMode elegido.

Comprende cómo la función de dirección IP persistente controla de forma automática los cambios del Pod y las opciones de configuración disponibles para ti:

  • Decide entre ReadyCondition o Exists dentro del campo reactionMode de tu Configuración de GKEIPRoute. Considera las necesidades de tu aplicación con respecto a la rapidez con la que se asigna la dirección IP en comparación con los requisitos de preparación estrictos.
  • Si usas ReadyCondition para garantizar la preparación, asegúrate de que tus Pods hayan implementado de forma correcta sondeos de preparación de Kubernetes. De lo contrario, es posible que la dirección IP persistente no funcione según lo previsto.
  • Te recomendamos supervisar el estado de los Pods y el campo Conditions del objeto GKEIPRoute para asegurarte de que el sistema funcione de forma correcta. El estado true de la condición Ready indica que el sistema funciona de forma correcta.

Soluciona problemas de comunicación con direcciones IP persistentes para Pods

En esta sección, se muestra cómo resolver problemas relacionados con las direcciones IP persistentes para Pods.

NoPodsFound cuando no se encontraron Pods que coincidan

Síntoma

El objeto GKEIPRoute especifica un podSelector (un conjunto de etiquetas) para identificar qué Pods están asociados con la dirección IP persistente. El estado NoPodsFound indica que no hay Pods dentro de los espacios de nombres GKEIPRoute's de destino que tengan las etiquetas coincidentes.

Causas posibles

  • Etiquetas incorrectas: el Pod con el que deseas usar la dirección IP persistente podría tener las etiquetas incorrectas o ninguna.
  • No existen Pods: Si reactionMode == Exists, verifica si el Pod se asigna a un nodo mediante la verificación del campo pod.Spec.nodeName. Es posible que no haya ningún Pod en ejecución en el espacio de nombres GKEIPRoute's que coincida con el selector.
  • Pod no listo: Si reactionMode == ReadyCondition, verifica si el estado del Pod es READY. Incluso si existe un Pod coincidente, si no está en un estado Ready, no puede entregar tráfico y, por lo tanto, no se selecciona.

Solución

  1. Verifica tus etiquetas: Vuelve a verificar que las etiquetas del podSelector de GKEIPRoute's coincidan con las etiquetas que aplicaste al Pod deseado.
  2. Verifica la existencia del Pod: Asegúrate de que exista un Pod con las etiquetas correctas en los espacios de nombres GKEIPRoute's que especifica el Listeners de la puerta de enlace. Si reactionMode == Exists, verifica si el Pod está asignado a un nodo mediante la revisión del campo pod.Spec.nodeName.
  3. Confirma la preparación del Pod: Si reactionMode == ReadyCondition, verifica si el estado del Pod es READY. Asegúrate de que el Pod esté en el estado Ready mediante el siguiente comando:

    kubectl get pods -n <namespace>
    

    Los Pods en otros estados (por ejemplo, “Pending” o “Error”) no están seleccionados.

  4. Configura tus Pods para que respondan en la dirección IP persistente asignada.

Mutated cuando se encontró un Pod coincidente y la programación de direcciones IP persistentes está en curso

Síntoma

El estado GKEIPRoute muestra “Mutado”, lo que indica que la configuración de la dirección IP persistente para un Pod coincidente está en curso.

Posible causa:

Puedes esperar el estado “Mutado” durante la configuración mientras el sistema configura la ruta de datos de GKE y los recursos de Google Cloud para la dirección IP persistente.

Resolución:

  1. Espera y vuelve a intentar: En la mayoría de los casos, el proceso de configuración se completa de forma automática en un período corto. Verifica el estado después de esperar. Cambiará a Ready cuando se complete de forma correcta.
  2. Investiga más a fondo (si es necesario): Si el estado "Mutated" persiste por un período prolongado, esto podría indicar un error de configuración. Examina las otras condiciones de estado en tu GKEIPRoute:
    • Aceptado: Indica si tu configuración de GKEIPRoute es válida.
    • DPV2Ready: indica si la ruta de datos en el nodo está programada de forma correcta.
    • GCPReady: Indica si los recursos de Google Cloud están configurados como se espera.

Busca mensajes de error dentro de estas condiciones para ayudar a solucionar el problema.

¿Qué sigue?