Visibilidad dentro de los nodos

En esta página, se muestra cómo configurar la visibilidad dentro de los nodos en un clúster de Google Kubernetes Engine a fin de que todo el tráfico de red en tu clúster sea visible para la red de Google Cloud Platform. Esto significa que puedes ver registros de flujo para todo el tráfico entre pods, incluido el tráfico entre pods en el mismo nodo. La visibilidad dentro de los nodos también te permite crear reglas de firewall que se apliquen a todo el tráfico entre los pods, incluso dentro del mismo nodo.

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

En la actualidad, la visibilidad dentro de los nodos está inhabilitada de forma predeterminada.

La visibilidad dentro de los nodos está disponible en GKE v1.11.x y versiones posteriores.

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 para asegurarte de que el tráfico legítimo no se obstruya.

Antes de comenzar

Sigue estos pasos a fin de prepararte para esta tarea:

Descripción general

Este es el panorama general de los pasos que se realizan en este tema:

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

  2. Crear un clúster, en la zona us-central1-a, que tenga un nodo

  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

Habilita los registros de flujo para una subred

gcloud

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

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

Sigue estos pasos a fin de habilitar los registros de flujo para la subred predeterminada en la región us-central1:

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

    Visitar la página 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

Crea un clúster que tenga un nodo:

gcloud

gcloud container clusters create [CLUSTER_NAME] \
    --zone us-central1-a \
    --num-nodes 1 \
    --enable-intra-node-visibility

Console

  1. Visita la página Crear un clúster de Kubernetes en GCP Console.

    Visitar la página Clústeres de Kubernetes

  2. En Nombre, ingresa [CLUSTER_NAME].

  3. En Zona, selecciona us-central1-a.

  4. En Cantidad de nodos, ingresa 1.

  5. En la parte inferior de la página, haz clic en Opciones avanzadas.

  6. Selecciona Habilitar visibilidad dentro de los nodos.

  7. Haz clic en Crear.

Obtén credenciales para tu clúster:

Ingresa este comando a fin de obtener credenciales para tu 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

Este es un manifiesto de un pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container-1
    image: gcr.io/google-samples/hello-app:2.0

Guarda el manifiesto en un archivo llamado pod-1.yaml y crea el pod:

kubectl apply -f pod-1.yaml

Este es un manifiesto para un segundo pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
spec:
  containers:
  - name: container-2
    image: gcr.io/google-samples/node-hello:1.0

Guarda el manifiesto en un archivo llamado pod-2.yaml y crea el pod:

kubectl apply -f pod-2.yaml

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

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

kubectl exec -it pod-1 sh

En tu shell, envía una solicitud a pod-2:

wget -qO- [POD_2_IP_ADDRESS]:8080

en la que [POD_2_IP_ADDRESS] es la dirección IP de pod-2 que aparece antes en este ejercicio.

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

Hello Kubernetes!

Ingresa exit para salir del shell y regresar al entorno de la línea de comandos principal.

Visualiza entradas del registro de flujo

gcloud

En tu ventana de línea de comandos normal, ingresa este comando a fin de ver 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 que:

  • [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 GCP Console.

    Visitar la página 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 en 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 la que:

    • [PROJECT_ID] es el ID del proyecto.
    • [POD_1_IP_ADDRESS] es la dirección IP de pod-1.

    Expande la entrada de registro que aparece. En jsonPayload puedes ver que la solicitud se envió de pod-1 a pod-2. En este ejemplo, el pod-1 tiene la dirección IP 10.56.0.13, y el 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
    

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

gcloud

A fin de habilitar la visibilidad dentro de los nodos para un clúster existente, ingresa este comando:

gcloud beta container clusters update [CLUSTER_NAME] \
    --enable-intra-node-visibility

en el que [CLUSTER_NAME] es el nombre de tu clúster existente.

Console

  1. Dirígete al menú Google Kubernetes Engine en GCP Console.

    Ir al menú Google Kubernetes Engine

  2. Haz clic en el botón de edición 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 característica, puedes confirmar que está activada si examinas las reglas de enrutamiento en tu nodo:

ip rule show

Aparece un resultado 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

y:

ip route show table 1

Aparece un resultado similar al siguiente:

default via [GKE_NODE_SUBNET_GW] dev eth0

Inhabilita la visibilidad dentro de los nodos

gcloud

A fin de inhabilitar la visibilidad dentro de los nodos para un clúster existente, ingresa este comando:

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

en el que [CLUSTER_NAME] es el nombre de tu clúster existente.

Console

  1. Visita la página Clústeres de Kubernetes en GCP Console.

    Visitar la página Clústeres de Kubernetes

  2. Haz clic en el botón de edición 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.

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Kubernetes Engine