Mise à niveau d'un cluster Kubernetes (kubeadm)

Dans ce chapitre, nous allons comprendre la signification et cycle de vie des versions k8s et nous allons apprendre à mettre à jour un cluster kubernetes à l'aide de l'outil kubeadm.

Conseils, informations et prérequis

Dans ce chapitre nous allons étudier la mise à niveau des nœuds maîtres et des nœuds de travail de votre cluster kubernetes. Nous allons pour cela mettre à jour l'outil kubeadm et kubelet.

Pour ce Lab, nous allons passer de la version 1.16 vers la version 1.17. Mais, avant toutes choses assurez-vous du respect des prérequis/conseils suivants :

Les versions kubernetes

Comprendre les versions kubernetes


Description

Les versions de Kubernetes sont exprimées en x.y.z , où x est la version principale, y est la version mineure et z est la version du correctif. Nous avons ainsi :

  • La version principale : modifications majeures de l'API.
  • La version mineure : ajout de nouvelles fonctionnalités rétrocompatibles.
  • La version du correctif : corrections de bugs/failles des fonctionnalités ajoutées par la version mineure.

Cycle de vie

Il n'y a pas de calendrier de mise à niveau obligatoire pour les versions majeures. Cependant, les versions mineures se produisent environ tous les 3 mois et sont prises en charge pendant environ 9 mois.

Les versions de correctifs sont disponibles chaque semaine et sont destinées aux corrections de bugs critiques de la dernière version mineure, telles que la correction des vulnérabilités de sécurité, la résolution des problèmes affectant un grand nombre d'utilisateurs, les problèmes graves sans solution de contournement et les bloqueurs pour les produits basés sur Kubernetes. Aucune incompatibilité ne doit être introduite entre les versions de correctif de la même version mineure.

Informations supplémentaires

Les dépendances, telles que Docker, ne devraient pas être modifiées sauf en cas d'absolue nécessité, et également uniquement pour corriger des bugs critiques.

Vous n'êtes pas obligé d'exécuter approximativement la dernière version de correctif d'une version mineure donnée. Néanmoins, l'équipe kubernetes inclue souvent des corrections de bugs critiques dans les versions de correctifs , et encouragent ses utilisateurs à mettre à niveau dès que possible.

Les versions et les mises à jour

Avec un cycle de publication aussi agressif, si jamais vous gérez plusieurs clusters Kubernetes, il peut être très avantageux d'automatiser autant que possible le processus de mise à niveau. Heureusement que Kubernetes est conçu pour être mis à niveau de manière continue :

  • Les nœuds worker peuvent posséder jusqu'à deux versions mineures inférieures au nœud master.
  • Les nœuds worker ne doivent pas être dans une version plus récente que le nœud master.
  • Un client peut posséder jusqu'à une seule version mineure supérieure ou inférieure à celle du nœud master.

Par exemple : un nœud maître v1.3 peut fonctionner avec les nœuds en version v1.1, v1.2 et v1.3 et peut fonctionner avec les clients v1.2, v1.3 et v1.4.

Les mises à niveau de versions mineures sont généralement sûres. En d'autres termes, la mise à niveau d'une version mineure vers la suivante devrait fonctionner sans temps d'arrêt ou états incohérents. Cependant, le projet Kubernetes recommande la mise à niveau incrémental par version mineure, c'est-à-dire que vous pouvez uniquement passer d'une version mineure à la prochaine version mineure, ou entre des versions de correctif du même mineur.

Autrement dit, vous ne pouvez pas ignorer les versions mineures lors de la mise à niveau. Par exemple, vous pouvez passer de 1.y à 1.y + 1, mais pas de 1.y à 1.y + 2.

Upgrade de notre master

Quand il s'agit d'une montée de version d'un cluster kubernetes, on doit tout d'abord commencer par mettre à jour notre nœud master , et par la suite mettre à jour les autres nœuds de travail un par un.

Dans mon cas, je souhaite upgrade mon master de la version 1.16 vers la version 1.17. Pour ce faire, nous entamerons une phase de recherche afin de trouver la dernière version stable de kubeadm et kubelet en v1.17. Comme je suis sous la distribution Ubuntu, je vais utiliser l'outil apt afin de rechercher mes nouveaux paquets :

apt-get update && \
apt-cache policy kubeadm

Résultat :

kubeadm:
Installed: 1.16.0-00
Candidate: 1.17.0-00
...

apt-cache policy kubelet

Résultat :

kubelet:
Installed: 1.16.0-00
Candidate: 1.17.0-00
...

Le résultat nous signale que la version 1.17 de kubeadm et kubelet sont bien disponibles. Nous allons d'abord nous attaquer directement par l'installation du nouveau paquet kubeadm :

