Kubernetes : orchestrer ses conteneurs, du premier Pod à la certification
Quitter

Leçon 1 sur 17 · Fondamentaux

Pourquoi Kubernetes ? Orchestration et architecture d'un cluster

30 min kubectl (client Kubernetes)

Objectif

Comprendre le problème que résout Kubernetes, savoir nommer chaque composant d'un cluster et expliquer son rôle, et choisir la bonne distribution pour apprendre, tester ou produire.

L'essentiel

  • Docker lance des conteneurs sur une machine. Kubernetes orchestre des conteneurs sur un groupe de machines : il les place, les relance, les met à l'échelle et les relie entre eux.
  • Kubernetes est déclaratif : vous décrivez l'état voulu (« 3 copies de l'API, version 2.3 ») et des contrôleurs travaillent en boucle pour que la réalité rejoigne cette description.
  • Un cluster = un plan de contrôle (kube-apiserver, etcd, kube-scheduler, kube-controller-manager) + des nœuds de travail (kubelet, kube-proxy, runtime de conteneurs).
  • Tout passe par l'API server : kubectl, les contrôleurs, le kubelet. Seul l'API server parle à etcd.
  • Pour apprendre : kind ou minikube sur votre poste ; pour un petit serveur : k3s ; en production : kubeadm ou un service managé (EKS, AKS, GKE…).

Le problème : vos conteneurs en production

Prenons une plateforme de paiement marocaine fictive, AtlasPay. Son équipe a tout mis en conteneurs avec Docker : une API de paiement, un front web, un service de notifications SMS. Sur un seul serveur, docker compose up -d suffit. Puis viennent les vraies questions :

  • Le serveur tombe un vendredi soir : qui relance les conteneurs sur une autre machine ?
  • Le jour du Black Friday, le trafic est multiplié par dix : comment passer de 2 à 20 copies de l'API, sur plusieurs serveurs, et revenir à 2 ensuite ?
  • Une nouvelle version de l'API doit sortir sans couper les paiements en cours.
  • Comment les copies de l'API trouvent-elles la base de données, alors que leurs adresses IP changent à chaque redémarrage ?

C'est le travail d'un orchestrateur. Kubernetes (souvent écrit K8s : un K, huit lettres, un s) est l'orchestrateur devenu standard. Il est né chez Google, a été ouvert en 2014 et est maintenu aujourd'hui par la CNCF (Cloud Native Computing Foundation).

Besoin Avec Docker seul Avec Kubernetes
Relancer un conteneur planté --restart sur une machine le Pod est recréé, au besoin sur un autre nœud
Mettre à l'échelle à la main, machine par machine replicas: 20, réparti sur le cluster
Mise à jour sans coupure scripts maison rolling update et retour arrière intégrés
Trouver un service IP ou réseau Docker local Service + DNS interne stable
Configuration et secrets variables et fichiers .env ConfigMaps et Secrets

Ce que Kubernetes n'est pas : ce n'est pas une plateforme clé en main. Il ne compile pas votre code, ne fournit pas de base de données, n'impose pas d'outil de supervision. Il fournit des briques, et vous les assemblez.

Le modèle déclaratif

Avec Docker, vous donnez des ordres : « lance ce conteneur ». Avec Kubernetes, vous décrivez un état voulu dans un fichier YAML, puis vous le confiez à l'API :

# Extrait : « je veux 3 copies de l'API de paiement »
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-paiement
spec:
  replicas: 3

Un contrôleur compare en permanence l'état voulu (3 copies) et l'état réel. S'il n'en compte que 2 parce qu'un nœud est tombé, il en crée une nouvelle. C'est la boucle de réconciliation : observer, comparer, corriger, recommencer. Vous ne dites jamais « relance le conteneur », vous dites « il en faut 3 ».

L'architecture d'un cluster

                    ┌─────────────── PLAN DE CONTRÔLE ───────────────┐
  kubectl  ───────▶ │  kube-apiserver  ◀──▶  etcd (état du cluster)   │
  (vous)            │        ▲                                        │
                    │        ├── kube-scheduler  (où placer les Pods)  │
                    │        └── kube-controller-manager (boucles)     │
                    └────────┼────────────────────────────────────────┘
                             │ (HTTPS)
         ┌───────────────────┼──────────────────────┐
         ▼                   ▼                      ▼
   ┌─ nœud 1 ──────┐   ┌─ nœud 2 ──────┐      ┌─ nœud 3 ──────┐
   │ kubelet       │   │ kubelet       │      │ kubelet       │
   │ kube-proxy    │   │ kube-proxy    │      │ kube-proxy    │
   │ containerd    │   │ containerd    │      │ containerd    │
   │ [Pod][Pod]    │   │ [Pod]         │      │ [Pod][Pod]    │
   └───────────────┘   └───────────────┘      └───────────────┘

Le plan de contrôle

C'est le « cerveau » du cluster. En production, il tourne sur 3 machines dédiées pour la haute disponibilité.

Composant Rôle
kube-apiserver la porte d'entrée unique : il expose l'API HTTP de Kubernetes, authentifie, vérifie les droits, valide les objets
etcd base clé-valeur cohérente et répliquée : tout l'état du cluster y est stocké. Perdre etcd sans sauvegarde = perdre le cluster
kube-scheduler repère les Pods qui n'ont pas encore de nœud et choisit pour chacun le nœud le plus adapté (ressources libres, contraintes)
kube-controller-manager fait tourner les contrôleurs : Deployments, ReplicaSets, nœuds, Jobs… chacun avec sa boucle de réconciliation
cloud-controller-manager facultatif : fait le lien avec un fournisseur cloud (créer un répartiteur de charge, des disques…)

Les nœuds

Ce sont les machines qui exécutent vos applications.

Composant Rôle
kubelet l'agent de chaque nœud : il reçoit les Pods attribués à son nœud et s'assure que leurs conteneurs tournent et restent en bonne santé
kube-proxy entretient les règles réseau (iptables, IPVS ou nftables) qui font fonctionner les Services ; certains plugins réseau le remplacent
runtime de conteneurs le logiciel qui lance réellement les conteneurs : containerd ou CRI-O, via l'interface CRI

Depuis Kubernetes 1.24, Docker Engine n'est plus un runtime pris en charge directement. Les images construites avec Docker restent parfaitement utilisables : ce sont des images OCI standard, que containerd sait lancer.

Les modules complémentaires (addons)

Un cluster nu ne suffit pas. On ajoute presque toujours :

  • un DNS interne (CoreDNS) : chaque Service reçoit un nom, par exemple api.paiement.svc.cluster.local ;
  • un plugin réseau (CNI : Calico, Cilium, Flannel…) qui donne une IP à chaque Pod ;
  • la collecte de métriques (metrics-server) et des journaux centralisés ;
  • éventuellement le tableau de bord web (Dashboard).

Suivre une commande de bout en bout

Que se passe-t-il quand l'équipe d'AtlasPay crée un Deployment de 3 copies ?

kubectl apply -f api-paiement.yaml
  1. kubectl lit le fichier et l'envoie en HTTPS à kube-apiserver.
  2. L'API server vérifie votre identité et vos droits, valide le YAML, puis enregistre l'objet dans etcd.
  3. Le contrôleur de Deployments (dans kube-controller-manager) voit le nouvel objet et crée un ReplicaSet, dont le contrôleur crée 3 Pods… qui n'ont pas encore de nœud.
  4. kube-scheduler voit 3 Pods sans nœud et attribue à chacun le nœud le plus adapté.
  5. Sur chaque nœud choisi, le kubelet voit qu'un Pod lui revient, demande au runtime de télécharger l'image et de lancer les conteneurs, puis remonte l'état à l'API server.
  6. Vous voyez le résultat :
kubectl get pods -o wide
# NAME                            READY   STATUS    NODE
# api-paiement-6d8f9c7b5d-4kq2x   1/1     Running   noeud-1
# api-paiement-6d8f9c7b5d-9fz7m   1/1     Running   noeud-2
# api-paiement-6d8f9c7b5d-tw8rl   1/1     Running   noeud-3

