Configura la visibilidad dentro de los nodos


En esta guía, se muestra cómo configurar la visibilidad dentro de los nodos en un clúster de Google Kubernetes Engine (GKE).

La visibilidad dentro de los nodos configura las redes en cada nodo del clúster para que la red de nube privada virtual (VPC) del clúster procese el tráfico enviado de un Pod a otro Pod, incluso si los Pods están en el mismo nodo.

La visibilidad dentro de los nodos está inhabilitada de forma predeterminada en los clústeres de Standard y habilitada de forma predeterminada en los clústeres de Autopilot.

Arquitectura

La visibilidad dentro de los nodos garantiza que la red de VPC procese siempre los paquetes enviados entre Pods, lo que garantiza que las reglas de firewall, las rutas, los registros de flujo y las opciones de configuración de duplicación de paquetes se apliquen a los paquetes.

Cuando un pod envía un paquete a otro Pod en el mismo nodo, el paquete abandona el nodo, y la red de Google Cloud lo procesa. Luego, el paquete se envía de inmediato al mismo nodo y se reenvía al Pod de destino.

La visibilidad dentro de los nodos implementa el DaemonSet netd.

Ventajas

La visibilidad dentro de los nodos proporciona los siguientes beneficios:

  • Consulta los registros de flujo para todo el tráfico entre Pods, incluido el tráfico entre Pods del mismo nodo.
  • Crea reglas de firewall que se apliquen a todo el tráfico entre los pods, incluido el tráfico entre pods del mismo nodo.
  • Usa la duplicación de paquetes a fin de clonar el tráfico, incluido el tráfico entre pods en el mismo nodo, y reenviarlo para su análisis.

Requisitos y limitaciones

La visibilidad dentro de los nodos tiene los siguientes requisitos y limitaciones:

  • Tu clúster debe estar en la versión 1.15 o posterior de GKE.
  • Nota: La visibilidad dentro de los nodos no es compatible con los grupos de nodos de Windows Server.
  • Si habilitas la visibilidad dentro de los nodos y usas ip-masq-agent configurado con el parámetro nonMasqueradeCIDRs, debes incluir el rango CIDR del Pod en nonMasqueradeCIDRs para evitar problemas de conectividad dentro de los nodos.

Reglas de firewall

Cuando habilitas la visibilidad dentro de los nodos, la red de VPC procesa todos los paquetes enviados entre Pods, incluidos los paquetes enviados entre Pods en el mismo nodo. Esto significa que las reglas de firewall de VPC y las políticas de firewall jerárquicas se aplican de manera coherente a la comunicación de Pod a Pod, sin importar la ubicación del Pod.

Si configuras reglas de firewall personalizadas para la comunicación dentro del clúster, evalúa con cuidado las necesidades de red del clúster a fin de determinar el conjunto de reglas de permiso de entrada y salida. Puedes usar las pruebas de conectividad para asegurarte de que el tráfico legítimo no se obstruya. Por ejemplo, se requiere la comunicación de Pod a Pod para que la política de red funcione.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Habilita la visibilidad dentro de los nodos en un clúster nuevo

Puedes crear un clúster con visibilidad dentro de los nodos habilitada con la CLI de gcloud o la consola de Google Cloud.

gcloud

Para crear un clúster de nodo único que tenga habilitada la visibilidad dentro de los nodos, usa la marca --enable-intra-node-visibility:

gcloud container clusters create CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --enable-intra-node-visibility

Reemplaza lo siguiente:

Console

Para crear un clúster de nodo único que tenga habilitada la visibilidad dentro de los nodos, realiza los siguientes pasos:

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. Haga clic en Crear.

  3. Ingresa el nombre de tu clúster.

  4. En el cuadro de diálogo Configurar clúster, haz clic en Configurar junto a GKE Standard.

  5. Configura tu clúster según sea necesario.

  6. En el panel de navegación, en Clúster, haz clic en Redes.

  7. Selecciona la casilla de verificación Habilita la visibilidad dentro de los nodos.

  8. Haz clic en Crear.

Habilita la visibilidad dentro de los nodos en un clúster existente

Puedes habilitar la visibilidad dentro de los nodos para un clúster existente mediante la CLI de gcloud o la consola de Google Cloud.

Cuando habilitas la visibilidad dentro de los nodos para un clúster existente, GKE reinicia los componentes en el plano de control y en los nodos trabajadores.

gcloud

Para habilitar la visibilidad dentro de los nodos en un clúster existente, usa la marca --enable-intra-node-visibility:

gcloud container clusters update CLUSTER_NAME \
    --enable-intra-node-visibility

Reemplaza CLUSTER_NAME por el nombre del clúster.

Console

Para habilitar la visibilidad dentro de los nodos en un clúster existente, realiza los siguientes pasos:

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haz clic en el nombre del clúster que deseas modificar.

  3. En Herramientas de redes, haz clic en Editar visibilidad dentro de los nodos.

  4. Selecciona la casilla de verificación Habilita la visibilidad dentro de los nodos.

  5. Haz clic en Save Changes.

Inhabilita la visibilidad dentro de los nodos.

Puedes inhabilitar la visibilidad dentro de los nodos en un clúster con la CLI de gcloud o la consola de Google Cloud.

Cuando inhabilitas la visibilidad dentro de los nodos para un clúster existente, GKE reinicia los componentes en el plano de control y en los nodos trabajadores.

