Kubernetes : architecture d'un cluster (API server, etcd, scheduler)
Tu as vu les pods et les nodes. Reste une question : qui décide quoi lancer, où et quand ?
C'est le boulot du control plane : un ensemble de composants qui orchestrent l'état du cluster.
Vue globale
On peut résumer Kubernetes ainsi :
- Tu déclares un état désiré (manifeste YAML : "je veux 3 pods de mon API").
- Le control plane observe l'état réel.
- Il applique des boucles de contrôle pour rapprocher le réel du désiré.
Les principaux composants côté control plane :
kube-apiserveretcdkube-schedulerkube-controller-manager
Sur chaque node, on retrouve :
kubelet- le runtime de conteneurs (containerd, CRI-O…)
kube-apiserver : porte d'entrée unique
L'API server est le point d'entrée central :
- toutes les commandes
kubectlpassent par lui, - les opérateurs et controllers discutent avec lui,
- il gère l'authentification/autorisation, la validation des objets, etc.
Quand tu fais :
kubectl apply -f deployment-api.yaml
kubectl :
- appelle l'API server,
- lui envoie le YAML,
- l'API server valide, puis enregistre l'objet dans etcd.
etcd : la source de vérité
Kubernetes stocke tout son état dans etcd, une base clé/valeur distribuée.
- Chaque ressource (Pod, Deployment, Service, ConfigMap, etc.) est un objet stocké dans etcd.
- Le control plane lit/écrit en permanence dans etcd.
En production, etcd est critique :
- on le met souvent sur des nodes dédiés (ou au moins protégés),
- on surveille sa latence et son espace disque,
- on planifie des backups réguliers.
kube-scheduler : qui va où ?
Le scheduler décide sur quel node placer chaque pod.
Il se base sur :
- les ressources disponibles (CPU/RAM),
- les contraintes (
nodeSelector,nodeAffinity,taints/tolerations), - d'éventuels plug-ins de scheduling.
Cycle basique :
- L'API server voit qu'un nouveau pod doit être créé (par ex. suite à un Deployment).
- Il marque ce pod comme "non schedulé".
- Le scheduler choisit un node adapté et met à jour le pod avec cette info.
- Le
kubeletdu node choisi se charge ensuite de créer les conteneurs.
kube-controller-manager : les boucles de contrôle
Le controller manager fait tourner plein de "contrôleurs" :
- ReplicationController / Deployment controller : s'assure qu'il y a le bon nombre de pods.
- Node controller : surveille la santé des nodes.
- Endpoint / Service controller : met à jour les endpoints des Services.
- etc.
Chaque controller suit le même pattern :
- Observe un type de ressource (Deployment, Node, etc.).
- Compare l'état désiré à l'état réel.
- Effectue les actions nécessaires (créer/supprimer des pods, marquer un node comme
NotReady, etc.).
kubelet et runtime de conteneurs
Sur chaque node :
- kubelet parle avec l'API server, reçoit les ordres (pods à créer/supprimer).
- Il demande ensuite au runtime (containerd, CRI-O) de lancer/stopper les conteneurs.
- Il remonte aussi l'état (health, logs, etc.) vers le control plane.
Pourquoi cette architecture t'intéresse en tant que dev
Même si tu n'administres pas directement le cluster, comprendre cette architecture te permet de :
- mieux lire les messages d'erreur (
kubectl describe, events), - savoir où regarder quand quelque chose ne va pas (pods en
Pending, nodes enNotReady), - discuter plus efficacement avec l'équipe infra/DevOps.
Dans les prochains articles, on va utiliser ces briques pour déployer réellement des applis.