apt-get upgrade -y kubeadm=1.17.0-00

Ensuite, nous vérifions que le téléchargement fonctionne et possède la version attendue :

kubeadm version

Résultat :

kubeadm version: &version.Info{Major:"1", mineur:"17", GitVersion:"v1.17.0" ...}

À présent, nous allons interroger l'outil kubeadm afin de vérifier les versions disponibles pour la mise à niveau et valider si notre cluster actuel peut être mis à niveau vers notre nouvelle version :

kubeadm upgrade plan

Résultat :

Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT       AVAILABLE
Kubelet     4 x v1.16.0   v1.17.0
    
Upgrade to the latest stable version:

COMPONENT            CURRENT   AVAILABLE
API Server           v1.16.0   v1.17.0
Controller Manager   v1.16.0   v1.17.0
Scheduler            v1.16.0   v1.17.0
Kube Proxy           v1.16.0   v1.17.0
CoreDNS              1.6.2     1.6.5
Etcd                 3.3.15    3.4.3-0

You can now apply the upgrade by executing the following command:

kubeadm upgrade apply v1.17.0

L'étape suivante consiste à rendre notre nœud master unschedulable, c'est-à-dire que le nœud ne pourra plus accepter de nouveaux pods et tous les pods existants dans le nœud seront déplacés vers un autre nœud :

kubectl drain master --ignore-daemonsets

Enfin, nous allons appliquer les nouveaux changement grâce la commande suivante :

kubeadm upgrade apply v1.17.0

Résultat :

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.17.0". Enjoy!

Nous devons par la suite installer la version stable de kubelet en v1.17.0 et redémarrer le service de manière à prendre en compte sa nouvelle version :

apt-get upgrade -y kubelet=1.17.0-00 && \
systemctl restart kubelet

Enfin, on n'oublie pas de rendre notre nœud à nouveau schedulable :

kubectl uncordon master

En lançant la commande ci-dessous, on peut remarquer que nos nœuds workers ne possèdent pas la même version que notre nœud master:

kubectl get nodes

Résultat :

NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   33m   v1.17.0
node01   Ready    <none>   32m   v1.16.0

Comme vu auparavant sur la section des versions, on peut d'ores et déjà s'arrêter ici, car il est toléré d'avoir au minimum deux version mineurs des nœuds workers inférieurs à celle du nœud master. Mais il est de mon devoir 😚 de vous montrer comment procéder à un upgrade des nœuds de travail.

Upgrade de notre worker

Comme dit antérieurement, nous devons upgrade nos workers un par un. La démarche reste tout de même similaire à celle du master à quelques différences près.

Premièrement, nous allons rendre notre nœud de travail unschedulable depuis notre nœud master :

kubectl drain node01 --ignore-daemonsets

Ensuite il faut être connecté sur un worker et installer les dernières versions stables de kubeadm et kubelet depuis notre nœud de travail :

ssh root@node01 "apt-get update && apt-get upgrade -y kubeadm=1.17.0-00 kubelet=1.17.0-00"

Depuis notre master nous allons mettre à niveau notre worker :

kubeadm upgrade node01 config --kubelet-version v1.17.0

Ensuite, il faut redémarrer le service kubelet :

ssh root@node01 "systemctl restart kubelet"

Enfin, on n'oublie pas de rendre notre nœud à nouveau schedulable :

kubectl uncordon node01

En vérifiant les nœuds disponibles de note cluster, on peut se rendre compte que notre worker et master sont au même niveau de version.

kubectl get nodes

Résultat :

NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   55m   v1.17.0
node01   Ready    <none>   53m   v1.17.0

Espace commentaire

Écrire un commentaire

Rejoignez la discussion

Vous devez être connecté pour poster un message.

25 commentaires

ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Nickel. Pense à bien valider tes versions avec kubectl get nodes avant de lancer tes workloads lourds.

24/12/2019 à 17:28
agnes60
Membre Actif
Avatar de agnes60
agnes60
Membre Actif

C'était bien ça, le fichier de config kubelet.conf n'avait pas été mis à jour correctement. Merci !

24/12/2019 à 13:08
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Check les logs avec journalctl -u kubelet -f. T'as probablement une erreur de config ou un problème de communication avec le master.

24/12/2019 à 07:59
sallain
Membre
Avatar de sallain
sallain
Membre

Au secours, mon worker ne repasse pas en Ready après le uncordon. Que faire ?

24/12/2019 à 02:52
andre52
Membre Actif Rédacteur
Avatar de andre52
andre52
Membre Actif Rédacteur