gcloud

Para inhabilitar la visibilidad dentro de los nodos, usa la marca --no-enable-intra-node-visibility:

gcloud container clusters update CLUSTER_NAME \
    --no-enable-intra-node-visibility

Reemplaza CLUSTER_NAME por el nombre del clúster.

Console

Para inhabilitar la visibilidad dentro de los nodos, sigue estos pasos:

  1. Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haz clic en el nombre del clúster que deseas modificar.

  3. En Herramientas de redes, haz clic en Editar visibilidad dentro de los nodos.

  4. Desactiva la casilla de verificación Habilitar la visibilidad dentro de los nodos.

  5. Haz clic en Save Changes.

Ejercicio: Verifica la visibilidad dentro de los nodos

En este ejercicio, se muestran los pasos necesarios a fin de habilitar la visibilidad dentro de los nodos y confirmar que funciona para tu clúster.

En este ejercicio, debes realizar los siguientes pasos:

  1. Habilitar los registros de flujo para la subred predeterminada en la región us-central1
  2. Crear un clúster de nodo único con visibilidad dentro de los nodos habilitada en la zona us-central1-a
  3. Crear dos pods en tu clúster
  4. Enviar una solicitud HTTP de un Pod a otro
  5. Ver la entrada de registro de flujo para la solicitud de pod a pod

Habilitar los registros de flujo

  1. Habilitar los registros de flujo para la subred predeterminada:

    gcloud compute networks subnets update default \
        --region=us-central1 \
        --enable-flow-logs
    
  2. Verificar que la subred predeterminada tenga habilitados los registros de flujo:

    gcloud compute networks subnets describe default \
        --region=us-central1
    

    El resultado muestra que los registros de flujo están habilitados, similares a los siguientes:

    ...
    enableFlowLogs: true
    ...
    

Crea un clúster

  1. Crea un clúster de nodo único con visibilidad dentro de los nodos habilitada:

    gcloud container clusters create flow-log-test \
        --zone=us-central1-a \
        --num-nodes=1 \
        --enable-intra-node-visibility
    
  2. Obtén las credenciales para su clúster.

    gcloud container clusters get-credentials flow-log-test \
        --zone=us-central1-a
    

Cree dos Pods

  1. Crea un Pod.

    Guarda el siguiente manifiesto como un archivo llamado pod-1.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-1
    spec:
      containers:
      - name: container-1
        image: google/cloud-sdk:slim
        command:
        - sh
        - -c
        - while true; do sleep 30; done
    
  2. Aplica el manifiesto al clúster:

    kubectl apply -f pod-1.yaml
    
  3. Crea un segundo Pod.

    Guarda el siguiente manifiesto como un archivo llamado pod-2.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-2
    spec:
      containers:
      - name: container-2
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
    
  4. Aplica el manifiesto al clúster:

    kubectl apply -f pod-2.yaml
    
  5. Visualiza los pods:

    kubectl get pod pod-1 pod-2 --output wide
    

    En la salida, se mostrarán las direcciones IP de tus Pods, que son similares a las siguientes:

    NAME      READY     STATUS    RESTARTS   AGE       IP           ...
    pod-1     1/1       Running   0          1d        10.52.0.13   ...
    pod-2     1/1       Running   0          1d        10.52.0.14   ...
    

    Anota las direcciones IP de pod-1 y pod-2.

envía una solicitud:

  1. Obtén una shell para el contenedor en pod-1:

    kubectl exec -it pod-1 -- sh
    
  2. En tu shell, envía una solicitud a pod-2:

    curl -s POD_2_IP_ADDRESS:8080
    

    Reemplaza POD_2_IP_ADDRESS por la dirección IP de pod-2.

    El resultado muestra la respuesta del contenedor que se ejecuta en pod-2.

    Hello, world!
    Version: 2.0.0
    Hostname: pod-2
    
  3. Escribe exit para salir de la shell y regresar al entorno de línea de comandos principal.

Visualiza entradas del registro de flujo

Para ver una entrada de registro de flujo, usa el siguiente comando:

gcloud logging read \
    'logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.connection.src_ip="POD_1_IP_ADDRESS" AND jsonPayload.connection.dest_ip="POD_2_IP_ADDRESS"'

Reemplaza lo siguiente:

  • PROJECT_ID: el ID de tu proyecto
  • POD_1_IP_ADDRESS: es la dirección IP de pod-1.
  • POD_2_IP_ADDRESS: es la dirección IP de pod-2.

El resultado muestra una entrada de registro de flujo para una solicitud de pod-1 a pod-2. En este ejemplo, pod-1 tiene la dirección IP 10.56.0.13 y pod-2 tiene la dirección IP 10.56.0.14.

...
jsonPayload:
  bytes_sent: '0'
  connection:
    dest_ip: 10.56.0.14
    dest_port: 8080
    protocol: 6
    src_ip: 10.56.0.13
    src_port: 35414
...

Realiza una limpieza

Para evitar que se apliquen cargos no deseados a tu cuenta, sigue estos pasos a fin de quitar los recursos que creaste:

  1. Borra el clúster:

    gcloud container clusters delete -q flow-log-test
    
  2. Inhabilita los registros de flujo para la subred predeterminada:

    gcloud compute networks subnets update default --no-enable-flow-logs
    

¿Qué sigue?