Configura 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 ip-masq-agent. Si deseas obtener más información sobre el enmascaramiento de IP en modo Autopilot de GKE, consulta Usa la política de NAT de salida para configurar el enmascaramiento de IP en clústeres de Autopilot.

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.

Comprobar el estado del ip-masq-agent

En esta sección se muestra cómo realizar las siguientes acciones:

  • Determinar si tu clúster tiene un DaemonSet de ip-masq-agent.
  • Verifica el recurso ConfigMap ip-masq-agent.

Comprobar el DaemonSet del ip-masq-agent

Para verificar si tu clúster ejecuta el DaemonSet ip-masq-agent, usa Google Cloud CLI o la consola de Google Cloud.

gcloud

  1. Obtén las credenciales para su clúster.

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Reemplaza CLUSTER_NAME por el nombre del clúster.

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

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

    Si el DaemonSet ip-masq-agent existe, el resultado es 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 es similar al siguiente:

    Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
    

Console

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

    Ir a Cargas de trabajo

  2. En Filtro, 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: Es el nombre de tu clúster.

    Si existe el DaemonSet ip-masq-agent, puedes ver el registro DaemonSet en la tabla. Si el DaemonSet ip-masq-agent no existe, no se muestran las filas.

Para crear el ConfigMap ip-masq-agent e implementar el DaemonSet de ip-masq-agent, consulta Configura e implementa ip-masq-agent.

Verifica el ConfigMap de ip-masq-agent

Para verificar si tu clúster ejecuta el ConfigMap ip-masq-agent, usa Google Cloud CLI o la consola de Google Cloud.

gcloud

  1. Obtén las credenciales para su clúster.

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Reemplaza CLUSTER_NAME por el nombre del clúster.

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

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

    Si el ConfigMap de ip-masq-agent existe, el resultado es 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 el ConfigMap de ip-masq-agent no existe, el resultado es similar al siguiente:

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

Console

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

    Ir a Configuración

  2. En Filtro, 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: Es el nombre de tu clúster.

    Si existe el ConfigMap de ip-masq-agent, puedes ver el registro ConfigMap en la tabla. Si ConfigMap de ip-masq-agent no existe, no se muestran filas.

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

Implementa y configura ip-masq-agent

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

Crea el ConfigMap de ip-masq-agent

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

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

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

    Reemplaza lo siguiente:

    • CIDR_1 y CIDR_2: Son los rangos de direcciones IP en formato CIDR. Cuando se envían paquetes a estos destinos, tu clúster no enmascara las fuentes de las direcciones IP y conserva las direcciones IP del Pod de origen. Si necesitas más de dos CIDR, agrega más entradas a la lista nonMasqueradeCIDRs con el mismo formato. Como mínimo, la propiedad nonMasqueradeCIDRs debe incluir los rangos de direcciones IP del nodo y el Pod del clúster.

    • SYNC_INTERVAL: Es la cantidad de tiempo después del cual cada Pod de ip-masq-agent verifica el contenido del ConfigMap de ip-masq-agent y escribe cualquier cambio en su archivo /etc/config/ip-masq-agent local. El valor predeterminado es 60.

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

    Configura masqLinkLocal como falso (predeterminado), a menos que necesites habilitar el enmascaramiento para los paquetes enviados a fin de vincular direcciones IPv4 locales. Si deseas obtener más información, consulta Enmascaramiento a destinos de vínculos locales.

  2. Crea el recurso ConfigMap:

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

    Reemplaza LOCAL_CONFIG_FILE_PATH por la ruta de acceso al archivo de configuración que creaste en el paso anterior.

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

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

    El resultado es similar a este:

    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>
    
    

    En esta salida, se incluye el parámetro config con tus cambios de configuración. Ahora puedes implementar el DeamonSet de ip-masq-agent.

Edita un ConfigMap de ip-masq-agent existente

Para modificar el contenido de un ConfigMap de ip-masq-agent existente, 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
    

    Reemplaza lo siguiente:

    • CIDR_1 y CIDR_2: Son los rangos de direcciones IP en formato CIDR. Cuando se envían paquetes a estos destinos, tu clúster no enmascara las fuentes de las direcciones IP y conserva las direcciones IP del Pod de origen. Si necesitas más de dos CIDR, agrega más entradas a la lista nonMasqueradeCIDRs con el mismo formato. Como mínimo, la propiedad nonMasqueradeCIDRs debe incluir los rangos de direcciones IP del nodo y el Pod del clúster.

    • SYNC_INTERVAL: Es la cantidad de tiempo después del cual cada Pod de ip-masq-agent verifica el contenido del ConfigMap de ip-masq-agent y escribe cualquier cambio en su archivo /etc/config/ip-masq-agent local. El valor predeterminado es 60.

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

    Configura masqLinkLocal como falso (predeterminado), a menos que necesites habilitar el enmascaramiento para los paquetes enviados a fin de vincular direcciones IPv4 locales. Si deseas obtener más información, consulta Enmascaramiento a destinos de vínculos locales.

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

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

    El resultado es similar a este:

    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>
    

    En esta salida, se incluye el parámetro config, que coincide con el valor de configuración del archivo que creaste.

Implementa el DaemonSet de ip-masq-agent

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

  1. Guarda el siguiente manifiesto como un 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.11.0-gke.23@sha256:f50757332ee45c0fb9f5856552a3ed16548c1de3c33c4e520a02d22e30af96ae
            args:
            # 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"

    En este manifiesto, se crea un volumen llamado config-volume que se activa según lo especificado por el volumeMount del contenedor.

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

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

    • El nombre del ConfigMap debe coincidir con el nombre del configMap al que se hace referencia en el volumen config-volume en el Pod.

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

    • Pods del DaemonSet leídos desde el archivo ip-masq-agent El contenido del archivo ip-masq-agent es el valor de la clave config en el ConfigMap.

    • Si usas rangos de IP reservados sin enmascarar de forma predeterminada, quita el comentario de la línea - --nomasq-all-reserved-ranges en la sección arg.

  2. Implementa el DaemonSet:

    kubectl apply -f LOCAL_FILE_PATH
    

    Reemplaza LOCAL_FILE_PATH por la ruta de acceso al archivo que creaste en el paso anterior.

Puedes actualizar de forma manual el DaemonSet ip-masq-agent que creaste. Para obtener más información, consulta Actualiza un DaemonSet.

Borra ip-masq-agent

En esta sección, se muestra cómo borrar el DaemonSet de ip-masq-agent y el ConfigMap de ip-masq-agent. Si borras ip-masq-agent, no se revertirá la configuración de enmascaramiento de IP existente en los nodos.

Borra el DaemonSet de ip-masq-agent

Si creaste el DaemonSet de ip-masq-agent de forma manual, puedes borrarlo si ejecutas el siguiente comando:

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

Borra el ConfigMap de ip-masq-agent

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

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

Soluciona problemas

En los siguientes pasos, se proporciona información para la solución de problemas:

  • Confirma el estado de ip-masq-agent. Si no se define el ConfigMap, el tráfico a todos los destinos predeterminados no se enmascara y conserva la dirección IP del Pod. El tráfico a otros destinos conserva la dirección IP del nodo.
  • Verifica si la cadena de IP-MASQ se propagó de forma correcta en las tablas de NAT IP mediante la ejecución del comando sudo iptables -t nat -L IP-MASQ en el nodo afectado. Si el nonMasqueradeCIDRs definido en el ConfigMap no aparece en las tablas de NAT IP, verifica que no haya errores tipográficos en el archivo de configuración que se usó para crear el ConfigMap.
  • Confirma que el destino al que intenta llegar el Pod se incluye en nonMasqueradeCIDRs en el ConfigMap. Si el destino no está en nonMasqueradeCIDRs, el tráfico conserva la dirección IP del nodo.
  • Confirma que el destino permita los rangos de direcciones IP del nodo y del Pod.
  • Si no se puede acceder al tráfico desde el nodo o el Pod, ejecuta una prueba de conectividad.

¿Qué sigue?