On me demande souvent comment installer un cluster Kubernetes tout en assurant l’isolation entre diffĂ©rents environnements comme la DMZ, la PROD, et la QUALIF. Il existe plusieurs façons de rĂ©pondre Ă cette problĂ©matique, mais la plus simple et efficace consiste Ă configurer des adresses IP multiples de chaque VLAN directement sur les nĆuds du cluster, et Ă gĂ©rer la segmentation du trafic avec des Network Policies.
Il est essentiel de comprendre que dans Kubernetes, la gestion rĂ©seau est plus dynamique qu’avec les VLANs traditionnels. La sĂ©curitĂ© et l’isolation sont souvent gĂ©rĂ©es directement via des politiques rĂ©seau internes, et non simplement au niveau de l’infrastructure physique.
Table of Contents
Le Réseau dans Kubernetes : Un Nouveau Monde
Dans une infrastructure réseau traditionnelle, on utilise généralement des VLANs, des firewalls, et des rÚgles de routage pour séparer les environnements comme la DMZ et la PROD. En revanche, dans Kubernetes, la gestion réseau se fait de maniÚre plus fine avec des CNI (Container Network Interfaces), comme Calico. Ces outils permettent de définir comment les pods (les unités de travail dans Kubernetes) communiquent entre eux.
La Sécurité dans Kubernetes
Par dĂ©faut, tous les pods dans un cluster Kubernetes peuvent se parler. Cela peut poser un problĂšme de sĂ©curitĂ© si tu as des environnements critiques comme la PROD et la DMZ, qui ne devraient pas Ă©changer de donnĂ©es. C’est ici que les Network Policies interviennent pour permettre ou bloquer les communications rĂ©seau au sein du cluster.
Solution 1 : Utiliser des IPs Multiples et des Network Policies
La solution la plus simple pour isoler tes environnements est d’attribuer plusieurs adresses IP sur chaque nĆud Kubernetes, chaque adresse IP Ă©tant associĂ©e Ă un VLAN distinct (par exemple : DMZ, PROD, QUALIF). Ensuite, tu peux gĂ©rer la segmentation du trafic avec des Network Policies.
Pourquoi cette approche est simple ?
- Pas besoin d’outils complexes : Tu configures simplement plusieurs IPs sur les nĆuds, correspondant aux VLANs dĂ©jĂ en place dans ton infrastructure rĂ©seau.
- Network Policies : Ce sont elles qui feront le travail pour isoler le trafic entre les environnements. Tu as un contrÎle trÚs précis sur les communications.
Comment mettre en place cette solution ?
- Configurer les VLANs sur les nĆuds Kubernetes : Chaque nĆud du cluster aura plusieurs adresses IP, chacune correspondant Ă un VLAN (exemple : une IP pour le VLAN de la DMZ, une autre pour celui de la PROD, etc.).
- Utiliser les Network Policies : Ces politiques permettent de dĂ©finir quels pods ou namespaces peuvent communiquer entre eux. Par exemple, tu peux empĂȘcher les pods de la DMZ dâaccĂ©der Ă ceux de la PROD, tout en autorisant certaines exceptions spĂ©cifiques.
Exemple d’Utilisation de Network Policies pour Isoler les Environnements
Prenons un exemple concret : Tu veux interdire toute communication entre les pods de la DMZ et ceux de la PROD. Cela peut ĂȘtre fait en utilisant une Network Policy basĂ©e sur les namespaces. Voici comment la configuration fonctionne :
Politique d’isolation par Namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-dmz-to-prod
namespace: prod
spec:
podSelector: {} # Applique cette rĂšgle Ă tous les pods du namespace "prod"
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
environment: dmz
Dans cet exemple :
- Namespace « prod » : La politique est appliquée dans le namespace prod.
- PodSelector : En le laissant vide (
{}
), la politique s’applique Ă tous les pods de ce namespace. - NamespaceSelector : Il spĂ©cifie que la rĂšgle concerne le namespace qui a le label
environment: dmz
, donc les pods du namespace dmz ne peuvent plus envoyer de trafic vers les pods de prod.
Pourquoi utiliser les Labels ici ?
Les labels sur les namespaces permettent de gérer dynamiquement les politiques réseau. Si tu as plusieurs namespaces (par exemple dmz-web, dmz-api), tu peux tous les étiqueter avec environment: dmz
, ce qui te permet de créer une rÚgle commune pour tous ces namespaces.
Exemple d’Isolation ComplĂšte entre les Namespaces (Sauf via l’Ingress)
Si tu veux isoler complĂštement tes environnements (chaque namespace est isolĂ© des autres) mais que tu veux autoriser le trafic via un Ingress Controller (comme NGINX), tu peux configurer une Network Policy qui bloque tout sauf le trafic venant d’un Ingress.
Voici un exemple qui interdit toute communication inter-namespace sauf via Ingress :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-cross-namespace-traffic
namespace: prod # Applique cette rĂšgle dans le namespace "prod"
spec:
podSelector: {} # Applique cette rĂšgle Ă tous les pods du namespace "prod"
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: {} # Bloque tout trafic provenant d'autres namespaces
- from:
- podSelector: {} # Cela permet les connexions via Ingress
Dans cet exemple :
- Tous les namespaces sont bloquĂ©s : Aucune communication entre les namespaces nâest autorisĂ©e par dĂ©faut.
- Seul l’Ingress est autorisĂ© : Le trafic qui passe par un Ingress Controller (un service externe exposĂ©) est autorisĂ©, car l’Ingress est liĂ© directement au pod via des services spĂ©cifiques.
Alternative 1 : Multus CNI pour la Gestion de Plusieurs Interfaces Réseau
Une autre approche consiste Ă utiliser Multus CNI, qui permet d’affecter plusieurs interfaces rĂ©seau Ă chaque pod. Cela peut ĂȘtre intĂ©ressant si tu souhaites isoler les environnements via des interfaces distinctes au lieu dâutiliser plusieurs adresses IP sur les nĆuds.
Comment ça marche ?
- Multus permet plusieurs interfaces : Chaque pod peut avoir plusieurs interfaces réseau. Par exemple, une interface pour le réseau DMZ, une autre pour PROD, etc.
- Gestion des VLANs : Chaque interface peut ĂȘtre associĂ©e Ă un VLAN spĂ©cifique, te permettant de gĂ©rer physiquement la segmentation du trafic.
Avantages
- Isolation physique stricte : Chaque environnement dispose de sa propre interface réseau.
- Granularité : Tu peux définir des interfaces spécifiques pour chaque environnement.
Inconvénients
- Complexité accrue : Configurer Multus nécessite plus de travail et augmente la charge de gestion.
Alternative 2 : Clusters Séparés pour Chaque Environnement
Une approche encore plus radicale consiste à déployer plusieurs clusters Kubernetes séparés pour chaque environnement (DMZ, PROD, QUALIF). Chaque cluster aurait son propre réseau et CNI, garantissant une isolation totale.
Avantages
- Isolation complÚte : Chaque environnement est totalement isolé au niveau des clusters, sans partage des ressources réseau.
Inconvénients
- Coût élevé : Mettre en place et gérer plusieurs clusters demande beaucoup de ressources et de temps.
Conclusion : Utiliser les IPs Multiples et les Network Policies pour une Simplicité Maximale
Pour isoler efficacement tes environnements tout en minimisant la complexitĂ©, la solution la plus simple est de configurer plusieurs IPs pour chaque VLAN sur les nĆuds Kubernetes, puis d’utiliser des Network Policies pour gĂ©rer la segmentation du trafic. Cela te permet de tirer parti des VLANs dĂ©jĂ en place dans ton infrastructure tout en gardant une flexibilitĂ© maximale dans Kubernetes.
Si tu cherches une solution plus stricte ou granulaire, tu peux envisager dâutiliser Multus CNI ou mĂȘme de dĂ©ployer des clusters Kubernetes sĂ©parĂ©s. Toutefois, pour la majoritĂ© des cas, l’approche via les IPs multiples et Calico est un compromis idĂ©al entre simplicitĂ© et efficacitĂ©. Un autre compromis intĂ©ressant qui combine le meilleur des deux mondes est Harvester, une solution HCI qui simplifie la gestion des infrastructures virtualisĂ©es et Kubernetes en offrant une plateforme unifiĂ©e.