Aller au contenu
English
Conteneurs & Orchestration medium

Mettre à jour un cluster Kubernetes sans interruption

45 min de lecture

logo kubernetes

Pour mettre à jour un cluster Kubernetes, respectez toujours le même ordre : control plane d'abord, workers ensuite, un nœud à la fois. Ce guide détaille la stratégie d'upgrade, la version skew policy qui définit les écarts de version autorisés entre composants, et le workflow complet avec kubeadm upgrade, de la planification à la vérification post-upgrade.

  • Comprendre la version skew policy : quels écarts de version sont autorisés
  • Suivre l'ordre correct de mise à jour des composants
  • Exécuter un upgrade complet avec kubeadm : plan, apply, drain, uncordon
  • Mettre à jour les worker nodes un par un sans interruption
  • Vérifier le cluster après l'upgrade et gérer les cas d'échec

Kubernetes publie trois versions mineures par an (environ tous les 4 mois). Le projet maintient les trois dernières versions mineures, avec environ un an de support de patch pour les versions 1.19 et suivantes.

Rester sur une version obsolète expose votre cluster à :

  • Des vulnérabilités non corrigées (CVE)
  • L'incompatibilité avec les nouvelles versions des outils (Helm, Istio, opérateurs)
  • La perte du support technique des fournisseurs cloud

La bonne stratégie : mettre à jour une version mineure à la fois (par exemple 1.33 → 1.34, puis 1.34 → 1.35). Sauter des versions n'est pas supporté par kubeadm.

La version skew policy définit les écarts de version autorisés entre les composants Kubernetes. C'est la règle fondamentale à connaître avant tout upgrade.

ComposantÉcart autorisé face à kube-apiserver
kube-apiservercomposant de référence. En HA, les instances se mettent à jour une par une.
kubeletjamais plus récent, jusqu'à trois versions mineures plus ancien
kube-proxyjamais plus récent, jusqu'à trois versions mineures plus ancien
kube-controller-manager / kube-schedulerjamais plus récents, jusqu'à une version mineure plus anciens
kubectlune version mineure d'écart, plus récente ou plus ancienne

Deux points de cette table expliquent à eux seuls la stratégie d'upgrade. Le premier est l'asymétrie : un kubelet peut prendre du retard, jamais de l'avance. Le second est la taille de la fenêtre, trois versions pour les nœuds contre une seule pour kubectl. C'est ce qui rend possible la mise à jour en deux temps, et un kubelet en retard sur son API server est une situation supportée, pas une anomalie à corriger dans l'heure.

Dans un control plane HA, les instances de kube-apiserver doivent être mises à jour une par une en limitant l'écart de version entre elles. Les autres composants doivent rester compatibles avec l'instance la plus ancienne et la plus récente pendant la transition.

La tolérance d'écart de version autorise à mettre à jour le control plane en premier, puis les workers progressivement, même sur un cluster de nombreux nœuds. Consultez toujours la version skew policy officielle pour les fenêtres de compatibilité exactes, avant de commencer.

Avec kubeadm, la mise à jour commence par le control plane via kubeadm upgrade apply, qui gère les composants du plan de contrôle (API server, controller-manager, scheduler) ainsi que etcd et les addons lorsqu'ils sont administrés par kubeadm. Si etcd est géré séparément, sa stratégie de compatibilité doit être vérifiée à part.

Ensuite, les workers sont mis à jour un par un avec kubeadm upgrade node, suivi de la mise à jour de kubelet.

Enfin, mettez à jour kubectl sur vos postes d'administration.

Un upgrade de cluster ne se défait pas : la seule marche arrière est une restauration d'etcd, avec la perte de tout ce qui a changé depuis la sauvegarde. Les trois vérifications ci-dessous ne sont donc pas des formalités, ce sont les seules choses qui vous resteront si l'opération se passe mal.

Assurez-vous que le cluster est sain avant de commencer :

Fenêtre de terminal
kubectl get nodes
kubectl get pods -A | grep -v Running | grep -v Completed

Tous les nœuds doivent être Ready. Aucun pod critique ne doit être en erreur.

Une sauvegarde etcd est indispensable avant un upgrade. En cas de problème, elle permet de restaurer le cluster dans son état précédent.

Fenêtre de terminal
etcdctl snapshot save /tmp/etcd-backup-pre-upgrade.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.key

Vérification, avec etcdutl et non etcdctl : ce dernier affiche l'aide et sort en 0 sans rien vérifier, ce qui donne une sauvegarde réputée bonne sans qu'elle ait été lue.

Fenêtre de terminal
etcdutl snapshot status /tmp/etcd-backup-pre-upgrade.db --write-out=table

