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

Masquerading de IP es una forma de traducción de direcciones de red (NAT) que se usa para realizar traducciones de direcciones IP de muchos a uno. Esto permite que varios clientes accedan a un destino con una sola dirección IP. Un clúster de GKE usa masquerading 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 que esperan 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

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de que habilitaste la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de que instalaste el SDK de Cloud.
  • 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

Masquerading 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 de ip-masq-agent se instala de manera automática con el argumento --nomasq-all-reserved-ranges en el clúster de GKE, si se cumplen una o más de las siguientes condiciones:

  • 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-agent-masq 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/12192.168.0.0/16
Puedes cambiar este comportamiento si especificas una lista de CIDR en nonMasqueradeCIDRs en el ConfigMap de ip-masq-agent.
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/12192.168.0.0/16100.64.0.0/10192.0.0.0/24192.0.2.0/24192.88.99.0/24198.18.0.0/15198.51.100.0/24203.0.113.0/24240.0.0.0/4

Ejemplo de resultado iptables:

En el siguiente ejemplo se muestran las reglas de iptables en la tabla NAT, como las mantiene ip-masq-agent:

iptables -t nat -L IP-MASQ
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 . El archivo ConfigMap debe estar escrito en YAML o JSON y debe llamarse config.

  • nonMasqueradeCIDRs: Una lista de strings en notación CIDR que especifica los rangos de direcciones IP de destino para preservar las direcciones IP del pod.
  • masqLinkLocal: Un valor booleano que indica si se debe enmascarar el tráfico al prefijo del vínculo local (169.254.0.0/16). El valor predeterminado es false.
  • resyncInterval: Representa la cantidad de tiempo que transcurre antes de que ip-masq-agent vuelva a cargar su configuración (mediante la escritura a /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 masquerading de IP en el rango de vínculo local, establece el valor de la clave masqLinkLocal en true en 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 comando siguiente desde tu shell o ventana de la terminal:

kubectl create configmap [CONFIGMAP_NAME] \
--from-file config \
--namespace kube-system

En el ejemplo anterior, se ilustra lo siguiente:

  • [CONFIGMAP_NAME] es lo 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.

Primero, guarda lo siguiente en un archivo con nombre ip-masq-agent.yaml de forma local.

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: ip-masq-agent
  namespace: kube-system
spec:
  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"

Luego, ejecuta el comando siguiente:

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 la sección sobre cómo configurar el agente con un ConfigMap.

Próximos pasos