Configurar un agente de enmascaramiento de IP en clústeres estándar

En esta página se explica cómo configurar los clústeres creados en el modo estándar de Google Kubernetes Engine (GKE) para realizar el enmascaramiento de IP con el ip-masq-agent. Para obtener más información sobre el enmascaramiento de IP en el modo Autopilot de GKE, consulta Usar la política NAT de salida para configurar el enmascaramiento de IP en clústeres de Autopilot.

Antes de empezar

Antes de empezar, asegúrate de que has 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.

Comprobar el estado de ip-masq-agent

En esta sección se explica cómo hacer lo siguiente:

  • Determina si tu clúster tiene un ip-masq-agent DaemonSet.
  • Consulta el recurso ip-masq-agent ConfigMap.

Consulta el ip-masq-agent DaemonSet

Para comprobar si tu clúster está ejecutando el ip-masq-agent DaemonSet, usa la CLI de Google Cloud o la consola de Google Cloud .

gcloud

  1. Obtén las credenciales de tu clúster:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Sustituye CLUSTER_NAME por el nombre de tu clúster.

  2. Busca ip-masq-agent en el espacio de nombres kube-system:

    kubectl get daemonsets/ip-masq-agent -n kube-system
    

    Si el ip-masq-agent DaemonSet existe, el resultado será similar al siguiente:

    NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    ip-masq-agent   3         3         3       3            3           <none>          13d
    

    Si el DaemonSet ip-masq-agent no existe, el resultado será similar al siguiente:

    Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
    
  3. Comprueba si el ip-masq-agent DaemonSet está ejecutando la versión más reciente:

    kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'
    

    Este comando debe devolver la misma imagen de contenedor que se especifica en Desplegar el DaemonSet ip-masq-agent.

Consola

  1. Ve a la página Cargas de trabajo de la Google Cloud consola.

    Ir a Cargas de trabajo

  2. En Filtrar, haz lo siguiente:

    1. Haz clic en para borrar el filtro Es objeto del sistema: falso.
    2. Filtra las siguientes propiedades:
      • Nombre: ip-masq-agent.
      • Clúster: el nombre de tu clúster.

    Si existe un DaemonSet ip-masq-agent, puedes ver el registro de DaemonSet en la tabla. Si no existe ip-masq-agent DaemonSet, no se mostrará ninguna fila.

Para crear el ip-masq-agent ConfigMap e implementar el ip-masq-agent DaemonSet, consulta Configurar e implementar el ip-masq-agent.

Comprobar el ConfigMap ip-masq-agent

Para comprobar si tu clúster está ejecutando el ip-masq-agentConfigMap, usa la CLI de Google Cloud o la consola. Google Cloud

gcloud

  1. Obtén las credenciales de tu clúster:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Sustituye CLUSTER_NAME por el nombre de tu clúster.

  2. Describe el ConfigMap ip-masq-agent en el espacio de nombres kube-system:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    Si existe el ConfigMap ip-masq-agent, el resultado será similar al siguiente:

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    
    Events:  <none>
    

    Si no existe el ConfigMap ip-masq-agent, el resultado será similar al siguiente:

    Error from server (NotFound): configmaps "ip-masq-agent" not found
    

Consola

  1. Ve a la página Configuración de la Google Cloud consola.

    Ir a Configuración

  2. En Filtrar, haz lo siguiente:

    1. Haz clic en para borrar el filtro Es objeto del sistema: falso.
    2. Filtra las siguientes propiedades:
      • Nombre: ip-masq-agent.
      • Clúster: el nombre de tu clúster.

    Si existe un ConfigMap ip-masq-agent, puedes ver el registro de ConfigMap en la tabla. Si no existe ip-masq-agent ConfigMap, no se mostrará ninguna fila.

Si el clúster ya tiene el ConfigMap ip-masq-agent, puedes configurarlo e implementarlo.

Configurar y desplegar ip-masq-agent

En esta sección se explica cómo crear o editar el ip-masq-agent ConfigMap y cómo desplegar o eliminar el ip-masq-agent DaemonSet. Para determinar qué tareas debes realizar, primero debes determinar si tu clúster ya tiene el ConfigMap ip-masq-agent y el DaemonSet ip-masq-agent.

Crear el ConfigMap ip-masq-agent