Pour un guide complet sur la sauvegarde, consultez Backup et restauration de cluster.

Avant chaque upgrade, consultez les notes de version officielles Kubernetes. Vérifiez :

  • Les breaking changes et APIs dépréciées
  • Les nouvelles fonctionnalités qui passent en GA (stable)
  • Les prérequis spécifiques à la version

Lisez les notes de version pour les suppressions d'API, et pas seulement pour les nouveautés. C'est le point qui casse des déploiements sans prévenir : un manifeste qui référence une version d'API retirée est refusé après l'upgrade, alors qu'il fonctionnait la veille. L'outil kubent ou kubectl-convert permet de repérer ces références avant de basculer.

L'upgrade se fait sur le premier nœud control plane d'abord, puis sur les éventuels autres nœuds control plane.

Sur le nœud control plane, mettez à jour le paquet kubeadm vers la version cible :

Fenêtre de terminal
# Ubuntu / Debian
sudo apt-mark unhold kubeadm
sudo apt-get update && sudo apt-get install -y kubeadm=1.35.0-1.1
sudo apt-mark hold kubeadm

Vérification :

Fenêtre de terminal
kubeadm version

Cette étape ne modifie rien : elle interroge le cluster et affiche les versions atteignables ainsi que les composants qui seront touchés. C'est aussi le moment où kubeadm signale les incompatibilités qu'il détecte, avant que quoi que ce soit ne soit engagé.

Fenêtre de terminal
sudo kubeadm upgrade plan

Cette commande affiche :

  • La version actuelle du cluster
  • La version cible disponible
  • Les composants qui seront mis à jour
  • Les éventuels avertissements (APIs dépréciées, etc.)

Lisez attentivement la sortie avant de continuer.

Fenêtre de terminal
sudo kubeadm upgrade apply v1.35.0

kubeadm upgrade apply met à jour les composants du control plane sur le nœud ciblé, et applique, selon la configuration du cluster, les mises à jour des composants qu'il gère : CoreDNS, kube-proxy et etcd.

Fenêtre de terminal
# Drainer le nœud
kubectl drain ks-cp1 --ignore-daemonsets
# Mettre à jour les paquets
sudo apt-mark unhold kubelet kubectl
sudo apt-get update && sudo apt-get install -y kubelet=1.35.0-1.1 kubectl=1.35.0-1.1
sudo apt-mark hold kubelet kubectl
# Redémarrer kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# Remettre le nœud en service
kubectl uncordon ks-cp1

Le drain d'un nœud control plane dépend de votre architecture. Dans beaucoup de clusters, aucune charge applicative n'y tourne, grâce au taint NoSchedule posé sur ces nœuds. Ailleurs, traitez-le comme n'importe quel nœud hébergeant des Pods.

Les deux sous-commandes ne font pas le même travail et ne s'emploient pas au même endroit. kubeadm upgrade apply ne se lance qu'une fois, sur le premier nœud du control plane : c'est lui qui décide de la version cible et met à jour les composants du plan de contrôle. kubeadm upgrade node se lance ensuite sur chacun des autres nœuds, control plane comme workers, et se contente d'aligner la configuration locale sur la décision déjà prise.

