Aller au contenu

Namespaces Kubernetes : isolation et gestion avancée

Mise à jour :

logo kubernetes

Lorsque l’on travaille avec Kubernetes, la gestion des ressources Kubernetes peut rapidement devenir complexe, surtout lorsqu’il y a plusieurs équipes ou projets partageant un même cluster. C’est là qu’interviennent les namespaces : ils permettent d’isoler logiquement les ressources pour mieux organiser et sécuriser les déploiements.

Qu’est-ce qu’un namespace Kubernetes ?

Pour bien comprendre les namespaces dans Kubernetes, il est essentiel de revenir à leur origine : les namespaces du noyau Linux. Introduits en 2002 avec la version 2.4.19 du noyau, les namespaces sont une fonctionnalité qui permet d’isoler des ressources système pour des groupes de processus spécifiques. Cette isolation offre à chaque groupe une vue distincte des ressources système, garantissant qu’un ensemble de processus ne puisse pas interférer avec un autre.

Kubernetes exploite ce concept en implémentant les namespaces pour segmenter et organiser les ressources au sein d’un cluster. Dans Kubernetes, un namespace est une abstraction qui permet de diviser un cluster en espaces logiques distincts.

Chaque namespace contient ses propres ensembles de pods, services et autres objets, offrant une séparation claire entre différentes applications ou environnements.

Pourquoi utiliser les namespaces dans Kubernetes ?

  • Organisation : En segmentant le cluster en namespaces, il devient plus simple de gérer et de superviser les déploiements, surtout dans des environnements complexes avec de multiples applications.

  • Isolation des ressources : Les namespaces permettent de séparer les ressources entre différentes équipes ou projets, évitant ainsi les conflits et facilitant la gestion.

  • Gestion des accès : Ils offrent un cadre pour appliquer des politiques de sécurité et de contrôle d’accès spécifiques à chaque espace, renforçant ainsi la sécurité globale du cluster.

Il est important de noter que certains objets Kubernetes, tels que les nœuds et les volumes persistants, ne sont pas liés à un namespace spécifique et sont considérés comme des ressources globales du cluster.

Création et gestion des namespaces dans Kubernetes

Dans Kubernetes, il existe deux approches principales pour créer un namespace :

  • Approche impérative : Création et gestion des namespaces avec des commandes kubectl.
  • Approche déclarative : Définition des namespaces avec des fichiers YAML, facilitant l’automatisation et la traçabilité.

Voyons comment utiliser ces deux méthodes.

Création d’un namespace en mode impératif

L’approche impérative consiste à utiliser directement la commande kubectl pour créer un namespace sans avoir besoin d’un fichier de configuration.

Créer un namespace

Terminal window
kubectl create namespace mon-namespace

Cela ajoute immédiatement un namespace appelé mon-namespace au cluster.

Lister tous les namespaces

Terminal window
kubectl get namespaces

Cela affiche une liste des namespaces existants dans le cluster. Exemple de sortie :

Terminal window
NAME STATUS AGE
default Active 10d
kube-system Active 10d
kube-public Active 10d
mon-namespace Active 5m

Les namespaces par défaut incluent default, kube-system et kube-public.

Voir les détails d’un namespace

Terminal window
kubectl describe namespace mon-namespace

Cela permet d’afficher les annotations, labels et quotas liés au namespace.

Supprimer un namespace

Terminal window
kubectl delete namespace mon-namespace

Création d’un namespace en mode déclaratif

Avec l’approche déclarative, nous utilisons un fichier YAML pour définir le namespace, ce qui permet une meilleure gestion et intégration avec des outils comme GitOps.

Exemple d’un fichier YAML pour un namespace :

apiVersion: v1
kind: Namespace
metadata:
name: mon-namespace
labels:
environment: test

Une fois ce fichier sauvegardé (mon-namespace.yaml), nous pouvons l’appliquer au cluster avec :

Terminal window
kubectl apply -f mon-namespace.yaml

Pour vérifier que le namespace a bien été créé :

Terminal window
kubectl get namespaces

Si des modifications sont apportées au fichier, on peut les appliquer avec :

Terminal window
kubectl apply -f mon-namespace.yaml

Cette approche est recommandée pour une gestion versionnée des namespaces et pour les environnements de production.

Utilisation de l’option -n pour spécifier un namespace

Par défaut, toutes les commandes kubectl s’exécutent dans le namespace default. Pour interagir avec un autre namespace, on utilise l’option -n (ou --namespace).

Lister les pods dans un namespace spécifique :

Terminal window
kubectl get pods -n mon-namespace

Créer un pod directement dans un namespace :

Terminal window
kubectl run nginx --image=nginx -n mon-namespace

Consulter les événements d’un namespace :

Terminal window
kubectl get events -n mon-namespace

Changer le namespace par défaut de la session actuelle :

Si vous souhaitez éviter d’avoir à ajouter -n à chaque commande :

Terminal window
kubectl config set-context --current --namespace=mon-namespace

Maintenant, toutes les commandes s’exécuteront par défaut dans mon-namespace.

Le namespace kube-system

Dans un cluster Kubernetes, plusieurs namespaces sont créés automatiquement, notamment kube-system, qui joue un rôle important dans le bon fonctionnement du cluster.

Ce namespace est réservé aux composants internes de Kubernetes, et il est essentiel de comprendre son utilisation et d’adopter des bonnes pratiques pour éviter d’éventuels problèmes.

Qu’est-ce que le namespace kube-system ?

Le namespace kube-system contient toutes les ressources essentielles au fonctionnement du cluster Kubernetes. Il est créé automatiquement lors de l’installation du cluster et héberge principalement :

  • Les composants du plan de contrôle (cf architecture de Kubernetes) :

    • kube-apiserver (API Server)
    • kube-controller-manager
    • kube-scheduler
  • Les services réseau

    • coredns (gestion du DNS interne de Kubernetes)
    • kube-proxy (gestion du routage du trafic entre les pods)
    • Plugins CNI (Calico, Flannel, Cilium…)
  • Les outils de monitoring et d’autoscaling

    • metrics-server (utilisé pour l’auto-scaling des pods)
    • kube-state-metrics (fournit des métriques sur l’état du cluster)

Pour afficher les ressources dans kube-system :

Terminal window
kubectl get all -n kube-system

Bonnes pratiques pour l’utilisation de kube-system.

Même si techniquement il est possible de déployer ses propres applications dans kube-system, c’est fortement déconseillé, car :

  1. Risque de perturbation du cluster

    • Une mauvaise configuration ou une surcharge dans kube-system peut impacter les services critiques de Kubernetes.
    • Exemple : si un pod consomme trop de ressources, cela peut ralentir kube-apiserver, rendant le cluster instable.
  2. Difficulté de gestion et de maintenance

    • kube-system est déjà rempli de nombreux pods et services Kubernetes. Ajouter des applications complique le dépannage et la lisibilité.

    • Lister ses propres ressources devient compliqué :

      Terminal window
      kubectl get pods -n kube-system
  3. Mises à jour et maintenance du cluster : Certaines distributions Kubernetes peuvent réinitialiser kube-system lors d’une mise à jour, ce qui peut entraîner la suppression des applications non prévues pour ce namespace.

  4. Surveillez régulièrement l’état des pods kube-system : Si certains composants critiques redémarrent en boucle (CrashLoopBackOff), cela peut indiquer un problème sous-jacent.

Terminal window
kubectl get pods -n kube-system
  1. Ne modifiez pas les ressources de kube-system sans raison valable : Les modifications sur ce namespace doivent être réfléchies et testées avant d’être appliquées en production.

  2. Évitez d’y supprimer des pods manuellement

Outils

Pour faciliter la navigation parmi les namespaces d’un cluster Kubernetes, plusieurs outils en ligne de commande sont disponibles :

  • kubens : Permet de changer rapidement de namespace sans avoir à spécifier l’option -n à chaque commande kubectl.

  • k9s : Fournit une interface utilisateur en terminal pour interagir de manière interactive avec les ressources Kubernetes, y compris les namespaces et les contextes.

Conclusion

Les namespaces Kubernetes sont essentiels pour organiser et isoler les ressources au sein d’un cluster. En segmentant l’environnement en espaces logiques distincts, ils permettent une meilleure gestion, une meilleure isolation des workloads et une optimisation des ressources.

Nous avons vu comment :

  • Créer et gérer les namespaces avec kubectl, en mode impératif et déclaratif.
  • Utiliser l’option -n et les contextes pour simplifier la gestion des namespaces.
  • Éviter d’utiliser kube-system pour les déploiements utilisateur et adopter de bonnes pratiques.
  • Utiliser des outils comme kubens, kubectx, kubie et k9s pour gagner en efficacité.

Bonnes pratiques à retenir

✔ Toujours utiliser des namespaces dédiés pour chaque projet ou environnement. ✔ Ne pas déployer d’applications dans kube-system.

En appliquant ces principes, vous garantirez une meilleure organisation, une sécurité renforcée et un cluster Kubernetes plus facile à administrer.