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.