Controlar la comunicación con direcciones IP persistentes


En esta página se muestra cómo implementar direcciones IP persistentes en pods de Google Kubernetes Engine (GKE). Puede controlar la red de pods de GKE con la asignación de direcciones IP persistentes personalizadas. Para obtener más información sobre las direcciones IP persistentes, sus casos prácticos y sus ventajas, consulta Acerca de las direcciones IP persistentes para pods de GKE.

Requisitos

  • GKE 1.31 o una versión posterior.
  • Puedes reservar direcciones IP proporcionadas por Google o utilizar tus propias direcciones IP (BYOIP).
  • Configura tu aplicación que se ejecuta en los pods para que reconozca y use las direcciones IP persistentes asignadas.
  • Las direcciones IP persistentes de los pods de GKE requieren que los clústeres tengan habilitados GKE Dataplane V2 y Gateway API.

Limitaciones

  • Debes configurar tus aplicaciones para que usen las direcciones IP persistentes asignadas. GKE no añade automáticamente la configuración de la dirección IP a las interfaces de red del Pod.
  • Puedes asociar cada dirección IP persistente a un solo Pod a la vez. Cuando hay varios pods disponibles, GKE suele enviar tráfico al pod coincidente más reciente. Sin embargo, GKE solo lo hace si el pod más reciente está en buen estado, lo que significa que el pod tiene el estado de la condición ReadyTrue de forma predeterminada. Puedes configurar este comportamiento y cambiarlo con el ajuste reactionMode en GKEIPRoute.
  • GKE solo admite direcciones IPv4 como direcciones IP persistentes.
  • GKE solo admite varias redes de capa 3 o de tipo de dispositivo.
  • No se admite la alta disponibilidad (HA) con direcciones IP persistentes en casos prácticos que no sean de DPDK.
  • Puedes especificar hasta 16 direcciones IP en un solo GKEIPRoute. Para configurar más direcciones, puedes crear varios objetos GKEIPRoute.

Antes de empezar

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

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Implementar direcciones IP persistentes para pods de GKE

Las direcciones IP persistentes de GKE te permiten asignar una identidad de red estable a tus pods, aunque estos se actualicen o se muevan.

En esta sección se resume el flujo de trabajo para implementar direcciones IP persistentes para pods de GKE:

  1. Crea un clúster: crea un clúster que tenga la API Gateway y GKE Dataplane V2.
  2. Reserva una dirección IP: decide si necesitas una dirección IP externa (accesible públicamente) o interna (solo para Google Cloud) y resérvala. Elige la misma región que tu clúster de GKE.
  3. Crea una pasarela: configura el objeto de pasarela de Kubernetes que contiene tus 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 para direcciones IP persistentes: si usas direcciones IP persistentes en una red adicional, prepara los pods para que usen direcciones IP persistentes habilitando varias interfaces de red y definiendo la red en la que residen las direcciones IP persistentes.
  5. Crea el objeto GKEIPRoute para las cargas de trabajo seleccionadas: configura GKEIPRoute para asignar la dirección IP persistente a un Pod específico. Puede usar etiquetas para orientar los anuncios al pod o los pods adecuados y, opcionalmente, configurar cómo reacciona el enrutamiento a los cambios en los pods.
  6. Configura la detección de aplicaciones: configura tu aplicación en el pod para que use activamente la dirección IP persistente.
  7. Monitorización: haz un seguimiento del estado de tu pasarela y de los GKEIPRoute objetos para asegurarte de que todo funciona correctamente.

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

Paso 1: Crea un clúster de GKE con la API Gateway y GKE Dataplane V2 habilitados

Para habilitar las funciones avanzadas de enrutamiento de red y gestión de direcciones IP necesarias para implementar direcciones IP persistentes en pods de GKE, debes crear un clúster de GKE Dataplane V2 de la siguiente manera:

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=CLUSTER_VERSION \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --gateway-api=standard

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del clúster.
  • CLUSTER_VERSION: la versión del clúster.

Paso 2: Configura direcciones IP persistentes

