Geschrieben von Thomas Kruse
am 14. Dezember 2018
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.
-
Update der Container Runtime (falls erforderlich)
-
Update der Kubernetes Binaries auf den Master Nodes (Control Plane)
-
Update der Kubernetes Pods auf den Master Nodes
-
Aktualisierung der Kubernetes Binaries auf den Worker Nodes
Geschrieben von Thomas Kruse
am 3. November 2018
Kubernetes nutzt Container Images im OCI- oder Docker-Format, um Workload im Cluster zu verteilen und auszuführen.
Möchte man - zum Beispiel im Rahmen eines CI-Builds - in einem Kubernetes-Cluster auch Docker-Images bauen, gibt es im wesentlichen drei Ansätze:
-
Verwendung des außenliegenden Docker-Daemons
-
Verwendung eines Docker-Daemons in einem Container (Docker-in-Docker)
-
Verwendung eines alternativen Build Werkzeugs
Den Docker-Daemon, der im Cluster selbst Container bereitstellt, in einem Build-Container zu verwenden bringt vor allem den Nachteil mit sich, dass der Build die Stabilität der Cluster-Node beeinträchtigen kann.
Zudem ist nicht gesagt, dass überhaupt ein Docker-Daemon bereitsteht, schließlich könnte der Kubernetes-Cluster auch CRI-O als Runtime verwenden.
Diese Option scheidet somit in der Regel aus.
Docker-in-Docker (DinD) ist eine häufig gewählte Option, verlangt jedoch, dass der entsprechende Container priviligiert gestartet wird.
Aus Sicherheitsaspekten ist diese Option zwar nicht optimal, lässt sich jedoch in der Praxis gut einsetzen.
Das gilt selbst dann, wenn die Container-Engine des Clusters gar kein Docker verwendet.
Als letzte Optionen bleibt noch die Verwendung spezialisierter Werkzeuge zur Erstellung von Container-Images.
In diesem Beitrag wurde die Verwendung von Buildah beschrieben, in Spring Boot mit Jib die Verwendung von Jib.
Jib ist speziell auf Java-Anwendungen ausgerichtet, buildah benötigt zum Bauen von Images root-Berechtigungen - beide Werkzeuge bringen damit gewisse Einschränkungen mit.
Von Google kommt das Werkzeug Kaniko, das in diesem Beitrag vorgestellt wird, und speziell für den Einsatz in Kubernetes konzipiert wurde.
Geschrieben von Thomas Kruse
am 26. Oktober 2018
In diesem Beitrag wurde die Installation von Kubernetes auf ODROID unter Arch Linux ARM beschrieben.
Nachdem Kubernetes 1.12 veröffentlich wurde, ist es an der Zeit, sich auch mit dem Thema Kubernetes Update zu beschäftigen.
Das grundsätzliche Vorgehen bei einem Upgrade von Kubernetes erfolgt in mehreren Schritten:
-
Update der Kubernetes Binaries auf den Master Nodes (Control Plane)
-
Update der Kubernetes Pods auf den Master Nodes
-
Aktualisierung der Worker Nodes auf die neuesten Kubernetes Binaries
Kubernetes Upgrades werden jeweils zwischen Minor Versionen supported, d.h. ein Update von 1.10 zu 1.12 muss über den Zwischenschritt eines Updates auf Kubernetes 1.11 erfolgen.
Das konkrete Vorgehen hängt von dem gewählten Verfahren zur Kubernetes Einrichtung ab.
Da der Beispiel-Cluster mit kubeadm
eingerichtet wurde, wird auch das Update von Kubernetes mit kubeadm upgrade
durchgeführt.
Geschrieben von Thomas Kruse
am 6. September 2018
Docker-Images sind plattformabhängig:
Während früher Docker ausschließlich unter Linux auf x86 Plattformen ein Thema war, kamen mit der ARM-Architektur und Windows-Containern zusätzliche Varianten hinzu.
Die einzige Option, das jeweils richtige Image für die Plattform auszuwählen, war dann, mit Image Tags zu arbeiten, sofern von einem Projekt überhaupt mehrere Architekturen unterstützt wurden und nicht ein ganz anderes Repository genutzt werden musste.
Tags sind eindimensional und es gibt ggf. weitere Image-Varianten zu berücksichtigen.
Darum hat jedes Projekt eine eigene Namenskonvention erstellt, beispielsweise gibt es dann foo/mariadb:amd64
, foo/mariadb:arm
, foo/mariadb:alpine-amd64
und foo/mariadb:alpine-arm
.
Damit werden die zu verwendenen Image-Namen plattformabhängig und können nicht übergreifend verwendet werden, z.B. in Kubernetes-Deploymentmanifests.
Das Problem wurde erkannt und Docker hat in mehreren Schritten den "Multi-Architecture-Support" implementiert.
Geschrieben von Thomas Kruse
am 28. August 2018
Wie ein Docker-Image für die Docker-Registry für ARM 64, z.B. für Raspberry PI oder ODROID C2, erzeugt wird, wurde im letzten Artikel beschrieben: Cross-Build von Docker Image Registry für ARM 64.
Nun geht es darum, mit diesem Image in Kubernetes eine Docker-Registry aufzubauen, um damit Container-Images im Cluster zur Verfügung zu stellen.
Für die TLS-Absicherung sorgt traefik, der in Kubernetes als Ingress fungiert und von Let’s Encrypt SSL-Zertifikate ausstellen läßt.
(Die Einrichtung von traefik als Kubernetes-Ingress kann hier nachgelesen werden: Traefik als Kubernetes Ingress. )
Geschrieben von Thomas Kruse
am 24. August 2018
Bisher gibt es die offizielle Docker Registry lediglich als x86 Docker Image.
Damit ist ein Betrieb unter ARM oder ARM 64 aktuell nicht möglich.
Obwohl Docker Multi-Arch-Support eingeführt hat, also die Möglichkeit unter dem selben Image-Namen verschiedene Architekturen zu bedienen, ist das bei dem hauseigenen Image leider noch nicht umgesetzt worden.
In diesem Beitrag geht es nun darum, ein passendes Image durch Cross-Compilation zu erstellen und damit eine Registry bereit zu stellen.
Der Betrieb des mit Docker erstellen Image wird unter CRI-O erfolgen, womit die Interoperabilität, dank der Standardisierung von OCI, unter Beweis gestellt wird.
Geschrieben von Thomas Kruse
am 20. August 2018
Um auf Kubernetes-Dienste zuzugreifen gibt es mehrere Möglichkeiten, eine davon ist der Ingress.
Ingress eignet sich für HTTP basierte Dienste und kann Funktionalitäten wie TLS-Terminierung und Load-Balancing übernehmen.
Im Prinzip handelt es sich bei Ingress also um so etwas wie einen Reverse-Proxy.
Kubernetes bringt dabei keine Ingress-Implementierung mit, sondern es gibt diverse Optionen von nginx über HA-Proxy und Apache Trafficserver bis zu traefik.
Wie traefik als Kubernetes-Ingress-Implementierung eingesetzt werden kann, wird in diesem Beitrag vorgestellt.
Geschrieben von Thomas Kruse
am 11. August 2018
In einer Public-Cloud-Umgebung wird dauerhafter Speicher für Kubernetes in der Regel durch den jeweiligen Cloud-Provider bereitgestellt.
Bedarf an dauerhaften Speicher gibt es dabei regelmäßig, wenn Daten nicht in den jeweiligen Datenbanken oder Messaging-Systemen der Umgebung gehalten wird, sondern lokale.
Wird der Kubernetes Cluster sogar lokal betrieben, gibt es entsprechnd keinen Cloud-Provider, der Storage in Form von Object-Store oder Block-Storage zur Verfügung stellen könnte.
Neben NFS und iSCSI, mit denen klassische SAN-Systeme angebunden werden können, wächst auch das Angebot an Cloud-Native-Storage.
Dabei handelt es sich um Softwarelösungen, die flexibel und dynamisch Speicher im gesamten Kubernetes Cluster zur Verfügung stellen können.
In diesem Beitrag wird der Einsatz von Rook (https://www.rook.io) auf einem ARM 64 Cluster mit ODROID C2 Knoten demonstriert.
Geschrieben von Thomas Kruse
am 3. August 2018
Kubernetes bietet eine Weboberfläche zur Clusterverwaltung bzw. Administration: Das sogenannte Kubernetes Dashboard.
Das Dashboard gibt es als vorbereitetes Deployment für die Architekturen AMD/Intel 64 und ARM.
Leider gibt es derzeit kein fertiges ARM 64 Deployment.
Wer das reguläre ARM Deployment ausprobiert, wird zwar die zugehörigen Resourcen erfolgreich erzeugen, jedoch wird der Container nicht erfolgreich starten und in der Folge wird der Pod-Status mit einem der Fehler Error
oder CrashLoopBackOff
ausgegeben.
Fehlerhaftes Kubernetes Dashboard Deployment auf ARM 64
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS
kube-system kubernetes-dashboard-7d597 0/1 ContainerCreating 0
kube-system kubernetes-dashboard-7d597 0/1 Error 0
kube-system kubernetes-dashboard-7d597 0/1 CrashLoopBackOff 1
Geschrieben von Thomas Kruse
am 1. August 2018
Eine Lösung ist, auf den "Fast Data Path" zu verzichten, was zur Folge hat, dass die Performance sich verringert und die CPU Belastung steigt.
Alternativ kann der ODROID C2 mit einem aktuellen Linux Kernel, dem Mainline (oder Upstream) Linux Kernel verwendet werden.
Geschrieben von Thomas Kruse
am 29. Juli 2018
Nachdem im vorherigen Beitrag zu Kubernetes gezeigt wurde, wie mittels CRI-O ein Kubernetes Master Node eingerichtet wird, folgt nun eine Worker Node.
Das besondere auch hier: Es wird Arch Linux auf ARM 64bit Architektur verwendet.
Für das Setup wird kubeadm verwendet, daher wird auch die Ausgabe von einem Kubernetes-Master Setup benötigt, da dort das erforderliche Token ausgeben wird.
Beispiel für kubeadm Setup Ausgabe auf Kubernetes Master Node
You can now join any number of machines by running the following on each node
as root:
kubeadm join 10.23.15.110:6443 --token nnnxv2.2p7n2zwuddqedg25 --discovery-token-ca-cert-hash sha256:7563bc0dcf826a37e96f820725147a61d9970a094e1428832283f803aad91cd3
Geschrieben von Thomas Kruse
am 28. Juli 2018
Auch wenn Docker stand heute die vermutlich am weitesten verbreitete Container-Lösung darstellt, gibt es doch einen regen Wettbewerb.
Besonders seit Kubernetes in Version 1.5 das Container-Runtime-Interface (CRI) eingeführt hat, mit dem sich die tatsächliche Container-Implementierung austauschen lässt.
Das CRI-O Projekt stellt einen Adapter zwischen der durch die OCI (Open Container Initiative) spezifizierten Schnittstellen für Container-Runtimes und dem durch Kubernetes mit CRI definierten Integrationspunkten dar.
Standardmäßig verwendet CRI-O die OCI konforme Containerimplementierung runc
.
Andere OCI kompatible Laufzeitumgebungen wie rkt
oder Intel Clear Container lassen sich damit ebenfalls einsetzen.
In einem typischen Docker basierten Setup sähe die Interaktion so aus:
-
Der kubelet
Prozess verwaltet die Container der Node, nutzt dabei die CRI Schnittstelle zur Kommunikation
-
mit dem dockershim
, einer CRI-zu-Docker API Bridge, die ihrerseits
-
mit dem eigentlichen docker
-Daemon kommuniziert, der dann
-
mit dem containerd
-Daemon kommuniziert und darüber
-
runc
aufruft, um konkrete Container zu managen
Mit CRI-O sieht die Interaktion so aus:
-
Der kubelet
Prozess verwaltet die Container der Node, nutzt dabei die CRI Schnittstelle zur Kommunikation
-
mit dem CRI-O
-Daemon, der dann eine OCI kompatible Container-Laufzeitumgebung aufruft, im Default ist das
-
die runc
, die auch Docker verwendet
Der Stack bei CRI-O ist also deutlich geringer, ist jedoch als auf Kubernetes fokussierter Stack auch kein vollständiger Ersatz für die vielen verschiedenen Anwendungsfälle von Docker.
Im folgenden geht es um das konkrete Setup von CRI-O mit Kubernetes unter Arch Linux ARM.