En los siguientes pasos se muestra cómo crear el ip-masq-agent ConfigMap. Si tu clúster ya tiene el ConfigMap ip-masq-agent, edita un ConfigMap ip-masq-agent ya creado.

  1. Crea un archivo de configuración con la siguiente plantilla y guárdalo localmente. Puedes usar el nombre que quieras para la copia local de este archivo de configuración.

    nonMasqueradeCIDRs:
      - CIDR_1
      - CIDR_2
    masqLinkLocal: false
    resyncInterval: SYNC_INTERVALUNIT_OF_TIME
    

    Haz los cambios siguientes:

    • CIDR_1 y CIDR_2: los intervalos de direcciones IP en formato CIDR. Cuando se envían paquetes a estos destinos, tu clúster no enmascara las fuentes de direcciones IP y conserva las direcciones IP de los pods de origen. Si necesitas más de dos CIDRs, añade más entradas a la lista nonMasqueradeCIDRssiguiendo el mismo formato. Como mínimo, la propiedad nonMasqueradeCIDRs debe incluir los intervalos de direcciones IP de los nodos y los pods de tu clúster.

    • SYNC_INTERVAL: el tiempo que transcurre hasta que cada ip-masq-agent pod comprueba el contenido de ip-masq-agent ConfigMap y escribe los cambios en su archivo /etc/config/ip-masq-agent local. El valor predeterminado es 60.

    • UNIT_OF_TIME: la unidad de tiempo de resyncInterval. Los valores válidos son s (segundos) o ms (milisegundos). El valor predeterminado es s.

    Asigna el valor "false" a masqLinkLocal (el valor predeterminado) a menos que necesites habilitar el enmascaramiento de los paquetes enviados a direcciones IPv4 locales de enlace. Para obtener más información, consulta Suplantación de identidad para destinos locales de enlace.

  2. Crea el recurso ConfigMap:

    kubectl create configmap ip-masq-agent \
       --namespace=kube-system \
       --from-file=config=LOCAL_CONFIG_FILE_PATH
    

    Sustituye LOCAL_CONFIG_FILE_PATH por la ruta del archivo de configuración que has creado en el paso anterior.

  3. Describe el ConfigMap ip-masq-agent en el espacio de nombres kube-system:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    El resultado debería ser similar al siguiente:

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    Events:  <none>
    
    

    Este resultado incluye el parámetro config con los cambios de configuración. Ahora puedes desplegar el ip-masq-agent DaemonSet.

Editar un ip-masq-agent ConfigMap

Para modificar el contenido de un ip-masq-agent ConfigMap, sigue estos pasos:

  1. Abre el ConfigMap en un editor de texto:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Edita el contenido del archivo ConfigMap:

    apiVersion: v1
    data:
      config: |
        nonMasqueradeCIDRs:
          - CIDR_1
          - CIDR_2
        masqLinkLocal: false
        resyncInterval: SYNC_INTERVALUNIT_OF_TIME
    kind: ConfigMap
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    

    Haz los cambios siguientes:

    • CIDR_1 y CIDR_2: los intervalos de direcciones IP en formato CIDR. Cuando se envían paquetes a estos destinos, tu clúster no enmascara las fuentes de direcciones IP y conserva las direcciones IP de los pods de origen. Si necesitas más de dos CIDRs, añade más entradas a la lista nonMasqueradeCIDRs siguiendo el mismo formato. Como mínimo, la propiedad nonMasqueradeCIDRs debe incluir los intervalos de direcciones IP de los nodos y los pods de tu clúster.

    • SYNC_INTERVAL: el tiempo que transcurre hasta que cada ip-masq-agent pod comprueba el contenido de ip-masq-agent ConfigMap y escribe los cambios en su archivo /etc/config/ip-masq-agent local. El valor predeterminado es 60.

    • UNIT_OF_TIME: la unidad de tiempo de resyncInterval. Los valores válidos son s (segundos) o ms (milisegundos). El valor predeterminado es s.

    Asigna el valor "false" a masqLinkLocal (el valor predeterminado) a menos que necesites habilitar el enmascaramiento de los paquetes enviados a direcciones IPv4 locales de enlace. Para obtener más información, consulta Suplantación de identidad para destinos locales de enlace.

  3. Describe el ConfigMap ip-masq-agent en el espacio de nombres kube-system:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    El resultado debería ser similar al siguiente:

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    
    Events:  <none>
    

    Esta salida incluye el parámetro config, que coincide con el valor de configuración del archivo que has creado.

Desplegar el DaemonSet ip-masq-agent

