Configurar una política de red

En esta página se muestra cómo usar las políticas de red de clústeres para controlar si un pod puede recibir tráfico de red entrante (o de entrada) y si puede enviar tráfico saliente (o de salida).

Las políticas de red te permiten limitar las conexiones entre objetos Pod, de forma que puedes reducir la exposición a ataques.

Las políticas de red actúan como un cortafuegos en la capa 3 o 4 del modelo OSI. No ofrecen funciones adicionales, como autorización o cifrado.

Restringir el tráfico entrante a objetos Pod

Un objeto NetworkPolicy te permite configurar políticas de acceso a la red para un pod. Los objetos NetworkPolicy contienen la siguiente información:

  • Objetos de pod a los que se aplica la política. Puedes definir objetos Pod y cargas de trabajo con etiquetas y selectores.

  • Tipo de tráfico al que afecta la política de red: entrada para el tráfico entrante, salida para el tráfico saliente o ambos.

  • En el caso de las políticas de entrada, qué objetos Pod pueden conectarse a los objetos Pod especificados.

  • En el caso de las políticas de salida, los objetos Pod a los que se pueden conectar los objetos Pod especificados.

Ejemplo de restricción del tráfico entrante

En esta sección se muestra cómo crear una restricción de tráfico entrante en una aplicación de ejemplo. Modifica este ejemplo para adaptarlo al entorno de tu aplicación.

  1. Ejecuta una aplicación de servidor web con la etiqueta app=hello y exponla internamente en el clúster:

    kubectl run hello-web --labels app=hello \
        --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 \
        --port 8080 --expose
    
  2. Configura un NetworkPolicy para permitir el tráfico al pod hello-web solo desde los objetos de pod app=foo. GKE en AWS bloquea el tráfico entrante de objetos Pod que no tienen esta etiqueta, así como el tráfico externo y el tráfico de objetos Pod de un espacio de nombres diferente.

    El siguiente manifiesto selecciona objetos Pod con la etiqueta app=hello y especifica una política de Ingress para permitir el tráfico solo de objetos Pod con la etiqueta app=foo:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: hello-allow-from-foo
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: hello
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app: foo
  3. Aplica esta política al clúster:

    kubectl apply -f hello-allow-from-foo.yaml
    

Verificar la política de entrada

  1. Ejecuta un pod temporal con la etiqueta app=foo. Para verificar que se permite el tráfico entrante, haz una solicitud al endpoint hello-web:8080:

    kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \
        -- wget -qO- --timeout=2 http://hello-web:8080
    

    Si el tráfico del pod app=foo a los objetos del pod app=hello está habilitado, el resultado será el siguiente:

    Hello, world!
    Version: 1.0.0
    Hostname: hello-web-2258067535-vbx6z
    
  2. Ejecuta un pod temporal con una etiqueta diferente (app=other) y haz la misma solicitud para observar que no se permite el tráfico:

    kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \
        -- wget -qO- --timeout=2 http://hello-web:8080
    

    El resultado confirma que la conexión no recibe ninguna respuesta:

    wget: download timed out
    

Restringir el tráfico saliente de objetos Pod

Puedes restringir el tráfico saliente de la misma forma que el tráfico entrante.

Sin embargo, para consultar nombres de host internos, como hello-web, o nombres de host externos, como www.example.com, debes crear una política de salida que permita el tráfico DNS en el puerto 53 mediante los protocolos TCP y UDP.

Para habilitar las políticas de red de salida, implementa un NetworkPolicy que controle el tráfico saliente de los objetos Pod con la etiqueta app=foo y que solo permita el tráfico a los objetos Pod con la etiqueta app=hello, así como el tráfico DNS.

El siguiente manifiesto especifica un NetworkPolicy que controla el tráfico de salida de los objetos Pod con la etiqueta app=foo con dos destinos permitidos:

  1. Objetos Pod en el mismo espacio de nombres con la etiqueta app=hello
  2. Endpoints internos o externos en el puerto 53 (UDP y TCP)
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: foo-allow-to-hello
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: foo
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: hello
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP

Aplica esta política al clúster:

kubectl apply -f foo-allow-to-hello.yaml

Validar la política de salida

  1. Despliega una nueva aplicación web llamada hello-web-2 y exponla internamente en el clúster:

    kubectl run hello-web-2 --labels app=hello-2 \
      --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
    
  2. Ejecuta un pod temporal con la etiqueta app=foo y comprueba que el pod puede establecer conexiones con hello-web:8080:

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
      -- wget -qO- --timeout=2 http://hello-web:8080
    

    El Pod responde a la solicitud:

    Hello, world!
    Version: 1.0.0
    Hostname: hello-web-2258067535-vbx6z
    
  3. Valida que el Pod no puede establecer conexiones con hello-web-2:8080:

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
        -- wget -qO- --timeout=2 http://hello-web-2:8080
    

    El resultado confirma que la conexión no recibe ninguna respuesta:

    wget: download timed out
    
  4. Valida que el pod no puede establecer conexiones con sitios web externos, como www.example.com.

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
        -- wget -qO- --timeout=2 http://www.example.com
    

    El resultado confirma que la conexión no recibe ninguna respuesta:

    wget: download timed out
    

Limpieza

Para eliminar los recursos que has creado en este tutorial, ejecuta estos comandos:

kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml

Siguientes pasos