Aller au contenu principal

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