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) para que la red de Google Cloud pueda ver todo el tráfico de red.

La visibilidad dentro de los nodos te permite hacer lo siguiente:

  • 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, incluso entre Pods dentro del mismo nodo.
  • Usa la duplicación de paquetes a fin de clonar el tráfico entre Pods en el mismo nodo y reenviarlo para su análisis.

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 está inhabilitada de forma predeterminada.

La visibilidad dentro de los nodos es obligatoria si deseas que el clúster use una red de VPC cuya MTU es de 1,500 bytes. Además, la versión de GKE del clúster debe ser 1.15 o superior. Para obtener más información sobre las redes de VPC MTU de 1,500, consulta Unidad de transmisión máxima en la documentación de VPC.

Aspectos que debes tener en cuenta

Mayor volumen de registro

Cuando se habilita la visibilidad dentro de los nodos, el volumen del registro de flujo puede aumentar con una mayor captura de tráfico por parte de la VPC. Puedes administrar los costos asociados con el registro de flujo si ajustas la configuración de registro.

Todo el tráfico de pod a pod está sujeto a firewalls

Todo el tráfico entre pods, incluidos los que están implementados en el nodo de nombre, es visible para la VPC cuando la visibilidad dentro de los nodos está habilitada. Habilitar la visibilidad dentro de los nodos puede hacer que el tráfico que antes no tenía restricciones pase a estar sujeto a reglas del firewall. Evalúa tus firewalls a nivel de nodo mediante pruebas de conectividad para asegurarte de que el tráfico legítimo no se obstruya.

Antes de comenzar

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

Establece la configuración de gcloud predeterminada mediante uno de los siguientes métodos:

  • Usa gcloud init si deseas ver una explicación sobre cómo configurar parámetros predeterminados.
  • Usa gcloud config para establecer el ID, la zona y la región del proyecto de manera individual.

Usa gcloud init

Si recibes el error One of [--zone, --region] must be supplied: Please specify location, completa esta sección.

  1. Ejecuta gcloud init y sigue las instrucciones:

    gcloud init

    Si usas SSH en un servidor remoto, usa la marca --console-only para evitar que el comando abra un navegador:

    gcloud init --console-only
  2. Sigue las instrucciones a fin de autorizar a gcloud para que use tu cuenta de Google Cloud.
  3. Crea una configuración nueva o selecciona una existente.
  4. Elige un proyecto de Google Cloud.
  5. Elige una zona predeterminada de Compute Engine para clústeres zonales o una región para clústeres regionales o de Autopilot.

Usa gcloud config

  • Establece tu ID del proyecto predeterminado:
    gcloud config set project PROJECT_ID
  • Si trabajas con clústeres zonales, establece tu zona de procesamiento predeterminada:
    gcloud config set compute/zone COMPUTE_ZONE
  • Si trabajas con clústeres de Autopilot o regionales, configura tu región de procesamiento predeterminada:
    gcloud config set compute/region COMPUTE_REGION
  • Actualiza gcloud a la versión más reciente:
    gcloud components update

Descripción general de tareas

A fin de demostrar la configuración de la visibilidad dentro de los nodos, aquí se muestra una descripción general de las tareas que realizas:

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

Los ejemplos que se usan en esta guía son los siguientes:

  • us-central1 como la región predeterminada
  • us-central1-a como la zona predeterminada

Habilita los registros de flujo para una subred

Puedes habilitar los registros de flujo para una subred con la herramienta de gcloud o Google Cloud Console.

gcloud

  1. Habilita los registros de flujo para la subred predeterminada en la región us-central1:

    gcloud compute networks subnets update default --region us-central1 \
        --enable-flow-logs
    
  2. Verifica que tu subred 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:

    ...
    enableFlowLogs: true
    ...
    ipCidrRange: 10.128.0.0/20
    region: https://www.googleapis.com/compute/v1/projects/abc-712099/regions/us-central1
    

Console

  1. Visita la página Redes de VPC de Google Kubernetes Engine en Cloud Console.

    Visitar la página de redes de VPC

  2. En la fila us-central1, haz clic en Predeterminado.

  3. En la página Detalles de la subred, haz clic en Editar.

  4. En Registros de flujo, selecciona Activado.

  5. Haz clic en Guardar.

Crea un clúster con visibilidad dentro de los nodos habilitada

Puedes crear un clúster que tenga habilitada la visibilidad dentro de los nodos con la herramienta de gcloud o Google Cloud Console.

gcloud

Crea un clúster de nodo único que tenga habilitada la visibilidad dentro de los nodos:

gcloud container clusters create cluster-name \
    --zone us-central1-a \
    --num-nodes 1 \
    --enable-intra-node-visibility

Console

  1. Ve al menú de Google Kubernetes Engine en Cloud Console.

    Ir al menú Google Kubernetes Engine

  2. Haz clic en Crear.

  3. Ingresa el nombre de tu clúster.

  4. Para el Tipo de ubicación, selecciona Zonal.

  5. En la lista desplegable Zona, selecciona us-central1-a.

  6. En el panel de navegación, en Grupos de nodos, haz clic en default-pool.

  7. Ingresa un Nombre para el grupo de nodos.

  8. Para los nodos de la versión estática, elige la Versión de nodo.

  9. En Cantidad de nodos, ingresa 1.

  10. En el panel de navegación, en Clúster, haz clic en Herramientas de redes.

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

  12. Haz clic en Crear.

Obtén credenciales para el clúster:

Obtén las credenciales para el clúster nuevo:

gcloud container clusters get-credentials cluster-name \
    --zone us-central1-a

Las credenciales se guardan en el archivo kubeconfig, que se suele encontrar en $HOME/.kube/config.

Crea dos pods

  1. Para el primer pod, crea un archivo llamado pod-1.yaml según el siguiente manifiesto de muestra:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-1
    spec:
      containers:
      - name: container-1
        image: gcr.io/google-samples/hello-app:2.0
    
  2. Ejecuta el siguiente comando para crear el pod:

    kubectl apply -f pod-1.yaml
    
  3. Para el segundo pod, crea un archivo llamado pod-2.yaml según el siguiente manifiesto de muestra:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-2
    spec:
      containers:
      - name: container-2
        image: gcr.io/google-samples/node-hello:1.0
    
  4. Ejecuta el siguiente comando para crear el pod:

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

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

    El resultado muestra las direcciones IP de tus pods. Toma nota de estas direcciones.

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

Envía una solicitud de pod-1 a pod-2

  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, con el siguiente comando:

    wget -qO- pod-2-ip-address:8080
    

    en el que pod-2-ip-address es la dirección IP de pod-2 que anotaste antes.

    El resultado muestra la respuesta del contenedor que se ejecuta en pod-2, de la siguiente manera:

    Hello Kubernetes!
    
  3. Escribe exit para salir de la shell y regresar al entorno de línea de comandos principal.

Visualiza entradas del registro de flujo

Puedes ver las entradas del registro de flujo con la herramienta de gcloud o Google Cloud Console.

gcloud

Visualiza una entrada de registro de flujo para la solicitud de pod-1 a pod-2:

gcloud logging read \
    'logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.connection.src_ip="pod-1-ip-address"'

En el ejemplo anterior, se ilustra lo siguiente:

  • project-id es el ID del proyecto.
  • pod-1-ip-address es la dirección IP de pod-1.

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

Console

  1. Visita la página Registros de Stackdriver de Google Kubernetes Engine en Cloud Console.

    Ir a la página de registros de Stackdriver

  2. En el campo de filtro, haz clic en y, luego, en Convertir a filtro avanzado.

  3. Reemplaza cualquier texto del campo de filtro por lo siguiente:

    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.src_ip="pod-1-ip-address"
    

    Reemplaza lo siguiente:

    • project-id es el ID del proyecto.
    • pod-1-ip-address es la dirección IP de pod-1.
  4. Expande la entrada de registro que aparece. En jsonPayload puedes ver que la solicitud se envió de pod-1 a pod-2. En el siguiente ejemplo, pod-1 tiene una dirección IP 10.56.0.13 y pod-2 tiene una 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
    

Recuerda que tu clúster tiene un solo nodo. Por lo tanto, pod-1 y pod-2 están en el mismo nodo. Aun así, las entradas del registro de flujo están disponibles para la comunicación dentro de los nodos entre pod-1 y pod-2.

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 con la herramienta de gcloud o Google Cloud Console.

gcloud

gcloud beta container clusters update cluster-name \
    --enable-intra-node-visibility

en este ejemplo, cluster-name es el nombre del clúster existente.

Console

  1. Ve al menú de Google Kubernetes Engine en Cloud Console.

    Ir al menú 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, junto al campo Visibilidad dentro de los nodos, 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 Guardar cambios.

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

Después de habilitar esta función, puedes confirmar que está activada si examinas las reglas de enrutamiento en tu nodo:

  1. Muestra las reglas de IP:

    ip rule show
    

    El resultado es similar al siguiente:

    0:  from all lookup local
    30001:  from all fwmark 0x4000/0x4000 lookup main
    30002:  from all iif lo lookup main
    30003:  not from all iif eth0 lookup 1
    32766:  from all lookup main
    32767:  from all lookup default
    
  2. Muestra las rutas IP:

    ip route show table 1
    

    El resultado es similar al siguiente:

    default via GKE-node-subnet-gw dev eth0
    

Inhabilita la visibilidad dentro de los nodos

Puedes inhabilitar la visibilidad dentro de los nodos para un clúster existente con la herramienta de gcloud o Google Cloud Console.

gcloud

gcloud beta container clusters update cluster-name \
    --no-enable-intra-node-visibility

en este ejemplo, cluster-name es el nombre del clúster existente.

Console

  1. Visita la página de Google Kubernetes Engine en Cloud Console.

    Visitar la página 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, junto al campo Visibilidad dentro de los nodos, 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 Guardar cambios.

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

Restricciones

Los clústeres con visibilidad dentro de los nodos tienen las siguientes restricciones:

  • Si habilitas la visibilidad dentro de los nodos y usas ip-masq-agent configurado con el parámetro nonMasqueradeCIDRs, nonMasqueradeCIDRs debe incluir el CIDR del pod; de lo contrario, puedes experimentar problemas de conectividad dentro de los nodos.

¿Qué sigue?