Comment Isoler les Environnements dans un Cluster Kubernetes : VLANs et Network Policies

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.


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 ?

  1. 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.).
  2. 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.