Merci pour le guide, c'est passé comme une lettre à la poste sur mon cluster de dev.

23/12/2019 à 21:31
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Oui, kubeadm renouvelle les certificats sur le control plane lors de l'upgrade. C'est un des avantages de cette méthode.

23/12/2019 à 15:50
meyer-zacharie
Membre Actif
Avatar de meyer-zacharie
meyer-zacharie
Membre Actif

J'ai un problème de certificat qui expire bientôt, l'upgrade va les renouveler automatiquement ?

23/12/2019 à 09:05
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

La commande kubeadm upgrade apply s'occupe de mettre à jour etcd automatiquement. Ne touche à rien manuellement sur etcd, tu risques de corrompre ta base de données.

23/12/2019 à 02:27
efoucher
Membre Actif
Avatar de efoucher
efoucher
Membre Actif

Mon etcd est en v3.3.15, je dois le mettre à jour avant ou après le kubeadm upgrade apply ?

22/12/2019 à 22:24
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

C'est tout à fait faisable, mais attention aux étapes de drain. Il faut bien gérer les pauses entre chaque node pour ne pas dégrader la dispo de tes services.

22/12/2019 à 14:26
paul-gomes
Membre Actif
Avatar de paul-gomes
paul-gomes
Membre Actif

Est-ce que je peux automatiser tout ça avec Ansible ou ça craint ?

22/12/2019 à 06:40
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Vérifie ton sources.list. T'as peut-être pas le dépôt officiel Kubernetes configuré correctement. Fais un apt-cache policy pour voir si le paquet est bien visible.

21/12/2019 à 23:53
juliette-gaudin
Membre Actif
Avatar de juliette-gaudin
juliette-gaudin
Membre Actif

J'ai un souci avec mon kubeadm, le paquet n'est pas trouvé dans les dépôts. Une idée ?

21/12/2019 à 18:18
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Désactive ce swap immédiatement. Le scheduler de Kubernetes ne gère pas le swap, tu vas avoir des comportements erratiques sur la gestion mémoire de tes pods.

21/12/2019 à 13:15

Le swap est activé sur mes workers, je peux le laisser comme ça ou c'est bloquant ?

21/12/2019 à 05:55
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

kubeadm upgrade apply gère normalement la mise à jour des composants système. Si le plan te le signale, c'est que la conf actuelle est obsolète. Laisse faire l'outil.

20/12/2019 à 23:28
rgrenier
Membre Actif
Avatar de rgrenier
rgrenier
Membre Actif

Sur mon nœud master, la commande kubeadm upgrade plan me sort un warning sur CoreDNS. Je dois le mettre à jour manuellement ?

20/12/2019 à 16:48
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Non, c'est le comportement attendu. Le master peut être en version supérieure aux workers. Par contre, ne tarde pas trop à aligner tes workers pour éviter les soucis d'API.

20/12/2019 à 10:05
leveque-monique
Membre Actif
Avatar de leveque-monique
leveque-monique
Membre Actif

J'ai une erreur version mismatch sur mon worker après avoir upgrade le master. C'est grave ?

20/12/2019 à 04:44
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Pas besoin de rebooter l'OS. Le systemctl restart kubelet suffit largement pour charger la nouvelle version et reconnecter le node au control plane.

19/12/2019 à 22:16
vdidier
Membre Actif Rédacteur
Avatar de vdidier
vdidier
Membre Actif Rédacteur

Est-ce que je dois vraiment rebooter tous les nœuds après l'upgrade du kubelet ?

19/12/2019 à 17:38
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Ouch. Comme indiqué dans le guide, c'est à ne jamais faire. Kubernetes impose un upgrade incrémental. Tu vas devoir restaurer ton etcd depuis ton dernier snapshot avant de retenter un upgrade propre.

19/12/2019 à 13:15
jacqueline49
Membre Actif
Avatar de jacqueline49
jacqueline49
Membre Actif

J'ai sauté une version mineure par erreur, je suis passé de 1.15 à 1.17 direct. Maintenant mon cluster est instable. C'est foutu ?

19/12/2019 à 08:12
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

C'est normal, ce sont probablement des pods qui ne sont pas gérés par un contrôleur ou qui ont des disques locaux. Ajoute --force si t'es sûr de ton coup, mais check bien ce qui tourne avant.

19/12/2019 à 02:47
renaud-susanne
Membre Actif
Avatar de renaud-susanne
renaud-susanne
Membre Actif

Tuto propre, ça m'a bien aidé pour le passage en 1.17. Par contre, j'ai eu une erreur lors du kubectl drain, il me dit que j'ai des pods qui ne peuvent pas être évacués.

18/12/2019 à 20:44

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire