Upgrade Kubernetes Cluster auf neues Release

Da mit der Zeit jedes System zumindest sicherheitsrelevante Updates benötigt, und auch Kubernetes regelmässig neue Releases veröffentlicht, kommt irgandwann der Zeitpunkt an dem man auch das Kubernetes einmal updaten muss.
Hierbei ist zunächst zu beachten, dass ein upgarde immer nur von einem Major Release zum nächsten möglich ist. Der kubeadm upgrade auf einem Master/Backplane node wird das upgrade verweigern, wenn es über mehr als ein Major relese geht.
Ich zeige hier einmal das upgrade von einer Version 1.20.x auf 1.21.4. Es kann aber für jedes weitere Release auch verwendet werden.

Ab dem Release 1.25.x benötigt man allerdings die neuen Repos von Kubernetes. Diese fügt man mit folgenden Befehlen hinzu:

sudo tee -a /etc/apt/sources.list.d/kubernetes.list > /dev/null <<EOT
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.25/deb/ /
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.26/deb/ /
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.27/deb/ /
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /
EOT

Dann benötigt man noch den public key für das repo. Dieser ist für aller Versionen gleich.

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

Nach einem apt update stehen die Pakete zur Verfügung.

Upgrade des/der Masternodes

Man sollte mit dem, oder wenn man mehrere davon hat, einem Masternode beginnen. Das vorher alle relevanten Daten gesichert werden, sollte selbstverständlich sein. Alle Schritte müssen per sudo oder als root ausgeführt werden.

Zunächst installiert man die neue kubeadm version


~# apt install -y --allow-change-held-packages kubeadm=1.21.1-*

Danach kurz checken, ob man die richtige Version hat:

~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:17:27Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}

Hat man die richtige Version, empfielt sich zunächst einen check auszuführen, ob der upgrade möglich ist:


~# kubeadm upgrade plan

Es kann vorkommen, das es noch einen Hinweis gibt, dass man dafür ein neueres Minor Release für das Upgrade benötigt. Hier war das 1.21.4. Also dann:


~# apt install -y --allow-change-held-packages kubeadm=1.21.4-*
~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.4", GitCommit:"3cce4a82b44f032d0cd1a1790e6d2f5a55d20aae", GitTreeState:"clean", BuildDate:"2021-08-11T18:14:53Z", GoVersion:"go1.16.7", Compiler:"gc", Platform:"linux/amd64"}
~# kubeadm upgrade plan

Wenn dann alles als OK angezeigt wird, können wir das update ausführen. Das erforderliche Kommando wird in der Ausgabe des Plans angezeigt

~# kubeadm upgrade apply v1.21.4

Danach erfolgt der Upgrade. Dieser kann eine Weile dauern. Hier bei werden der API Sever, Kontroller Manager, etcd, kube scheduler und eine ganhze Reihe Zertifikate upgedated. Am Ende erhält man, hoffentlich, die Nachricht, dass alles Erfolgreich war und die Aufforderung nun auch die kubelets upzugraden. Wir tun das dann auch gleich für kubectl.

Hat man mehrere Masternodes, sollte man den Masternode auf dem man arbeitet jetzt evakuieren. Die kubectl Kommandos sollten im Userspace ausgeführt werden.

~$ kubectl drain <node-to-drain> --ignore-daemonsets

Hierbei ersetzten wir den <node-to-drain> mit dem Nodenamen, den wir aus

~$ kubectl get nodes

erhalten. Jetzt führen wir das update aus

~$ apt install -y --allow-change-held-packages kubelet=1.21.4-* kubectl=1.21.4-*

Danach müssen wir kubelet einmal restarten

~# systemctl daemon-reload
~# systemctl restart kubelet

Hatten wir den Node evakuiert, können wir ihn jetzt wieder frei geben

~$ kubectl uncordon <node-to-uncordon>

Danach können wir, wenn wir mehrere Masternodes haben, das ganze auch für die anderen Masternodes ausführen. Hierbei wir allerdings kubeadm upgrade plan durch kubeadm upgrade node ersetzt und kubeadm upgrade apply ist nicht notwendig.

Upgrade worker nodes

Hier sollten wir auch zunächst den Workernode evakuieren. Wir verenden das bekannt Kommando auf dem Masternode


~$ kubectl drain <node-to-drain> --ignore-daemonsets

Danach auch hier das update:

~# apt install -y --allow-change-held-packages kubeadm=1.21.4-*
~# kubeadm upgrade node
~# apt install -y --allow-change-held-packages kubelet=1.21.4-* kubectl=1.21.4-*
~# systemctl daemon-reload
~# systemctl restart kubelet

Und danach auf dem Masternode den Workernode wieder frei geben


~$ kubectl uncordon <node-to-uncordon>

Das wiederholt man für alle Workernodes. Das ganze kann auch parallel auf mehreren ausgeführt werden, wobei man darauf achten muss, die notwendige Kapazität für den Workload im Cluster nicht zu unterschreiten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert