Agente de enmascaramiento de IP

En esta página, se explican el funcionamiento de masquerading de IP en GKE y las opciones de configuración para el agente de enmascaramiento de IP.

Descripción general

El enmascaramiento de IP es una forma de traducción de direcciones de red (NAT) que se usa para realizar traducciones de direcciones IP de varios a uno. Esto permite que varios clientes accedan a un destino con una sola dirección IP. Un clúster de GKE usa el enmascaramiento de IP para que los destinos fuera del clúster solo reciban paquetes de direcciones IP de nodo en lugar de direcciones IP de pod. Esto es útil en entornos en los que se espera recibir solo paquetes de direcciones IP de nodo.

En las siguientes secciones se describe cómo configurar masquerading de IP en tu clúster de GKE.

Antes de comenzar

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

Establece la configuración de gcloud predeterminada mediante uno de los siguientes métodos:

  • Usa gcloud init si deseas ver una explicación sobre cómo configurar parámetros predeterminados.
  • Usa gcloud config para establecer el ID, la zona y la región del proyecto de manera individual.

Usa gcloud init

Si recibes el error One of [--zone, --region] must be supplied: Please specify location, completa esta sección.

  1. Ejecuta gcloud init y sigue las instrucciones:

    gcloud init

    Si usas SSH en un servidor remoto, usa la marca --console-only para evitar que el comando abra un navegador:

    gcloud init --console-only
  2. Sigue las instrucciones a fin de autorizar a gcloud para que use tu cuenta de Google Cloud.
  3. Crea una configuración nueva o selecciona una existente.
  4. Elige un proyecto de Google Cloud.
  5. Elige una zona predeterminada de Compute Engine.

Usa gcloud config

  • Establece tu ID del proyecto predeterminado:
    gcloud config set project project-id
  • Si trabajas con clústeres zonales, establece tu zona de procesamiento predeterminada:
    gcloud config set compute/zone compute-zone
  • Si trabajas con clústeres regionales, establece tu región de procesamiento predeterminada:
    gcloud config set compute/region compute-region
  • Actualiza gcloud a la versión más reciente:
    gcloud components update

Enmascaramiento en GKE

GKE usa reglas iptables, junto con el DaemonSet de ip-masq-agent, para cambiar la dirección IP de origen de los paquetes que se envían desde los pods a ciertos destinos. Cuando un pod envía un paquete a una dirección IP de destino en un rango de enmascaramiento especificado, la dirección IP del nodo se usa como dirección de origen del paquete (en lugar de la dirección IP del pod).

GKE realiza masquerading de IP para todos los destinos excepto:

  • Si ip-masq-agent está instalado en su clúster y definiste tu propio nonMasqueradeCIDRs en el ConfigMap de ip-masq-agent, entonces GKE conserva las direcciones IP de origen como direcciones IP de Pod para los paquetes enviados a los destinos especificados en nonMasqueradeCIDRs.

  • Si ip-masq-agent no está instalado o no se especifica ningún CIDR en nonMasqueradeCIDRs, entonces GKE conserva las direcciones IP de origen de los paquetes que se enviaron a un conjunto de destinos predeterminados sin enmascarar. Estos destinos predeterminados dependen de la versión de GKE y el tipo de imagen de nodo.

Hay más información disponible en la Guía del usuario del agente de enmascaramiento de IP en la documentación de Kubernetes.

Cuando se incluye ip-masq-agent

El DaemonSet ip-masq-agent se instala de forma automática como un complemento con el argumento --nomasq-all-reserved-ranges en un clúster de GKE, si una o más de las siguientes afirmaciones es cierta:

  • El clúster tiene una política de red.
  • El rango CIDR del pod no está dentro de 10.0.0.0/8.

Puedes especificar nonMasqueradeCIDRs en el ConfigMap de ip-masq-agent a fin de cambiar los rangos de destino. Si tu clúster no incluye el ip-masq-agent, puedes instalar el ip-masq-agent de forma manual.

Destinos predeterminados sin enmascarar

En la siguiente tabla, se resumen los rangos de destino predeterminados sin enmascarar de GKE en casos en los que nonMasqueradeCIDRs no se especifica en el ConfigMap de ip-masq-agent.

Versiones de GKE Tipo de imagen de nodo Rangos de destino Notas
Todas las versiones Todos los tipos de imagen 169.254.0.0/16
(rango de vínculo local )
Para cambiar este comportamiento, configura masqLinkLocal como True en el ConfigMap de ip-masq-agent.
Versiones anteriores a 1.14 Container-Optimized OS con containerd (cos_containerd)
o ip-masq-agent empezado con el argumento --nomasq-all-reserved-ranges
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
Puedes cambiar este comportamiento si especificas una lista de CIDR en nonMasqueradeCIDRs en el ConfigMap ip-masq-agent.

Consulta los rangos válidos de redes de VPC para obtener información sobre el uso de rangos de direcciones reservados que no son RFC 1918.
Otros tipos de imágenes sin ip-masq-agent habilitado 10.0.0.0/8
Versiones 1.14.1-gke.14, 1.14.2-gke.1 y posteriores Todos los tipos de imagen 10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
100.64.0.0/10
192.0.0.0/24
192.0.2.0/24
192.88.99.0/24
198.18.0.0/15
198.51.100.0/24
203.0.113.0/24
240.0.0.0/4

Verifica las reglas de enmascaramiento en iptables

Establece una conexión SSH a uno de los nodos y ejecuta el siguiente comando:

iptables -t nat -L IP-MASQ

A continuación, se muestra una salida de ejemplo de un clúster que no ejecuta el daemonset ip-masq-agent, con el grupo de nodos de una versión anterior a 1.14 y con una imagen cos_cointainerd (consulta la tabla en la sección anterior para obtener más detalles):

RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

Parámetros del ConfigMap de ip-masq-agent

Las siguientes claves del ConfigMap de ip-masq-agent te permiten especificar rangos de destino sin enmascarar y cambiar el comportamiento de ip-masq-agent. El archivo ConfigMap debe estar escrito en YAML o JSON y debe llamarse config.

  • nonMasqueradeCIDRs: Una lista de strings en notación CIDR en la que se especifican los rangos de direcciones IP de destino para preservar direcciones IP de pods.
  • masqLinkLocal: Un valor booleano que indica si se debe enmascarar el tráfico al prefijo de vínculo local (169.254.0.0/16). El valor predeterminado es false.
  • resyncInterval: Representa la cantidad de tiempo que pasa antes de que ip-masq-agent vuelva a cargar la configuración (mediante la escritura en /etc/config/ip-masq-agent desde el ConfigMap). El formato es Nx, en el que N es un número entero y x es una unidad de tiempo, como s o ms. Si no se especifica, el valor predeterminado es 60 segundos.

Especifica nonMasqueradeCIDRs

El siguiente ConfigMap, config, conserva la dirección de origen para los paquetes enviados a 10.0.0.0/8:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

Para hacer que ip-masq-agent habilite el enmascaramiento de IP en el rango de vínculo local, establece el valor de la clave masqLinkLocal en true en el ConfigMap.

Por ejemplo:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true

Agrega un ConfigMap a tu clúster

Para agregar un ConfigMap a tu clúster, ejecuta el siguiente comando desde la shell o la ventana de la terminal:

kubectl create configmap configmap-name \
  --from-file config \
  --namespace kube-system

En el ejemplo anterior, configmap-name es el nombre que eliges para el recurso ConfigMap, como ip-masq-agent.

Por ejemplo:

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

Una vez completada la sincronización, deberías ver los cambios en iptables:

iptables -t nat -L IP-MASQ
Chain IP-MASQ (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local */
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

Crea un recurso ip-masq-agent de forma manual (opcional)

Es posible que debas crear y configurar ip-masq-agent de forma manual. Para hacerlo, debes implementar un recurso ip-masq-agent en tu clúster.

  1. Guarda de forma local el siguiente manifiesto en un archivo llamado ip-masq-agent.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: gcr.io/google-containers/ip-masq-agent-amd64:v2.4.1
            args:
                - --masq-chain=IP-MASQ
                # To non-masquerade reserved IP ranges by default, uncomment the line below.
                # - --nomasq-all-reserved-ranges
            securityContext:
              privileged: true
            volumeMounts:
              - name: config
                mountPath: /etc/config
          volumes:
            - name: config
              configMap:
                # Note this ConfigMap must be created in the same namespace as the
                # daemon pods - this spec uses kube-system
                name: ip-masq-agent
                optional: true
                items:
                  # The daemon looks for its config in a YAML file at /etc/config/ip-masq-agent
                  - key: config
                    path: ip-masq-agent
          tolerations:
          - effect: NoSchedule
            operator: Exists
          - effect: NoExecute
            operator: Exists
          - key: "CriticalAddonsOnly"
            operator: "Exists"
    
  2. Ejecuta el siguiente comando:

    kubectl apply -f ip-masq-agent.yaml
    

Este debería crear un daemonset con el nombre ip-masq-agent que se ejecute en todos los nodos de tu clúster.

Para configurar la herramienta ip-masq-agent, consulta Configura el agente mediante un ConfigMap.

Restricciones

Los clústeres que ejecutan ip-masq-agent tienen las siguientes restricciones:

  • Si habilitas la visibilidad dentro de los nodos y usas ip-masq-agent configurado con el parámetro nonMasqueradeCIDRs, los nonMasqueradeCIDRs deben incluir el CIDR del pod; de lo contrario, puedes experimentar problemas de conectividad dentro del nodo.

Próximos pasos