Neuigkeiten von trion.
Immer gut informiert.

Kubernetes 1.13 auf ARM mit CRI-O und Arch Linux

Kubernetes

In diesem Beitrag wurde die Installation von Kubernetes auf ODROID unter Arch Linux ARM beschrieben.

Hier geht es nun um das Update auf Kubernetes 1.13, auch in diesem Fall mit selbst übersetzten Paketen für Arch Linux. Bei anderen Distributionen sind ggf. bereits die Upstream Pakete verfügbar.

Wie schon in Kubernetes Upgrade Arch Linux ARM im Detail beschrieben, wird das Update in folgenden Schritten durchgeführt:

  1. Update der Container Runtime (falls erforderlich)

  2. Update der Kubernetes Binaries auf den Master Nodes (Control Plane)

  3. Update der Kubernetes Pods auf den Master Nodes

  4. Aktualisierung der Kubernetes Binaries auf den Worker Nodes

Zum Build von Kubernetes 1.13

Da der Go Build von Kubernetes erhebliche Mengen Speicher zur Übersetzung und zum Linking benötigt, kann es auf Maschinen mit wenig Speicher erforderlich sein, einige Kniffe anzuwenden. Details dazu finden sich in diesem Beitrag sowie in dieser GitHub Issue: https://github.com/kubernetes/kubernetes/issues/70062

Build CRI-O und crictl

Zunächst werden aktuelle Versionen von CRI-O und der CRI-Tools (crictl) gebaut. Als PKGBUILD für ARM können die folgenden Vorlagen dienen:

CRI-O Arch Linux ARM PKGBUILD
PKGBUILD-crio[]
CRI-Tools/crictl Arch Linux ARM PKGBUILD
PKGBUILD-crictl[]

Wie immer werden die Pakete am besten mit makepkg --clean --syncdeps gebaut. Nachdem die neuesten Versionen der Container Runtime CRI-O und zugehöriger Tools gebaut sind, können die Kubernetes Binaries gebaut werden.

Build von runc

Auch runc ist in einer neueren Version verfügbar, analog wird ein Paket gebaut.

runc PKGBUILD für ARM
PKGBUILD-runc[]

Auch hier erfolgt der Build am einfachsten mit makepkg.

Build von Kubernetes 1.13 und kubeadm

Für kubelet und kubeadm wird das Paket kubernetes gebaut. Das benötigte PKGBUILD kann z.B. wie folgt aussehen:

Kubernetes Arch Linux ARM PKGBUILD
PKGBUILD-kubernetes[]

Die gebauten Pakete sollten auf alle Knoten verteilt werden oder über ein lokales Repository bereitgestellt werden.

Kubernetes Cluster Update

Zunächst wird die Container-Runtime aktualisiert, anschließend die Kubernetes Komponenten selbst.

Das Update des Kubernetes Clusters auf neue Kubernetes Komponenten erfolgt in Stufen: Zunächst wird der Master Node auf die neueste Kubernetes Version aktualisiert, danach die Worker.
Da das Beispiel aus lediglich einen einzelnen Master besteht, wird auch nur ein Knoten aktualisiert.

Update der Container Runtime

Update von CRI-O, crictl und runC
$ sudo systemctl stop kubelet
$ sudo systemctl stop crio
$ sudo pacman -U cri*.pkg.tar.xz
$ sudo pacman -U runc*.pkg.tar.xz
$ sudo systemctl start crio

Update Kubernetes Master Node

Als erstes wird das neue Kubernetes Arch Paket installiert, danach die Version von kubeadm verifiziert.

Update der Kubernetes Binaries auf Master Node
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"archive", BuildDate:"2018-10-20T20:23:34Z", GoVersion:"go1.11.1", Compiler:"gc", Platform:"linux/arm64"}
$ sudo pacman -U kubernetes-*.tar.xz
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.0", GitCommit:"ddf47ac13c1a9483ea035a79cd7c10005ff21a6d", GitTreeState:"archive", BuildDate:"2018-12-14T19:37:01Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/arm64"}

Durch kubeadm wird ein Upgrade von Kubernetes nativ unterstützt und erfordert wenige manuelle Eingriffe.

Kontrolle des Kubernetes Upgrade Plans von kubeadm
$ sudo kubeadm upgrade plan
[preflight] Running pre-flight checks.
...

