Upgrade eines K3s Lightweight Kubernetes Clusters

K3s ist eine schlanke, hochverfügbare Open-Source-Kubernetes-Cluster-Plattform, die für eine einfache und ressourcenschonende Installation entwickelt wurde. K3s wird in einem Paket von weniger als 60 MB geliefert. Das Paket ist für ARM-Plattformen optimiert und kann daher auch auf Hardware wie einem Raspberry Pi, oder als Gast-VM auf ESXi-on-ARM betrieben werden.

Informationen sammeln

K3s ist eine Cluster-Lösung. Daher ist die Reihenfolge, in der die Knoten aktualisiert werden, wichtig. Das Update beginnt auf dem Masterknoten. Also müssen wir zunächst herausfinden, welcher Knoten diese Rolle hat. Am einfachsten geht dies mit einem kubectl Kommando:

kubectl get node
NAME STATUS ROLES AGE VERSION
k3node1.lab.local Ready master 2y43d v1.19.3+k3s3
k3node2.lab.local Ready none 2y42d v1.19.3+k3s3
k3node3.lab.local Ready none 2y42d v1.19.3+k3s3

Wir sehen in der Ausgabe oben meine drei K3s-Knoten mit FQDN, Status, Rolle, Alter und Version. Demzufolge hat hier k3node1 die Masterrolle.

Alternativ kann man den Befehl auch im ausführlichen Modus ausführen:

kubectl get node -o wide

Version prüfen

Die K3s Version des aktuellen Knoten kann man auch mit folgendem k3s Kommando abfragen:

k3s -v
k3s version v1.19.3+k3s3 (0e4fbfef)

Auf aktive Pods prüfen

Vor dem Upgrade / Update muss sichergestellt werden, dass sich keine aktiven Pods auf dem Knoten befinden.

kubectl get pods --all-namespaces

Alternative Kurzform des obigen Kommandos:

kubectl get pods -A

Auf diesem Knoten befanden sich keine aktiven Pods. Falls sich dort Pods befinden, muss der Knoten zunächst geräumt werden.

kubectl drain k3node1 --ignore-daemonsets

Upgrade

Nach den Vorprüfungen sind wir bereit zum Upgrade. Wir beginnen auf dem Knoten mit der Masterrolle.

Upgrade auf dem Master Node beginnen

curl -sfL https://get.k3s.io | sh -

Versionskontrolle

kubectl get node

Der Master-Node wurde auf Version v1.25.4 aktualisiert.

Achtung! In Produktivsystemen sollte die Versionen auf den Knoten sich über maximal drei Minor-Versions erstrecken. D.h. wir hätten hier korrekterweise zunächst von v1.19.3 auf v1.21.x gehen dürfen. Da es sich in meinem Fall um ein Lab handelt, wurde der Sprung direkt auf die neueste verfügbare Version (v1.25.4) durchgeführt.

Agent Node aktualisieren

Bevor wir mit der Aktualisierung der Agent-Nodes fortfahren können, müssen wir das Token des Master-Nodes ermitteln. Dieses Token wurde auch bei der Bildung des Clusters verwendet. Dazu führen wir direkt auf dem Master-Node folgendes Kommando aus:

cat /var/lib/rancher/k3s/server/node-token

Wir notieren das Token oder kopieren es in die Zwischenablage. Der nächste Schritt erfolgt auf einem Agent-Node. Dazu öffenen wir eine SSH Verbindung zum Agent Node und führen das Setupscript unter Angabe des Master-Nodes und des Master-Tokens aus. Die IP Adresse meines Master-Nodes ist in diesem Fall 10.0.10.171 und der Port ist 6443. Hinter den Parameter K3S_TOKEN= kopieren wir das Master-Token aus der Zwischenablage.

curl -sfL https://get.k3s.io | K3S_URL=https://10.0.10.171:6443 K3S_TOKEN=K109fc629c6ff2feb3e94a6e6d7c972cdbab2cfa39e19697db67b6455d10cc13c98::server:47581903e817d3cc683a20bb1d1f1448 sh -

Nach dem Durchlauf des Setupscripts prüfen wir die Version auf dem Master-Node. (Diesesmal in der ausführlichen Variante).

kubectl get node -o wide

Master und erster Agent-Node sind aktualisiert. Wiederholung des obigen Befehls auf zweitem Agent-Node. Wie zuvor stellen wir eine Verbindung über SSH zum dritten Knoten (k3node3) her. Auch hier wieder unter Angabe des Master-Nodes und des Master-Tokens. Es ist also der identische Befehl wie auf k3node2.

curl -sfL https://get.k3s.io | K3S_URL=https://10.0.10.171:6443 K3S_TOKEN=K109fc629c6ff2feb3e94a6e6d7c972cdbab2cfa39e19697db67b6455d10cc13c98::server:47581903e817d3cc683a20bb1d1f1448 sh -

Check Kubectl version

Es genügt nicht, nur die K3s Version zu aktualisieren, sondern auch die CLI kubectl muss auf neuen Stand gebracht werden. Zunächst prüfen wir die aktuell installierte Version und lassen uns das Ergebnis als YAML ausgeben (-o=yaml).

kubectl version -o=yaml

Es gibt zwei Möglichkeiten zur Aktualisierung:

  • Update zur neuesten Version
  • Update zu einer bestimmten Version

Update zur neuesten kubectl-Version

Die URL zu stable.txt gibt die jeweils neueste Version zurück. Der String (z.B. v1.25.4) wird in den eigentlichen Pfad des curl Kommandos übernommen. Je nach Plattform muss die URL im hinteren Teil angepasst werden auf arm64 oder amd64.

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl"

Update auf eine bestimmte Version

Hier entfällt die Abfrage der neuesten Version und die URL zeigt direkt auf die gewünschte Version.

curl -LO https://dl.k8s.io/release/v1.25.4/bin/linux/arm64/kubectl

Testpod erzeugen

Nach dem Update ist es sinnvoll einen kleinen Test der Verbindung durchzuführen. Beispielsweise durch Erzeugung eines einfachen Pods.

kubectl run testpod --image=nginx

Die erfolgreiche Bereitstellung können wir mit dem describe Kommando überprüfen.

kubectl describe pod testpod

In meinem Fall konnte der Pod nicht erzeugt werden.

Error: failed to create containerd container: get apparmor_parser version: apparmor_parser resolves to executable in current directory (./apparmor_parser)

Das Paket apparmor fehlte auf meinen K3s Hosts. Da es sich bei mir um eine PhotonOS Plattform handelt, wird hierfür der Paketmanager tdnf verwendet.

tdnf install apparmor-parser

Auf Ubuntu lautet der Befehl:

sudo apt-get install apparmor
sudo apt-get install apparmor-utils 

Nach der Installation kann die Bereitstellung des Pods testpod erneut versucht werden.

kubectl get pods

Das hat offensichtlich funktioniert. Unsere Umgebung ist damit auf dem aktuellen Stand.

Schreibe einen Kommentar

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