Para establecer identidades de red fiables para tus pods y configurar direcciones IP persistentes, primero debes adquirir direcciones IP persistentes. Puedes elegir entre reservar direcciones IP proporcionadas por Google o usar las tuyas (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

Haz los cambios siguientes:

  • ADDRESS_NAME: el nombre que quieras asociar a esta dirección.
  • REGION: la región en la que quieres reservar esta dirección. Esta región debe ser la misma que la del pod al que quieras asociar la dirección IP.

    Nota: Debe especificar una región al reservar una dirección IP, ya que las reglas de reenvío, que gestionan el enrutamiento del tráfico de las direcciones IP persistentes, son regionales. Tu dirección IP y tu clúster de GKE deben estar en la misma región para que el enrutamiento funcione correctamente.

Para reservar direcciones IP internas, ejecuta el siguiente comando:

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

Haz los cambios siguientes:

  • ADDRESS_NAME: los nombres de una o varias direcciones que quieras reservar. Si hay varias direcciones, especifícalas todas en una lista separada por espacios. Por ejemplo, ejemplo-direccion-1 ejemplo-direccion-2 ejemplo-direccion-3
  • REGION: la región de esta solicitud.
  • SUBNETWORK: la subred de esta dirección IPv4 interna.

Para que el tráfico se enrute correctamente en tu red privada, las direcciones IP internas deben pertenecer a la subred predeterminada del clúster o a una subred de red adicional.

Para obtener más información sobre las direcciones IP externas e internas o para ver cómo reservar direcciones mediante la consola, consulta Reservar una dirección IP externa estática y Reservar una dirección IP interna estática.

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

Puedes usar tus propias direcciones IP (BYOIP) en lugar de las que proporciona Google. BYOIP es útil si necesitas direcciones IP específicas para tus aplicaciones o si vas a migrar sistemas a Google Cloud. Para usar BYOIP, Google valida que eres el propietario del intervalo de direcciones IP y, después de importar las direcciones IP a Google Cloud, puedes asignarlas como direcciones IP persistentes para los pods de GKE. Para obtener más información, consulta Usar tus propias direcciones IP.

Paso 3: Crea objetos de pasarela

Los objetos de pasarela contienen las direcciones IP y definen qué pods pueden 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 (soloGoogle Cloud).
  2. En la sección de direcciones de la pasarela, enumera las direcciones IP persistentes (proporcionadas por Google o BYOIP) que gestiona esta pasarela.
  3. Usa la sección Listeners para determinar qué pods (y sus objetos GKEIPRoute asociados) pueden usar las direcciones IP de la pasarela. Listeners actúa como filtro en función del espacio de nombres de GKEIPRoute en el que existe un objeto GKEIPRoute.

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

    • Todos los espacios de nombres: cualquier GKEIPRoute del 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 a nivel de clúster a direcciones IP persistentes externas, lo que permite que cualquier pod pueda usarlas.

Guarda el siguiente archivo de manifiesto de ejemplo 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: muestra todas las direcciones IP cuyos permisos gestiona la pasarela específica.
  • Listeners: se usa para identificar los espacios de nombres desde los que los objetos GKEIPRoute pueden hacer referencia a esta pasarela.

Aplica el manifiesto al clúster:

kubectl apply -f allowed-pod-ips.yaml

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

Si tienes previsto usar tus direcciones IP persistentes con pods que requieran conectividad a varias redes, puedes configurar pods de varias redes y crear objetos de red que indiquen las 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 archivo de manifiesto de ejemplo 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: default
  reactionMode: ReadyCondition
  podSelector: # Only one pod is selected.
    matchLabels:
      component: proxy

donde:

  • parentRefs apunta a la pasarela desde la que se usan las direcciones IP persistentes. Este campo no se puede modificar.
  • Addresses: muestra todas las direcciones IP persistentes que se enrutan al pod identificado con podSelector. Este campo se puede modificar. En el caso de IPv4, solo se admiten direcciones /32.
  • podSelector especifica las etiquetas que identifican el pod al que se dirigen 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 el ajuste del campo reactionMode.
  • reactionMode especifica cómo se comporta esta función cuando se crea o se elimina un Pod específico (seleccionado por podSelector). Este campo es opcional y su valor predeterminado es ReadyCondition. El campo ReadyCondition es inmutable. Puedes definir el reactionMode para controlar cómo actúa la función cuando se crean, eliminan o actualizan pods.
  • network: apunta a la interfaz de red de un pod al que se dirigen las direcciones IP persistentes. Este campo es opcional y su valor predeterminado es default. Ten en cuenta que, si usas la red predeterminada, network debe tener el valor default. Si usas redes adicionales, asigna a la red el nombre del objeto de red que hayas creado anteriormente. Este campo no se puede modificar.

Aplica el manifiesto al clúster:

kubectl apply -f my-ip-route.yaml

Asignar direcciones IP persistentes a pods de StatefulSet

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

Guarda el siguiente archivo de manifiesto de ejemplo 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 que tienes una red llamada "blue-network"):

kubectl apply -f my-pod-ips.yaml

Asignar direcciones IP persistentes a pods de implementaciones

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

Guarda el siguiente archivo de manifiesto de ejemplo 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 # point to the right network if you intend to use persistent-ip on additional networks
  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:  <- Remove these lines if the pods are not multi-nic pods
      #   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:

kubectl apply -f my-ip-route.yaml

Asegúrate de que tienes una red llamada "blue-network" si utilizas redes adicionales.

Paso 6: Usar direcciones IP persistentes en el pod

Asignar una dirección IP persistente a un pod de GKE mediante un GKEIPRoute no hace que las direcciones IP sean utilizables automáticamente por tu aplicación. Las direcciones IP persistentes se gestionan a nivel de enrutamiento de red, pero la configuración predeterminada de tu Pod no lo tendrá en cuenta. Debes configurar la aplicación para que reconozca y use la dirección del Pod. Para ello, tu Pod necesitará permisos de privilegio.

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

  • net.ipv4.ip_nonlocal_bind: modifica un ajuste del sistema para permitir que tu aplicación use direcciones IP que no estén asignadas directamente a su interfaz.
  • ip address add: usa este comando en la lógica de tu aplicación para añadir manualmente la dirección IP persistente a una interfaz.
  • Sockets sin formato: para tener aún más control, tu aplicación puede interactuar directamente con la pila de red (opción avanzada).
  • Pila de direcciones IP del espacio de usuario: en casos especializados, una aplicación independiente puede ejecutarse en el Pod para gestionar la dirección IP (muy avanzado).

Paso 7: Habilita ARP para direcciones IP persistentes (solo en la red predeterminada)

Para generar solicitudes y respuestas válidas del protocolo de resolución de direcciones (ARP) y establecer una nueva conexión con un pod mediante una dirección IP persistente en la red predeterminada, debes configurar la variable arp_announce.

Para definir la variable arp_announce, ejecuta el siguiente comando en tu pod:

echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce

donde la variable arp_announce controla cómo se gestionan los anuncios ARP. Si se asigna el valor "2", se asegura que se hagan anuncios ARP para la dirección IP persistente, lo que permite que otros dispositivos de la red conozcan la nueva asociación.

Personalizar el comportamiento de la dirección IP persistente durante los cambios de los pods

En esta sección se describe cómo se comporta la dirección IP persistente de un pod de GKE cuando se crea o se elimina el pod de destino. El controlador de GKE monitoriza tus pods y la configuración de GKEIPRoute. Cuando detecta que se está produciendo una actualización, reasigna automáticamente la dirección IP persistente a un Pod adecuado según la reactionMode que hayas elegido.

Descubre cómo gestiona automáticamente la función de dirección IP persistente los cambios de pod y las opciones de configuración que tienes disponibles:

  • Elige entre ReadyCondition o Exists en el campo reactionMode de tu configuración de GKEIPRoute. Ten en cuenta las necesidades de tu aplicación en cuanto 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 asegurarte de que todo esté listo, comprueba que tus pods hayan implementado correctamente las pruebas de disponibilidad de Kubernetes. De lo contrario, es posible que la dirección IP persistente no funcione correctamente.
  • Le recomendamos que monitorice el estado de sus pods y el campo Conditions del objeto GKEIPRoute para asegurarse de que el sistema funciona correctamente. El estado true de la condición Ready indica que el sistema funciona correctamente.

Solucionar problemas de comunicación con direcciones IP persistentes de pods

En esta sección se explica cómo solucionar problemas relacionados con las direcciones IP persistentes de los pods.

NoPodsFound cuando no se encuentran pods que coincidan

Síntoma

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

Posibles causas

  • Etiquetas incorrectas: es posible que el pod con el que quieres usar la dirección IP persistente tenga etiquetas incorrectas o no tenga ninguna.
  • No hay pods: si reactionMode == Exists, comprueba si el pod se ha asignado a un nodo consultando el campo pod.Spec.nodeName. Puede que no haya ningún pod en el espacio de nombres GKEIPRoute's que coincida con el selector.
  • Pod no está listo: si reactionMode == ReadyCondition, comprueba si el estado del Pod es READY. Aunque exista un Pod que coincida, si no está en un estado Ready , no puede servir tráfico y, por lo tanto, no se selecciona.

Resolución

  1. Comprueba las etiquetas: asegúrate de que las etiquetas de tu GKEIPRoute's podSelector coinciden con las que has aplicado al pod correspondiente.
  2. Verificar la existencia del pod: asegúrate de que existe un pod con las etiquetas correctas en los GKEIPRoute's espacios de nombres especificados por el Listeners de tu gateway. Si el reactionMode == Exists, comprueba si el pod está asignado a un nodo comprobando el campo pod.Spec.nodeName.
  3. Confirma que el Pod está listo: si reactionMode == ReadyCondition, comprueba si el estado del Pod es READY. Asegúrate de que el pod esté en el estado Ready con el siguiente comando:

    kubectl get pods -n <namespace>
    

    Los pods que tengan otros estados (por ejemplo, "Pendiente" o "Error") no se seleccionarán.

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

Mutated cuando se ha encontrado un Pod que coincide y se está programando una dirección IP persistente

Síntoma

El estado GKEIPRoute muestra "Mutated", lo que indica que se está configurando la dirección IP persistente de un pod coincidente.

Causa posible:

Durante la configuración, el estado será "Mutated" (Mutado), ya que el sistema está configurando la ruta de datos de GKE y los recursos de la dirección IP persistente. Google Cloud

Resolución:

  1. Espera y vuelve a intentarlo: en la mayoría de los casos, el proceso de configuración se completa automáticamente en poco tiempo. Comprueba el estado después de esperar. Si se realiza correctamente, cambiará a Ready.
  2. Investiga más a fondo (si es necesario): si el estado "Mutated" persiste durante un periodo prolongado, puede indicar que hay un error de configuración. Consulta las otras condiciones de estado de tu GKEIPRoute:
    • Aceptado: indica si la configuración de GKEIPRoute es válida.
    • DPV2Ready indica si la ruta de datos del nodo se ha programado correctamente.
    • GCPReady indica si los recursos de Google Cloud están configurados como se espera.

Busca mensajes de error en estas condiciones para solucionar el problema.

Siguientes pasos