Aller au contenu
Conteneurs & Orchestration medium

Fonctionnement du control plane Kubernetes

21 min de lecture

logo Kubernetes

Dans l’introduction sur l’architecture de Kubernetes, vous avez appris qu’un cluster Kubernetes repose sur une architecture bien huilée. Mais alors, qu’est-ce qui orchestre tout cela en coulisses ? C’est là qu’intervient le control plane (controle plane), le cerveau du cluster.

Pour rappel, le control plane gère tout ce qui se passe dans Kubernetes : il décide où déployer vos applications, surveille leur état et s’assure que tout fonctionne comme prévu. C’est un peu comme le chef d’orchestre d’une symphonie : il ne joue pas les instruments lui-même, mais sans lui, rien ne serait harmonieux.

Mais qu’est-ce que cela signifie concrètement ? Quelles sont ses responsabilités exactes et pourquoi est-il si indispensable pour le fonctionnement d’un cluster Kubernetes ?

Le control plane est responsable de tout ce qui touche à la gestion et à l’orchestration des ressources dans Kubernetes. Concrètement, il remplit trois grandes missions :

  1. Décision : où et comment les applications doivent être déployées dans le cluster ?
  2. Gestion de l’état : s’assurer que les applications tournent comme prévu et corriger les écarts si nécessaire.
  3. Exposition : fournir aux utilisateurs et aux outils une interface pour interagir avec le cluster.

Ces trois fonctions sont assurées par plusieurs composants clés qui collaborent pour maintenir le cluster opérationnel.

Le control plane de Kubernetes est l’élément central de tout cluster. Il orchestre la gestion des applications, la surveillance de l’état des ressources, et les décisions automatisées. Pour bien comprendre son fonctionnement, il est essentiel de connaître ses composants clés. Voici un schéma simplifié et une explication détaillée de chaque composant :

architecture kubernetes high level

L’API Server est au cœur du control plane. C’est lui qui reçoit toutes les requêtes provenant des utilisateurs, des outils comme kubectl et même des composants internes. Il agit comme une interface centrale qui :

  • Valide les requêtes : vérifie que les demandes sont correctement formatées et que les utilisateurs sont autorisés à les exécuter.
  • Exécute les actions : après validation, il envoie les requêtes aux autres composants pour qu’ils prennent les mesures nécessaires.
  • Expose l’état du cluster : les utilisateurs peuvent interroger l’API pour obtenir des informations sur les objets Kubernetes (Pods, Services, etc.).

En résumé, l’API Server est le gardien du cluster. Sans lui, aucune interaction avec Kubernetes ne serait possible.

etcd est une base de données clé-valeur distribuée qui stocke toutes les informations critiques du cluster. C’est dans etcd que réside la vérité sur :

  • La configuration du cluster.
  • L’état des ressources (comme les Pods, les nœuds, etc…).
  • Les secrets et autres données sensibles.

Pourquoi etcd est-il si important ? Parce qu’il garantit que le cluster est toujours synchronisé. Si un composant a besoin de savoir quelle est la configuration actuelle, il interroge etcd.

Le scheduler est le composant chargé de décider déployer chaque Pod. Pour cela, il analyse :

  • Les besoins des Pods (mémoire, CPU, stockage, etc.).
  • Les ressources disponibles sur chaque nœud.

Le scheduler ne fait qu’une chose, mais il la fait bien : il trouve le nœud idéal pour chaque Pod. Son rôle est essentiel pour garantir une utilisation optimale des ressources et éviter les surcharges.

Le controller manager regroupe plusieurs controllers, chacun ayant un rôle précis. Ces controllers surveillent en permanence l’état du cluster et prennent des décisions correctives si nécessaire. Voici quelques exemples :

  • Node Controller : détecte quand un nœud est hors ligne et met à jour l’état du cluster en conséquence.
  • Replication Controller : s’assure que le bon nombre de réplicas est actif pour chaque déploiement.
  • Endpoints Controller : met à jour les endpoints des Services en fonction des Pods disponibles.

Chaque controller est comme une petite tâche automatisée qui veille à ce que tout se passe bien dans son domaine.

Ce composant est facultatif et uniquement utilisé si le cluster est déployé sur un cloud provider. Il permet de gérer les fonctionnalités spécifiques au cloud, comme :

  • La création automatique de load balancers.
  • La gestion des volumes de stockage cloud.
  • L’intégration des services réseau natifs du provider.

Le cloud controller manager facilite l’intégration entre Kubernetes et les infrastructures cloud.

Interaction entre les Composants du Control Plane Kubernetes

Section intitulée « Interaction entre les Composants du Control Plane Kubernetes »

Le control plane de Kubernetes est un système complexe où plusieurs composants travaillent ensemble pour assurer le bon fonctionnement du cluster. Chaque composant a un rôle bien défini, mais c’est leur interaction qui permet à Kubernetes d’assurer l’orchestration efficace des conteneurs. Je vais détailler comment ces composants communiquent entre eux et assurent la cohérence du système.

L’API Server est le cœur du control plane : c’est lui qui sert de point d’entrée unique pour toutes les interactions entre les composants internes et externes du cluster.

Interaction avec les autres composants :

  • etcd : L’API Server stocke et récupère l’état du cluster dans etcd, qui est la base de données centrale de Kubernetes.
  • Scheduler : L’API Server informe le scheduler lorsqu’un nouveau Pod doit être planifié.
  • Controller Manager : Les différents controllers surveillent les changements via l’API Server et déclenchent des actions correctives si nécessaire.
  • Cloud Controller Manager : Interagit avec l’API Server pour gérer les ressources cloud.

Exemple de flux de communication :

  1. Un utilisateur crée un déploiement avec kubectl :

    Fenêtre de terminal
    kubectl apply -f my-deployment.yaml
  2. kubectl envoie la requête à l’API Server, qui la valide et l’enregistre dans etcd.

  3. L’API Server informe ensuite le scheduler qu’un nouveau Pod doit être assigné à un nœud.

  4. Une fois que le scheduler a trouvé un nœud approprié, il met à jour etcd avec cette information via l’API Server.

  5. Le Controller Manager détecte cette mise à jour et s’assure que le Pod est bien démarré en envoyant les instructions nécessaires aux kubelets (agents sur les nœuds).

etcd est une base de données clé-valeur distribuée qui stocke l’état global du cluster. Tous les composants du control plane s’appuient sur etcd pour :

  • Lire les informations actuelles du cluster.
  • Sauvegarder les modifications apportées aux ressources Kubernetes.

Interaction avec les autres composants :

  • API Server : L’API Server est le seul composant qui communique directement avec etcd. Il y lit et écrit toutes les informations.
  • Scheduler et Controller Manager : Ces composants ne se connectent pas directement à etcd mais passent par l’API Server.

Exemple de flux de communication :

  1. L’API Server enregistre une nouvelle configuration de Service dans etcd.
  2. Le Controller Manager détecte cette mise à jour via l’API Server et ajuste la configuration des pods concernés.
  3. Si un nœud tombe en panne, l’API Server met à jour etcd pour refléter cette perte et le Node Controller (dans le Controller Manager) prend les actions correctives.

Le Scheduler est responsable de l’affectation des Pods aux nœuds du cluster. Il prend des décisions basées sur les contraintes de ressources et d’affinité définies.

Interaction avec les autres composants :

  • API Server : Le Scheduler reçoit la liste des Pods en attente d’assignation via l’API Server.
  • etcd : Indirectement, car l’API Server stocke l’affectation des Pods dans etcd.
  • Nodes : Une fois qu’un Pod est assigné à un nœud, le kubelet de ce nœud récupère les informations et démarre le conteneur.

Exemple de flux de communication :

  1. Un nouvel objet Pod est créé et envoyé à l’API Server.
  2. L’API Server sauvegarde cette nouvelle ressource dans etcd.
  3. Le Scheduler interroge l’API Server pour obtenir la liste des Pods non assignés.
  4. Après calcul, il choisit un nœud et met à jour la ressource Pod via l’API Server.
  5. L’API Server enregistre la modification dans etcd et le kubelet du nœud sélectionné récupère cette mise à jour pour lancer le conteneur.

4. Controller Manager : L’Automatisation du Cluster

Section intitulée « 4. Controller Manager : L’Automatisation du Cluster »

Le Controller Manager contient plusieurs controllers qui s’assurent que l’état réel du cluster correspond à l’état désiré.

Interaction avec les autres composants :

  • API Server : Les controllers surveillent les changements d’état via l’API Server.
  • etcd : Les mises à jour sont enregistrées dans etcd par l’API Server.
  • Nodes : Certains controllers, comme le Node Controller, surveillent directement les nœuds et réagissent aux pannes.

Exemple de flux de communication :

  1. Un Deployment spécifie qu’il doit y avoir trois réplicas d’un Pod.
  2. Le Replication Controller détecte via l’API Server qu’il n’y a que deux Pods en cours d’exécution.
  3. Il crée un nouveau Pod, que l’API Server enregistre dans etcd.
  4. Le Scheduler assigne ce Pod à un nœud et le kubelet démarre le conteneur.

5. Cloud Controller Manager : L’Intégration avec le Cloud

Section intitulée « 5. Cloud Controller Manager : L’Intégration avec le Cloud »

Si Kubernetes est déployé sur un Cloud Provider (AWS, GCP, Azure, etc.), le Cloud Controller Manager gère les interactions avec les services cloud.

