Einstieg in Kubernetes

Hallo zusammen,
ich bin neu in Kubernetes und hoffe das ich hier etwas Hilfe beim Einstieg bekommen kann.

Mein Vorhaben ist ein Magento2 Shop mittels Kubernetes aufzusetzen. Vorgestellt hatte ich mir dabei folgende Komponenten: nginx, php-fpm, redis. Die Datenbank würde ich separat davon betrachten.

Soweit ich das Prinzip von Kubernetes verstanden habe, sollte man aufgrund der besseren Skalierbarkeit möglichst wenige Services in einem gemeinsamen Pod laufen lassen? Von daher dachte ich die 3 genannten Komponenten jeweils in einen separaten Pod zu packen.
Wie geht man innerhalb Kubernetes prinzipiell mit dem Application Code um und wo packt man diesen am besten hin? Gelesen hatte ich, dass es eigentlich gut wäre, wenn dieser im Image untergebracht wäre und nur Teile die persistent gehalten oder geteilt werden müssen in Volumes untergebracht werden.
Jetzt stellt sich mir allerdings die Frage wie man dies im Zusammenspiel von nginx und php-fpm macht? Da beide Pods normalerweise Zugriff auf den Code benötigen.

Wäre das Anlegen eines persistent volumes mit persistent volume claim, welches sowohl vom nginx als auch php-fpm pod verwendet wird hier ein sinnvoller Weg? Sodass man sozusagen den kompletten Application Code in einem geteilten Volume hat.

Vielen Dank schon mal für eure Hilfe!

VG tid

2 Likes

Normalerweise sollten man versuchen soweit wie möglich separate Pods zu nutzen. Im Falle von PHP ist das aber leider aufgrund der Arbeitsweise nicht unbedingt so. Meistens packt man da nginx und php-fpm in einen Pod und lässt diese dadurch auf den selben Speicher (also das selbe Volume) zugreifen. Da gibt’s einiges an Blogs und Tutorials zu, z.B https://matthewpalmer.net/kubernetes-app-developer/articles/php-fpm-nginx-kubernetes.html

Hallo puja, vielen Dank für die ausführliche Antwort!

Ich würde als nächstes versuchen diesen Weg zu gehen, hätte aber noch ein paar Fragen:

  1. Ich hatte bisher ein Persistent Volume Claim eingesetzt und darüber Code geshared. Beim Neustart war im Prinzip der Stand des Codes immer noch der gleiche wie zuvor.
    Verstehe ich es richtig, dass in dem Beispiel unter “matthewpalmer.net” der Inhalt nicht persistent gehalten wird? Ich müsste also sozusagen alles was ich persistent bräuchte, wie beispielweise den Inhalt des “media” Verzeichnisses nochmal separat in ein persistent Volume packen?

  2. Es gibt immer wieder momente wo ich Befehle auf der Konsole ausführen müsste. Für Magento bspw. setup:upgrade oder auch setup:static-content:deploy. Was je nach Befehl Änderungen an der DB vornimmt oder Dateien auf dem Filesystem erzeugt/aktualisiert. Wie bildet man so etwas sinnvoll in Kubernetes ab, sodass dies einen gewissen automatismus hat, aber dennoch nicht immer ausgeführt. Also bspw. sollte es nicht ausgeführt werden wenn einfach nur eine Skalierung der Pods stattfindet. Wenn ich es richtig sehe, wäre die Ausführung dieser Befehle nur notwendig nach einem Code-Deployment. Und dann auch nur bei einem einzigen Pod. Ich hoffe man versteht auf was ich meine.

Nochmals vielen Dank für eure Unterstützung!

Hallo zusammen, inzwischen habe ich es umgebaut auf PHP-Nginx in einem Pod. Das funktioniert auch soweit.

Allerdings habe ich noch Schwierigkeiten mit meiner zweiten Frage. Wie geht man Prinzipiell mit dem Application Code um. Ich bin jetzt der Annahme gegangen, diesen so weit möglich im PHP-Nginx Pod bzw. dessen Container Image zu verpacken. Beim Start müsste ich dann allerdings die erwähnten Befehle zum generieren statischer Dateien und DB Anpassungen ausführen. Das dauert einige Minuten (teilweise ~15 min) und ich denke das wäre nicht akzeptabel bei jedem Pod Start auszuführen?

Deshalb habe ich überlegt einen Job anzulegen. Dieser verwendet im Prinzip das gleiche Image, führt die Befehle aus und stellt die erzeugten Dateien in einem Persistent Volume bereit. Somit könnte der PHP-Nginx Pod diese dann einfach beim Start von dort kopieren. Ist dieser Ansatz sinnvoll?

Wenn meine Überlegung richtig ist, würde dieser Job doch auch auf mehreren Nodes ausgeführt werden. Eigentlich möchte ich diesen ja immer nur einmal initial oder später bei einem deployment ausführen und sonst nicht. (Auch damit keine Daten gegenseitig überschrieben werden, sofern diese auf zwei verschiedenen Nodes gleichzeitig ausgeführt werden würden)

Wäre super wenn mir hier nochmal jemand etwas Hilfe geben könnte :slight_smile: