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-namespace
Cela ajoute immédiatement un namespace appelé mon-namespace
au cluster.
Lister tous les namespaces
kubectl get namespaces
Cela 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 5m
Les namespaces par défaut incluent default
, kube-system
et
kube-public
.
Voir les détails d’un namespace
kubectl describe namespace mon-namespace
Cela permet d’afficher les annotations, labels et quotas liés au namespace.
Supprimer un namespace
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: v1kind: Namespacemetadata: name: mon-namespace labels: environment: test
Une fois ce fichier sauvegardé (mon-namespace.yaml
), nous pouvons l’appliquer
au cluster avec :
kubectl apply -f mon-namespace.yaml
Pour vérifier que le namespace a bien été créé :
kubectl get namespaces
Si des modifications sont apportées au fichier, on peut les appliquer avec :
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 :
kubectl get pods -n mon-namespace
Créer un pod directement dans un namespace :
kubectl run nginx --image=nginx -n mon-namespace
Consulter les événements d’un namespace :
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 :
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
:
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 :
-
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.
- Une mauvaise configuration ou une surcharge dans
-
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
-
-
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. -
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-system
sans 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.
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
etk9s
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.