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.
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
Configura un
NetworkPolicy
para permitir el tráfico al podhello-web
solo desde los objetos de podapp=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 etiquetaapp=foo
:Aplica esta política al clúster:
kubectl apply -f hello-allow-from-foo.yaml
Verificar la política de entrada
Ejecuta un pod temporal con la etiqueta
app=foo
. Para verificar que se permite el tráfico entrante, haz una solicitud al endpointhello-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 podapp=hello
está habilitado, el resultado será el siguiente:Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
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:
- Objetos Pod en el mismo espacio de nombres con la etiqueta
app=hello
- Endpoints internos o externos en el puerto 53 (UDP y TCP)
Aplica esta política al clúster:
kubectl apply -f foo-allow-to-hello.yaml
Validar la política de salida
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
Ejecuta un pod temporal con la etiqueta
app=foo
y comprueba que el pod puede establecer conexiones conhello-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
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
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
- Documentación de las políticas de red de Kubernetes
- Utiliza el registro de políticas de red para registrar cuándo permiten o deniegan las políticas de red de tu clúster las conexiones a objetos Pod.