Remarquez qu'aucun composant ne donne d'ordre direct à un autre : chacun observe l'API server et réagit. C'est ce qui rend Kubernetes robuste : si le scheduler redémarre, il reprend simplement les Pods encore sans nœud.

Les distributions : où faire tourner Kubernetes ?

Kubernetes est un projet ; pour l'utiliser, il faut une distribution ou un service qui l'installe pour vous.

Pour apprendre, sur votre poste

Outil Principe Quand l'utiliser
kind chaque nœud est un conteneur Docker tests rapides, plusieurs nœuds sur un portable, CI
minikube un cluster à un nœud dans une VM ou un conteneur découverte, nombreux modules (minikube addons)
Docker Desktop, Rancher Desktop, Podman Desktop Kubernetes intégré à l'outil de bureau si vous les utilisez déjà
# kind : un cluster de 3 nœuds décrit dans un fichier (exemple du lab)
kind create cluster --name livraison --config kind-livraison.yaml
kubectl get nodes
# livraison-control-plane   Ready   control-plane
# livraison-worker          Ready   <none>
# livraison-worker2         Ready   <none>

# minikube : un nœud, en une commande
minikube start
kubectl get nodes

Pour un petit serveur ou la périphérie

k3s (projet CNCF) est une distribution certifiée et très légère : un seul binaire, quelques centaines de Mo de RAM. Idéal pour un serveur de test chez un hébergeur marocain, un Raspberry Pi ou un magasin. Comparable : MicroK8s (Canonical).

Pour la production

  • kubeadm : l'outil officiel pour monter vous-même un cluster sur vos serveurs (sur site ou VPS). Vous gérez tout : mises à jour, sauvegardes d'etcd, certificats. Voir la leçon 4.2.
  • Services managés : Amazon EKS, Azure AKS, Google GKE, et d'autres fournisseurs. Le fournisseur gère le plan de contrôle ; vous payez et gérez les nœuds. C'est le choix le plus courant quand on ne veut pas exploiter etcd soi-même.
  • Distributions d'entreprise : Red Hat OpenShift, Rancher (RKE2), avec support commercial.
Critère kind / minikube k3s kubeadm Managé
Installation 1 minute 1 commande quelques heures quelques clics
Haute disponibilité non possible oui (à construire) oui
Qui gère etcd ? l'outil k3s (ou SQLite) vous le fournisseur
Usage apprentissage, CI petit serveur, périphérie sur site, contrôle total production cloud

L'outil commun : kubectl

Quel que soit le cluster, vous lui parlez avec kubectl, qui lit l'adresse du cluster et vos identifiants dans ~/.kube/config :

kubectl version --client        # version du client, sans contacter de cluster
kubectl cluster-info            # adresse de l'API server (nécessite un cluster)
kubectl get nodes               # les nœuds et leur état
kubectl config get-contexts     # les clusters connus de votre kubeconfig

Dans les labs de cette formation, vous disposez de kubectl sans cluster : vous écrirez de vrais manifestes et utiliserez kubectl … --dry-run=client -o yaml, qui fonctionne hors ligne. Reproduisez ensuite chaque exercice sur un cluster kind ou minikube chez vous.

Les versions

Kubernetes publie environ trois versions mineures par an (1.32, 1.33, 1.34…). Chaque version est maintenue environ 14 mois. Conséquence pratique : un cluster doit être mis à jour au moins une fois par an, une version mineure à la fois. Les services managés vous y obligent d'ailleurs.

kubectl version
# Client Version: v1.34.x
# Server Version: v1.33.x     ← le client peut avoir une version mineure d'écart avec le serveur

Pièges fréquents

  • Croire que Kubernetes remplace Docker : vous construisez toujours vos images avec Docker (ou Buildah, Podman) ; Kubernetes les exécute avec containerd.
  • Monter un cluster kubeadm pour apprendre : commencez par kind ou minikube. kubeadm demande plusieurs machines et beaucoup de réglages.
  • Négliger etcd : sans sauvegarde d'etcd, un incident sur le plan de contrôle d'un cluster kubeadm peut tout effacer.
  • Penser « serveurs » plutôt que « état voulu » : on ne se connecte pas en SSH sur un nœud pour relancer un conteneur ; on corrige le manifeste et on laisse les contrôleurs agir.