Das eigentliche Upgrade der Kubernetes Control Plane wird durch kubeadm upgrade gestartet.

Upgrade von Kubernetes Master Node mit kubeadm
$ sudo kubeadm upgrade apply v1.13.0
...
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.13.0". Enjoy!

Nun bleibt noch ein Upgrade eines evtl. genutzten CNI Netzwerkes. Bei Weave ist nicht viel zu tun: Das DaemonSet von Weave verwendet Rolling Updates - wird eine neue Kubernetes Version installiert, werden die Weave Net Pods automatisch der Reihe nach aktualisiert.

Damit das neue kubelet verwendet wird, muss der Prozess neu gestartet werden. Es empfiehlt sich vorher ggf. vorhandene Workload vom Master herunter zu nehmen.

Kubernetes Master Node drain und Upgrade von kubelet
$ NODE=c2-master0
$ kubectl drain $NODE --ignore-daemonsets
$ sudo systemctl restart kubelet
$ kubectl uncordon $NODE

Eine Überprüfung der Node Liste zeigt, dass der Master erfolgreich aktualisiert wurde.

Prüfung der Kubernetes Versionen nach Upgrade der Master Node
$ kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
c2-master0   Ready    master   127d   v1.13.0
c2-worker0   Ready    <none>   127d   v1.12.1
c2-worker1   Ready    <none>   127d   v1.12.1
c2-worker2   Ready    <none>   127d   v1.12.1

Update Kubernetes Worker Nodes

Die Worker Nodes werden einzeln aktualisiert, damit es zu keinen Einschränkungen der Verfügbarkeit des Kubernetes Clusters kommt. Dazu wird jeweils mit kubectl drain --ignore-daemonsets die Node evakuiert, aktualisiert und mit kubectl uncordon wieder aktiviert.

Werden Pods ausgeführt, die lokal Daten speichern, kann die Option --delete-local-data mit angegeben werden. Da lokaler Speicher nicht im Cluster an einem anderen Ort bereitgestellt werden kann, gehen diese Daten verloren, wenn die zugehörigen Pods auf einer anderen Node neu erzeugt werden.

Evakuierung der Kubernetes Workload von Worker Node
local:~$ NODE=c2-worker0
local:~$ kubectl drain $NODE --ignore-daemonsets --delete-local-data

Nun ist auf dem Worker auch der passende Zeitpunkt, um CRI-O und runC zu aktualisieren.

Update von CRI-O und runC auf Worker Node
$ sudo systemctl stop kubelet; sudo systemctl stop crio
$ sudo pacman -U cri*.pkg.tar.xz; sudo pacman -U runc*.pkg.tar.xz
$ sudo systemctl start crio

Auf den Worker Nodes muss zusätzlich die Konfiguration von kubelet aktualisiert werden, was ebenfalls durch kubeadm unterstützt wird.

Upgrade von kubelet und Anpassung der kubelet-Config
$ sudo pacman -U kubernetes-*-aarch64.pkg.tar.xz
...
$ sudo kubeadm upgrade node config --kubelet-version $(kubelet --version | cut -d ' ' -f 2)
$ sudo systemctl restart kubelet

Sind alle Nodes aktualisiert, sollten diese auch wieder als verfügbar gelistet werden:

Überprüfung der korrekten Funktion aller Kubernetes Nodes
$ kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
c2-master0   Ready    master   127d   v1.13.0
c2-worker0   Ready    <none>   127d   v1.13.0
c2-worker1   Ready    <none>   127d   v1.13.0
c2-worker2   Ready    <none>   127d   v1.13.0

Das Upgrade des Kubernetes Clusters ist nun beendet. Alternativ zum Update des Clusters gibt es als Vorgehensweise, einen neuen Kubernetes Cluster mit der gewünschten Version zu erstellen und die Workload auf den Cluster umzuziehen. Außerhalb von Cloud-Umgebungen ist dazu jedoch entsprechend viel an Resourcen vorzuhalten, so dass das Vorgehen in der Praxis unpraktikabel sein kann.




Zu den Themen Kubernetes, Docker und Cloud Architektur bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per E-Mail an [email protected] oder über das Kontaktformular. Wir freuen uns auf eine Kontaktaufnahme!

Suche

Los geht's!

Bitte teilen Sie uns mit, wie wir Sie am besten erreichen können.