Aller au contenu
English
Conteneurs & Orchestration medium

Control Plane Kubernetes : API Server, etcd, Scheduler

35 min de lecture

logo Kubernetes

Vous avez compris l'architecture globale de Kubernetes : un Control Plane qui décide, et des Worker Nodes qui exécutent. Mais comment le Control Plane fonctionne-t-il en interne ? Quels composants le constituent, et surtout, comment communiquent-ils entre eux ?

Ce guide détaille le fonctionnement du Control Plane, l'ensemble des processus qui décident de l'état du cluster sans jamais exécuter vos applications. Vous comprendrez pourquoi vos applications restent disponibles quand un Pod crashe, et par quel mécanisme Kubernetes détermine où déployer vos conteneurs.

  • Identifier les 4 composants essentiels du Control Plane et leur rôle précis
  • Comprendre la règle d'or : seul l'API Server accède à etcd
  • Expliquer la boucle de contrôle (watch → compare → act) du Controller Manager
  • Savoir comment le Scheduler et les Kubelets communiquent avec l'API Server

Prérequis : avoir lu Architecture Kubernetes. Si vous ne savez pas ce qu'est un Pod ou un Node, commencez par là !

Le Control Plane regroupe les processus qui décident de l'état du cluster. Son travail est d'orchestrer : enregistrer ce que vous demandez, décider où le placer et corriger les écarts. En pratique, vos applications ne s'y déploient pas, une marque posée sur ce nœud en écartant les Pods ordinaires. C'est une protection, pas une impossibilité technique : un Pod explicitement autorisé à passer outre peut y tourner, et c'est ainsi que les composants de Kubernetes eux-mêmes y sont placés.

Composants du Control Plane Kubernetes : API Server, etcd, Scheduler, Controller Manager et leurs interactions

Le Control Plane repose sur 4 composants essentiels qui travaillent ensemble, plus un 5ème optionnel pour les clusters cloud :

ComposantRôle en une phraseCe qu'il NE fait PAS
kube-apiserverPoint d'entrée unique, seul à accéder à etcdNe lance pas de conteneurs
etcdBase de données clé-valeur, source de véritéNe prend aucune décision
kube-schedulerAssigne les Pods aux NodesNe lance PAS les conteneurs
kube-controller-managerBoucle de contrôle, réconcilie état souhaité/actuelN'accède pas directement à etcd
cloud-controller-manager(optionnel) Intègre les services cloudN'existe que sur clusters cloud

