Kubernetes: Políticas de red
Anteriormente, ya hemos hablado de Kubernetes y networking.
Hoy vamos a hablar de políticas de red para Kubernetes, que son las pequeñas herramientas de seguridad que podemos usar, para entre otras cosas, controlar como se comunican nuestros pods dentro del clúster entre sí, y con otros recursos de la red.
Las políticas de red, definen las reglas que determinan qué tráfico está permitido hacia y desde los pods, basándose en atributos como etiquetas de pods, namespaces, y otros identificadores. Esto es fundamental para poder asegurar las aplicaciones y evitar accesos no autorizados.
Como la mejor forma de aprender es bajo un ejemplo, simularemos una aplicación Web en 3 capas (Frontend, Backend y base de datos)
Componentes Clave de las Políticas de Red
- Selector de Pods: Define los pods a los que se aplica la política.
- Ingress Rules: Controlan el tráfico entrante a los pods seleccionados.
- Egress Rules: Controlan el tráfico saliente de los pods seleccionados.
- Namespaces: Las políticas pueden aplicarse a pods dentro de namespaces específicos.
Ejemplo: Configuración de Políticas de Red para una Aplicación Web
Supongamos que tienes una aplicación web que consiste en tres componentes principales:
- Frontend: Servicio web que atiende solicitudes HTTP de usuarios.
- Backend: Servicio que proporciona lógica de negocio.
- Base de datos: Servicio de almacenamiento de datos.
Para asegurar esta aplicación web, aplicaremos políticas de red que limiten la comunicación entre estos componentes y controlen el acceso desde el exterior.
1. Configurar el Namespace y los Pods
Creamos el namespace production y desplegamos los pods con etiquetas:
1 |
kubectl create namespace production |
Archivo YAML para los pods (pods.yml):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
apiVersion: v1 kind: Pod metadata: name: frontend namespace: production labels: app: myapp tier: frontend spec: containers: - name: nginx image: nginx --- apiVersion: v1 kind: Pod metadata: name: backend namespace: production labels: app: myapp tier: backend spec: containers: - name: app image: myapp/backend --- apiVersion: v1 kind: Pod metadata: name: database namespace: production labels: app: myapp tier: database spec: containers: - name: mysql image: mysql env: - name: MYSQL_ROOT_PASSWORD value: "password" |
Aplica el archivo YAML para desplegar los pods:
1 |
kubectl apply -f pods.yml |
2. Aplicar políticas de red Kubernetes
Creamos los archivos YAML de las políticas de red:
- Archivo allow-frontend-access-from-lan.yml:
- Permitir el acceso al frontend desde una IP de la LAN por el puerto 80
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend-access-from-lan namespace: production spec: podSelector: matchLabels: tier: frontend policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 192.168.2.100/32 # IP de la LAN permitida ports: - protocol: TCP port: 80 # Puerto permitido |
- Archivo allow-backend-access-to-db.yml:
- Permitir acceso del backend a la base de datos por el puerto 3306
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-backend-access-to-db namespace: production spec: podSelector: matchLabels: tier: database policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: tier: backend ports: - protocol: TCP port: 3306 |
- Archivo allow-backend-egress-to-ip.yml:
- Permitimos la salida del backend a una IP específica por el puerto 443
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-backend-egress-to-ip namespace: production spec: podSelector: matchLabels: tier: backend policyTypes: - Egress egress: - to: - ipBlock: cidr: 203.0.113.5/32 # IP externa permitida ports: - protocol: TCP port: 443 # Puerto HTTPS |
1 2 3 |
kubectl apply -f allow-frontend-access-from-lan.yml kubectl apply -f allow-backend-access-to-db.yml kubectl apply -f allow-backend-egress-to-ip.yml |
Verificación y Monitoreo políticas de red Kubernetes
- Verificar las Políticas Aplicadas:
1 |
kubectl get networkpolicies -n production |
- Monitorear los Logs: Usa kubectl logs para verificar que los pods se comportan como se espera y que las políticas están efectivamente limitando el tráfico.
1 2 3 |
kubectl logs frontend -n production kubectl logs backend -n production kubectl logs database -n production |
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?