Lab

Vous allez :

  1. nommer le composant qui stocke l'état du cluster ;
  2. trier une liste de composants pour ne garder que ceux du plan de contrôle ;
  3. écrire le fichier de configuration d'un cluster kind à trois nœuds pour l'application de livraison, que vous pourrez réutiliser chez vous avec kind create cluster --config.

Pour écrire un fichier sans éditeur, utilisez cat > fichier <<EOF … EOF ou printf.

Quiz

  1. Quel composant choisit le nœud sur lequel tournera un nouveau Pod ?
  2. Quel est le seul composant qui lit et écrit directement dans etcd ?
  3. Quel composant tourne sur chaque nœud et s'assure que les conteneurs de ses Pods fonctionnent ?
  4. Vous voulez tester un cluster à 3 nœuds sur votre portable en deux minutes : quel outil choisissez-vous ?
  5. Que signifie « Kubernetes est déclaratif » ?
Réponses
  1. kube-scheduler.
  2. kube-apiserver : tous les autres composants passent par lui.
  3. kubelet.
  4. kind (chaque nœud est un conteneur Docker) ; minikube convient aussi mais il crée un seul nœud par défaut.
  5. Vous décrivez l'état voulu (dans un manifeste YAML) au lieu de donner des ordres ; des contrôleurs comparent sans cesse l'état réel à cet état voulu et corrigent les écarts.

Exercices pratiques

À réaliser sur kubectl (client Kubernetes)

Le terminal en ligne ouvre bientôt. En attendant, réalisez ces tâches sur votre machine Linux, une machine virtuelle ou WSL.

  1. Écrivez dans /root/etat.txt, seul sur sa ligne, le nom du composant qui conserve tout l'état du cluster (la base clé-valeur)
    Afficher un indiceC'est une base de données clé-valeur distribuée, à quatre lettres
    Voir la solution
    echo etcd > /root/etat.txt

    Vérification : grep -qx "etcd" /root/etat.txt

  2. Le fichier /root/composants.txt mélange des composants. Recopiez dans /root/plan-de-controle.txt, un par ligne, uniquement ceux du plan de contrôle (ils sont quatre)
    Afficher un indicekubelet, kube-proxy et le runtime de conteneurs tournent sur chaque nœud, pas dans le plan de contrôle
    Voir la solution
    grep -Ex "etcd|kube-apiserver|kube-scheduler|kube-controller-manager" /root/composants.txt > /root/plan-de-controle.txt

    Vérification : f=/root/plan-de-controle.txt; for c in etcd kube-apiserver kube-scheduler kube-controller-manager; do grep -qx "$c" $f || exit 1; done; ! grep -Eqx "kubelet|kube-proxy|containerd" $f

  3. Écrivez /root/kind-livraison.yaml : un cluster kind (kind: Cluster, apiVersion: kind.x-k8s.io/v1alpha4) avec un nœud control-plane et deux nœuds worker
    Afficher un indiceSous nodes:, une ligne « - role: … » par nœud
    Voir la solution
    printf "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n- role: control-plane\n- role: worker\n- role: worker\n" > /root/kind-livraison.yaml

    Vérification : f=/root/kind-livraison.yaml; grep -Eq "^kind: *Cluster *$" $f && grep -Eq "^apiVersion: *kind.x-k8s.io/v1alpha4 *$" $f && [ "$(grep -Ec "role: *control-plane" $f)" -eq 1 ] && [ "$(grep -Ec "role: *worker" $f)" -eq 2 ]

Références officielles consultées : Overview — https://kubernetes.io/docs/concepts/overview/ ; Kubernetes Components — https://kubernetes.io/docs/concepts/overview/components/ ; Environnement d’apprentissage — https://kubernetes.io/fr/docs/setup/learning-environment/ ; Environnement de production — https://kubernetes.io/fr/docs/setup/production-environment/. Texte original MasterLinux.