Une erreur courante : croire que le Scheduler lance les conteneurs. C'est faux. Le Scheduler ne fait qu'assigner un Pod à un Node (il écrit "ce Pod va sur ce Node" dans etcd via l'API Server). C'est le Kubelet du Node qui lance réellement le conteneur.

Le kube-apiserver est le cœur du Control Plane. C'est lui qui reçoit toutes les requêtes, que ce soit de kubectl, d'une interface web, ou des autres composants internes.

Son travail tient en trois temps, toujours les mêmes quelle que soit la requête :

  1. Valider : vérifier le format, l'authentification, les autorisations
  2. Persister : stocker l'état dans etcd, ce que lui seul fait
  3. Exposer : permettre de relire cet état via l'API REST

C'est cette validation systématique qui fait de lui le gardien du cluster.

Fenêtre de terminal
# Toute interaction passe par l'API Server
kubectl get pods # Lecture via API Server
kubectl apply -f deployment.yaml # Écriture via API Server
kubectl delete pod mon-pod # Suppression via API Server

C'est la règle d'or de l'architecture Kubernetes :

Seul l'API Server communique directement avec etcd. Le Scheduler, le Controller Manager, les Kubelets, tous passent par l'API Server pour lire ou écrire des données. Cette centralisation garantit :

  • Cohérence : un seul point de vérité
  • Sécurité : un seul composant à sécuriser pour protéger etcd
  • Simplicité : les autres composants n'ont pas besoin de connaître etcd

Ces deux commandes ne répondent pas à la même question. La première cherche le Pod qui héberge l'API Server, la seconde interroge l'endpoint de santé exposé par l'API elle-même. Sur un cluster de découverte, seule la seconde est fiable : /healthz renvoie la chaîne ok dès que l'API répond, quelle que soit la distribution.

Fenêtre de terminal
# Voir le pod de l'API Server (clusters kubeadm)
kubectl get pod -n kube-system -l component=kube-apiserver
# Vérifier la santé de l'API
kubectl get --raw='/healthz'
# Résultat attendu : ok

La première commande ne fonctionne que si vous administrez le control plane. C'est le cas avec Kind ou kubeadm, où chaque composant tourne dans son propre Pod statique. Sur un cluster managé (EKS, GKE, AKS), le fournisseur exploite le control plane pour vous et ne l'expose pas : la commande renvoie No resources found, et ce n'est pas une panne.

C'est pourquoi le contrôle de santé se fait sur /healthz, /readyz ou /livez : ils répondent ok partout, quelle que soit la façon dont le cluster a été installé.

etcd est une base de données clé-valeur distribuée qui stocke tout l'état du cluster. C'est la "source de vérité" de Kubernetes.

Tout ce que vous pouvez lister avec kubectl get se trouve dans etcd, et rien d'autre : ni les logs de vos conteneurs, ni les métriques, ni les images. La ligne à retenir est la troisième, parce qu'elle est contre-intuitive. Par défaut, les Secrets ne sont pas chiffrés dans etcd, ils y sont seulement encodés en base64, ce qui n'est pas une protection. La documentation Kubernetes l'écrit noir sur blanc : « Kubernetes Secrets are, by default, stored unencrypted in the API server's underlying data store (etcd) ». Le chiffrement au repos s'active explicitement, via une EncryptionConfiguration passée à l'API Server.

Type de donnéesExemples
Configuration du clusterNodes, namespaces, RBAC
État des ressourcesPods, Deployments, Services, ConfigMaps
Données sensiblesSecrets (non chiffrés par défaut, simplement encodés en base64)
MétadonnéesLabels, annotations

Si etcd est perdu sans backup, le cluster devient irrécupérable. Vous perdez :

  • La liste de tous vos Deployments
  • La configuration de tous vos Services
  • Tous vos Secrets et ConfigMaps
  • L'historique des ReplicaSets

Sauvegardez etcd régulièrement. C'est la seule protection contre la perte du cluster, et c'est aussi ce qui distingue un cluster que vous administrez d'un cluster managé : chez EKS, GKE ou AKS, le fournisseur s'en charge sans que vous ayez à y penser. La procédure, ses certificats et la restauration sont détaillés dans le guide etcd.

Sur un cluster que vous administrez, etcd tourne comme un Pod du namespace kube-system, au même titre que les autres composants :

Fenêtre de terminal
kubectl get pod -n kube-system -l component=etcd

Sur un cluster managé, cette commande ne renvoie rien, et ce n'est pas une panne : le fournisseur n'expose pas son control plane.

Le kube-scheduler décide déployer chaque Pod. Il analyse les besoins du Pod et les ressources disponibles sur chaque Node.

Le Scheduler suit un processus en deux étapes :

  1. Filtrage : éliminer les Nodes impossibles

    Le Scheduler écarte d'emblée les nœuds qui ne peuvent pas accueillir le Pod. Trois motifs suffisent à disqualifier un candidat :

    • Pas assez de CPU ou de mémoire disponible
    • Taints incompatibles avec les tolerations du Pod
    • Contraintes d'affinité non respectées
  2. Scoring : classer les Nodes restants

    Parmi les Nodes possibles, le Scheduler attribue un score selon :

    • Répartition de charge (spread)
    • Affinités préférées
    • Ressources disponibles

Le Scheduler n'exécute pas les conteneurs. Il écrit simplement dans etcd (via l'API Server) : "ce Pod est assigné à ce Node". C'est tout.

# Le Scheduler ne fait que ça : assigner un nodeName
spec:
nodeName: worker-node-1 # ← Écrit par le Scheduler

