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 CLI de gcloud, obtén la versión más reciente ejecutando el comando
gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
- Asegúrate de que tienes un clúster Standard. Si necesitas uno, crea un clúster estándar.
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-agentDaemonSet. - Consulta el recurso
ip-masq-agentConfigMap.
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
Obtén las credenciales de tu clúster:
gcloud container clusters get-credentials CLUSTER_NAMESustituye
CLUSTER_NAMEpor el nombre de tu clúster.Busca
ip-masq-agenten el espacio de nombreskube-system:kubectl get daemonsets/ip-masq-agent -n kube-systemSi el
ip-masq-agentDaemonSet 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> 13dSi el DaemonSet
ip-masq-agentno existe, el resultado será similar al siguiente:Error from server (NotFound): daemonsets.apps "ip-masq-agent" not foundComprueba si el
ip-masq-agentDaemonSet 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
Ve a la página Cargas de trabajo de la Google Cloud consola.
En Filtrar, haz lo siguiente:
- Haz clic en para borrar el filtro Es objeto del sistema: falso.
- Filtra las siguientes propiedades:
- Nombre:
ip-masq-agent. - Clúster: el nombre de tu clúster.
- Nombre:
Si existe un DaemonSet
ip-masq-agent, puedes ver el registro de DaemonSet en la tabla. Si no existeip-masq-agentDaemonSet, 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
Obtén las credenciales de tu clúster:
gcloud container clusters get-credentials CLUSTER_NAMESustituye
CLUSTER_NAMEpor el nombre de tu clúster.Describe el ConfigMap
ip-masq-agenten el espacio de nombreskube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemSi 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
Ve a la página Configuración de la Google Cloud consola.
En Filtrar, haz lo siguiente:
- Haz clic en para borrar el filtro Es objeto del sistema: falso.
- Filtra las siguientes propiedades:
- Nombre:
ip-masq-agent. - Clúster: el nombre de tu clúster.
- Nombre:
Si existe un ConfigMap
ip-masq-agent, puedes ver el registro de ConfigMap en la tabla. Si no existeip-masq-agentConfigMap, 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.
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_TIMEHaz los cambios siguientes:
CIDR_1yCIDR_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 listanonMasqueradeCIDRssiguiendo el mismo formato. Como mínimo, la propiedadnonMasqueradeCIDRsdebe incluir los intervalos de direcciones IP de los nodos y los pods de tu clúster.SYNC_INTERVAL: el tiempo que transcurre hasta que cadaip-masq-agentpod comprueba el contenido deip-masq-agentConfigMap y escribe los cambios en su archivo/etc/config/ip-masq-agentlocal. El valor predeterminado es60.UNIT_OF_TIME: la unidad de tiempo de resyncInterval. Los valores válidos sons(segundos) oms(milisegundos). El valor predeterminado ess.
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.Crea el recurso ConfigMap:
kubectl create configmap ip-masq-agent \ --namespace=kube-system \ --from-file=config=LOCAL_CONFIG_FILE_PATHSustituye
LOCAL_CONFIG_FILE_PATHpor la ruta del archivo de configuración que has creado en el paso anterior.Describe el ConfigMap
ip-masq-agenten el espacio de nombreskube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemEl 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
configcon los cambios de configuración. Ahora puedes desplegar elip-masq-agentDaemonSet.
Editar un ip-masq-agent ConfigMap
Para modificar el contenido de un ip-masq-agent ConfigMap, sigue estos pasos:
Abre el ConfigMap en un editor de texto:
kubectl edit configmap ip-masq-agent --namespace=kube-systemEdita 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-systemHaz los cambios siguientes:
CIDR_1yCIDR_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 listanonMasqueradeCIDRssiguiendo el mismo formato. Como mínimo, la propiedadnonMasqueradeCIDRsdebe incluir los intervalos de direcciones IP de los nodos y los pods de tu clúster.SYNC_INTERVAL: el tiempo que transcurre hasta que cadaip-masq-agentpod comprueba el contenido deip-masq-agentConfigMap y escribe los cambios en su archivo/etc/config/ip-masq-agentlocal. El valor predeterminado es60.UNIT_OF_TIME: la unidad de tiempo de resyncInterval. Los valores válidos sons(segundos) oms(milisegundos). El valor predeterminado ess.
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.Describe el ConfigMap
ip-masq-agenten el espacio de nombreskube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemEl 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.
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-volumeque 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
configMapreferenciado en elconfig-volumevolumen del pod.El nombre de la cadena (
--masq-chain) debe serIP-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 archivoip-masq-agentes el valor de la claveconfigen 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-rangesen la secciónarg.
Despliega el DaemonSet:
kubectl apply -f LOCAL_FILE_PATHSustituye
LOCAL_FILE_PATHpor 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:
- Confirma el estado de la
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. - Confirma la versión de la imagen
ip-masq-agentespecificada en DaemonSet. Si la versión del DaemonSetip-masq-agentno es la más reciente, sigue los pasos de implementación para actualizar el DaemonSet. - Comprueba si la cadena IP-MASQ se ha rellenado correctamente en las tablas de IP de NAT ejecutando el comando
sudo iptables -t nat -L IP-MASQen el nodo afectado. Si elnonMasqueradeCIDRsdefinido en ConfigMap no aparece en las tablas de IP de NAT, comprueba que no haya errores tipográficos en el archivo de configuración que se ha usado para crear ConfigMap. - Confirma que el destino permite los intervalos de direcciones IP de nodos y pods.
- Si no se puede acceder al tráfico desde el nodo o el pod, ejecuta una prueba de conectividad.
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:
Abre el
ip-masq-agentConfigMap:kubectl edit configmap ip-masq-agent --namespace=kube-systemRevisa la lista
nonMasqueradeCIDRsen ConfigMap. La listanonMasqueradeCIDRsdebe estar presente y completa. Por ejemplo:... nonMasqueradeCIDRs: - 35.100.0.0/16 ...Si falta alguna entrada en la lista o está incompleta, añada o modifique la
nonMasqueradeCIDRslista 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/0al campononMasqueradeCIDRs. 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.
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
- Consulta cómo usar la política de NAT de salida para configurar el enmascaramiento de IP en clústeres de Autopilot.
- Consulta cómo crear un clúster nativo de VPC.
- Consulta la información general sobre la red de GKE.
- Consulta información sobre cómo configurar redes autorizadas.