Capítulo 9.3 - Network Policies
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender qué son las Network Policies
- Crear Network Policies para aislar el tráfico
- Configurar reglas de ingress y egress
- Utilizar selectors para seleccionar Pods
- Implementar la segmentación de red
- Comprender las limitaciones
Introducción
Las Network Policies permiten controlar el tráfico de red entre los Pods en un clúster de Kubernetes. Proporcionan segmentación de red a nivel de aplicación.
¿Qué es una Network Policy?
Una Network Policy define reglas que controlan el tráfico de red entre los Pods. Permite:
- Autorizar o bloquear el tráfico ingress (entrante)
- Autorizar o bloquear el tráfico egress (saliente)
- Filtrar por namespace, labels o IPs
Importante: Las Network Policies requieren un CNI que las soporte (Calico, Cilium, etc.).
Comportamiento por Defecto
Sin Network Policy
Por defecto: Todos los Pods pueden comunicarse entre sí.
Con Network Policy
Aislamiento: Solo el tráfico autorizado está permitido.
Ejemplo Básico
Network Policy: Aislar un Namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: production
spec:
podSelector: {} # Todos los Pods
policyTypes:
- Ingress
- Egress
Resultado: No se permite ningún tráfico de ingress ni egress en el namespace production.
Network Policy: Autorizar el Tráfico Interno
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-internal
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: production
Resultado: Solo se permite el tráfico proveniente del namespace production.
Selectors
Pod Selector
Seleccionar Pods específicos:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-network-policy
spec:
podSelector:
matchLabels:
app: web
tier: frontend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api
Resultado: Los Pods con app=web y tier=frontend solo pueden recibir tráfico de Pods con app=api.
Namespace Selector
Seleccionar namespaces:
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: frontend
IP Block
Seleccionar rangos de IPs:
spec:
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
except:
- 192.168.1.100/32
Ejemplo Completo: Aplicación Multi-Tier
Arquitectura
Network Policy: Frontend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-policy
namespace: frontend
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
- Egress
ingress:
- from: [] # Permitir desde cualquier lugar (Internet vía Ingress)
egress:
- to:
- namespaceSelector:
matchLabels:
name: backend
ports:
- protocol: TCP
port: 80
Network Policy: Backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-policy
namespace: backend
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- namespaceSelector:
matchLabels:
name: database
ports:
- protocol: TCP
port: 5432
Network Policy: Database
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database-policy
namespace: database
spec:
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: backend
ports:
- protocol: TCP
port: 5432
egress: [] # No se permite tráfico saliente
Puertos y Protocolos
Especificar los Puertos
spec:
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
- protocol: UDP
port: 53
Port Range (según CNI)
Algunos CNI soportan rangos de puertos:
spec:
ingress:
- ports:
- protocol: TCP
port: 8000-8999
Comandos Útiles
Gestión
# Crear una Network Policy
kubectl apply -f network-policy.yaml
# Ver las Network Policies
kubectl get networkpolicies
kubectl get netpol
# Detalles
kubectl describe networkpolicy frontend-policy
# Ver por namespace
kubectl get netpol -n production
Prueba
# Probar la conectividad desde un Pod
kubectl exec -it test-pod -- curl http://api-service:8080
# Ver las reglas aplicadas (según CNI)
# Calico
calicoctl get networkpolicies
Limitaciones
1. Soporte CNI
No todos los CNI soportan Network Policies:
- Soportan: Calico, Cilium, Weave Net, Antrea
- No soportan: Flannel (básico)
2. Rendimiento
Las Network Policies pueden impactar el rendimiento según el CNI.
3. Complejidad
La gestión de muchas Network Policies puede volverse compleja.
Buenas Prácticas
1. Inicio Progresivo
Comenzar aislando los namespaces críticos, luego expandir.
2. Documentación
Documentar las reglas de comunicación entre los servicios.
3. Pruebas
Probar las Network Policies antes de aplicarlas en producción.
4. Monitoreo
Supervisar las conexiones bloqueadas para detectar problemas.
5. Default Deny
Utilizar una política "deny all" por defecto y luego autorizar explícitamente.
Resumen
En este capítulo, usted ha aprendido:
Network Policy: Control del tráfico de red entre Pods
Comportamiento por defecto: Todos los Pods pueden comunicarse
Selectors: Pod, namespace, IP block
Ingress/Egress: Reglas para tráfico entrante y saliente
Ports: Especificar los puertos y protocolos permitidos
Casos de uso: Segmentación de red, aislamiento multi-tier
Limitaciones: Requiere un CNI compatible
Buenas prácticas: Inicio progresivo, default deny, pruebas
Próximos Pasos
Capítulo 9.4: Pod Security Standards
Lab 9.3: Network Policies Avanzadas
Capítulo creado el: Diciembre 2024