Namespaces - ii02735/learn-k8 GitHub Wiki

Les namespaces

Un namespace (ou espace de noms) est un mécanisme de cloisonnement qui permet d'isoler un ensemble de ressources (objets) à l'intérieur d'un même cluster Kubernetes.

Deux namespaces dev et prod dans un même cluster Kubernetes

À quoi ça sert ?

Les namespaces permettent de :

  • Organiser les ressources d'un cluster (par équipe, par projet, par environnement…)
  • Isoler les applications les unes des autres (un dev et un prod dans le même cluster)
  • Appliquer des quotas de ressources (CPU, mémoire) par namespace
  • Restreindre les droits d'accès (RBAC) namespace par namespace
  • Faciliter le multi-tenant (plusieurs équipes ou clients partagent un même cluster)

Note

Un namespace ne remplace pas un cluster : c'est une frontière logique, pas une frontière réseau ou de sécurité physique.

Ressources namespacées ou non

La plupart des ressources vivent dans un namespace, mais certaines sont globales au cluster et n'appartiennent à aucun namespace. Dans la liste ci-dessous, chaque catégorie est annotée selon sa portée :

  • 📂 namespacée : la ressource appartient à un namespace précis

  • 🌐 globale au cluster : la ressource est partagée à l'échelle du cluster

  • Workloads 📂 : Pod, Deployment, ReplicaSet, StatefulSet, DaemonSet, Job, CronJob

  • Réseau 📂 : Service, Ingress, NetworkPolicy, Endpoints

  • Configuration 📂 : ConfigMap, Secret

  • Stockage applicatif 📂 : PersistentVolumeClaim (PVC)

  • Accès 📂 : ServiceAccount, Role, RoleBinding

  • Noeuds 🌐 : Node

  • Stockage 🌐 : PersistentVolume (PV), StorageClass

  • Accès 🌐 : ClusterRole, ClusterRoleBinding

  • Le namespace lui-même 🌐 : Namespace

  • Extensions 🌐 : CustomResourceDefinition, APIService

⚠️ Certaines ressources comme les Node ou les PersistentVolume sont globales au cluster et ne peuvent pas être rangées dans un namespace.

Les namespaces par défaut

Lorsqu'on installe un cluster, Kubernetes crée déjà plusieurs namespaces :

  • default : le namespace utilisé quand on n'en précise aucun
  • kube-system : les composants du cluster (API server, scheduler, controller, etcd…)
  • kube-public : lisible par tous, utilisé pour des informations publiques du cluster
  • kube-node-lease : les « baux » (leases) des noeuds, pour détecter rapidement un noeud défaillant

Le DNS interne

À l'intérieur d'un cluster, chaque Service obtient un nom DNS de la forme :

<service>.<namespace>.svc.cluster.local

Par exemple, un service web-svc dans le namespace dev est joignable à l'adresse web-svc.dev.svc.cluster.local. Depuis un pod du même namespace, on peut même se contenter du nom court web-svc.

C'est cette isolation qui permet d'avoir deux services portant le même nom (web-svc) dans deux namespaces différents, sans aucun conflit.

Les commandes principales

  • Lister les namespaces : kubectl get namespaces
  • Créer un namespace : kubectl create namespace dev
  • Déployer une ressource dans un namespace : kubectl apply -f deployment.yaml -n dev
  • Lister les ressources d'un namespace : kubectl get pods -n dev
  • Voir les ressources de tous les namespaces : kubectl get pods --all-namespaces
  • Définir le namespace courant du contexte : kubectl config set-context --current --namespace=dev
⚠️ **GitHub.com Fallback** ⚠️