En este documento se describe cómo configurar una pasarela de NAT de salida para Google Distributed Cloud. Esta pasarela proporciona direcciones IP de SNAT persistentes y deterministas para el tráfico de salida de tus clústeres. Cuando ejecutas cargas de trabajo que tienen tráfico de usuarios de salida (fuera de tus clústeres), tus clientes quieren identificar este tráfico mediante algunas direcciones IP deterministas. Esto permite a tus clientes establecer medidas de seguridad basadas en IP, como políticas de listas de permitidas.
Esta página está dirigida a especialistas en redes que diseñan y desarrollan la red de su organización, así como instalan, configuran y ofrecen asistencia para los equipos de red. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas de usuario habituales de GKE.
La pasarela de NAT de salida se habilita mediante dos recursos personalizados. En un espacio de nombres determinado, el recurso personalizado NetworkGatewayGroup
especifica las direcciones IP flotantes que se pueden configurar en la interfaz de red de un nodo que se elija para actuar como pasarela. El recurso personalizado EgressNatPolicy
te permite especificar políticas de enrutamiento de salida para controlar el tráfico en la puerta de enlace de salida.
Si no configura una pasarela NAT de salida o si el tráfico de salida no cumple las reglas de selección de tráfico, el tráfico de salida de un pod determinado a un destino fuera del clúster se enmascarará con la dirección IP del nodo en el que se esté ejecutando el pod. En este caso, no hay ninguna garantía de que todo el tráfico de salida de un pod concreto tenga la misma dirección IP de origen o se enmascare con la misma dirección IP de nodo.
La pasarela NAT de salida es una oferta de redes avanzadas basada en Dataplane V2.
Cómo funciona la pasarela de NAT de salida
La lógica de selección del tráfico de salida se basa en un selector de espacio de nombres, un selector de pods y un conjunto de intervalos de direcciones IP de destino en notación de bloque CIDR. Para ilustrar cómo funciona la pasarela de NAT de salida, vamos a analizar el flujo de un paquete de un pod a un consumidor externo y la respuesta correspondiente. Supongamos que la subred de nodos tiene direcciones IP en el bloque CIDR 192.168.1.0/24.
En el siguiente diagrama se muestra la arquitectura de red del tráfico de salida a través de un nodo de pasarela.
El flujo de paquetes a través de la pasarela de NAT de salida podría ser el siguiente:
El tráfico de salida se genera desde un pod con la dirección IP
10.10.10.1
en un nodo con la dirección IP192.168.1.1
.La dirección de destino del tráfico es un endpoint fuera del clúster.
Si el tráfico coincide con una regla de salida, el programa eBPF lo dirige al nodo de la pasarela en lugar de enmascararlo directamente con la dirección IP del nodo.
El nodo de la pasarela recibe el tráfico de salida.
El nodo de la pasarela enmascara la dirección IP de origen del tráfico de origen,
10.10.10.1
, con la dirección IP de salida de origen,192.168.1.100
, especificada en el recurso personalizadoEgressNATPolicy
.El tráfico de retorno vuelve al nodo de la pasarela con el destino
192.168.1.100
.El nodo de la pasarela hace coincidir el conntrack del tráfico de retorno con el del tráfico de salida original y reescribe la dirección IP de destino como
10.10.10.1
.10.10.10.1
se trata como tráfico dentro del clúster, se enruta al nodo original y se devuelve al pod original.
Configurar direcciones IP flotantes para el tráfico de nodos
El recurso personalizado NetworkGatewayGroup es un componente incluido de Google Distributed Cloud. El recurso gestiona una lista de una o más direcciones IP flotantes que se usan para el tráfico de salida de los nodos de tu clúster. Los nodos participantes se determinan mediante el espacio de nombres especificado. El grupo de pasarelas de red hace que una dirección IP flotante esté disponible en todo momento con el mejor esfuerzo posible. Si un nodo que usa una dirección IP flotante deja de funcionar, el operador de red avanzado mueve la dirección IP asignada al siguiente nodo disponible. Todo el tráfico de salida de la carga de trabajo que utilice esa dirección IP también se moverá.
Incluya los detalles del grupo de la puerta de enlace de red (anotación y especificación) en el archivo de configuración del clúster al crear un clúster 1.33.100-gke.89.
Crea el recurso personalizado NetworkGatewayGroup
.
Para habilitar Network Gateway Group, defina el campo spec.clusterNetwork.advancedNetworking
en true
en el archivo de configuración del clúster al crear un clúster, tal como se muestra en el siguiente ejemplo:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
spec:
clusterNetwork:
...
advancedNetworking: true
...
Cuando cree el recurso personalizado NetworkGatewayGroup
, defina su espacio de nombres como el espacio de nombres del clúster y especifique una lista de direcciones IP flotantes, tal como se muestra en el siguiente ejemplo:
kind: NetworkGatewayGroup
apiVersion: networking.gke.io/v1
metadata:
namespace: cluster-cluster1
name: default
spec:
floatingIPs:
- 192.168.1.100
- 192.168.1.101
- 192.168.1.102
El operador de redes avanzadas asigna las IPs flotantes a los nodos en función de los siguientes criterios:
- Subred del nodo: la dirección IP flotante debe coincidir con la subred del nodo.
- Rol del nodo (plano de control, trabajador): los nodos de trabajador tienen prioridad sobre los nodos del plano de control a la hora de asignar direcciones IP flotantes.
- Si un nodo tiene una dirección IP flotante, el operador prioriza las asignaciones a los nodos que aún no tienen una dirección IP flotante asignada.
La asignación de direcciones o nodos se encuentra en la sección status
cuando obtienes el objeto NetworkGatewayGroup
. Ten en cuenta que el objeto NetworkGatewayGroup
está en el espacio de nombres kube-system
. Si un nodo de pasarela no funciona, el operador de red avanzado asigna las direcciones IP flotantes al siguiente nodo disponible.
Verificar la configuración de la pasarela
Una vez que hayas aplicado los cambios en la configuración de la pasarela, puedes usar kubectl
para comprobar el estado de la pasarela y recuperar las direcciones IP flotantes
especificadas para la pasarela.
Usa el siguiente comando para comprobar el estado de
NetworkGatewayGroup
y ver cómo se asignan las direcciones IP flotantes:kubectl -n kube-system get networkgatewaygroups.networking.gke.io default -o yaml
La respuesta de un clúster con dos nodos,
worker1
yworker2
, podría tener este aspecto:kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: default spec: floatingIPs: - 192.168.1.100 - 192.168.1.101 - 192.168.1.102 status: nodes: worker1: Up worker2: Up // Or Down floatingIPs: 192.168.1.100: worker1 192.168.1.101: worker2 192.168.1.102: worker1
Definir reglas de selección de tráfico
El recurso personalizado EgressNATPolicy
especifica reglas de selección de tráfico y asigna una dirección IP determinista al tráfico de salida que abandona el clúster.
Cuando especifique el recurso personalizado, deberá incluir egress
(con al menos una regla), destinationCIDRs
y egressSourceIP
.
Usa kubectl apply
para crear el EgressNATPolicy
recurso personalizado. En las siguientes secciones se proporcionan detalles y ejemplos para definir la especificación.
Especificar reglas de enrutamiento de salida
El recurso personalizado EgressNatPolicy
te permite especificar las siguientes reglas para el tráfico de salida:
Debe especificar una o varias reglas de selección de tráfico de salida en la sección
egress
.- Cada regla consta de un
podSelector
y unnamespaceSelector
. - La selección se basa en una etiqueta de espacio de nombres,
namespaceSelector.matchLabels.user
, y una etiqueta de pod,podSelector.matchLabels.role
. - Si un pod coincide con alguna de las reglas (la coincidencia usa una relación OR), se selecciona para el tráfico de salida.
- Cada regla consta de un
Especifique las direcciones de destino permitidas en la sección
destinationCIDRs
.destinationCIDRs
toma una lista de bloques CIDR.- Si el tráfico saliente de un pod tiene una dirección IP de destino que se encuentra dentro del intervalo de cualquiera de los bloques CIDR especificados, se selecciona para el tráfico de salida.
En el siguiente ejemplo, se permite el tráfico de salida de un pod cuando se cumplen los siguientes criterios:
- El pod tiene la etiqueta
role: frontend
. - El pod está en un espacio de nombres etiquetado como
user: alice
ouser: paul
. - El pod se comunica con direcciones IP del bloque CIDR
8.8.8.0/24
.
kind: EgressNATPolicy
apiVersion: networking.gke.io/v1
metadata:
name: egress
spec:
sources:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: frontend
- namespaceSelector:
matchLabels:
user: paul
podSelector:
matchLabels:
role: frontend
action: SNAT
destinations:
- cidr: 8.8.8.0/24
gatewayRef:
name: default
namespace: kube-system
Para obtener más información sobre el uso de etiquetas, consulta el artículo Etiquetas y selectores de la documentación de Kubernetes.
Obtener una dirección IP de origen para el tráfico de salida
El recurso personalizado EgressNATPolicy
(política) usa los valores gatewayRef.name
y gatewayRef.namespace
para encontrar un objeto NetworkGatewayGroup
(gateway).
La política usa una de las direcciones IP flotantes de la pasarela como dirección IP de origen del tráfico de salida. Si hay varias direcciones IP flotantes en la pasarela coincidente, la política utiliza la primera dirección IP de la lista floatingIPs
e ignora las demás. En el caso de la pasarela de ejemplo, la primera dirección de la lista floatingIPs
es 192.168.1.100
. Si hay campos o valores no válidos en la sección gatewayRef
, no se podrá aplicar el objeto de la política.
Varias políticas de salida y varios objetos de pasarela
Como se ha descrito en la sección anterior, cada objeto egressNATPolicy
(política) usa la primera dirección IP de la lista floatingIPs
del objeto de pasarela que coincida con gatewayRef.name
y gatewayRef.namespace
. Puedes crear varias políticas y, si tienes intención de usar diferentes direcciones IP, debes crear varios objetos NetworkGatewayGroup
y hacer referencia a ellos respectivamente.
Cada recurso NetworkGatewayGroup
debe contener direcciones IP flotantes únicas.
Para configurar varios objetos EgressNATPolicy
de forma que usen la misma dirección IP, utiliza el mismo gatewayRef.name
y gatewayRef.namespace
para ambos.
Para configurar varias políticas de salida y varios objetos de pasarela, sigue estos pasos:
Crea objetos de pasarela en el espacio de nombres
kube-system
para gestionar cada dirección IP flotante. Por lo general, cada política de salida debe tener un objeto de pasarela correspondiente para asegurarse de que se asigne la dirección IP correcta.A continuación, verifica cada objeto de pasarela con
kubectl
para obtener el estado de asignación de las direcciones IP flotantes:kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway1 spec: floatingIPs: - 192.168.1.100 status: ... floatingIPs: 192.168.1.100: worker1 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway2 spec: floatingIPs: - 192.168.1.101 status: ... floatingIPs: 192.168.1.101: worker2 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway3 spec: floatingIPs: - 192.168.1.102 status: ... floatingIPs: 192.168.1.102: worker1
Crea varias políticas que hagan referencia a los objetos de la pasarela, como
gateway1
, que se ha creado en el paso anterior:kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress1 spec: ... gatewayRef: name: gateway1 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress2 spec: ... gatewayRef: name: gateway2 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress3 spec: ... gatewayRef: name: gateway3 namespace: kube-system
(Opcional) Especificar los nodos en los que se colocarán las direcciones IP flotantes
NetworkGatewayGroup
recursos admiten selectores de nodos. Para especificar un subconjunto de nodos que se tienen en cuenta para alojar una dirección IP flotante, puedes añadir el selector de nodos al objeto NetworkGatewayGroup
, tal como se muestra en el siguiente ejemplo:
kind: NetworkGatewayGroup
apiVersion: networking.gke.io/v1
metadata:
namespace: cluster-cluster1
name: default
spec:
floatingIPs:
- 192.168.1.100
- 192.168.1.101
- 192.168.1.102
nodeSelector:
node-type: "egressNat"
El selector de nodos coincide con los nodos que tienen la etiqueta especificada y solo se tienen en cuenta estos nodos para alojar una dirección IP flotante. Si especificas varios selectores, su lógica es aditiva, por lo que un nodo debe coincidir con cada etiqueta para que se tenga en cuenta a la hora de alojar una dirección IP flotante. Si no hay muchos nodos con etiquetas coincidentes, un selector de nodos puede reducir las cualidades de alta disponibilidad (HA) de la colocación de direcciones IP flotantes.
Reglas de selección de tráfico de salida y políticas de red
La pasarela de NAT de salida es compatible con las APIs de políticas de red. Las políticas de red se evalúan primero y tienen prioridad sobre las reglas de selección de tráfico de la pasarela de NAT de salida. Por ejemplo, si el tráfico de salida activa una política de red que provoca que se descarte el paquete, las reglas de la puerta de enlace de salida no comprobarán el paquete. Solo cuando la política de red permita que el paquete salga, se evaluarán las reglas de selección de tráfico de salida para decidir cómo se gestiona el tráfico, ya sea mediante la pasarela NAT de salida o mediante el enmascaramiento directo con la dirección IP del nodo en el que se ejecuta el pod.
Limitaciones
Estas son las limitaciones actuales de la pasarela de NAT de salida:
La pasarela NAT de salida solo está habilitada para el modo IPv4.
Las direcciones IP de salida deben estar en el mismo dominio de capa 2 que las direcciones IP de los nodos.