Interaction avec les autres composants :

  • API Server : Il reçoit les requêtes pour créer des ressources cloud (ex: Load Balancers).
  • Cloud Provider : Il envoie les commandes à l’infrastructure cloud pour allouer des ressources.

Exemple de flux de communication :

  1. Un utilisateur crée un Service de type LoadBalancer.
  2. L’API Server enregistre cette demande dans etcd.
  3. Le Cloud Controller Manager détecte cette mise à jour et demande au Cloud Provider de créer un Load Balancer.
  4. Une fois créé, il met à jour l’API Server avec l’IP du Load Balancer.

Pour bien comprendre le fonctionnement d’un cluster Kubernetes, rien de tel que de mettre les mains dans le cambouis en créant votre propre environnement de test. Je vous propose de configurer un cluster à deux nœuds en utilisant Minikube avec le pilote KVM. Cela vous permettra d’expérimenter et de vous familiariser avec les commandes essentielles de Kubernetes.

Avant de commencer, assurez-vous d’avoir les éléments suivants installés sur votre machine :

  • Minikube : outil permettant de créer des clusters Kubernetes locaux.
  • kubectl : interface en ligne de commande pour interagir avec Kubernetes.
  • KVM/libvirt (Kernel-based Virtual Machine) : solution de virtualisation pour Linux.
  1. Vérification de l’installation de KVM et Libvirt Assurez-vous que KVM et Libvirt sont correctement installés et configurés sur votre système. Vous pouvez vérifier leur présence avec les commandes suivantes :

    Fenêtre de terminal
    kvm-ok
    INFO: /dev/kvm exists
    KVM acceleration can be used
    Fenêtre de terminal
    virsh list --all
    Id Name State
    --------------------

    Si ces commandes renvoient des erreurs, il vous faudra installer ou reconfigurer KVM et Libvirt.

  2. Démarrage du cluster Minikube avec le pilote KVM Une fois les prérequis en place, vous pouvez lancer un cluster Minikube avec deux nœuds en spécifiant le pilote KVM :

    Fenêtre de terminal
    minikube start --driver=kvm2 --nodes=2 -p multinode-demo
    • --driver=kvm2 : spécifie l’utilisation de KVM comme pilote de virtualisation.
    • --nodes=2 : indique que le cluster doit comporter deux nœuds.
    • -p multinode-demo : définit le nom du profil Minikube pour ce cluster.

    Cette commande initialise un cluster avec un nœud de contrôle et un nœud de travail, tous deux virtualisés via KVM.

  3. Vérification de l’état du cluster Après le démarrage, il est important de s’assurer que les nœuds sont opérationnels :

    Fenêtre de terminal
    kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    multinode-demo NotReady control-plane 58d v1.31.0
    multinode-demo-m02 NotReady <none> 2s v1.31.0

    Vous devriez voir une liste de nœuds avec leur statut indiquant qu’ils sont prêts à recevoir des charges de travail.

Maintenant que vous avez mis en place un cluster Kubernetes, il est temps de lever le rideau sur son control plane. Comme évoqué dans l’introduction, le control plane est le cerveau de Kubernetes : il décide, surveille et ajuste tout ce qui se passe dans votre cluster.

Avant d’explorer en détail chaque composant, commençons par une vue d’ensemble du control plane et des nœuds du cluster.

Vérifier l’état des nœuds du cluster :

La commande suivante liste tous les nœuds du cluster, y compris le nœud de contrôle (où s’exécute le control plane) et les nœuds de travail :

Fenêtre de terminal
kubectl get nodes -o wide

Vous devriez voir une sortie similaire à celle-ci :

Fenêtre de terminal
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
multinode-demo Ready control-plane 58d v1.31.0 192.168.50.141 <none> Buildroot 2023.02.9 5.10.207 docker://27.2.0
multinode-demo-m02 Ready <none> 3m1s v1.31.0 192.168.50.38 <none> Buildroot 2023.02.9 5.10.207 docker://27.2.0

Vérifier les composants du control plane :

Le control plane est composé de plusieurs pods qui tournent dans le namespace kube-system. Pour les voir, utilisez :

Fenêtre de terminal
kubectl get pods -n kube-system -l tier=control-plane

Exemple de sortie :

Fenêtre de terminal
NAME READY STATUS RESTARTS AGE
etcd-multinode-demo 1/1 Running 1 (4m9s ago) 58d
kube-apiserver-multinode-demo 1/1 Running 1 (4m9s ago) 58d
kube-controller-manager-multinode-demo 1/1 Running 1 (4m9s ago) 58d
kube-scheduler-multinode-demo 1/1 Running 1 (4m9s ago) 58d

Chaque composant a son propre pod et nous allons maintenant voir comment les interroger individuellement.

L’API Server est le point d’entrée principal du cluster. Toutes les interactions passent par lui.

Vérifier l’état de l’API Server :

Utilisez cette commande pour voir si l’API Server fonctionne correctement :

Fenêtre de terminal
kubectl get pod -n kube-system -l component=kube-apiserver
NAME READY STATUS RESTARTS AGE
kube-apiserver-multinode-demo 1/1 Running 1 (4m44s ago) 58d

Vous pouvez aussi interroger directement l’état de santé de l’API Server :

Fenêtre de terminal
curl -k https://192.168.50.141:8443/healthz

Si tout fonctionne bien, la réponse sera :

Fenêtre de terminal
ok

Lister les ressources disponibles via l’API :

Pour voir toutes les ressources que l’API Server expose :

Fenêtre de terminal
kubectl api-resources

Exemple de sortie :

Fenêtre de terminal
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap

Cela montre toutes les ressources manipulables dans Kubernetes.

Comme vu précédemment, etcd est la base de données distribuée qui stocke toutes les informations sur l’état du cluster.

** Vérifier que etcd fonctionne** :

Pour voir si le pod etcd est bien démarré :

Fenêtre de terminal
kubectl get pod -n kube-system -l component=etcd -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
etcd-multinode-demo 1/1 Running 1 (16m ago) 58d 192.168.50.141 multinode-demo <none>

Explorer les données stockées dans etcd :

On peut interroger etcd pour voir les clés qu’il stocke :

Fenêtre de terminal
kubectl exec etcd-multinode-demo -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl \
--endpoints=https://192.168.50.141:2379 \
--cacert=/var/lib/minikube/certs/etcd/ca.crt \
--key=/var/lib/minikube/certs/etcd/server.key \
--cert=/var/lib/minikube/certs/etcd/server.crt \
get / --prefix --keys-only"

Exemple de sortie :

Fenêtre de terminal
/registry/apiregistration.k8s.io/apiservices/v1.
/registry/apiregistration.k8s.io/apiservices/v1.admissionregistration.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.apiextensions.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.apps
...

Chaque ligne représente une ressource Kubernetes stockée dans etcd.

Le scheduler assigne les nouveaux Pods aux nœuds disponibles.

Vérifier que le scheduler fonctionne :

Fenêtre de terminal
kubectl get pod -n kube-system -l component=kube-scheduler
NAME READY STATUS RESTARTS AGE
kube-scheduler-multinode-demo 1/1 Running 1 (11m ago) 58d

Observer comment un Pod est planifié :

Lançons un pod sans spécifier de nœud :

apiVersion: v1
kind: Pod
metadata:
name: test-scheduler
spec:
containers:
- name: busybox
image: busybox
command: ["sleep", "3600"]

Appliquez-le :

Fenêtre de terminal
kubectl apply -f test-pod.yaml

Maintenant, observez le scheduler en action :

Fenêtre de terminal
kubectl describe pod test-scheduler

Vous verrez une ligne comme celle-ci :

Fenêtre de terminal
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 10s default-scheduler Successfully assigned default/test-scheduler to worker-node-1

Cela montre que le scheduler a trouvé un nœud disponible et y a assigné le Pod.

Le Controller Manager surveille et corrige les écarts entre l’état désiré et l’état actuel du cluster.

Vérifier que le Controller Manager fonctionne :

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

Tester l’action d’un contrôleur :

Créons un Deployment avec 3 réplicas :

apiVersion: apps/v1
kind: Deployment
metadata:
name: test-controller
spec:
replicas: 3
selector:
matchLabels:
app: test-controller
template:
metadata:
labels:
app: test-controller
spec:
containers:
- name: nginx
image: nginx

Appliquez-le :

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

Maintenant, supprimons un des pods manuellement :

Fenêtre de terminal
kubectl delete pod -l app=test-controller

Quelques secondes plus tard, exécutez :

Fenêtre de terminal
kubectl get pods -l app=test-controller

Vous verrez que Kubernetes a automatiquement recréé un Pod pour respecter le nombre de réplicas défini.

Kubernetes est un écosystème vaste et en constante évolution. Pour aller plus loin et approfondir la compréhension du control plane, voici une sélection de ressources officielles, articles techniques, outils pratiques et formations qui vous aideront à maîtriser ses subtilités.

La documentation officielle est toujours la meilleure source pour comprendre le fonctionnement interne de Kubernetes. Elle est régulièrement mise à jour et couvre tous les composants du control plane : Architecture du control plane

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
70%

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

Voila qui conclut notre exploration du control plane Kubernetes. Vous avez découvert les composants clés qui orchestrent le fonctionnement de votre cluster et comment ils interagissent pour garantir son bon fonctionnement. En comprenant le rôle de chaque composant, vous serez mieux armé pour diagnostiquer et corriger les problèmes qui peuvent survenir dans votre cluster.

Dans le prochain chapitre, nous plongerons dans le monde des workers nodes.