En este documento, se describe cómo configurar una puerta de enlace NAT de salida para GKE en Bare Metal. Esta puerta de enlace proporciona direcciones IP de SNAT persistentes y deterministas para el tráfico de salida desde tus clústeres. Cuando ejecutas cargas de trabajo que tienen tráfico de usuario 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 la inclusión de políticas de listas de entidades permitidas.
La puerta de enlace NAT de salida se habilita mediante dos recursos personalizados. Para 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 eligió como una puerta de enlace. 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 configuras una puerta de enlace NAT de salida, o si el tráfico de salida no cumple con 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 enmascara con la dirección IP del nodo en el que se ejecuta el Pod. En este caso, no hay garantía de que todo el tráfico de salida de un Pod en particular tenga la misma dirección IP de origen o se enmascare a la misma dirección IP del nodo.
La puerta de enlace NAT de salida es una oferta avanzada de Herramientas de redes compilada sobre Dataplane V2.
Cómo funciona la puerta de enlace NAT de salida
La lógica de selección de tráfico de salida se basa en un selector de espacio de nombres, un selector de Pods y un conjunto de rangos de direcciones IP de destino en la notación de bloques CIDR. Para ilustrar cómo funciona la puerta de enlace NAT de salida, consideremos el flujo del paquete de un Pod a un consumidor externo y la respuesta correspondiente. Supongamos que la subred de nodo tiene direcciones IP en el bloque CIDR 192.168.1.0/24.
En el siguiente diagrama, se muestra la arquitectura de red para el tráfico de salida a través de un nodo de puerta de enlace.
El flujo de paquetes a través de la puerta de enlace NAT de salida podría verse así:
El tráfico de salida se genera de 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 extremo fuera del clúster.
Si el tráfico coincide con una regla de salida, el programa de eBPF enruta el tráfico de salida al nodo de puerta de enlace, en lugar de enmascarar directamente con la dirección IP del nodo.
El nodo de puerta de enlace recibe el tráfico de salida.
El nodo de puerta de enlace 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 se dirige al nodo de la puerta de enlace con el destino
192.168.1.100
.El nodo de puerta de enlace coincide con 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 en el clúster, enrutado al nodo original y entregado al Pod original.
Configura direcciones IP flotantes para el tráfico de nodos
El recurso personalizado del grupo de puerta de enlace de red es un componente empaquetado de GKE en Bare Metal. El recurso administra una lista de una o más direcciones IP flotantes para usar en el tráfico de salida de los nodos en el clúster. Los nodos participantes se determinan según el espacio de nombres especificado. Network Gateway Group hace que una dirección IP flotante esté disponible en todo momento según el criterio del mejor esfuerzo. Si un nodo que usa una dirección IP flotante falla, el operador avanzado de la red mueve la dirección IP asignada al siguiente nodo disponible. También se transferirá todo el tráfico de salida de carga de trabajo que use esa dirección IP.
Incluye los detalles del grupo de puerta de enlace de red (anotación y especificaciones) en el archivo de configuración del clúster cuando crees un clúster 1.14.11 nuevo.
Crea el recurso personalizado NetworkGatewayGroup
Para habilitar Network Gateway Group, establece el campo spec.clusterNetwork.advancedNetworking
en true
en el archivo de configuración del clúster cuando crees un clúster, 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 crees el recurso NetworkGatewayGroup
personalizado, configura su espacio de nombres con el espacio de nombres del clúster y especifica una lista de direcciones IP flotantes, 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 red avanzado asigna las IP 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 trabajadores tienen prioridad sobre los nodos del plano de control cuando se asignan 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 IP flotante asignada.
La asignación de dirección/nodo se puede encontrar 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 puerta de enlace está inactivo, el operador de red avanzado asigna las direcciones IP flotantes al siguiente nodo disponible.
Verifica la configuración de la puerta de enlace
Después de aplicar los cambios en la configuración de la puerta de enlace, puedes usar kubectl
a fin de verificar el estado de la puerta de enlace y recuperar las direcciones IP flotantes especificadas para la puerta de enlace.
Usa el siguiente comando para verificar 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 el siguiente 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
Configura reglas de selección de tráfico
El recurso EgressNATPolicy
personalizado especifica las reglas de selección de tráfico y asigna una dirección IP determinista para el tráfico de salida que sale del clúster.
Cuando especificas el CR, egress
(con al menos una regla), destinationCIDRs
y egressSourceIP
son obligatorios.
Usa kubectl apply
para crear el recurso personalizado EgressNATPolicy
. En las siguientes secciones, se proporcionan detalles y ejemplos para definir la especificación.
Especifica las reglas de enrutamiento de salida
El recurso personalizado EgressNatPolicy
te permite especificar las siguientes reglas para el tráfico de salida:
Debes especificar una o más reglas de selección de tráfico de salida en la sección
egress
.- Cada regla consta de una
podSelector
y unanamespaceSelector
. - 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 cualquiera de las reglas (la coincidencia usa una relación OR), se selecciona para el tráfico de salida.
- Cada regla consta de una
Especifica 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 rango 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 desde un Pod cuando se cumplen los siguientes criterios:
- El Pod se etiqueta con
role: frontend
. - El Pod está en un espacio de nombres etiquetado como
user: alice
ouser: paul
. - El Pod se comunica con las direcciones IP en el bloque de 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 Etiquetas y selectores en la documentación de Kubernetes.
Obtén 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
(puerta de enlace).
La política usa una de las direcciones IP flotantes de la puerta de enlace como la dirección IP de origen para el tráfico de salida. Si hay varias direcciones IP flotantes en la puerta de enlace coincidente, la política usa la primera dirección IP de la lista floatingIPs
e ignora cualquier otra dirección IP. Para la puerta de enlace de ejemplo, la primera dirección en la lista floatingIPs
es 192.168.1.100
. Tener valores o campos no válidos en la sección gatewayRef
hará que falle la aplicación del objeto de política.
Varias políticas de salida y varios objetos de puerta de enlace
Como se describió en la sección anterior, cada objeto egressNATPolicy
(política) usa la primera dirección IP de la lista floatingIPs
del objeto de puerta de enlace que coincida con gatewayRef.name
y gatewayRef.namespace
. Puedes crear varias políticas y, si planeas usar direcciones IP diferentes, debes crear varios objetos NetworkGatewayGroup
y hacer referencia a ellos, respectivamente.
Una limitación de NetworkGatewayGroup
en GKE en Bare Metal para esta versión es que solo el objeto “predeterminado” se concilia para las asignaciones de IP flotantes.
Además, solo la puerta de enlace predeterminada informa el estado de asignación de todas las direcciones IP flotantes.
NetworkGatewayGroup
define la puerta de enlace predeterminada con el nombre default
en el espacio de nombres kube-system
. Por lo tanto, cuando crees varios objetos de puerta de enlace, debes asegurarte de que las direcciones IP en las puertas de enlace no predeterminadas también se especifiquen en el manifiesto de puerta de enlace predeterminado. De lo contrario, no se asignarán como IP flotantes y, por lo tanto, el objeto EgressNATPolicies
no podrá usarlas.
Para configurar varias políticas de salida y varios objetos de puerta de enlace, sigue estos pasos:
Verifica el objeto de puerta de enlace predeterminado (
name: default
) conkubectl
para obtener el estado de asignación de las direcciones IP flotantes:kubectl -n kube-system get NetworkGatewayGroup.networking.gke.io default -o yaml
La respuesta de un clúster con dos nodos,
worker1
yworker2
podría tener el siguiente 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: ... floatingIPs: 192.168.1.100: worker1 192.168.1.101: worker2 192.168.1.102: worker1
Después de verificar el estado de la puerta de enlace predeterminada, crea objetos de puerta de enlace adicionales en el espacio de nombres
kube-system
para “hacer un seguimiento” de cada IP flotante.Ten en cuenta que estos objetos de puerta de enlace nuevos no informan el estado de asignación, que se encuentra en la puerta de enlace
default
.kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway1 spec: floatingIPs: - 192.168.1.100 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway2 spec: floatingIPs: - 192.168.1.101 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway3 spec: floatingIPs: - 192.168.1.102
Crea varias políticas que hagan referencia a los objetos de puerta de enlace “secundarios”, como
gateway1
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
Reglas de selección de tráfico de salida y políticas de red
La puerta de enlace NAT de salida es compatible con las API de la política 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 puerta de enlace NAT de salida. Por ejemplo, si el tráfico de salida activa una política de red que provoca que el paquete se descarte, las reglas de puerta de enlace de salida no comprobarán el paquete. Solo cuando la política de red permite la salida del paquete, se evaluarán las reglas de selección de tráfico de salida para decidir cómo se maneja el tráfico, ya sea mediante la puerta de enlace 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 puerta de enlace NAT de salida:
La puerta de enlace NAT de salida solo está habilitada para el modo IPv4.
Las direcciones IP de salida deben estar en el mismo dominio de capa 2 con direcciones IP de nodo.
Las actualizaciones no son compatibles con clústeres que se configuraron para usar la vista previa de la puerta de enlace NAT de salida. Para la versión 1.14.0 y posteriores de GKE en Bare Metal, la puerta de enlace NAT de salida solo está en versión preliminar en Ubuntu 18.04. No se aplican cargos por usar esta función mientras está en vista previa.