Ensuite, le Kubelet du Node concerné détecte cette assignation et lance le conteneur.

La preuve tient en une commande. Créez un Pod qu'aucun nœud ne peut accueillir, et regardez ce que le Scheduler écrit :

Fenêtre de terminal
kubectl get pod impossible -o custom-columns='POD:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName'
kubectl get events --field-selector involvedObject.name=impossible
Sortie
POD STATUS NODE
impossible Pending <none>
0/2 nodes are available: 1 node(s) didn't match Pod's node affinity/selector,
1 node(s) had untolerated taint(s).

Le champ nodeName reste vide : le Scheduler n'a rien écrit, donc aucun Kubelet ne se sent concerné, et le Pod attend. Le message dit exactement combien de nœuds ont été écartés et pourquoi, ce qui en fait la première chose à lire devant un Pod Pending.

Le Scheduler communique exclusivement via l'API Server :

  1. Il observe en continu les Pods sans nodeName, donc non assignés
  2. Il calcule le meilleur nœud pour chacun
  3. Il écrit l'association entre le Pod et le nœud dans l'API Server
  4. L'API Server la persiste dans etcd

Jamais de communication directe avec les Kubelets ou etcd.

Le kube-controller-manager est le composant qui rend Kubernetes auto-correctif : il réconcilie en permanence l'état souhaité avec l'état actuel.

La boucle de contrôle : watch → compare → act

Section intitulée « La boucle de contrôle : watch → compare → act »

Boucle de contrôle du Control Plane : Watch, Compare, Act en continu

Le Controller Manager exécute une boucle infinie pour chaque type de ressource :

ÉtapeActionExemple
WATCHObserver l'état via l'API Server"Je vois 2 Pods nginx running"
COMPAREComparer avec l'état souhaité"L'utilisateur veut 3 répliques"
ACTCorriger l'écart"Je crée 1 Pod supplémentaire"

Cette boucle tourne en continu, sans intervention humaine. C'est ce qui permet à Kubernetes de "se réparer tout seul".

Contrairement à ce qu'on pourrait penser, le kube-controller-manager n'agit pas uniquement quand un utilisateur interagit. Il surveille et corrige les écarts en permanence, même si personne ne touche au cluster. Un Pod qui crashe à 3h du matin sera recréé automatiquement.

Le Controller Manager regroupe plusieurs contrôleurs spécialisés dans un seul processus :

ContrôleurResponsabilité
Deployment ControllerGère les rolling updates, rollbacks
ReplicaSet ControllerMaintient le nombre de répliques
Node ControllerDétecte les Nodes en panne
Job ControllerGère les Jobs et leur complétion
Service Account ControllerCrée les comptes de service par défaut
Endpoints ControllerMaintient les endpoints des Services

Comme les autres composants, le Controller Manager passe par l'API Server pour toute lecture ou écriture. Il ne communique jamais directement avec etcd.

Controller Manager → API Server → etcd
(jamais direct)

Le cloud-controller-manager est un composant optionnel qui n'existe que sur les clusters déployés chez un fournisseur cloud (AWS, GCP, Azure, etc.).

La question à se poser est simple : votre cluster a-t-il besoin de créer des ressources chez un fournisseur ? Un load balancer, une route, un disque. Si oui, il lui faut ce composant et les droits IAM associés ; sinon, il est inutile. Le tableau ci-dessous se lit avec cette grille. Sur les offres managées, vous n'avez rien à faire, il est déjà là. Sur un cluster que vous installez vous-même dans le cloud, c'est à vous de le déployer, et son absence est la cause la plus fréquente d'un Service bloqué en Pending.

Environnementcloud-controller-manager ?
EKS, GKE, AKSOui (géré automatiquement)
kubeadm sur VMs cloudOui (à installer)
kubeadm bare-metalNon
Minikube, kindNon

Le cloud-controller-manager contient des contrôleurs spécifiques au cloud :

ContrôleurRôleExemple concret
Node ControllerVérifie si les VMs existentSi une VM AWS est supprimée, met à jour le cluster
Route ControllerConfigure les routes réseauCrée les règles de routage entre sous-réseaux
Service ControllerGère les Load BalancersCrée un ELB quand vous déclarez type: LoadBalancer

Un point essentiel de l'architecture Kubernetes : les Kubelets fonctionnent en mode "pull".

Le point qui distingue les deux onglets est le sens de la connexion réseau. Dans un modèle push, c'est le Control Plane qui ouvre une connexion vers chaque Node ; il doit donc pouvoir les joindre en permanence, et chaque Node doit exposer un port. Dans le modèle pull retenu par Kubernetes, ce sont les Kubelets qui appellent l'API Server. Conséquence directe : une panne du Control Plane ne coupe pas les applications déjà lancées, puisque chaque Kubelet continue de faire tourner ce qu'il a reçu.

Attention toutefois à ne pas en conclure que le trafic ne va jamais dans l'autre sens. Le sens Control Plane vers Node existe bel et bien, pour un ensemble de gestes précis : kubectl logs, kubectl exec, kubectl port-forward et le proxy de nœud passent par une connexion que l'API Server ouvre vers le Kubelet, sur le port 10250. C'est pourquoi le manifeste de l'API Server porte un certificat client dédié, apiserver-kubelet-client.crt. Un pare-feu qui bloquerait ce port laisserait le cluster fonctionner, mais rendrait kubectl logs et kubectl exec inopérants.

API Server --push--> Kubelet
"Kubelet, lance ce Pod"

Problème : si l'API Server est surchargé ou injoignable, les ordres ne passent pas.

ComposantCommunique avecVia
kubectlAPI ServerRequêtes HTTPS
SchedulerAPI ServerWatch + Update
Controller ManagerAPI ServerWatch + Update
KubeletAPI ServerWatch + Report
API ServeretcdLecture/Écriture directe

Tous passent par l'API Server, sauf l'API Server lui-même qui accède à etcd.

Voici ce qui se passe quand vous créez un Deployment :

  1. Vous envoyez la requête

    Fenêtre de terminal
    kubectl apply -f deployment.yaml

    kubectl envoie la requête HTTPS à l'API Server.

  2. L'API Server valide et persiste

    • Authentification : qui êtes-vous ?
    • Autorisation : avez-vous le droit ?
    • Admission : la requête est-elle valide ?
    • Stockage dans etcd
  3. Le Deployment Controller réagit

    Il détecte le nouveau Deployment et crée un ReplicaSet.

  4. Le ReplicaSet Controller crée des Pods

    Il voit que le ReplicaSet demande 3 répliques, crée 3 Pods (sans nodeName).

  5. Le Scheduler assigne les Pods

    Il détecte les Pods sans nodeName, calcule les meilleurs Nodes, écrit les assignations.

  6. Les Kubelets lancent les conteneurs

    Chaque Kubelet détecte les Pods assignés à son Node et demande au container runtime (containerd) de lancer les conteneurs.

Les dix questions portent sur les points où les erreurs sont les plus tenaces : qui accède à etcd, qui lance réellement les conteneurs, et dans quel sens circulent les communications. Le seuil de réussite est de 70 % ; en dessous, relisez la section sur les flux de communication, qui concentre à elle seule la moitié des confusions.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
70% requis

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

  • Seul l'API Server accède à etcd, tous les autres composants passent par l'API Server
  • Le Scheduler assigne, le Kubelet lance, le Scheduler ne lance jamais de conteneurs
  • Le Controller Manager tourne en permanence, pas seulement quand un utilisateur agit
  • Le modèle pull rend le cluster résilient, les Kubelets interrogent l'API Server, pas l'inverse
  • Le Controller Manager regroupe plusieurs contrôleurs, Deployment, ReplicaSet, Node, Job...
  • Le cloud-controller-manager est optionnel, uniquement sur clusters cloud
  • etcd est critique, sauvegardez-le régulièrement

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn