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.

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.

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 regionales, establece 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 de 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. 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. Visita el menú de Google Kubernetes Engine en Cloud Console.

    Ir al menú Google Kubernetes Engine

  2. Haz clic en el botón Crear clúster.

  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. 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 la parte superior de la página, en el cuadro del filtro, a la derecha, haz clic en la flecha hacia abajo y selecciona Convertir a filtro avanzado.

  3. Borra cualquier texto que esté en el cuadro de filtro y, luego, ingresa esta consulta:

    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    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.
  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. Visita el menú de Google Kubernetes Engine en Cloud Console.

    Ir al menú Google Kubernetes Engine

  2. Haz clic en el botón Editar del clúster , que tiene forma de lápiz.

  3. Habilita la Visibilidad dentro de los nodos.

  4. Haz clic en Guardar.

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 Clústeres de Kubernetes en Cloud Console.

    Visitar la página Clústeres de Kubernetes

  2. Haz clic en el botón Editar del clúster , que tiene forma de lápiz.

  3. En el menú desplegable Visibilidad dentro de los nodos, selecciona Inhabilitada.

  4. Haz clic en Guardar.

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.

Próximos pasos