Neuigkeiten von trion.
Immer gut informiert.

Artikel in der Kategorie 'docker'

Kubernetes Upgrade auf ARM mit CRI-O und Arch Linux 26 Okt

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:

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

  2. Update der Kubernetes Pods auf den Master Nodes

  3. 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.

PHP in Docker 16 Okt

Geschrieben von Thomas Kruse am 16. Oktober 2018

Auch wenn mit Docker die Containertechnologie fast überall Einzug hält, gibt es immer wieder in der praktischen Arbeit Herausforderungen zu meistern. Ganz besonders dann, wenn die Anwendung, die in einen Container verbracht werden soll, nicht dafür ausgelegt wurde, entsprechend betrieben zu werden. Vor allem im PHP Umfeld finden sich oft Anwendungsarchitekturen, die der Docker Philosophie "Ein Container, eine Aufgabe" entgegen stehen.

Ein möglicher Ansatz zur Lösung ist die Nutzung von Docker lediglich zur Ausführung der PHP- und Webserverprozesse und separate Verwaltung der PHP Programmdateien. Ein Host-Mount kann die Dateien in beliebige Container einbinden - doch verliert man dann gerade die Stärke von Docker, sowohl für Rollout als auch Rollback eine handhabbare Einheit bestehend aus Anwendungsserver und Programmdateien bereitzustellen.

Das Problem besteht bei PHP Anwendungen in Docker darin, dass diese typischerweise aus mehreren Komponenten bestehen:

  • PHP-FPM für die Ausführung von PHP als Resultat von Web-Anfragen

  • Cron Jobs, oft ebenfalls als Trigger von PHP Scripten für periodische und asynchrone Aufgaben

  • Memcached oder Redis als Cache

  • Eine Datenbank wie MySQL oder PostgreSQL

  • Ein Webserver (nginx, Apache httpd, …​) zur Auslieferung statischer Dateien

Zumindest die ersten beiden Dienste benötigen Zugriff auf die selben PHP Programmdateien. Einen Scheduler und PHP-FPM im selben Container auszuführen passt nicht so ganz zur reinen Lehre von Docker, ist aber solange leicht zu verschmerzen, wie lediglich eine Container-Instanz läuft.

Sowieso als externe Resourcen verwaltete Dienste wie die Datenbank oder einen Memcached in einem separaten Container laufen zu lassen ist naheliegen. Doch wie geht mit man Software um, die für eine gänzlich andere Betriebsumgebung konzipiert wurde?

Am Beispiel typischer PHP Projekte kann man die unterschiedlichen Vorgehensweisen und damit einhergehende Eigenschaften betrachten.

Springboot Java Docker Images mit jib 3 Okt

Geschrieben von Thomas Kruse am 3. Oktober 2018

Mit Docker haben sich Container als Auslieferungsformat (nicht nur) für Microservices zum Status Quo für Cloudanwendungen etabliert. Zur Erstellung der Container-Images war lange Zeit Zugriff auf einen Docker-Daemon erforderlich. Besonders in Umgebungen wie Kubernetes-Clustern oder Public-Clouds mit gemeinsam genutzter Infrastruktur soll auf privilegierte Container verzichtet werden. Mit dem typischen Ansatz von Docker-in-Docker oder Docker-Outside-Docker erhält ein so ausgeführter Build nämlich relativ viele Rechte. Dank der OCI Spezifikation für Image-Formate ist Docker mit einem Dockerfile jedoch nur noch eine Möglichkeit, zum auslieferbaren Image zu gelangen.

Ein weiterer Aspekt sind die oft schwer umzusetzenden Optimierungsmöglichkeiten für Docker Images: Um vom Layer-Caching optimal zu profitieren und damit sowohl I/O-Operationen als auch Speicherplatz zu sparen, sollten die Daten, die sich weniger häufig ändern, in einem separaten Layer positioniert werden, als Daten, die sich regelmäßig ändern. Bei einer Spring Boot Anwendung könnte man zum Beispiel zwischen allen Abhängigkeiten und den eigentlichen, zu der Anwendung selbst gehörenden Class-Dateien differenzieren: Die Abhängigkeiten werden sich seltener ändern, als das Programm, das bei jedem Bugfix und jeder Erweiterung Änderungen erfährt. Nur dieser geänderte Image-Layer muss dann verteilt werden.

Für beide Probleme soll das Google Projekt "Jib" eine Lösung liefert. Am Beispiel einer Spring Boot Anwendung und Maven wird der Einsatz von Google Jib demonstriert.

Die Beispielanwendung kann z.B. von hier bezogen werden: https://github.com/trion-development/spring-boot-rest-sample

Docker Multi-Arch-Image 6 Sep

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.

Docker-Registry in Kubernetes Raspberry PI 28 Aug

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. )

Docker-Registry auf ARM 64 - Cross-Compiling Docker-Images 24 Aug

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.

Kubernetes Ingress mit traefik 20 Aug

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.

Kubernetes Rook Storage auf ARM 64 11 Aug

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.

Android CI-Builds mit Docker 10 Aug

Geschrieben von Karsten Sitterberg am 10. August 2018

Um Anwendungen erfolgreich bauen zu können, ist - je nach Anwendung - ein hoher Aufwand in die Einrichtung der Umgebung zu investieren. Beispielsweise für ein Android-Projekt muss Java installiert sein, es werden die Android-Tools mit dem Android-SDK benötigt und der Build muss passend konfiguriert werden. Dieses Setup wird aber nicht nur auf den Entwickler-Rechnern benötigt, auch die Countinuous-Integration-Umgebung des Buildservers muss entsprechende Werkzeuge bereitstellen. Um Reproduzierbarkeit zu gewährleisten, sollte sichergestellt sein, dass in allen diesen Umgebungen die gleichen Versionen der Tools genutzt werden.

In diesem Artikel werden wir uns damit beschäftigen, wie auf einfachem Wege eine zur Entwicklung von Android-Projekten geeignete Umgebung mit Hilfe von Docker erstellt werden kann. Am Beispiel von Gitlab-CI wird der Einsatz des entsprechenden Docker-Containers in einer CI-Umgebung gezeigt.

Kubernetes Dashboard auf ARM 64 3 Aug

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

Kubernetes auf ODROID Arch Linux ARM Mainline Kernel 1 Aug

Geschrieben von Thomas Kruse am 1. August 2018

Das Setup von Kubernetes mit Arch Linux ARM 64bit auf einem ODROID C2 wurde im vorherigen Beitrag zu Kubernetes gezeigt. Als Overlay-Network wurde Weave verwendet, was leider im Zusammenspiel mit dem ODROID C2 Linux Kernel zu Abstürzen durch eine Kernel Panic führen kann. Die zugehörige Issue findet sich hier: https://github.com/weaveworks/weave/issues/3314

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.

CRI-O Kubernetes Worker Setup auf Arch Linux ARM 29 Jul

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

Zur Desktop Version des Artikels