
Un namespace Kubernetes organise votre cluster en espaces logiques distincts. Il permet de séparer les ressources par équipe, projet ou environnement, d’éviter les conflits de noms, et de cibler facilement des politiques (quotas, permissions). Pour une vraie séparation d’équipe en production, vous irez plus loin avec RBAC, ResourceQuota et NetworkPolicy — mais commençons par comprendre ce qu’est un namespace et comment l’utiliser au quotidien.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »À la fin de ce guide, vous saurez :
- Comprendre le rôle d’un namespace : organiser un cluster, séparer équipes et environnements
- Créer et gérer des namespaces : commandes impératives, manifestes déclaratifs, changement de contexte
- Identifier les namespaces système :
default,kube-system,kube-public,kube-node-lease - Connaître les limites : ce qu’un namespace isole vraiment et ce qu’il n’isole pas
- Sécuriser un namespace d’équipe avec le pack minimum : quotas, limites, NetworkPolicy, RBAC
À quoi sert un namespace Kubernetes ?
Section intitulée « À quoi sert un namespace Kubernetes ? »Avant de créer votre premier namespace, comprenons pourquoi cette ressource existe et quels problèmes elle résout.
Organiser un cluster partagé
Section intitulée « Organiser un cluster partagé »Imaginez un cluster Kubernetes utilisé par plusieurs équipes : backend, frontend, data, ops. Sans namespaces, toutes les ressources (pods, services, configmaps) cohabitent dans un espace unique. Le résultat ? Un chaos où il devient difficile de savoir qui a déployé quoi.
Un namespace crée un répertoire logique pour regrouper les ressources liées. C’est comme avoir des dossiers sur un disque dur : chaque équipe travaille dans son espace sans polluer celui des autres.
Éviter les conflits de noms
Section intitulée « Éviter les conflits de noms »Deux équipes veulent créer un service nommé api. Sans namespaces, c’est impossible — le nom est unique dans le cluster. Avec des namespaces séparés (team-backend et team-frontend), chaque équipe peut avoir son propre service api sans conflit.
# Deux services "api" coexistent dans des namespaces différentskubectl get service api -n team-backendkubectl get service api -n team-frontendSéparer les environnements
Section intitulée « Séparer les environnements »Les namespaces permettent de faire cohabiter plusieurs environnements sur le même cluster :
| Namespace | Usage |
|---|---|
dev | Développement, tests rapides |
staging | Pré-production, tests d’intégration |
prod | Production |
Cette séparation facilite l’application de politiques différenciées : quotas généreux en dev, stricts en prod ; accès large en dev, restreint en prod.
Appliquer des politiques ciblées
Section intitulée « Appliquer des politiques ciblées »Un namespace sert de périmètre pour les politiques :
- RBAC : donner à une équipe les droits complets sur son namespace, sans accès aux autres
- ResourceQuota : limiter la consommation CPU/mémoire par namespace
- LimitRange : définir des valeurs par défaut pour les conteneurs
- NetworkPolicy : contrôler le trafic réseau entrant et sortant
Sans namespace, vous ne pourriez pas cibler ces politiques — elles s’appliqueraient à tout le cluster.
Créer et gérer un namespace
Section intitulée « Créer et gérer un namespace »Passons à la pratique. Kubernetes offre deux approches pour créer un namespace, chacune adaptée à des cas d’usage différents.
Création impérative
Section intitulée « Création impérative »L’approche impérative utilise des commandes kubectl directes. Elle convient pour les tests rapides et l’exploration.
# Créer un namespacekubectl create namespace mon-namespace
# Lister tous les namespaceskubectl get namespaces
# Voir les détails (quotas, labels, annotations)kubectl describe namespace mon-namespace
# Supprimer un namespace (supprime TOUTES ses ressources !)kubectl delete namespace mon-namespaceCréation déclarative
Section intitulée « Création déclarative »L’approche déclarative utilise des fichiers YAML versionnés. C’est la méthode recommandée pour la production et les workflows GitOps.
apiVersion: v1kind: Namespacemetadata: name: team-backend labels: team: backend environment: production cost-center: "12345" annotations: owner: "equipe-backend@example.com" description: "Namespace pour les services backend de production"Appliquez ce fichier avec :
kubectl apply -f namespace.yamlLes labels sont particulièrement utiles pour les NetworkPolicies (sélection par namespace) et pour l’organisation (filtrage, reporting de coûts).
Configurer le namespace par défaut
Section intitulée « Configurer le namespace par défaut »Pour éviter d’ajouter -n mon-namespace à chaque commande, configurez le namespace par défaut de votre contexte kubectl :
# Définir le namespace par défautkubectl config set-context --current --namespace=team-backend
# Vérifier le namespace actuelkubectl config view --minify | grep namespace:Tous vos kubectl get pods, kubectl get services, etc. s’exécuteront désormais dans team-backend sans avoir à le spécifier.
Les namespaces initiaux de Kubernetes
Section intitulée « Les namespaces initiaux de Kubernetes »Quand vous tapez kubectl get ns sur un cluster fraîchement créé, vous voyez quatre namespaces. Chacun a un rôle spécifique qu’il est important de comprendre.
Le namespace default est l’espace par défaut pour toutes les ressources qui ne spécifient pas de namespace. C’est pratique pour les tests rapides, mais problématique en production car toutes les ressources s’y mélangent sans organisation.
kube-system
Section intitulée « kube-system »Ce namespace contient les composants essentiels de Kubernetes lui-même : kube-apiserver, kube-controller-manager, kube-scheduler, CoreDNS, kube-proxy, et les plugins CNI. Ces composants sont critiques pour le fonctionnement du cluster.
# Voir les composants systèmekubectl get pods -n kube-systemNe déployez jamais vos applications dans kube-system. Une erreur de configuration ou une surconsommation de ressources pourrait impacter les composants critiques et déstabiliser tout le cluster. De plus, certaines mises à jour de cluster peuvent réinitialiser ce namespace.
kube-public
Section intitulée « kube-public »Ce namespace est lisible par tous les utilisateurs, même non authentifiés. Il est principalement utilisé pour les ressources qui doivent être accessibles publiquement, comme le ConfigMap cluster-info utilisé lors du bootstrap.
# Le ConfigMap cluster-info est accessible sans authentificationkubectl get configmap cluster-info -n kube-public -o yamlEn pratique, ce namespace est peu utilisé. Il existe principalement pour des cas d’usage spécifiques liés au bootstrapping du cluster.
kube-node-lease
Section intitulée « kube-node-lease »Introduit dans Kubernetes 1.14, ce namespace contient des objets Lease pour chaque nœud. Ces Leases permettent au kubelet d’envoyer des heartbeats (signaux de vie) sans surcharger l’API Server avec des mises à jour fréquentes de l’objet Node.
# Voir les leases des nœudskubectl get lease -n kube-node-leaseCe mécanisme optimise la détection de défaillance des nœuds tout en réduisant la charge sur etcd. Vous n’avez généralement pas besoin d’interagir avec ce namespace.
Ce qu’un namespace isole réellement
Section intitulée « Ce qu’un namespace isole réellement »Maintenant que vous savez créer et utiliser des namespaces, voyons précisément ce qu’ils isolent. Un namespace crée une frontière logique avec des effets concrets sur plusieurs aspects de vos ressources.
Isolation des noms de ressources
Section intitulée « Isolation des noms de ressources »Le premier rôle d’un namespace est de créer un scope pour les noms. Deux ressources peuvent porter le même nom si elles sont dans des namespaces différents.
# Créer deux namespaceskubectl create namespace team-devkubectl create namespace team-qa
# Créer un pod "api" dans chaque namespacekubectl run api --image=nginx -n team-devkubectl run api --image=nginx -n team-qa
# Vérifier : les deux pods coexistent sans conflitkubectl get pods api -n team-devkubectl get pods api -n team-qaLes deux pods api existent simultanément, chacun dans son propre espace.
Isolation des ressources sensibles
Section intitulée « Isolation des ressources sensibles »Les ConfigMaps et les Secrets sont scopés par namespace. Un pod dans team-dev ne peut pas monter un Secret créé dans team-qa. Cette isolation protège les données sensibles entre équipes.
# Un secret créé dans team-dev...kubectl create secret generic db-password \ --from-literal=password=secret123 -n team-dev
# ...n'est pas visible depuis team-qakubectl get secret db-password -n team-qa# Error: secrets "db-password" not foundCette isolation s’étend aux ServiceAccounts. Chaque namespace possède automatiquement un ServiceAccount default, et les pods d’un namespace utilisent les ServiceAccounts de ce namespace uniquement.
Portée des politiques RBAC
Section intitulée « Portée des politiques RBAC »Les Role et RoleBinding s’appliquent à un namespace spécifique. Vous pouvez donner à une équipe les droits complets sur son namespace sans lui accorder l’accès aux autres namespaces.
# Un Role qui donne tous les droits... mais seulement dans team-devapiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: full-access namespace: team-devrules:- apiGroups: ["", "apps", "batch"] resources: ["*"] verbs: ["*"]Portée des quotas et limites
Section intitulée « Portée des quotas et limites »Les ResourceQuota et LimitRange sont des ressources namespacées. Ils permettent de limiter la consommation de ressources par namespace, évitant qu’une équipe ne monopolise le cluster.
# Voir les quotas et limites appliqués à un namespacekubectl describe namespace team-devCette commande affiche les quotas configurés et leur utilisation actuelle.
Ce qu’un namespace N’isole PAS
Section intitulée « Ce qu’un namespace N’isole PAS »Comprendre les limites de l’isolation par namespace est crucial pour éviter de faux sentiments de sécurité. Le diagramme ci-dessous illustre la frontière entre ce qui est isolé et ce qui est partagé.
Le réseau par défaut
Section intitulée « Le réseau par défaut »Pour tester cette communication inter-namespace :
# Depuis un pod dans team-dev, on peut joindre un service dans team-qakubectl exec -it mon-pod -n team-dev -- curl http://mon-service.team-qa.svc.cluster.localLa résolution DNS fonctionne car Kubernetes utilise le format <service>.<namespace>.svc.cluster.local pour tous les Services. Sans NetworkPolicy explicite, le trafic passe sans restriction.
Les ressources cluster-wide
Section intitulée « Les ressources cluster-wide »Certaines ressources Kubernetes ne sont pas scopées par namespace. Ces ressources cluster-wide sont partagées par tous :
| Ressource | Description | Impact sur l’isolation |
|---|---|---|
| Nodes | Nœuds du cluster | Tous les pods partagent les mêmes nœuds |
| PersistentVolumes | Stockage persistant | Un PV peut être réclamé depuis n’importe quel namespace |
| StorageClasses | Classes de stockage | Partagées globalement |
| ClusterRole | Rôles RBAC cluster-wide | Permissions globales |
| Namespaces | Eux-mêmes | Visibles par tous |
| IngressClass | Classes d’Ingress | Partagées globalement |
| PriorityClasses | Priorités de scheduling | Affectent le scheduling global |
Pour lister toutes les ressources non-namespacées de votre cluster :
kubectl api-resources --namespaced=falseLes ressources physiques du nœud
Section intitulée « Les ressources physiques du nœud »Les pods de différents namespaces qui s’exécutent sur le même nœud partagent ses ressources physiques :
- CPU et mémoire : Sans quotas, un pod peut consommer toutes les ressources du nœud
- Espace disque : Les volumes ephemeral et les logs partagent le même disque
- Bande passante réseau : Pas d’isolation réseau au niveau nœud par défaut
Cette cohabitation crée le problème du “noisy neighbor” (voisin bruyant) : un pod mal configuré peut dégrader les performances des autres pods sur le même nœud.
Les images conteneur
Section intitulée « Les images conteneur »Le même registry d’images est utilisé par tous les namespaces. Si un développeur push une image malveillante sur un registry partagé, elle peut être utilisée par n’importe quel namespace. L’isolation des images nécessite des politiques au niveau du registry ou des admission controllers.
Pack minimum d’un namespace d’équipe
Section intitulée « Pack minimum d’un namespace d’équipe »Maintenant que vous connaissez ce qu’un namespace isole et ses limites, voici comment le rendre vraiment exploitable en production. Créer un namespace vide ne suffit pas — vous devez déployer un ensemble cohérent de ressources.
-
Créer le namespace avec des labels appropriés
Les labels permettent d’identifier le namespace et sont utilisés par les NetworkPolicies.
apiVersion: v1kind: Namespacemetadata:name: team-backendlabels:team: backendenvironment: production -
Ajouter un ResourceQuota pour limiter la consommation globale
Le ResourceQuota protège le cluster contre la surconsommation par une équipe.
apiVersion: v1kind: ResourceQuotametadata:name: team-backend-quotanamespace: team-backendspec:hard:requests.cpu: "4"requests.memory: 8Gilimits.cpu: "8"limits.memory: 16Gipods: "30"services: "10"configmaps: "30"secrets: "30"persistentvolumeclaims: "10" -
Ajouter un LimitRange pour les valeurs par défaut
Sans LimitRange, les pods sans requests/limits définis ne seront pas schedulés si un ResourceQuota est en place. Le LimitRange définit des valeurs par défaut automatiques.
apiVersion: v1kind: LimitRangemetadata:name: team-backend-limitsnamespace: team-backendspec:limits:- default:cpu: "500m"memory: "512Mi"defaultRequest:cpu: "100m"memory: "128Mi"max:cpu: "2"memory: "4Gi"min:cpu: "50m"memory: "64Mi"type: Container -
Isoler le réseau avec des NetworkPolicies
Par défaut, bloquez tout le trafic, puis autorisez sélectivement.
# Politique par défaut : tout bloquerapiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: default-deny-allnamespace: team-backendspec:podSelector: {}policyTypes:- Ingress- Egress---# Autoriser le trafic interne au namespace + DNSapiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: allow-internalnamespace: team-backendspec:podSelector: {}policyTypes:- Ingress- Egressingress:- from:- namespaceSelector:matchLabels:kubernetes.io/metadata.name: team-backendegress:- to:- namespaceSelector:matchLabels:kubernetes.io/metadata.name: team-backend- to: # Autoriser les requêtes DNS- namespaceSelector:matchLabels:kubernetes.io/metadata.name: kube-systemports:- protocol: UDPport: 53 -
Configurer le RBAC pour l’équipe
Créez un Role avec les permissions nécessaires et liez-le au groupe de l’équipe.
apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:name: team-backend-developernamespace: team-backendrules:- apiGroups: ["", "apps", "batch"]resources: ["pods", "deployments", "services", "configmaps", "secrets"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]- apiGroups: [""]resources: ["pods/log", "pods/exec"]verbs: ["get", "create"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:name: team-backend-developersnamespace: team-backendsubjects:- kind: Groupname: team-backend-devs # Groupe dans votre IdPapiGroup: rbac.authorization.k8s.ioroleRef:kind: Rolename: team-backend-developerapiGroup: rbac.authorization.k8s.io
Vérifier le pack appliqué
Section intitulée « Vérifier le pack appliqué »Après avoir appliqué toutes ces ressources, vérifiez leur présence :
# Le namespace avec ses quotas et limiteskubectl describe namespace team-backend
# Les NetworkPolicieskubectl get networkpolicies -n team-backend
# Le RBACkubectl get roles,rolebindings -n team-backendUn kubectl describe namespace team-backend affiche à la fois les Resource Quotas et les LimitRanges, vous permettant de valider la configuration en une commande.
Outils pour naviguer entre namespaces
Section intitulée « Outils pour naviguer entre namespaces »Travailler avec plusieurs namespaces implique de nombreux changements de contexte. Plusieurs outils simplifient cette navigation.
L’outil kubens permet de changer de namespace en une commande, sans manipuler la configuration kubectl.
# Lister les namespaces disponibleskubens
# Changer de namespacekubens team-backend
# Revenir au namespace précédentkubens -kubens colore le namespace actuel, facilitant le repérage visuel. Il fait partie du projet kubectx qui fournit aussi kubectx pour changer de cluster.
k9s offre une interface terminal complète pour explorer et gérer les ressources Kubernetes. Il permet de naviguer entre namespaces avec les raccourcis clavier et d’exécuter des actions directement.
Pour filtrer par namespace dans k9s, tapez :ns pour lister les namespaces, puis Entrée pour sélectionner. Le namespace actif s’affiche dans le header.
Dépannage des namespaces
Section intitulée « Dépannage des namespaces »Certains problèmes courants avec les namespaces ont des solutions bien documentées.
Namespace bloqué en état Terminating
Section intitulée « Namespace bloqué en état Terminating »Lorsqu’un namespace reste en état Terminating indéfiniment, c’est généralement dû à des finalizers qui ne peuvent pas être traités. Identifiez la cause :
# Voir ce qui bloquekubectl get namespace mon-namespace -o json | jq '.status'
# Rechercher les ressources avec des finalizerskubectl api-resources --verbs=list --namespaced -o name | \ xargs -n 1 kubectl get --show-kind --ignore-not-found -n mon-namespaceSi des ressources avec des finalizers persistent, vous devrez peut-être les supprimer manuellement ou patcher le namespace pour retirer les finalizers (opération risquée, à faire avec précaution).
Ressources créées dans le mauvais namespace
Section intitulée « Ressources créées dans le mauvais namespace »Si vos ressources apparaissent systématiquement dans default alors que vous pensiez les créer ailleurs :
# Vérifier le namespace par défaut de votre contextekubectl config view --minify | grep namespace:
# Si vide, le namespace par défaut est "default"# Corrigez avec :kubectl config set-context --current --namespace=team-backendUne autre cause fréquente : les fichiers YAML qui ne spécifient pas de namespace dans leur metadata. Ajoutez explicitement le namespace dans le manifeste ou utilisez -n lors du kubectl apply.
Conflit de quota dépassé
Section intitulée « Conflit de quota dépassé »Si vos pods restent en état Pending avec un événement mentionnant des quotas :
# Voir l'utilisation actuelle vs les limiteskubectl describe resourcequota -n team-backendSoit vous demandez plus de ressources que le quota autorise pour un pod unique, soit le namespace a atteint sa limite globale. Ajustez le quota ou réduisez les requests/limits de vos workloads.
Testez vos Connaissances
Section intitulée « Testez vos Connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »Un namespace Kubernetes est un outil d’organisation avant d’être un outil d’isolation :
- Utilisez-le pour : organiser vos ressources, séparer équipes et environnements, éviter les conflits de noms, cibler des politiques
- Le namespace isole : les noms de ressources, les Secrets/ConfigMaps, le périmètre RBAC, et permet d’appliquer des quotas
- Le namespace N’isole PAS : le réseau (sans NetworkPolicy), les ressources cluster-wide (Nodes, PV, StorageClass), les ressources physiques du nœud
- Le pack minimum d’équipe comprend : Namespace + ResourceQuota + LimitRange + NetworkPolicy + RBAC
- Évitez
defaulten production et ne touchez pas àkube-systempour vos workloads