Southbridge in Tscheljabinsk und Bitrix in Kubernetes

In Tscheljabinsk finden Meetups fĂŒr Systemadministratoren von Sysadminka statt, und bei dem letzten habe ich einen Vortrag ĂŒber unsere Lösung zur AusfĂŒhrung von Anwendungen auf 1C-Bitrix in Kubernetes gehalten.

Bitrix, Kubernetes, Ceph – eine tolle Mischung?

Ich werde erzÀhlen, wie wir aus all dem eine funktionierende Lösung zusammengebaut haben.

Los geht's!

Southbridge in Tscheljabinsk und Bitrix in Kubernetes

Das Meetup fand am 18. April in Tscheljabinsk statt. Über unsere Meetups kann man lesen in Timepad und sich anschauen auf YouTube.

Wenn Sie zu uns kommen möchten, um einen Vortrag zu halten oder als Zuhörer – herzlich willkommen, schreiben Sie an vadim.isakanov@gmail.com und auf Telegram t.me/vadimisakanov.

Mein Vortrag

Southbridge in Tscheljabinsk und Bitrix in Kubernetes

Folien

Lösung „Bitrix in Kubernetes, Version Southbridge 1.0“

Ich werde ĂŒber unsere Lösung im Format „fĂŒr Einsteiger in Kubernetes“ berichten, wie es auf dem Meetup gemacht wurde. Aber ich gehe davon aus, dass Ihnen die Begriffe Bitrix, Docker, Kubernetes und Ceph zumindest auf dem Niveau von Wikipedia-Artikeln bekannt sind.

Was gibt es eigentlich schon ĂŒber Bitrix in Kubernetes?

Im gesamten Internet gibt es sehr wenig Informationen ĂŒber die AusfĂŒhrung von Anwendungen auf Bitrix in Kubernetes.
Ich habe nur solche Materialien gefunden:

Vortrag von Alexander Serbul, 1C-Bitrix, und Anton Tuzlukov von Qsoft:

Video abspielen

Ich empfehle, ihm zuzuhören.

Entwicklung einer eigenen Lösung vom Benutzer serkyron auf Habra.
Ich habe noch eine solche Lösung gefunden.

Und iiiih
 das ist eigentlich alles.

Ich warne, die QualitĂ€t der Lösungen in den obigen Links haben wir nicht ĂŒberprĂŒft 🙂
Übrigens, bei der Vorbereitung unserer Lösung habe ich mit Alexander Serbul gesprochen, zu dieser Zeit gab es seinen Vortrag noch nicht, daher gibt es in meinen Folien einen Punkt "Bitrix nutzt kein Kubernetes".

Aber es gibt bereits viele fertige Docker-Images fĂŒr die Arbeit mit Bitrix in Docker: https://hub.docker.com/search?q=bitrix&type=image

Reicht das aus, um eine vollwertige Lösung fĂŒr Bitrix in Kubernetes zu schaffen?
Nein. Es gibt viele Probleme, die gelöst werden mĂŒssen.

Was sind die Probleme mit Bitrix in Kubernetes?

Erstens – die fertigen Images aus Dockerhub sind nicht fĂŒr Kubernetes geeignet.

Wenn wir eine mikroservicebasierte Architektur aufbauen wollen (was wir in Kubernetes normalerweise wollen), muss die Anwendung in Kubernetes in Container aufgeteilt werden, und wir mĂŒssen sicherstellen, dass jeder Container eine kleine Funktion ausfĂŒhrt (und das gut macht). Warum nur eine? Kurz gesagt – je einfacher, desto zuverlĂ€ssiger.
Wenn Sie mehr Details möchten – schauen Sie sich bitte diesen Artikel und das Video an: https://habr.com/ru/company/southbridge/blog/426637/

Docker-Images in Dockerhub sind hauptsÀchlich nach dem Prinzip "alles in einem" erstellt, weshalb wir letztendlich unser eigenes Rad bauen und sogar die Images von Grund auf neu erstellen mussten.

Zweitens – der Code der Website wird aus dem Administrationsbereich bearbeitet.

Wir haben einen neuen Abschnitt auf der Website erstellt – der Code wurde aktualisiert (ein Verzeichnis mit dem Namen des neuen Abschnitts wurde hinzugefĂŒgt).

Die Eigenschaften der Komponente im Admin-Bereich wurden geĂ€ndert – der Code hat sich geĂ€ndert.

Kubernetes kann standardmĂ€ĂŸig nicht damit umgehen, Container mĂŒssen unverĂ€nderlich (stateless) sein.

Grund: Jeder Container (Pod) im Cluster verarbeitet nur einen Teil des Traffics. Wenn der Code nur in einem Container (Pod) geÀndert wird, wird der Code in verschiedenen Pods unterschiedlich sein, die Website funktioniert unterschiedlich, unterschiedliche Benutzer sehen unterschiedliche Versionen der Website. So kann man nicht leben.

Drittens – es muss eine Lösung fĂŒr das Deployment gefunden werden.

Wenn wir ein Monolithen und einen „klassischen“ Server haben, ist alles ganz einfach: wir setzen die neue Codebasis um, fĂŒhren die Datenbankmigration durch und leiten den Traffic auf die neue Version des Codes um. Der Wechsel geschieht sofort.
Wenn unsere Website in Kubernetes lĂ€uft, in Mikrodienste aufgeteilt ist und viele Container mit Code hat – oh je. Wir mĂŒssen Container mit der neuen Codeversion bauen, sie anstelle der alten bereitstellen, die Datenbankmigration korrekt durchfĂŒhren und idealerweise dies fĂŒr die Besucher unmerklich machen. Zum GlĂŒck hilft uns Kubernetes dabei und unterstĂŒtzt eine ganze Reihe von verschiedenen Deployment-Arten.

Viertens – es muss eine Lösung zur Speicherung von Statischen gefunden werden.

Wenn Ihre Website „nur“ 10 Gigabyte groß ist und Sie sie vollstĂ€ndig in Containern bereitstellen, erhalten Sie Container mit einem Gewicht von 10 Gigabyte, die eine Ewigkeit zum Deployen benötigen.
Die schwersten Teile der Website mĂŒssen außerhalb der Container gespeichert werden, und die Frage, wie das richtig gemacht wird, stellt sich.

Was in unserer Lösung nicht vorhanden ist.

Der gesamte Bitrix-Code ist nicht auf Mikrofunktionen/Mikrodienste aufgeteilt (so dass die Registrierung separat, das Modul fĂŒr den Online-Shop separat usw. ist). Die gesamte Codebasis speichern wir in jedem Container vollstĂ€ndig.

Die Datenbank speichern wir auch nicht in Kubernetes (ich habe zwar Lösungen mit einer Datenbank in Kubernetes fĂŒr Entwicklerumgebungen implementiert, aber nicht fĂŒr die Produktionsumgebung).

Die Administratoren der Website werden dennoch bemerken, dass die Website in Kubernetes lĂ€uft. Die Funktion "SystemprĂŒfung" funktioniert nicht korrekt, um den Code der Website im Admin-Bereich zu bearbeiten, muss zuerst der Knopf „Ich möchte den Code bearbeiten“ gedrĂŒckt werden.

Wir haben die Probleme gelöst, wir sind uns der Notwendigkeit der Implementierung von Mikrodiensten bewusst, das Ziel ist klar – ein funktionierendes System fĂŒr Anwendungen auf Bitrix in Kubernetes zu erhalten, wobei sowohl die Möglichkeiten von Bitrix als auch die Vorteile von Kubernetes erhalten bleiben. Wir beginnen mit der Implementierung.

Architektur

Viele "Worker"-Pods mit Webserver (Worker).
Ein Pod mit Cron-Jobs (unbedingt nur einer).
Ein Upgrade-Pod fĂŒr die Bearbeitung des Website-Codes aus dem Admin-Panel (ebenfalls unbedingt nur einer).

Southbridge in Tscheljabinsk und Bitrix in Kubernetes

Wir klÀren die Fragen:

  • Wo speichern wir die Sitzungen?
  • Wo speichern wir den Cache?
  • Wo speichern wir die Statischen Dateien? Wir können doch nicht Gigabytes an Statischen Dateien in einer Vielzahl von Containern lagern?
  • Wie wird die Datenbank funktionieren?

Docker-Image

Wir beginnen mit dem Aufbau des Docker-Images.

Die ideale Lösung – wir haben ein universelles Image, auf dessen Basis wir sowohl Worker-Pods als auch Pods mit Cron-Jobs und Upgrade-Pods erhalten.

Wir haben genau so ein Image erstellt..

Es enthÀlt nginx, apache/php-fpm (bei der Erstellung auswÀhlbar), msmtp zum Versand von E-Mails und cron.

Bei der Erstellung des Images wird der vollstÀndige Code der Website in das Verzeichnis /app kopiert (mit Ausnahme der Teile, die wir in einen separaten Shared Storage auslagern).

Mikrodienste, Services

Worker-Pods:

  • Container mit nginx + Container apache/php-fpm + msmtp
  • msmtp konnte nicht in einen separaten Mikrodienst ausgelagert werden, Bitrix beschwert sich, dass es die E-Mails nicht direkt senden kann.
  • In jedem Container befindet sich der vollstĂ€ndige Codebasis.
  • Verbot von Änderungen am Code in Containern.

