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:
- 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 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.
-
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
- Sigue las instrucciones a fin de autorizar a
gcloud
para que use tu cuenta de Google Cloud. - Crea una configuración nueva o selecciona una existente.
- Elige un proyecto de Google Cloud.
- Elige una zona predeterminada de Compute Engine para clústeres zonales o una región para clústeres regionales o de Autopilot.
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 de Autopilot o regionales, configura 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 el enmascaramiento de IP como se resumen en esta tabla:
Configuración del clúster | Comportamiento de la SNAT |
---|---|
GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a los destinos especificados en la lista de GKE cambia las direcciones IP del Pod de origen por las direcciones IP del nodo de origen para los paquetes enviados a destinos no especificados en la lista de |
|
|
GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a un conjunto de destinos predeterminados sin enmascarar. Estos destinos predeterminados dependen de la versión de GKE y del tipo de imagen de nodo. GKE cambia las direcciones IP del Pod de origen por las direcciones IP de nodo de origen para los paquetes enviados a destinos fuera de los destinos predeterminados sin enmascarar. |
|
GKE conserva las direcciones IP del Pod de origen para los paquetes enviados a todos los destinos. Para cambiar este comportamiento, asegúrate de que |
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
. - El clúster se creó sin la marca
--disable-default-snat
y tiene Workload Identity habilitado.
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 para los clústeres creados sin la marca --disable-default-snat
, siempre que se cumpla una de las siguientes condiciones:
- No se implementó
ip-masq-agent
, o - No se especificó
nonMasqueradeCIDRs
en el ConfigMap deip-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 esfalse
. - 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 esNx
, en el queN
es un número entero yx
es una unidad de tiempo, comos
oms
. Si no se especifica, el valor predeterminado es60
segundos.
Especifica nonMasqueradeCIDRs
El siguiente ConfigMap conserva la dirección de origen para los paquetes enviados a 10.0.0.0/8
:
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 60s
Omite el rango de vínculo local
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.
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: k8s.gcr.io/networking/ip-masq-agent-amd64:v2.6.0 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"
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ámetrononMasqueradeCIDRs
,nonMasqueradeCIDRs
debe incluir el CIDR del Pod; de lo contrario, puedes experimentar problemas de conectividad dentro del nodo.
¿Qué sigue?
- Más información sobre alias de IP.
- Consulta la descripción general de la red GKE.
- Obtén información sobre cómo configurar redes autorizadas.