Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Mettre à jour un cluster Kubernetes sans interruption

15 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.

ComposantPrincipe
kube-apiserverComposant de référence pour la compatibilité. En HA, les instances doivent rester dans la fenêtre définie par la skew policy.
kubeletPeut rester temporairement plusieurs versions mineures derrière l’API server selon la skew policy.
kube-controller-manager / kube-schedulerDoivent rester proches des versions des API servers pendant la transition.
kubectlDoit rester dans la fenêtre de compatibilité officielle ; en pratique, gardez-le aligné ou très proche de la version du cluster.
kube-proxySuivre la skew policy officielle ; ne pas supposer qu’il suit simplement le kubelet.

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 skew policy permet de mettre à jour le control plane en premier, puis les workers progressivement — même sur un cluster avec beaucoup de nœuds. Consultez toujours la version skew policy officielle pour les fenêtres de compatibilité exactes avant un upgrade.

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.

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_API=3 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 :

Fenêtre de terminal
ETCDCTL_API=3 etcdctl snapshot status /tmp/etcd-backup-pre-upgrade.db --write-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

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
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 planifiées des composants gérés comme 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, les workloads applicatifs n’y tournent pas (taint NoSchedule du control plane). Dans d’autres environnements, traitez ce nœud comme tout autre nœud hébergeant des Pods.

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 --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

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
ETCDCTL_API=3 etcdctl 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)
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.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn