Namespaces Kubernetes : isolation et gestion avancée
Mise à jour :
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
kubectl create namespace mon-namespaceCela ajoute immédiatement un namespace appelé mon-namespace au cluster.
Lister tous les namespaces
kubectl get namespacesCela affiche une liste des namespaces existants dans le cluster. Exemple de sortie :
NAME STATUS AGEdefault Active 10dkube-system Active 10dkube-public Active 10dmon-namespace Active 5mLes namespaces par défaut incluent default, kube-system et
kube-public.
Voir les détails d’un namespace
kubectl describe namespace mon-namespaceCela permet d’afficher les annotations, labels et quotas liés au namespace.
Supprimer un namespace
kubectl delete namespace mon-namespaceCré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: v1kind: Namespacemetadata: name: mon-namespace labels: environment: testUne fois ce fichier sauvegardé (mon-namespace.yaml), nous pouvons l’appliquer
au cluster avec :
kubectl apply -f mon-namespace.yamlPour vérifier que le namespace a bien été créé :
kubectl get namespacesSi des modifications sont apportées au fichier, on peut les appliquer avec :
kubectl apply -f mon-namespace.yamlCette 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 :
kubectl get pods -n mon-namespaceCréer un pod directement dans un namespace :
kubectl run nginx --image=nginx -n mon-namespaceConsulter les événements d’un namespace :
kubectl get events -n mon-namespaceChanger le namespace par défaut de la session actuelle :
Si vous souhaitez éviter d’avoir à ajouter -n à chaque commande :
kubectl config set-context --current --namespace=mon-namespaceMaintenant, 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-managerkube-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 :
kubectl get all -n kube-systemBonnes 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 :
-
Risque de perturbation du cluster
- Une mauvaise configuration ou une surcharge dans
kube-systempeut impacter les services critiques de Kubernetes. - Exemple : si un pod consomme trop de ressources, cela peut ralentir
kube-apiserver, rendant le cluster instable.
- Une mauvaise configuration ou une surcharge dans
-
Difficulté de gestion et de maintenance
-
kube-systemest 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
-
-
Mises à jour et maintenance du cluster : Certaines distributions Kubernetes peuvent réinitialiser
kube-systemlors d’une mise à jour, ce qui peut entraîner la suppression des applications non prévues pour ce namespace. -
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.
kubectl get pods -n kube-system-
Ne modifiez pas les ressources de
kube-systemsans raison valable : Les modifications sur ce namespace doivent être réfléchies et testées avant d’être appliquées en production. -
É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 commandekubectl. -
k9s : Fournit une interface utilisateur en terminal pour interagir de manière interactive avec les ressources Kubernetes, y compris les namespaces et les contextes.
Contrôle de connaissances
Pourquoi ce contrôle ?
Cet contrôle va vous permettre de valider vos connaissances sur le sujet abordé dans le guide. Il comporte des QCM, des questions vrai/faux et des réponses ouvertes à un mot.
🕒 Le chronomètre commence dès que vous cliquez sur Démarrer le test. Vous devrez terminer l’examen avant la fin du temps imparti.
🎯 Pour réussir, vous devez obtenir au moins 90% de bonnes réponses.
💡 Je ne fournis pas directement les réponses aux questions. Cependant, si certaines sont complexes, des pistes d’explication pourront être proposées dans le guide ou après l’examen.
Bonne chance ! 🚀
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
-net les contextes pour simplifier la gestion des namespaces. - Éviter d’utiliser
kube-systempour les déploiements utilisateur et adopter de bonnes pratiques. - Utiliser des outils comme
kubens,kubectx,kubieetk9spour gagner en efficacité.