En este tutorial se explica cómo usar las políticas de red de clúster para controlar qué pods reciben tráfico de red entrante y qué pods pueden enviar tráfico saliente. Para obtener más información, consulta el artículo Crear una política de red de clúster.
Las políticas de red te permiten limitar las conexiones entre pods. Por lo tanto, el uso de políticas de red proporciona una mayor seguridad al reducir el radio de vulneración.
Ten en cuenta que las políticas de red determinan si se permite una conexión y no ofrecen funciones de nivel superior, como la autorización o el transporte seguro (como SSL/TLS).
Objetivos
En este tutorial, aprenderás a:- Crear clústeres con la aplicación de políticas de red
- Restringir el tráfico entrante a pods mediante etiquetas
- Restringir el tráfico saliente desde pods mediante etiquetas
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.
Antes de empezar
Sigue estos pasos para habilitar la API de Kubernetes Engine:- Ve a la página de Kubernetes Engine en la Google Cloud consola.
- Crea o selecciona un proyecto.
- Espera a que la API y los servicios relacionados se habiliten. Este proceso puede tardar varios minutos.
-
Verify that billing is enabled for your Google Cloud project.
Instala las siguientes herramientas de línea de comandos utilizadas en este tutorial:
-
gcloud
se usa para crear y eliminar clústeres de Kubernetes Engine.gcloud
se incluye en la CLI degcloud
. -
kubectl
se usa para gestionar Kubernetes, el sistema de orquestación de clústeres que utiliza Kubernetes Engine. Puedes instalarkubectl
congcloud
:gcloud components install kubectl
Clona el código de ejemplo de GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/networking/network-policies
Configurar los valores predeterminados de la herramienta de línea de comandos gcloud
Para ahorrar tiempo al escribir el ID de proyecto y las opciones de zona de Compute Engine en la herramienta de línea de comandos gcloud
, puedes definir los valores predeterminados:
gcloud config set project project-id gcloud config set compute/zone compute-zone
Crear un clúster de GKE con la implementación obligatoria de la política de red
Para crear un clúster de contenedores con la aplicación de la política de red, ejecuta el siguiente comando:
gcloud container clusters create test --enable-network-policy
Restringir el tráfico entrante a los pods
Los recursos de Kubernetes NetworkPolicy
te permiten configurar políticas de acceso a la red para los pods. Los objetos NetworkPolicy
contienen la siguiente información:
Pods a los que se aplican las políticas de red, normalmente designados por un selector de etiquetas
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
Para las políticas de entrada, los pods que pueden conectarse a los pods especificados
En el caso de las políticas de salida, los pods a los que pueden conectarse los pods especificados
Primero, 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
A continuación, configura un NetworkPolicy
para permitir el tráfico a los pods hello-web
solo desde los pods app=foo
. El resto del tráfico entrante de los pods que no tienen esta etiqueta, el tráfico externo y el tráfico de los pods en otros espacios de nombres están bloqueados.
El siguiente manifiesto selecciona los pods con la etiqueta app=hello
y especifica una política de entrada para permitir el tráfico solo de los pods con la etiqueta app=foo
:
Para aplicar esta política en el clúster, ejecuta el siguiente comando:
kubectl apply -f hello-allow-from-foo.yaml
Validar la política de entrada
Primero, ejecuta un pod temporal con la etiqueta app=foo
y obtén un shell en el pod:
kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t test-1
Envía una solicitud al endpoint hello-web:8080
para verificar que se permite el tráfico entrante:
/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z / # exit
El tráfico del pod app=foo
a los pods app=hello
está habilitado.
A continuación, ejecuta un pod temporal con otra etiqueta (app=other
) y obtén un shell
dentro del pod:
kubectl run -l app=other --image=alpine --restart=Never --rm -i -t test-1
Realiza la misma petición para observar que el tráfico no está permitido y, por lo tanto, la petición expira y sale del shell del pod:
/ # wget -qO- --timeout=2 http://hello-web:8080
wget: download timed out / # exit
Restringir el tráfico saliente de los pods
Puedes restringir el tráfico saliente de la misma forma que el tráfico entrante.
Sin embargo, para poder consultar nombres de host internos, como hello-web
, o nombres de host externos, como www.example.com
, debes permitir la resolución de DNS (sistema de nombres de dominio) en tus políticas de red de salida. El tráfico DNS se produce en el puerto 53 con protocolos TCP y UDP.
Para habilitar las políticas de red de salida, implementa una NetworkPolicy
que controle el tráfico de salida de los pods con la etiqueta app=foo
y que solo permita el tráfico a los pods con la etiqueta app=hello
, así como el tráfico DNS.
El siguiente manifiesto especifica una política de red que controla el tráfico de salida de los pods con la etiqueta app=foo
con dos destinos permitidos:
- Pods en el mismo espacio de nombres con la etiqueta
app=hello
. - Pods de clúster o endpoints externos en el puerto 53 (UDP y TCP).
Para aplicar esta política en el clúster, ejecuta el siguiente comando:
kubectl apply -f foo-allow-to-hello.yaml
Validar la política de salida
Primero, 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
A continuación, ejecuta un pod temporal con la etiqueta app=foo
y abre un shell dentro del contenedor:
kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never test-3
Valida que el pod puede establecer conexiones con hello-web:8080
:
/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z
Valida que el pod no puede establecer conexiones con hello-web-2:8080
:
/ # wget -qO- --timeout=2 http://hello-web-2:8080
wget: download timed out
Valida que el pod no puede establecer conexiones con sitios web externos, como www.example.com
, y sal de la shell del pod.
/ # wget -qO- --timeout=2 http://www.example.com
wget: download timed out
/ # exit
Limpieza
Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.
Elimina el clúster de contenedores: en este paso se eliminarán los recursos que componen el clúster de contenedores, como las instancias de proceso, los discos y los recursos de red.
gcloud container clusters delete test