Cron-Pod:

  • Container mit apache, php, cron
  • Im Paket befindet sich die vollstĂ€ndige Codebasis.
  • Verbot von Änderungen am Code in Containern.

Upgrade-Pod:

  • Container mit nginx + Container apache/php-fpm + msmtp
  • Kein Verbot von Änderungen am Code in Containern.

Sitzungsspeicher

Cache-Speicher fĂŒr Bitrix

Wichtig: Die Passwörter fĂŒr die Verbindung zu allem, von der Datenbank bis zur E-Mail, speichern wir in Kubernetes-Secrets. Wir erhalten den Bonus, dass die Passwörter nur denjenigen sichtbar sind, denen wir Zugriff auf die Secrets gewĂ€hren, und nicht allen, die Zugang zur Codebasis des Projekts haben.

Speicher fĂŒr Statik

Wir können alles verwenden: Ceph, NFS (aber NFS empfehlen wir nicht fĂŒr die Produktion), Netzwerkspeicher von ‚Cloud‘-Anbietern usw.

Der Speicher muss in den Containern im Verzeichnis /upload/ der Website und in anderen Verzeichnissen mit Statischen Dateien eingebunden werden.

Datenbank

Zur Vereinfachung empfehlen wir, die Datenbank außerhalb von Kubernetes zu platzieren. Die Datenbank in Kubernetes ist eine separate, komplexe Aufgabe, sie macht das Schema erheblich komplizierter.

Sitzungsspeicher

Wir verwenden Memcached 🙂

Er kĂŒmmert sich gut um die Speicherung von Sitzungen, wird clusterfĂ€hig und wird „nativ“ als session.save_path in PHP unterstĂŒtzt. Ein solches System wurde bereits in der klassischen monolithischen Architektur mehrfach erprobt, als wir Cluster mit einer Vielzahl von Webservern aufgebaut haben. FĂŒr das Deployment verwenden wir Helm.

$ helm install stable/memcached --name session

php.ini — hier sind im Image die Einstellungen fĂŒr die Speicherung von Sitzungen in Memcached definiert

Wir haben Umgebungsvariablen verwendet, um Daten ĂŒber die Hosts mit Memcached zu ĂŒbertragen https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/.
Dies ermöglicht es, denselben Code in den Umgebungen dev, stage, test, prod zu verwenden (die Hostnamen von Memcached werden sich unterscheiden, daher mĂŒssen wir jedem Umfeld einen einzigartigen Hostnamen fĂŒr die Sitzungen ĂŒbergeben).
Cache-Speicher von Bitrix

Wir benötigen einen ausfallsicheren Speicher, in den alle Pods schreiben und aus dem sie lesen können.

Wir nutzen ebenfalls Memcached.
Diese Lösung wird von Bitrix selbst empfohlen.

$ helm install stable/memcached --name cache

bitrix/.settings_extra.php — hier wird in Bitrix definiert, wo wir den Cache speichern

Auch hier verwenden wir Umgebungsvariablen.

Cron-Jobs

Es gibt verschiedene AnsĂ€tze zur AusfĂŒhrung von Cron-Jobs in Kubernetes.

  • einen separaten Deployment mit einem Pod zur AusfĂŒhrung von Cron-Jobs
  • Cronjob zur AusfĂŒhrung der Cron-Jobs (wenn es sich um eine Web-App handelt — mit wget https://$host$cronjobname, oder kubectl exec in einen der Worker Pods, usw.)
  • usw.

Man kann ĂŒber die beste Lösung diskutieren, aber in diesem Fall haben wir die Option "separates Deployment mit Pods fĂŒr Cronjobs" gewĂ€hlt.

So wurde es gemacht:

  • Cron-Jobs fĂŒgen wir ĂŒber ConfigMap oder ĂŒber die Datei config/addcron hinzu
  • Wir starten einen Container in einem einzigen Exemplar, der dem Worker-Pod identisch ist + erlauben die AusfĂŒhrung von Cron-Jobs in ihm
  • Es wird dieselbe Codebasis verwendet, sodass der Aufbau des Containers einfach ist

Was wir Gutes erhalten:

  • Wir haben funktionierende Cron-Jobs in einer Umgebung, die der Umgebung der Entwickler (Docker) entspricht
  • Cronjobs mĂŒssen nicht fĂŒr Kubernetes "neu geschrieben" werden, sie funktionieren in der gleichen Art und Weise und im gleichen Codebasiss wie zuvor.
  • Cron-Jobs können von allen Teammitgliedern mit Commit-Rechten im Produktionszweig hinzugefĂŒgt werden, nicht nur von Administratoren

Modul Southbridge K8SDeploy und Bearbeitung des Codes aus dem Administrationspanel

Wir haben doch ĂŒber das Upgrade des Pods gesprochen?
Wie leitet man den Verkehr dorthin?
Hurra, wir haben dafĂŒr ein Modul in PHP geschrieben 🙂 Das ist ein kleines klassisches Modul fĂŒr Bitrix. Es ist noch nicht öffentlich zugĂ€nglich, aber wir planen, es freizugeben.
Das Modul wird wie ein gewöhnliches Modul in Bitrix installiert:

Southbridge in Tscheljabinsk und Bitrix in Kubernetes

Und so sieht es aus:

Southbridge in Tscheljabinsk und Bitrix in Kubernetes

Es ermöglicht das Setzen eines Cookies, das den Administrator der Website identifiziert und Kubernetes erlaubt, den Traffic auf das Upgrade-Pod zu lenken.

Sobald die Änderungen abgeschlossen sind, muss man `git push` drĂŒcken, die Änderungen im Code werden an git gesendet, danach erstellt das System das Image mit der neuen Version des Codes und "rollt" es im Cluster aus, wobei die alten Pods ersetzt werden.

Ja, etwas improvisiert, aber so bewahren wir die Microservice-Architektur und nehmen den Benutzern von Bitrix die Möglichkeit, den Code ĂŒber das Admin-Panel zu Ă€ndern, nicht weg. Schließlich ist das eine Option, die Aufgabe der Codeanpassung kann auch anders gelöst werden.

Helm-Chart

FĂŒr den Aufbau von Anwendungen in Kubernetes verwenden wir in der Regel den Paketmanager Helm.
FĂŒr unsere Lösung Bitrix in Kubernetes hat Sergey Bondarev, unser leitender Systemadministrator, ein spezielles Helm-Chart geschrieben.

Er fĂŒhrt die Erstellung von Worker-, Upgrade- und Cron-Pods durch, konfiguriert Ingress, Services und ĂŒbertrĂ€gt Variablen aus Kubernetes Secrets in die Pods.

Wir speichern den Code in Gitlab, und das Helm-Build wird ebenfalls aus Gitlab gestartet.

Kurz gesagt, so sieht es aus

$ helm upgrade --install project .helm --set image=registrygitlab.local/k8s/bitrix -f .helm/values.yaml --wait --timeout 300 --debug --tiller-namespace=production

Helm ermöglicht auch einen "nahtlosen" Rollback, falls wÀhrend des Deployments etwas schiefgeht. Es ist angenehm, wenn nicht du in Panik bist, den Code per FTP zu "fixen, weil die Produktion gefallen ist", sondern Kubernetes dies automatisch ohne Downtime erledigt.

Bereitstellung

Ja, wir sind Fans von Gitlab & Gitlab CI, wir verwenden es 🙂
Beim Commit in Gitlab wird eine Pipeline im Projekt-Repository ausgefĂŒhrt, die die Bereitstellung der neuen Version der Umgebung durchfĂŒhrt.

Phasen:

  • build (neues Docker-Image erstellen)
  • test (testen)
  • clean up (Testumgebung löschen)
  • push (es in das Docker-Registry senden)
  • deploy (Anwendung ĂŒber Helm in Kubernetes bereitstellen).

Southbridge in Tscheljabinsk und Bitrix in Kubernetes

Hurra, es ist fertig, wir implementieren!
Oder wir stellen Fragen, wenn welche vorhanden sind.

Also, was haben wir gemacht

Aus technischer Sicht:

  • wir haben Bitrix containerisiert;
  • "wir haben Bitrix in Container zerlegt, von denen jeder minimale Funktionen ausfĂŒhrt;
  • wir haben einen zustandslosen Zustand der Container erreicht;
  • wir haben das Problem mit dem Update von Bitrix in Kubernetes gelöst;
  • alle Funktionen von Bitrix funktionieren weiterhin (fast alle);
  • wir haben das Deployment in Kubernetes und den Rollback zwischen Versionen erfolgreich durchgefĂŒhrt.

Aus geschÀftlicher Sicht:

  • Ausfallsicherheit;
  • Kubernetes-Tools (einfache Integration mit Gitlab CI, nahtloses Deployment usw.);
  • Passwörter in Secrets (sind nur fĂŒr diejenigen sichtbar, denen der Zugriff auf die Passwörter direkt gewĂ€hrt wurde);
  • Es ist bequem, zusĂ€tzliche Umgebungen (fĂŒr Entwicklung, Tests usw.) innerhalb einer einheitlichen Infrastruktur zu erstellen.

Quelle: habr.com

60GB SSD 8Gb DDR4