Después de crear o editar tu ip-masq-agent ConfigMap, implementa el ip-masq-agent DaemonSet.

  1. Guarda el siguiente manifiesto como archivo YAML:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          k8s-app: ip-masq-agent
      template:
        metadata:
          labels:
            k8s-app: ip-masq-agent
        spec:
          hostNetwork: true
          containers:
          - name: ip-masq-agent
            image: gke.gcr.io/ip-masq-agent:v2.12.3-gke.4@sha256:b5db41ddaf863b660da330322714f668101482b528829c50c53229d901d11af5
            args:
            - --v=2
            - --logtostderr=false
            - --log_file=/dev/stdout
            - --log_file_max_size=0
            # The masq-chain must be IP-MASQ
            - --masq-chain=IP-MASQ
            # To non-masquerade reserved IP ranges by default,
            # uncomment the following line.
            # - --nomasq-all-reserved-ranges
            # Must be set to false when using Dataplane V2.
            - --random-fully=false
            securityContext:
              privileged: false
              capabilities:
                drop: ["ALL"]
                add: ["NET_ADMIN", "NET_RAW"]
              allowPrivilegeEscalation: false
              seccompProfile:
                type: RuntimeDefault
            volumeMounts:
            - name: config-volume
              mountPath: /etc/config
          volumes:
          - name: config-volume
            configMap:
              name: ip-masq-agent
              optional: true
              items:
              - key: config
                path: ip-masq-agent
          tolerations:
          - effect: NoSchedule
            operator: Exists
          - effect: NoExecute
            operator: Exists
          - key: "CriticalAddonsOnly"
            operator: "Exists"

    Este manifiesto crea un volumen llamado config-volume que se monta según lo especificado por el volumen de montaje del contenedor.

    Si necesitas editar este archivo de manifiesto, ten en cuenta las siguientes condiciones:

    • El nombre del volumen puede ser cualquiera, pero debe coincidir con el nombre del contenedor volumeMount.

    • El nombre de ConfigMap debe coincidir con el nombre del configMap referenciado en el config-volume volumen del pod.

    • El nombre de la cadena (--masq-chain) debe ser IP-MASQ. De lo contrario, GKE no anula las reglas de enmascaramiento predeterminadas.

    • Los pods de DaemonSet leen del archivo ip-masq-agent. El contenido del archivo ip-masq-agent es el valor de la clave config en ConfigMap.

    • Si usas intervalos de IP reservadas que no son de enmascaramiento de forma predeterminada, quita el comentario de la línea - --nomasq-all-reserved-ranges en la sección arg.

  2. Despliega el DaemonSet:

    kubectl apply -f LOCAL_FILE_PATH
    

    Sustituye LOCAL_FILE_PATH por la ruta al archivo que has creado en el paso anterior.

Puedes actualizar manualmente el ip-masq-agent DaemonSet que has creado. Para obtener más información, consulta Actualizar un DaemonSet.

Eliminar la ip-masq-agent

En esta sección se explica cómo eliminar el ip-masq-agent DaemonSet y el ip-masq-agent ConfigMap. Si eliminas el ip-masq-agent, no se revierten los ajustes de enmascaramiento de IP de los nodos.

Eliminar el DaemonSet ip-masq-agent

Si has creado manualmente el DaemonSet ip-masq-agent, puedes eliminarlo ejecutando el siguiente comando:

kubectl delete daemonsets ip-masq-agent -n kube-system

Eliminar el ConfigMap ip-masq-agent

Para eliminar por completo el ip-masq-agent ConfigMap, ejecuta el siguiente comando:

kubectl delete configmap ip-masq-agent -n kube-system

Solución de problemas

En las siguientes secciones se ofrecen consejos para solucionar problemas.

Solucionar problemas generales

Sigue estos pasos para diagnosticar problemas con el enmascaramiento de direcciones IP:

Problema: la dirección IP del pod cambia a la dirección IP del nodo

Cuando usas un agente de enmascaramiento de IP, es posible que la dirección IP de origen del pod use inesperadamente la dirección IP del nodo cuando tus pods se comuniquen con destinos externos.

El problema se debe a que falta una lista de traducción de direcciones de red de origen (SNAT) personalizada o a que está incompleta. Cuando usas un agente de enmascaramiento de IP, se usa el SNAT predeterminado del clúster si falta el ConfigMap o no contiene una lista nonMasqueradeCIDRs. Cuando un paquete sale de un pod, la SNAT predeterminada cambia la dirección IP de origen de la dirección IP del pod a la dirección IP interna del nodo. Para obtener más información sobre SNAT, consulta Agente de enmascaramiento de IP.

Para solucionar el problema, configura una lista SNAT personalizada definiendo una nonMasqueradeCIDRs lista en el ip-masq-agent ConfigMap:

  1. Abre el ip-masq-agentConfigMap:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Revisa la lista nonMasqueradeCIDRs en ConfigMap. La lista nonMasqueradeCIDRs debe estar presente y completa. Por ejemplo:

    ...
    nonMasqueradeCIDRs:
      - 35.100.0.0/16
    ...
    
  3. Si falta alguna entrada en la lista o está incompleta, añada o modifique la nonMasqueradeCIDRs lista para incluir los intervalos de IPs de destino para los que quiera conservar las IPs de los pods de origen. Esta lista también debe incluir las direcciones que quieras usar con Cloud NAT.

    Si no quieres que ningún tráfico externo use SNAT, asigna el valor 0.0.0.0/0 al campo nonMasqueradeCIDRs. Por ejemplo:

    ...
    nonMasqueradeCIDRs:
      - 0.0.0.0/0
    ...
    

    Cuando el tráfico no usa SNAT, todos los paquetes enviados desde los pods conservan la dirección IP del pod como dirección IP de origen, independientemente del destino.

  4. Comprueba la dirección IP de origen de los paquetes salientes de tus pods. Para comprobar esta dirección, haz una captura de paquetes. Si no es posible, puedes consultar la dirección IP del nodo, que debería ser la dirección IP de origen de los paquetes salientes sujetos a SNAT, con el siguiente comando:

    kubectl get nodes -o wide
    

Siguientes pasos