Chapitre 9.3 - Network Policies
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Comprendre ce que sont les Network Policies
- Créer des Network Policies pour isoler le trafic
- Configurer les règles ingress et egress
- Utiliser les selectors pour cibler les Pods
- Implémenter la segmentation réseau
- Comprendre les limitations
Introduction
Les Network Policies permettent de contrôler le trafic réseau entre les Pods dans un cluster Kubernetes. Elles fournissent une segmentation réseau au niveau de l'application.
Qu'est-ce qu'une Network Policy?
Une Network Policy définit des règles qui contrôlent le trafic réseau entre les Pods. Elle permet de:
- Autoriser ou bloquer le trafic ingress (entrant)
- Autoriser ou bloquer le trafic egress (sortant)
- Filtrer par namespace, labels, ou IPs
Important: Les Network Policies nécessitent un CNI qui les supporte (Calico, Cilium, etc.).
Comportement par Défaut
Sans Network Policy
Par défaut: Tous les Pods peuvent communiquer avec tous les autres Pods.
Avec Network Policy
Isolation: Seul le trafic autorisé est permis.
Exemple Basique
Network Policy: Isoler un Namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: production
spec:
podSelector: {} # Tous les Pods
policyTypes:
- Ingress
- Egress
Résultat: Aucun trafic ingress ou egress n'est autorisé dans le namespace production.
Network Policy: Autoriser le Trafic Interne
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-internal
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: production
Résultat: Seul le trafic depuis le namespace production est autorisé.
Selectors
Pod Selector
Cibler des Pods spécifiques:
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
Résultat: Les Pods avec app=web et tier=frontend peuvent recevoir du trafic seulement des Pods avec app=api.
Namespace Selector
Cibler des namespaces:
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: frontend
IP Block
Cibler des plages d'IPs:
spec:
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
except:
- 192.168.1.100/32
Exemple Complet: Application Multi-Tiers
Architecture
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: [] # Autoriser depuis n'importe où (Internet via 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: [] # Pas de trafic sortant autorisé
Ports et Protocoles
Spécifier les Ports
spec:
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
- protocol: UDP
port: 53
Port Range (selon CNI)
Certains CNI supportent les plages de ports:
spec:
ingress:
- ports:
- protocol: TCP
port: 8000-8999
Commandes Utiles
Gestion
# Créer une Network Policy
kubectl apply -f network-policy.yaml
# Voir les Network Policies
kubectl get networkpolicies
kubectl get netpol
# Détails
kubectl describe networkpolicy frontend-policy
# Voir par namespace
kubectl get netpol -n production
Test
# Tester la connectivité depuis un Pod
kubectl exec -it test-pod -- curl http://api-service:8080
# Voir les règles appliquées (selon CNI)
# Calico
calicoctl get networkpolicies
Limitations
1. Support CNI
Tous les CNI ne supportent pas les Network Policies:
- Supportent: Calico, Cilium, Weave Net, Antrea
- Ne supportent pas: Flannel (basique)
2. Performance
Les Network Policies peuvent impacter les performances selon le CNI.
3. Complexité
La gestion de nombreuses Network Policies peut devenir complexe.
Bonnes Pratiques
1. Démarrage Progressif
Commencer par isoler les namespaces critiques, puis étendre.
2. Documentation
Documenter les règles de communication entre les services.
3. Tests
Tester les Network Policies avant de les appliquer en production.
4. Monitoring
Surveiller les connexions bloquées pour détecter les problèmes.
5. Default Deny
Utiliser une politique "deny all" par défaut, puis autoriser explicitement.
Résumé
Dans ce chapitre, vous avez appris:
Network Policy: Contrôle du trafic réseau entre Pods
Comportement par défaut: Tous les Pods peuvent communiquer
Selectors: Pod, namespace, IP block
Ingress/Egress: Règles pour trafic entrant et sortant
Ports: Spécifier les ports et protocoles autorisés
Cas d'usage: Segmentation réseau, isolation multi-tiers
Limitations: Nécessite un CNI compatible
Bonnes pratiques: Démarrage progressif, default deny, tests
Prochaines Étapes
Chapitre 9.4: Pod Security Standards
Lab 9.3: Network Policies Avancées
Chapitre créé le: Décembre 2024