Les workers se mettent à jour un par un pour éviter toute interruption de service. Pour chaque worker, le workflow est identique.

  1. Mettre à jour kubeadm sur le worker :

    Fenêtre de terminal
    sudo apt-mark unhold kubeadm
    sudo apt-get update && sudo apt-get install -y kubeadm=1.35.0-1.1
    sudo apt-mark hold kubeadm
  2. Appliquer la configuration :

    Fenêtre de terminal
    sudo kubeadm upgrade node
  3. Drainer le worker (depuis un poste d'administration) :

    Fenêtre de terminal
    kubectl drain ks-worker1 --ignore-daemonsets --delete-emptydir-data
  4. Mettre à jour kubelet et kubectl :

    Fenêtre de terminal
    sudo apt-mark unhold kubelet kubectl
    sudo apt-get update && sudo apt-get install -y kubelet=1.35.0-1.1 kubectl=1.35.0-1.1
    sudo apt-mark hold kubelet kubectl
    sudo systemctl daemon-reload
    sudo systemctl restart kubelet
  5. Remettre le worker en service :

    Fenêtre de terminal
    kubectl uncordon ks-worker1
  6. Vérifier avant de passer au worker suivant :

    Fenêtre de terminal
    kubectl get nodes
    kubectl get pods -A -o wide | grep ks-worker1

Après avoir mis à jour tous les nœuds, vérifiez l'ensemble du cluster :

Fenêtre de terminal
kubectl get nodes

Tous les nœuds doivent afficher la même version :

NAME STATUS ROLES AGE VERSION
ks-cp1 Ready control-plane 43h v1.35.0
ks-worker1 Ready worker 43h v1.35.0
ks-worker2 Ready worker 43h v1.35.0
Fenêtre de terminal
kubectl get pods -n kube-system

Tous les pods du plan de contrôle doivent être Running.

Vérifiez la santé des composants via l'endpoint readyz de l'API server :

Fenêtre de terminal
kubectl get --raw='/readyz?verbose' | grep '\[-\]\|\[\+\]'

Créez un pod de test pour valider que le cluster fonctionne :

Fenêtre de terminal
kubectl run test-upgrade --image=nginx:1.28@sha256:146adea4768b83c607d0bdfa4188464e3da6e0a3ad4475db1d1d8f64f27c29cc --restart=Never
kubectl get pod test-upgrade -w

Attendez que le pod passe en Running, puis nettoyez :

Fenêtre de terminal
kubectl delete pod test-upgrade

Les trois situations ci-dessous se classent par gravité croissante, et la réponse n'est pas la même. Un upgrade apply qui refuse de démarrer n'a rien cassé ; un kubelet qui ne repart pas laisse un nœud hors service ; une restauration d'etcd fait perdre tout ce qui a changé depuis la sauvegarde. Essayez toujours dans cet ordre.

Si kubeadm upgrade apply échoue en cours de route, vous pouvez relancer la même commande en toute sécurité : elle est idempotente. Si le problème persiste, consultez les logs :

Fenêtre de terminal
sudo journalctl -u kubelet -f
sudo crictl ps -a

En dernier recours, si le cluster est dans un état incohérent après un upgrade raté, restaurez la sauvegarde etcd :

Fenêtre de terminal
etcdutl snapshot restore /tmp/etcd-backup-pre-upgrade.db \
--data-dir=/var/lib/etcd-restore

Puis remplacez le répertoire de données etcd et redémarrez les services. Consultez le guide Backup et restauration pour la procédure complète.

Si le kubelet ne démarre pas sur un nœud après la mise à jour :

Fenêtre de terminal
sudo journalctl -u kubelet -f --no-pager | tail -50

Causes fréquentes :

  • Incompatibilité de version : vérifiez que les versions installées respectent la version skew policy et l'ordre d'upgrade recommandé par kubeadm
  • Configuration obsolète : kubeadm upgrade node n'a pas été exécuté avant la mise à jour du kubelet
  • Certificats : les certificats ont expiré (renouvelez avec kubeadm certs renew all)

Ces symptômes se rencontrent pendant l'opération, au moment où le cluster est dans un état intermédiaire. Les avoir lus à froid vaut mieux que de les découvrir avec un nœud à moitié mis à jour et une fenêtre de maintenance qui se referme.

SymptômeCause probableSolution
kubeadm upgrade plan ne trouve pas la versionRepository apt/yum non mis à jourapt-get update puis réessayer
Upgrade bloqué depuis 10+ minutesPull d'images lent ou timeout réseauVérifier la connectivité et pré-pull les images : kubeadm config images pull
Nœud reste en NotReady après upgradekubelet pas redémarré ou mauvaise versionsystemctl restart kubelet ; vérifier kubelet --version
Pods en Pending après drainPas assez de ressources sur les nœuds restantsVérifier les requests/limits ; uncordon d'abord puis re-drain
CoreDNS ne fonctionne plusConfigMap CoreDNS personnalisé écraséRestaurer la config depuis le backup ; vérifier kubectl -n kube-system get cm coredns
API server inaccessible après upgradeCertificats expirés ou port occupésudo crictl logs <container-id> du conteneur kube-apiserver
  • Mettez à jour une version mineure à la fois : 1.33 → 1.34, jamais 1.33 → 1.35 directement.
  • L'ordre est strict : control plane d'abord (kubeadm upgrade apply), workers ensuite (kubeadm upgrade node), un nœud à la fois.
  • La version skew policy définit les fenêtres de compatibilité entre composants. Consultez-la systématiquement avant un upgrade.
  • Sauvegardez etcd avant chaque upgrade. C'est votre filet de sécurité.
  • Lisez les notes de version pour anticiper les breaking changes et APIs supprimées.
  • kubeadm upgrade apply est idempotent : en cas d'échec, relancez la même commande.
  • Vérifiez le cluster après chaque nœud : kubectl get nodes, pods système, test fonctionnel.

Sept questions sur ce qui ne se rattrape pas : les chiffres exacts de la tolérance d'écart de version, l'ordre imposé qui en découle, et le fait qu'une montée de version ne se défait pas.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
5 min.
80% 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

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