Configura una puerta de enlace NAT de salida

En este documento, se describe cómo configurar una puerta de enlace NAT de salida para GDCV para 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.

Diagrama de puerta de enlace NAT de salida para GKE en Bare Metal

El flujo de paquetes a través de la puerta de enlace NAT de salida podría verse así:

  1. 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 IP 192.168.1.1.

    La dirección de destino del tráfico es un extremo fuera del clúster.

  2. 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.

  3. El nodo de puerta de enlace recibe el tráfico de salida.

  4. 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 personalizado EgressNATPolicy.

  5. El tráfico de retorno se dirige al nodo de la puerta de enlace con el destino 192.168.1.100.

  6. 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.

  7. 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.15.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.

  1. 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 y worker2 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 una namespaceSelector.
    • 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.
  • 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 o user: 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.

Cada recurso NetworkGatewayGroup debe contener direcciones IP flotantes únicas. Si deseas configurar varios objetos EgressNATPolicy para que usen la misma dirección IP, usa la misma gatewayRef.name y gatewayRef.namespace para ambos.

Para configurar varias políticas de salida y varios objetos de puerta de enlace, sigue estos pasos:

  1. Crea objetos de puerta de enlace en el espacio de nombres kube-system para administrar cada dirección IP flotante. Por lo general, cada política de salida debe tener un objeto de puerta de enlace correspondiente para garantizar que se asigne la dirección IP correcta.

    Luego, verifica cada objeto de puerta de enlace 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
    
  2. Crea varias políticas que hagan referencia a los objetos de puerta de enlace, como gateway1, que se creó 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.15.0 y posteriores de GKE en Bare Metal, la puerta de enlace NAT de salida solo se encuentra en versión preliminar en Ubuntu 18.04. No se aplican cargos por usar esta función mientras está en vista previa.