
kubeadm est l’outil officiel pour bootstrapper un cluster Kubernetes conforme aux standards upstream. Ce guide vous accompagne dans l’installation d’un cluster multi-nœuds sur des machines virtuelles KVM, de la préparation des VMs jusqu’au déploiement d’applications. Vous apprendrez à configurer containerd, initialiser le control plane, joindre des workers et maintenir votre cluster.
kubeadm vs autres solutions
Section intitulée « kubeadm vs autres solutions »| Critère | kubeadm | k0s | k3s | Kubespray | RKE2 |
|---|---|---|---|---|---|
| Type | Bootstrap tool | Distribution | Distribution | Playbooks Ansible | Distribution |
| Orientation | Standard upstream | Edge, prod, CI | Edge, IoT, dev | Prod, multi-cloud | Enterprise, sécurité |
| Installation | Commandes | k0sctl (YAML) | Script unique | Ansible | Script |
| CNI défaut | Aucun | kube-router | Flannel | Configurable | Canal |
| HA native | Manuel | ✅ Multi-controller | ✅ Multi-server | ✅ Ansible | ✅ Intégrée |
| Profil CIS | Manuel | Manuel | Manuel | Selon config | ✅ Intégré |
| Cas d’usage | Bare metal, formation | Edge, CI/CD, prod | Edge, IoT, dev | Prod automatisée | Conformité, prod |
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »Ce guide vous permettra de maîtriser l’installation et la maintenance d’un cluster Kubernetes avec kubeadm. À la fin, vous saurez :
- Provisionner des VMs KVM pour héberger le cluster, en comprenant pourquoi chaque configuration est nécessaire
- Installer containerd et les composants Kubernetes, en configurant correctement le cgroup driver pour éviter les problèmes de stabilité
- Initialiser un cluster avec kubeadm, en comprenant le rôle de chaque option et composant
- Joindre des nœuds workers au cluster et diagnostiquer les échecs de jointure
- Configurer la haute disponibilité avec plusieurs control planes et un load balancer
- Mettre à jour le cluster vers une nouvelle version en respectant les règles de version skew
- Sauvegarder et restaurer etcd, la base de données critique du cluster
- Dépanner les problèmes courants avec une méthodologie structurée
Prérequis
Section intitulée « Prérequis »Pourquoi ces ressources matérielles ?
Section intitulée « Pourquoi ces ressources matérielles ? »Avant de créer vos VMs, comprenez pourquoi Kubernetes impose des minimums stricts. Le control plane héberge l’API server, etcd, le scheduler et le controller-manager : ces composants consomment de la mémoire même au repos. Avec moins de 2 Go de RAM, etcd refusera de démarrer ou crashera sous charge. Les workers exécutent vos conteneurs applicatifs : 2 vCPU permettent de faire tourner plusieurs pods sans contention excessive.
| Rôle | CPU | RAM | Disque | Quantité | Pourquoi ces specs |
|---|---|---|---|---|---|
| Control plane | 2 vCPU | 2 Go | 20 Go | 1 (ou 3 pour HA) | etcd + API server + scheduler + controller-manager |
| Worker | 2 vCPU | 2 Go | 20 Go | 2+ | kubelet + pods applicatifs |
Pour un environnement de production, doublez ces valeurs minimum. En environnement de test ou pour la préparation CKA, ces minimums suffisent.
Logiciels requis sur l’hyperviseur
Section intitulée « Logiciels requis sur l’hyperviseur »Vous aurez besoin d’un hyperviseur Linux avec KVM pour créer les machines virtuelles. Si vous n’avez pas de serveur dédié, vous pouvez utiliser votre poste de travail Linux avec suffisamment de RAM (16 Go recommandés pour faire tourner 3 VMs simultanément).
- KVM/QEMU et libvirt installés (le cœur de la virtualisation)
- virt-manager ou virsh pour gérer les VMs (interface graphique ou CLI)
- Une image cloud Ubuntu 24.04 ou Rocky Linux 9 (pré-configurée pour cloud-init)
Ports réseau à ouvrir
Section intitulée « Ports réseau à ouvrir »La communication entre les composants Kubernetes se fait sur des ports bien définis. Si vous utilisez un pare-feu entre les VMs (iptables, firewalld, ou un pare-feu réseau), vous devez ouvrir ces ports. Sur un réseau local sans pare-feu entre les VMs, cette étape n’est pas nécessaire.
| Port | Composant | Qui se connecte | Pourquoi |
|---|---|---|---|
| 6443 | kube-apiserver | kubectl, kubelet, autres control planes | Point d’entrée de toute communication avec le cluster |
| 2379-2380 | etcd | API server, autres etcd (HA) | Base de données du cluster, réplication HA |
| 10250 | kubelet | API server, metrics-server | Gestion des pods, récupération des logs et métriques |
| 10257 | kube-controller-manager | Prometheus (optionnel) | Métriques du controller |
| 10259 | kube-scheduler | Prometheus (optionnel) | Métriques du scheduler |
| 179 | Calico BGP | Autres nœuds Calico | Routage BGP entre nœuds (si vous utilisez Calico) |
Création des machines virtuelles avec KVM
Section intitulée « Création des machines virtuelles avec KVM »Architecture du lab
Section intitulée « Architecture du lab »Le schéma ci-dessous représente l’architecture cible de notre cluster de test. Vous aurez un nœud control plane (cp1) qui héberge les composants de gestion, et deux workers (worker1, worker2) qui exécuteront vos applications. Tous les nœuds sont connectés au réseau virtuel par défaut de libvirt (virbr0, 192.168.122.0/24).
Cette architecture est suffisante pour apprendre Kubernetes et préparer la CKA. En production, vous ajouteriez 2 control planes supplémentaires pour la haute disponibilité (section dédiée plus loin).
Télécharger et préparer les images cloud
Section intitulée « Télécharger et préparer les images cloud »Les images cloud sont des disques système pré-configurés pour s’initialiser via cloud-init. Contrairement à une installation classique, elles démarrent en quelques secondes et se configurent automatiquement au premier boot. Nous utilisons la technique du “backing file” de QCOW2 : l’image de base reste intacte, et chaque VM stocke uniquement ses différences. Cela économise de l’espace disque et accélère la création des VMs.
Ubuntu 24.04 LTS (“Noble Numbat”) est recommandée pour sa stabilité et son support long terme (jusqu’en 2029). L’image cloud inclut cloud-init et les modules kernel nécessaires.
# Télécharger l'image cloud Ubuntu (environ 700 Mo)wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img \ -O /var/lib/libvirt/images/ubuntu-24.04-cloud.img
# Créer un snapshot pour chaque VM (20 Go max, mais démarre petit)# Le backing file (-b) permet de partager l'image de base entre toutes les VMsqemu-img create -f qcow2 -b /var/lib/libvirt/images/ubuntu-24.04-cloud.img \ -F qcow2 /var/lib/libvirt/images/cp1.qcow2 20Gqemu-img create -f qcow2 -b /var/lib/libvirt/images/ubuntu-24.04-cloud.img \ -F qcow2 /var/lib/libvirt/images/worker1.qcow2 20Gqemu-img create -f qcow2 -b /var/lib/libvirt/images/ubuntu-24.04-cloud.img \ -F qcow2 /var/lib/libvirt/images/worker2.qcow2 20GRocky Linux 9 est l’alternative RHEL-compatible, gratuite et supportée par la communauté. Elle est particulièrement adaptée si vous travaillez avec des clusters d’entreprise basés sur RHEL.
# Télécharger l'image cloud Rocky Linux (environ 1 Go)wget https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud.latest.x86_64.qcow2 \ -O /var/lib/libvirt/images/rocky-9-cloud.qcow2
# Créer un snapshot pour chaque VMqemu-img create -f qcow2 -b /var/lib/libvirt/images/rocky-9-cloud.qcow2 \ -F qcow2 /var/lib/libvirt/images/cp1.qcow2 20Gqemu-img create -f qcow2 -b /var/lib/libvirt/images/rocky-9-cloud.qcow2 \ -F qcow2 /var/lib/libvirt/images/worker1.qcow2 20Gqemu-img create -f qcow2 -b /var/lib/libvirt/images/rocky-9-cloud.qcow2 \ -F qcow2 /var/lib/libvirt/images/worker2.qcow2 20GConfigurer cloud-init
Section intitulée « Configurer cloud-init »Cloud-init est l’outil standard pour initialiser les instances cloud. Il configure le hostname, crée les utilisateurs, injecte les clés SSH et peut exécuter des commandes au premier boot. Créez un fichier de configuration pour chaque VM en adaptant l’adresse IP et le hostname.
Le fichier ci-dessous configure le control plane (cp1). Les points importants :
- Utilisateur
kube: compte dédié avec sudo sans mot de passe pour simplifier les manipulations - Clé SSH : remplacez par votre clé publique pour vous connecter sans mot de passe
- IP statique : garantit que les nœuds gardent la même IP après reboot
- Swap désactivé : kubelet refuse de démarrer si le swap est actif
#cloud-confighostname: cp1fqdn: cp1.kube.localmanage_etc_hosts: true
users: - name: kube sudo: ALL=(ALL) NOPASSWD:ALL groups: sudo shell: /bin/bash ssh_authorized_keys: - ssh-ed25519 AAAA... votre-clé-publique
# Réseau statique - adaptez à votre réseau libvirtnetwork: version: 2 ethernets: enp1s0: addresses: - 192.168.122.10/24 gateway4: 192.168.122.1 nameservers: addresses: - 192.168.122.1
# Commandes exécutées au premier bootruncmd: - swapoff -a - sed -i '/swap/d' /etc/fstabCréez des fichiers similaires pour worker1 (IP .20) et worker2 (IP .21).
Créer les VMs avec virt-install
Section intitulée « Créer les VMs avec virt-install »Maintenant que les images et la configuration cloud-init sont prêtes, créons les VMs. La commande cloud-localds génère un disque ISO contenant la configuration cloud-init, que la VM lira au premier boot.
# Générer l'ISO cloud-init pour le control planecloud-localds /var/lib/libvirt/images/cp1-cidata.iso cloud-init-cp1.yaml
# Créer la VM control plane# --import : utilise un disque existant au lieu de lancer une installation# --noautoconsole : ne pas attacher de console (la VM démarre en arrière-plan)virt-install \ --name cp1 \ --ram 2048 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/cp1.qcow2,format=qcow2 \ --disk path=/var/lib/libvirt/images/cp1-cidata.iso,device=cdrom \ --os-variant ubuntu24.04 \ --network network=default \ --graphics none \ --console pty,target_type=serial \ --import \ --noautoconsoleRépétez l’opération pour worker1 et worker2 en adaptant les noms et les fichiers cloud-init.
Vérification : après une minute de boot, testez la connexion SSH. Si la connexion échoue, vérifiez que votre clé publique est correcte dans le fichier cloud-init.
ssh kube@192.168.122.10# Doit se connecter sans demander de mot de passeInstallation des prérequis sur tous les nœuds
Section intitulée « Installation des prérequis sur tous les nœuds »Cette section prépare le système pour exécuter Kubernetes. Chaque étape a une raison précise, et sauter une étape causera des problèmes difficiles à diagnostiquer. Exécutez ces commandes sur tous les nœuds (control plane et workers).
-
Configurer les modules kernel pour le réseau des conteneurs
Kubernetes utilise des bridges réseau virtuels pour connecter les conteneurs. Le module
overlaypermet le stockage en couches des images conteneur. Le modulebr_netfilterpermet au trafic réseau qui traverse les bridges d’être traité par iptables, ce qui est essentiel pour les règles de Services Kubernetes.Fenêtre de terminal # Charger les modules au démarragecat <<EOF | sudo tee /etc/modules-load.d/k8s.confoverlaybr_netfilterEOF# Charger les modules immédiatement (sans reboot)sudo modprobe overlaysudo modprobe br_netfilterVérification : les modules doivent apparaître dans la liste des modules chargés.
Fenêtre de terminal lsmod | grep -E 'overlay|br_netfilter'# br_netfilter 32768 0# overlay 151552 0 -
Configurer sysctl pour le forwarding réseau
Ces paramètres kernel permettent au trafic réseau de traverser les interfaces virtuelles. Sans eux, les pods ne pourraient pas communiquer entre eux ni avec l’extérieur. Le paramètre
ip_forwardactive le routage IP, indispensable car chaque nœud agit comme un routeur pour ses pods.Fenêtre de terminal cat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1EOF# Appliquer sans rebootsudo sysctl --systemVérification : les valeurs doivent être à 1.
Fenêtre de terminal sysctl net.ipv4.ip_forward# net.ipv4.ip_forward = 1 -
Désactiver le swap (obligatoire)
Le kubelet refuse catégoriquement de démarrer si le swap est actif. Pourquoi ? Le scheduler Kubernetes prend des décisions de placement basées sur la mémoire disponible. Si le système swape, ces calculs deviennent faux et les performances s’effondrent. Si cloud-init l’a déjà fait, cette commande est inoffensive.
Fenêtre de terminal # Désactiver immédiatementsudo swapoff -a# Supprimer l'entrée swap du fstab pour que ça persiste au rebootsudo sed -i '/swap/d' /etc/fstabVérification : la commande
freene doit montrer aucun swap.Fenêtre de terminal free -h | grep Swap# Swap: 0B 0B 0B -
Installer containerd comme runtime de conteneurs
Kubernetes a besoin d’un runtime de conteneurs conforme à l’interface CRI (Container Runtime Interface). Depuis Kubernetes 1.24, Docker n’est plus supporté nativement. containerd est devenu le standard de fait : léger, stable, et utilisé par tous les clouds publics. Nous l’installons depuis le dépôt Docker car il fournit des binaires à jour.
Fenêtre de terminal # Installer les dépendances pour ajouter des repos HTTPSsudo apt-get updatesudo apt-get install -y ca-certificates curl gnupg# Ajouter la clé GPG du repo Dockersudo install -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | \sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg# Ajouter le repo Dockerecho "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \sudo tee /etc/apt/sources.list.d/docker.list# Installer containerdsudo apt-get updatesudo apt-get install -y containerd.ioFenêtre de terminal # Ajouter le repo Dockersudo dnf config-manager --add-repo \https://download.docker.com/linux/centos/docker-ce.repo# Installer containerdsudo dnf install -y containerd.io -
Configurer containerd avec le cgroup driver systemd
C’est l’étape la plus critique et la plus souvent oubliée. Kubernetes et containerd doivent utiliser le même cgroup driver. Sur les distributions modernes avec systemd, ce driver doit être
systemd(pascgroupfs). Si vous oubliez cette configuration, le kubelet crashera avec des erreurs cryptiques.Fenêtre de terminal # Générer la configuration par défautsudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml# CRITIQUE : activer le cgroup driver systemdsudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml# Redémarrer pour appliquersudo systemctl restart containerdsudo systemctl enable containerdVérification : containerd doit être actif et la configuration correcte.
Fenêtre de terminal sudo systemctl status containerd# ● containerd.service - containerd container runtime# Active: active (running)grep SystemdCgroup /etc/containerd/config.toml# SystemdCgroup = true -
Installer kubeadm, kubelet et kubectl
Ces trois binaires forment le cœur de l’installation :
- kubeadm : outil de bootstrap qui initialise le cluster et génère les certificats
- kubelet : agent qui tourne sur chaque nœud et gère les containers
- kubectl : CLI pour interagir avec l’API Kubernetes
Fenêtre de terminal # Ajouter la clé GPG du repo Kubernetessudo mkdir -p /etc/apt/keyringscurl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | \sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg# Ajouter le repo Kubernetesecho 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | \sudo tee /etc/apt/sources.list.d/kubernetes.list# Installer les composantssudo apt-get updatesudo apt-get install -y kubelet kubeadm kubectl# Bloquer les mises à jour automatiques (important pour les upgrades contrôlés)sudo apt-mark hold kubelet kubeadm kubectlFenêtre de terminal # Ajouter le repo Kubernetescat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/enabled=1gpgcheck=1gpgkey=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/repodata/repomd.xml.keyEOF# Installer les composantssudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetessudo systemctl enable kubeletVérification : les binaires doivent être installés à la bonne version.
Fenêtre de terminal kubeadm version# kubeadm version: &version.Info{Major:"1", Minor:"35", GitVersion:"v1.35.2"...}kubectl version --client# Client Version: v1.35.2
Initialisation du cluster
Section intitulée « Initialisation du cluster »L’initialisation du cluster est le moment où kubeadm génère tous les composants du control plane : certificats TLS, fichiers de configuration, et pods statiques. Cette étape ne s’exécute que sur le premier nœud control plane.
Comprendre les options de kubeadm init
Section intitulée « Comprendre les options de kubeadm init »Avant de lancer la commande, comprenez chaque option pour pouvoir adapter à votre environnement :
| Option | Signification | Pourquoi c’est important |
|---|---|---|
--pod-network-cidr | Plage d’adresses pour les pods | Le CNI (Flannel, Calico) utilisera ce CIDR. 10.244.0.0/16 est le défaut pour Flannel |
--apiserver-advertise-address | IP sur laquelle l’API server écoute | Les workers et kubectl utiliseront cette IP |
--control-plane-endpoint | Endpoint stable pour le control plane | Indispensable pour HA : permet d’ajouter d’autres control planes plus tard |
Méthode recommandée : fichier de configuration YAML
Section intitulée « Méthode recommandée : fichier de configuration YAML »Plutôt que des options CLI longues, utilisez un fichier de configuration kubeadm. C’est reproductible, versionnable et compatible avec IaC (Ansible, Terraform).
Créez un fichier kubeadm-config.yaml :
apiVersion: kubeadm.k8s.io/v1beta4kind: ClusterConfigurationkubernetesVersion: v1.35.2controlPlaneEndpoint: "192.168.122.10:6443"networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12---apiVersion: kubelet.config.k8s.io/v1beta1kind: KubeletConfigurationcgroupDriver: systemdPuis initialisez avec :
sudo kubeadm init --config kubeadm-config.yamlInitialiser avec la ligne de commande (alternative)
Section intitulée « Initialiser avec la ligne de commande (alternative) »Si vous préférez ne pas créer de fichier YAML pour un lab rapide, vous pouvez utiliser les options CLI. Sur le nœud cp1 uniquement, lancez l’initialisation :
sudo kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=192.168.122.10 \ --control-plane-endpoint=192.168.122.10:6443Sortie attendue (les tokens seront différents) :
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.122.10:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:...Copiez et sauvegardez la commande kubeadm join affichée ! Vous en aurez besoin pour joindre les workers. Le token expire après 24 heures.
Configurer kubectl pour l’utilisateur courant
Section intitulée « Configurer kubectl pour l’utilisateur courant »kubectl a besoin d’un fichier kubeconfig pour savoir comment contacter l’API server et s’authentifier. Le fichier admin.conf généré par kubeadm contient un certificat client avec les droits administrateur. On le copie dans le répertoire home de l’utilisateur pour que kubectl le trouve automatiquement.
# Créer le répertoire de configuration kubectlmkdir -p $HOME/.kube
# Copier le fichier de configuration adminsudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# Donner les droits à l'utilisateur courantsudo chown $(id -u):$(id -g) $HOME/.kube/configVérification : kubectl doit maintenant pouvoir contacter l’API server.
kubectl get nodes# NAME STATUS ROLES AGE VERSION# cp1 NotReady control-plane 30s v1.35.2Le statut NotReady est normal à ce stade : le CNI (Container Network Interface) n’est pas encore installé. Sans CNI, les pods ne peuvent pas obtenir d’adresses IP et le nœud ne peut pas être considéré comme prêt.
Installer le plugin réseau CNI
Section intitulée « Installer le plugin réseau CNI »Le CNI (Container Network Interface) fournit le réseau aux pods. Sans lui, les pods resteront en Pending et le nœud en NotReady.
Choisissez votre CNI selon votre cas d’usage :
| CNI | Usage conseillé | NetworkPolicies | Complexité | Quand l’utiliser |
|---|---|---|---|---|
| Flannel | Lab, démo, apprentissage | ❌ Non | ⭐ Faible | Vous débutez ou n’avez pas besoin de NetworkPolicies |
| Calico | Production classique | ✅ Oui | ⭐⭐ Moyenne | Vous avez besoin d’isolation réseau entre namespaces |
| Cilium | Production avancée, observabilité | ✅ Oui + eBPF | ⭐⭐⭐ Plus élevée | Vous voulez de l’observabilité réseau poussée |
Flannel est le CNI le plus simple à installer. Parfait pour apprendre et pour la CKA. Il ne supporte pas les NetworkPolicies, mais ce n’est pas un problème pour un lab.
# Installer Flannelkubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.ymlCalico supporte les NetworkPolicies et offre plus de contrôle sur le réseau. Recommandé pour les clusters self-managed sérieux et la production.
# Installer l'opérateur Calicokubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml
# Installer Calico avec le bon CIDR (doit correspondre à --pod-network-cidr)kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/custom-resources.yamlCette commande crée un namespace dédié, un DaemonSet, des ConfigMaps et les RBAC nécessaires. Attendez environ 30 secondes que les pods CNI démarrent.
Vérification : le nœud doit passer en Ready et Flannel doit tourner.
# Le nœud doit maintenant être Readykubectl get nodes# NAME STATUS ROLES AGE VERSION# cp1 Ready control-plane 2m v1.35.2
# Le pod Flannel doit être Runningkubectl get pods -n kube-flannel# NAME READY STATUS RESTARTS AGE# kube-flannel-ds-xxxxx 1/1 Running 0 30s
# Vérifier aussi les pods systèmekubectl get pods -n kube-system# Tous les pods doivent être Running ou CompletedJoindre les workers au cluster
Section intitulée « Joindre les workers au cluster »Chaque worker doit s’enregistrer auprès du control plane pour recevoir des pods. La commande kubeadm join utilise un token et un hash de certificat pour authentifier le nœud auprès du cluster.
Sur chaque worker (worker1 et worker2), exécutez la commande copiée lors de l’initialisation :
sudo kubeadm join 192.168.122.10:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:...Le token est valide 24 heures. Si vous l’avez perdu ou s’il a expiré, générez-en un nouveau sur le control plane :
# Sur le control plane : regénérer la commande join complètekubeadm token create --print-join-commandVérification finale depuis le control plane : tous les nœuds doivent être Ready.
kubectl get nodes -o wide# NAME STATUS ROLES AGE VERSION INTERNAL-IP OS-IMAGE# cp1 Ready control-plane 5m v1.35.2 192.168.122.10 Ubuntu 24.04# worker1 Ready <none> 2m v1.35.2 192.168.122.20 Ubuntu 24.04# worker2 Ready <none> 1m v1.35.2 192.168.122.21 Ubuntu 24.04Félicitations ! Vous avez un cluster Kubernetes fonctionnel. Les sections suivantes couvrent la haute disponibilité, les mises à jour et le dépannage.
Configuration haute disponibilité
Section intitulée « Configuration haute disponibilité »En production, un seul control plane représente un point de défaillance unique (SPOF). Si cp1 tombe, l’API server devient inaccessible et vous ne pouvez plus gérer le cluster. Les workers continuent de faire tourner les pods existants, mais vous ne pouvez plus déployer, scaler ou modifier quoi que ce soit.
La haute disponibilité (HA) résout ce problème avec 3 control planes et un load balancer devant eux. Même si un control plane tombe, les deux autres continuent de répondre.
Choisir votre topologie etcd
Section intitulée « Choisir votre topologie etcd »Kubernetes HA supporte deux architectures etcd. Comprenez les différences avant de choisir :
| Architecture | Description | Avantages | Inconvénients | Quand l’utiliser |
|---|---|---|---|---|
| Stacked etcd | etcd sur les mêmes nœuds que le control plane | Moins de VMs, plus simple | Couplage control plane/etcd, risque de contention ressources | Lab, CKA, clusters < 50 nœuds |
| External etcd | Cluster etcd dédié (3 VMs séparées) | Isolation ressources, scaling indépendant | Plus de VMs, complexité certificats | Production critique, > 50 nœuds |
Ce guide utilise stacked etcd (la topologie par défaut de kubeadm).
Attention au load balancer comme SPOF
Section intitulée « Attention au load balancer comme SPOF »Le load balancer (HAProxy) lui-même peut devenir un point de défaillance unique. En production stricte :
- Utilisez 2 instances HAProxy avec Keepalived pour une VIP flottante
- Ou un load balancer cloud (AWS ELB, GCP LB) qui est nativement HA
Architecture HA
Section intitulée « Architecture HA »Le schéma ci-dessous montre une architecture HA typique avec 3 control planes. HAProxy distribue le trafic entre les API servers. Chaque control plane héberge son propre etcd (architecture “stacked”). Les workers contactent uniquement HAProxy.
Installer HAProxy sur une VM dédiée
Section intitulée « Installer HAProxy sur une VM dédiée »HAProxy agit comme un load balancer TCP pour le port 6443 de l’API server. Créez une VM dédiée (IP 192.168.122.5) ou utilisez un LB existant. Cette configuration utilise le health check TCP : si un control plane ne répond pas, HAProxy arrête de lui envoyer du trafic.
sudo apt-get install -y haproxyConfigurez HAProxy pour distribuer le trafic entre les 3 control planes. Le mode tcp est utilisé car l’API server utilise TLS et HAProxy ne doit pas terminer la connexion SSL.
global daemon maxconn 256
defaults mode tcp timeout connect 5000ms timeout client 50000ms timeout server 50000ms
frontend kubernetes-frontend bind *:6443 default_backend kubernetes-backend
backend kubernetes-backend balance roundrobin option tcp-check server cp1 192.168.122.10:6443 check server cp2 192.168.122.11:6443 check server cp3 192.168.122.12:6443 checkRedémarrez HAProxy et vérifiez qu’il écoute sur le port 6443 :
sudo systemctl restart haproxysudo systemctl enable haproxy
# Vérifier que HAProxy écoutess -tlnp | grep 6443# LISTEN 0 128 *:6443 *:* users:(("haproxy",...))Initialiser le premier control plane HA
Section intitulée « Initialiser le premier control plane HA »L’initialisation en mode HA diffère par l’option --upload-certs qui chiffre et stocke les certificats dans un Secret Kubernetes. Les autres control planes récupéreront ces certificats lors de leur jointure.
sudo kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --control-plane-endpoint="192.168.122.5:6443" \ --upload-certsPoints importants :
--control-plane-endpointpointe vers HAProxy (pas vers cp1)--upload-certsgénère une clé de déchiffrement valide 2 heures
La sortie affiche deux commandes kubeadm join :
- Une pour les workers (sans
--control-plane) - Une pour les control planes (avec
--control-plane --certificate-key)
Joindre les autres control planes
Section intitulée « Joindre les autres control planes »Sur cp2 et cp3, exécutez la commande spéciale pour control planes :
sudo kubeadm join 192.168.122.5:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:... \ --control-plane \ --certificate-key ...Vérification : les 3 control planes doivent apparaître avec le rôle control-plane.
kubectl get nodes# NAME STATUS ROLES AGE VERSION# cp1 Ready control-plane 10m v1.35.2# cp2 Ready control-plane 5m v1.35.2# cp3 Ready control-plane 3m v1.35.2Mise à jour du cluster
Section intitulée « Mise à jour du cluster »La mise à jour (upgrade) d’un cluster Kubernetes est une compétence essentielle pour la CKA. Kubernetes suit un cycle de release rapide (3 versions mineures par an), et vous devez savoir mettre à jour sans interruption de service.
Règles de version skew
Section intitulée « Règles de version skew »Kubernetes impose des règles strictes de compatibilité entre versions. Le version skew définit l’écart de version autorisé entre composants :
| Composant | Skew autorisé par rapport à kube-apiserver |
|---|---|
| kubelet | -2 versions mineures (ex: API 1.35 → kubelet 1.33 OK) |
| kubectl | ±1 version mineure |
| kube-controller-manager, kube-scheduler | Même version ou -1 |
Règle pratique : mettez à jour le control plane avant les workers, et ne sautez pas de version mineure.
Mettre à jour le control plane
Section intitulée « Mettre à jour le control plane »La mise à jour du control plane se fait en plusieurs étapes. Cette procédure minimise le temps d’indisponibilité de l’API server.
-
Vérifier les versions disponibles
Avant de mettre à jour, vérifiez quelle version est disponible dans le dépôt. Cela vous permet de planifier la mise à jour et de vérifier que la version cible existe.
Fenêtre de terminal # Lister les versions disponibles de kubeadmapt-cache madison kubeadm | head -5# kubeadm | 1.35.2-1.1 | https://pkgs.k8s.io/...# kubeadm | 1.35.1-1.1 | https://pkgs.k8s.io/...# kubeadm | 1.35.0-1.1 | https://pkgs.k8s.io/... -
Mettre à jour kubeadm en premier
kubeadm doit être à la version cible avant de pouvoir appliquer la mise à jour. On débloque temporairement le paquet, on met à jour, puis on rebloque.
Fenêtre de terminal # Débloquer kubeadmsudo apt-mark unhold kubeadm# Mettre à jour le cache et installer la nouvelle versionsudo apt-get updatesudo apt-get install -y kubeadm=1.35.2-1.1# Rebloquer pour éviter les mises à jour automatiquessudo apt-mark hold kubeadm -
Vérifier le plan de mise à jour
Cette commande affiche exactement ce qui va être mis à jour. Elle vérifie aussi les prérequis et signale les problèmes potentiels. Lisez attentivement la sortie avant de continuer.
Fenêtre de terminal sudo kubeadm upgrade plan# [upgrade] Fetching available versions to upgrade to# Components that must be upgraded manually after you have upgraded the control plane:# COMPONENT CURRENT TARGET# kubelet v1.35.1 v1.35.2## Upgrade to the latest stable version:# COMPONENT CURRENT TARGET# kube-apiserver v1.35.1 v1.35.2# kube-controller-manager v1.35.1 v1.35.2# kube-scheduler v1.35.1 v1.35.2# kube-proxy v1.35.1 v1.35.2# CoreDNS v1.11.1 v1.11.3# etcd 3.5.15 3.5.16 -
Appliquer la mise à jour
Cette commande met à jour les composants du control plane. Elle télécharge les nouvelles images, met à jour les manifestes des pods statiques, et redémarre les composants. Le cluster reste accessible pendant ce processus (quelques secondes d’indisponibilité possibles).
Fenêtre de terminal sudo kubeadm upgrade apply v1.35.2# [upgrade] Are you sure you want to proceed? [y/N]: y -
Mettre à jour kubelet et kubectl
kubelet et kubectl doivent être mis à jour séparément. Le kubelet gère les pods sur ce nœud, donc un redémarrage est nécessaire.
Fenêtre de terminal # Débloquer les paquetssudo apt-mark unhold kubelet kubectl# Installer les nouvelles versionssudo apt-get install -y kubelet=1.35.2-1.1 kubectl=1.35.2-1.1# Rebloquersudo apt-mark hold kubelet kubectl# Recharger la configuration systemd et redémarrer kubeletsudo systemctl daemon-reloadsudo systemctl restart kubeletVérification : le nœud control plane doit afficher la nouvelle version.
Fenêtre de terminal kubectl get nodes# NAME STATUS ROLES AGE VERSION# cp1 Ready control-plane 1d v1.35.2 # ← nouvelle version -
Vérifier les add-ons après upgrade
Après l’upgrade, vérifiez que les composants critiques fonctionnent toujours :
Fenêtre de terminal # Vérifier CoreDNSkubectl get pods -n kube-system -l k8s-app=kube-dns# Tous doivent être Running# Vérifier kube-proxykubectl get pods -n kube-system -l k8s-app=kube-proxy# DaemonSet, un pod par nœud# Vérifier le CNI (Flannel ou Calico)kubectl get pods -n kube-flannel # ou -n calico-system# Tous doivent être Running# Vérifier qu'il n'y a pas d'erreurs dans les eventskubectl get events -A --field-selector type=Warning --sort-by='.lastTimestamp' | head -10
Mettre à jour les workers
Section intitulée « Mettre à jour les workers »Les workers sont mis à jour un par un pour maintenir la disponibilité des applications. La procédure drain/upgrade/uncordon garantit que les pods sont déplacés avant toute intervention.
-
Drainer le nœud pour évacuer les pods
Le drain déplace gracieusement tous les pods vers d’autres nœuds. Les DaemonSets restent car ils doivent tourner sur chaque nœud. Les pods avec des volumes emptyDir perdent leurs données, d’où l’option
--delete-emptydir-data.Fenêtre de terminal # Depuis le control planekubectl drain worker1 --ignore-daemonsets --delete-emptydir-data# Vérifier que le nœud est cordoned (SchedulingDisabled)kubectl get nodes# worker1 Ready,SchedulingDisabled <none> 1d v1.35.1 -
Mettre à jour kubeadm et kubelet sur le worker
Sur le worker lui-même (pas sur le control plane), mettez à jour les composants. La commande
kubeadm upgrade nodemet à jour la configuration locale du kubelet.Fenêtre de terminal # Sur le worker (SSH kube@192.168.122.20)sudo apt-mark unhold kubeadm kubeletsudo apt-get updatesudo apt-get install -y kubeadm=1.35.2-1.1 kubelet=1.35.2-1.1sudo apt-mark hold kubeadm kubelet# Mettre à jour la configuration kubeletsudo kubeadm upgrade node# Redémarrer kubeletsudo systemctl daemon-reloadsudo systemctl restart kubelet -
Remettre le nœud en service
Une fois la mise à jour terminée, autorisez à nouveau le scheduling sur ce nœud. Les pods en attente seront automatiquement schedulés dessus.
Fenêtre de terminal # Depuis le control planekubectl uncordon worker1# Vérifier que le nœud est Ready et à la nouvelle versionkubectl get nodes# worker1 Ready <none> 1d v1.35.2
Répétez cette procédure pour chaque worker. En production, attendez que les pods soient stables sur un nœud avant de passer au suivant.
Sauvegarde et restauration d’etcd
Section intitulée « Sauvegarde et restauration d’etcd »etcd est la base de données du cluster Kubernetes. Elle contient tout : Deployments, Services, Secrets, ConfigMaps, état des pods, etc. Si etcd est corrompu ou perdu sans sauvegarde, le cluster est irrécupérable. La sauvegarde régulière d’etcd est donc critique en production.
Comprendre où sont stockées les données etcd
Section intitulée « Comprendre où sont stockées les données etcd »etcd tourne comme un pod statique sur chaque control plane. Ses données sont dans /var/lib/etcd/ et ses certificats dans /etc/kubernetes/pki/etcd/. Pour interagir avec etcd, vous avez besoin de 3 certificats :
| Certificat | Chemin | Rôle |
|---|---|---|
| CA | /etc/kubernetes/pki/etcd/ca.crt | Autorité de certification etcd |
| Certificat client | /etc/kubernetes/pki/etcd/server.crt | Authentification du client |
| Clé privée | /etc/kubernetes/pki/etcd/server.key | Signature des requêtes |
Sauvegarder etcd
Section intitulée « Sauvegarder etcd »La sauvegarde crée un snapshot de toutes les données etcd. Cette opération est non-bloquante et peut être exécutée sur un cluster en production.
# Créer un snapshot d'etcd# ETCDCTL_API=3 est obligatoire pour utiliser la v3 de l'APIETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.keyVérification : contrôlez que le snapshot est valide et contient des données. Depuis etcd 3.5.x, etcdctl snapshot status est déprécié ; utilisez plutôt etcdutl :
# Méthode recommandée (etcd 3.5+)etcdutl --write-out=table snapshot status /tmp/etcd-backup.db# +----------+----------+------------+------------+# | HASH | REVISION | TOTAL KEYS | TOTAL SIZE |# +----------+----------+------------+------------+# | a1b2c3d4 | 12345 | 1024 | 2.1 MB |# +----------+----------+------------+------------+
# Alternative si etcdutl n'est pas disponibleETCDCTL_API=3 etcdctl snapshot status /tmp/etcd-backup.db --write-out=tableRestaurer etcd
Section intitulée « Restaurer etcd »La restauration d’etcd est une opération destructive : elle écrase toutes les données actuelles. Utilisez-la uniquement pour récupérer d’un désastre ou migrer vers un nouveau cluster.
-
Arrêter le control plane
Arrêtez kubelet pour que les pods statiques (API server, etc.) s’arrêtent. etcd doit être arrêté pour la restauration.
Fenêtre de terminal sudo systemctl stop kubelet -
Restaurer le snapshot dans un nouveau répertoire
La restauration crée un nouveau répertoire de données. Elle ne modifie pas
/var/lib/etcddirectement.Fenêtre de terminal ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db \--data-dir=/var/lib/etcd-restored -
Remplacer les données etcd
Sauvegardez l’ancien répertoire (au cas où) et mettez le nouveau en place.
Fenêtre de terminal sudo mv /var/lib/etcd /var/lib/etcd.oldsudo mv /var/lib/etcd-restored /var/lib/etcd -
Redémarrer le control plane
kubelet va redémarrer les pods statiques, y compris etcd avec les données restaurées.
Fenêtre de terminal sudo systemctl start kubelet -
Vérifier que le cluster fonctionne
Attendez quelques minutes que tous les composants redémarrent.
Fenêtre de terminal kubectl get nodeskubectl get pods -A
Renouvellement des certificats
Section intitulée « Renouvellement des certificats »Les certificats Kubernetes générés par kubeadm expirent après 1 an par défaut. Un certificat expiré bloque complètement l’accès au cluster : kubectl ne fonctionne plus, les nœuds perdent le contact avec l’API server.
Vérifier l’expiration des certificats
Section intitulée « Vérifier l’expiration des certificats »Cette commande affiche la date d’expiration de chaque certificat. Planifiez le renouvellement avant l’expiration.
sudo kubeadm certs check-expiration# CERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGED# admin.conf Mar 15, 2027 10:00 UTC 364d no# apiserver Mar 15, 2027 10:00 UTC 364d no# apiserver-etcd-client Mar 15, 2027 10:00 UTC 364d no# ...Surveillez la colonne RESIDUAL TIME. Renouvelez quand il reste moins de 30 jours.
Renouveler tous les certificats
Section intitulée « Renouveler tous les certificats »Le renouvellement régénère tous les certificats avec une nouvelle validité d’un an. Les clients (kubectl, kubelet des workers) devront récupérer les nouveaux certificats.
# Renouveler tous les certificats du control planesudo kubeadm certs renew all
# Redémarrer les composants pour qu'ils utilisent les nouveaux certificatssudo systemctl restart kubeletAprès le renouvellement, mettez à jour le fichier kubeconfig de votre utilisateur :
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configDépannage du cluster
Section intitulée « Dépannage du cluster »Le dépannage représente 30% de l’examen CKA — c’est le domaine le plus lourd. Cette section vous donne une méthodologie structurée et les commandes essentielles pour diagnostiquer rapidement les problèmes.
Méthodologie de diagnostic
Section intitulée « Méthodologie de diagnostic »Face à un problème, suivez cette approche en couches :
- État du nœud :
kubectl get nodes— le nœud est-il Ready ? - Pods système :
kubectl get pods -n kube-system— les composants tournent-ils ? - kubelet :
journalctl -u kubelet— le kubelet démarre-t-il ? - Composants : logs des pods statiques avec
crictl - Réseau : connectivité entre pods, DNS, Services
Problèmes courants et solutions
Section intitulée « Problèmes courants et solutions »Ce tableau couvre les situations les plus fréquentes. Pour chaque symptôme, la cause la plus probable et la solution directe.
| Symptôme | Cause probable | Comment diagnostiquer | Solution |
|---|---|---|---|
Nœud NotReady après init | CNI non installé | kubectl describe node → “network plugin is not ready” | Installer Flannel ou Calico |
Nœud NotReady après reboot | kubelet ne démarre pas | journalctl -u kubelet -xe | Vérifier swap, cgroups, containerd |
connection refused :6443 | API server down | crictl ps -a | grep kube-api | Vérifier manifest /etc/kubernetes/manifests/kube-apiserver.yaml |
| Token expiré | Token > 24h | kubeadm token list | kubeadm token create --print-join-command |
| Certificat expiré | Certificats > 1 an | kubeadm certs check-expiration | kubeadm certs renew all |
Pods en Pending | Pas de nœud disponible ou ressources insuffisantes | kubectl describe pod <pod> → Events | Ajouter des workers ou libérer des ressources |
Pods en CrashLoopBackOff | Application qui crash | kubectl logs <pod> --previous | Corriger l’application |
CoreDNS en CrashLoopBackOff | Problème CNI ou loop DNS | kubectl logs -n kube-system coredns-xxx | Vérifier CNI, /etc/resolv.conf |
| Worker ne joint pas | Connectivité, token, ou cgroups | journalctl -u kubelet -xe sur le worker | Vérifier les 3 causes ci-dessus |
Diagnostic du kubelet
Section intitulée « Diagnostic du kubelet »Le kubelet est l’agent qui gère les conteneurs sur chaque nœud. S’il ne fonctionne pas, rien ne fonctionne sur ce nœud. Ces commandes sont vos premiers réflexes.
# État du service kubeletsudo systemctl status kubelet# Si inactive ou failed, regarder pourquoi :
# Logs détaillés du kubelet (les 100 dernières lignes)sudo journalctl -u kubelet -n 100 --no-pager
# Logs en temps réel (pour voir ce qui se passe pendant un test)sudo journalctl -u kubelet -f
# Erreurs spécifiques (--since pour limiter)sudo journalctl -u kubelet --since "5 minutes ago" | grep -i errorErreurs fréquentes dans les logs kubelet :
| Message d’erreur | Cause | Solution |
|---|---|---|
failed to run Kubelet: running with swap on is not supported | Swap actif | swapoff -a && sed -i '/swap/d' /etc/fstab |
failed to get cgroup | Mauvais cgroup driver | Vérifier SystemdCgroup = true dans containerd |
Unable to connect to the server | API server injoignable | Vérifier réseau et certificats |
certificate has expired | Certificats expirés | kubeadm certs renew all |
Diagnostic des pods statiques du control plane
Section intitulée « Diagnostic des pods statiques du control plane »Les composants du control plane (kube-apiserver, etcd, kube-scheduler, kube-controller-manager) sont des pods statiques gérés directement par kubelet. Leurs manifests sont dans /etc/kubernetes/manifests/. Pour voir leurs logs, utilisez crictl (pas kubectl, qui nécessite un API server fonctionnel).
# Lister tous les conteneurs (y compris arrêtés)sudo crictl ps -a
# Logs de l'API serversudo crictl logs $(sudo crictl ps -q --name kube-apiserver)
# Logs d'etcdsudo crictl logs $(sudo crictl ps -q --name etcd)
# Logs du schedulersudo crictl logs $(sudo crictl ps -q --name kube-scheduler)
# Logs du controller-managersudo crictl logs $(sudo crictl ps -q --name kube-controller-manager)Vérifier l’état d’etcd
Section intitulée « Vérifier l’état d’etcd »etcd est la base de données du cluster. Si etcd ne fonctionne pas, l’API server ne peut pas stocker ni récupérer de données.
# Statut des endpoints etcd (santé du cluster etcd)sudo ETCDCTL_API=3 etcdctl endpoint health \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key
# Sortie attendue :# https://127.0.0.1:2379 is healthy: successfully committed proposal: took = 2.5ms
# Liste des membres du cluster etcd (utile en HA)sudo ETCDCTL_API=3 etcdctl member list \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.keyDiagnostic réseau et DNS
Section intitulée « Diagnostic réseau et DNS »Les problèmes réseau sont fréquents. Ces commandes vérifient que les pods peuvent communiquer et que le DNS fonctionne.
# Vérifier que CoreDNS fonctionnekubectl get pods -n kube-system -l k8s-app=kube-dns# Les pods doivent être Running
# Tester la résolution DNS depuis un pod temporairekubectl run dnstest --image=busybox:1.28 --rm -it --restart=Never -- nslookup kubernetes# Doit résoudre vers l'IP du service kubernetes (10.96.0.1 par défaut)
# Si DNS échoue, vérifier le service CoreDNSkubectl get svc -n kube-system kube-dnskubectl get endpoints -n kube-system kube-dns
# Vérifier les logs CoreDNSkubectl logs -n kube-system -l k8s-app=kube-dnsDiagnostic des Services et endpoints
Section intitulée « Diagnostic des Services et endpoints »Quand un Service ne répond pas, vérifiez la chaîne complète : Service → Endpoints → Pods.
# Lister les Services avec leurs ClusterIPkubectl get svc -A
# Vérifier qu'un Service a des endpoints (pods cibles)kubectl get endpoints <service-name># Si ENDPOINTS est vide, le selector ne matche aucun pod
# Vérifier les EndpointSlices (nouveau format)kubectl get endpointslices -l kubernetes.io/service-name=<service-name>
# Tester la connectivité vers un Service depuis un podkubectl run curltest --image=curlimages/curl --rm -it --restart=Never -- \ curl -v http://<service-name>.<namespace>.svc.cluster.localVoir les événements récents
Section intitulée « Voir les événements récents »Les événements Kubernetes sont une mine d’or pour le dépannage. Ils montrent ce qui s’est passé récemment.
# Tous les événements du cluster, triés par datekubectl get events -A --sort-by='.lastTimestamp'
# Événements d'un namespace spécifiquekubectl get events -n <namespace>
# Événements liés à un objet spécifiquekubectl describe pod <pod-name> # Section Events en bas
# Filtrer les événements de type Warningkubectl get events -A --field-selector type=WarningReset complet d’un nœud
Section intitulée « Reset complet d’un nœud »Si un nœud est trop corrompu pour être réparé, réinitialisez-le complètement. Cette procédure efface toute la configuration Kubernetes du nœud.
# Réinitialiser kubeadm (supprime certificats et configuration)sudo kubeadm reset -f
# Supprimer la configuration CNIsudo rm -rf /etc/cni/net.d
# Supprimer le kubeconfig utilisateursudo rm -rf $HOME/.kube
# Nettoyer les règles iptables créées par kube-proxysudo iptables -Fsudo iptables -t nat -Fsudo iptables -t mangle -Fsudo iptables -X
# Optionnel : nettoyer les images containerdsudo crictl rmi --allAprès le reset, vous pouvez rejoindre le cluster avec kubeadm join.
Compétences CKA couvertes par ce guide
Section intitulée « Compétences CKA couvertes par ce guide »Ce guide couvre principalement le domaine Cluster Architecture, Installation & Configuration (25%) de la CKA. Le tableau ci-dessous résume ce que vous avez appris et ce qui reste à maîtriser dans d’autres guides.
Ce que ce guide couvre (25% de l’examen)
Section intitulée « Ce que ce guide couvre (25% de l’examen) »| Objectif CKA | Section du guide | Compétence acquise |
|---|---|---|
| Préparer l’infrastructure pour installer un cluster | Création des VMs, prérequis | Configuration kernel, containerd, swap |
| Créer et gérer des clusters avec kubeadm | Initialisation, join workers | kubeadm init, kubeadm join, CNI |
| Gérer le cycle de vie d’un cluster | Mise à jour | kubeadm upgrade, drain/uncordon |
| Implémenter un control plane HA | Configuration HA | HAProxy, stacked etcd, join control planes |
| Comprendre les interfaces d’extension (CNI, CSI, CRI) | Installation containerd, CNI | CRI avec containerd, CNI avec Flannel |
| Sauvegarder et restaurer etcd | Sauvegarde/restauration | etcdctl snapshot save/restore |
Ce que ce guide ne couvre pas (à étudier ailleurs)
Section intitulée « Ce que ce guide ne couvre pas (à étudier ailleurs) »La CKA évalue aussi des compétences non couvertes ici. Consultez les guides dédiés :
| Domaine CKA | Poids | Ce qu’il faut savoir | Guide recommandé |
|---|---|---|---|
| Troubleshooting | 30% | Logs, events, debug réseau, kubelet | Ce guide + pratique intensive |
| Services & Networking | 20% | Services, Ingress, NetworkPolicies, Gateway API, CoreDNS | Guide Réseau Kubernetes |
| Workloads & Scheduling | 15% | Deployments, rollouts, ConfigMaps, Secrets, scheduling | Guide Workloads Kubernetes |
| Storage | 10% | PV, PVC, StorageClass, access modes | Guide Storage Kubernetes |
Outils à maîtriser pour la CKA
Section intitulée « Outils à maîtriser pour la CKA »La CKA attend que vous maîtrisiez certains outils de packaging et configuration :
| Outil | Ce qu’il faut savoir | Couvert ici ? |
|---|---|---|
| kubectl | Toutes les commandes, output JSON/YAML, —dry-run | Partiellement |
| kubeadm | init, join, upgrade, certs, reset | ✅ Oui |
| etcdctl | snapshot save/restore, endpoint health | ✅ Oui |
| Helm | install, upgrade, rollback, values | ❌ Guide dédié |
| Kustomize | bases, overlays, patches | ❌ Guide dédié |
| crictl | ps, logs, images | ✅ Oui |
Tester vos connaissances
Section intitulée « Tester vos connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
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
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »Ce guide vous a appris à installer et maintenir un cluster Kubernetes avec kubeadm. Voici les points essentiels à retenir :
-
kubeadm est l’outil officiel de bootstrap — il génère certificats, manifests et configure le cluster selon les standards upstream
-
containerd avec
SystemdCgroup = trueest obligatoire — c’est l’erreur n°1 des débutants, vérifiez toujours ce paramètre -
Les modules kernel
overlayetbr_netfiltersont indispensables pour le réseau des conteneurs -
Le swap doit être désactivé — kubelet refuse de démarrer si le swap est actif
-
Le CNI (Flannel, Calico) s’installe après
kubeadm init— sans lui, les nœuds restent en NotReady -
Spécifiez
--control-plane-endpointmême pour un cluster single-node, cela permet de passer en HA plus tard -
Mettez à jour control plane avant workers — respectez le version skew (1 version mineure max)
-
Sauvegardez etcd régulièrement — c’est la seule source de vérité du cluster, sans backup = perte totale
-
Renouvelez les certificats avant expiration — ils expirent après 1 an, planifiez le renouvellement
-
Pour dépanner : kubelet logs → crictl logs → events → describe — suivez cette progression systématiquement
Prochaines étapes
Section intitulée « Prochaines étapes »Ce guide vous a donné les bases de l’installation. Pour compléter votre préparation CKA, explorez ces domaines complémentaires :
Ressources
Section intitulée « Ressources »Pour aller plus loin, consultez ces ressources officielles :
- Documentation kubeadm — référence officielle pour toutes les options et procédures
- CKA Certification — page officielle avec le curriculum et les objectifs de l’examen
- Kubernetes the Hard Way — installation manuelle pour comprendre chaque composant en profondeur
- GitHub kubeadm — issues et discussions sur kubeadm
- Best practices clusters de production — recommandations officielles pour la production