{"id":35581,"date":"2019-10-31T22:05:09","date_gmt":"2019-10-31T19:05:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes\/"},"modified":"2019-10-31T22:05:09","modified_gmt":"2019-10-31T19:05:09","slug":"southbridge-v-chelyabinske-i-bitriks-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","title":{"rendered":"Southbridge in Tscheljabinsk und Bitrix in Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>In Tscheljabinsk finden Meetups f\u00fcr Systemadministratoren von Sysadminka statt, und bei dem letzten habe ich einen Vortrag \u00fcber unsere L\u00f6sung zur Ausf\u00fchrung von Anwendungen auf 1C-Bitrix in Kubernetes gehalten.<\/p>\n<p><\/p>\n<p>Bitrix, Kubernetes, Ceph \u2013 eine tolle Mischung?<\/p>\n<p><\/p>\n<p>Ich werde erz\u00e4hlen, wie wir aus all dem eine funktionierende L\u00f6sung zusammengebaut haben.<\/p>\n<p><\/p>\n<p>Los geht's!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge in Tscheljabinsk und Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/3f1b760eeab9dc07124a6353ccd2f004.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Das Meetup fand am 18. April in Tscheljabinsk statt. \u00dcber unsere Meetups kann man lesen in <noindex><a rel=\"nofollow\" href=\"https:\/\/sysadminka.timepad.ru\">Timepad<\/a><\/noindex> und sich anschauen auf <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/channel\/UCMblNgU0Gt-TXb9GdVeeinw\/\">YouTube<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Wenn Sie zu uns kommen m\u00f6chten, um einen Vortrag zu halten oder als Zuh\u00f6rer \u2013 herzlich willkommen, schreiben Sie an vadim.isakanov@gmail.com und auf Telegram t.me\/vadimisakanov. <\/p>\n<p><\/p>\n<h2 id=\"moy-doklad\">Mein Vortrag<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=MZqPNMUjr_M\" title=\"Bericht \u00fcber Bitrix in Kubernetes\"><img decoding=\"async\" alt=\"Southbridge in Tscheljabinsk und Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/eb02d3ceb8248faad927c2bcae0074de.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/yadi.sk\/i\/1q0YpFHBGBdtcg\">Folien<\/a><\/noindex><\/p>\n<p><\/p>\n<h2 id=\"reshenie-bitriks-v-kubernetes-versiya-southbridge-10\">L\u00f6sung \u201eBitrix in Kubernetes, Version Southbridge 1.0\u201c<\/h2>\n<p><\/p>\n<p>Ich werde \u00fcber unsere L\u00f6sung im Format \u201ef\u00fcr Einsteiger in Kubernetes\u201c 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.<\/p>\n<p><\/p>\n<h4 id=\"chto-voobsche-est-gotovogo-pro-bitriks-v-kubernetes\">Was gibt es eigentlich schon \u00fcber Bitrix in Kubernetes?<\/h4>\n<p><\/p>\n<p>Im gesamten Internet gibt es sehr wenig Informationen \u00fcber die Ausf\u00fchrung von Anwendungen auf Bitrix in Kubernetes.<br \/>\nIch habe nur solche Materialien gefunden:<\/p>\n<p><\/p>\n<p>Vortrag von Alexander Serbul, 1C-Bitrix, und Anton Tuzlukov von Qsoft: <\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"lHK4eOvLbRM\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/lHK4eOvLbRM\/hqdefault.jpg\" alt=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Ich empfehle, ihm zuzuh\u00f6ren.<\/p>\n<p><\/p>\n<p>Entwicklung einer eigenen L\u00f6sung vom Benutzer <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/serkyron\/\" class=\"user_link\">serkyron<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/351286\/\">auf Habra<\/a><\/noindex>.<br \/>\nIch habe noch <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ESSch\/kubernetes\">eine solche L\u00f6sung gefunden<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Und iiiih\u2026 das ist eigentlich alles.<\/p>\n<p><\/p>\n<p>Ich warne, die Qualit\u00e4t der L\u00f6sungen in den obigen Links haben wir nicht \u00fcberpr\u00fcft \ud83d\ude42<br \/>\n\u00dcbrigens, bei der Vorbereitung unserer L\u00f6sung 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\".<\/p>\n<p><\/p>\n<p>Aber es gibt bereits viele fertige Docker-Images f\u00fcr die Arbeit mit Bitrix in Docker: <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/search?q=bitrix&amp;type=image\">https:\/\/hub.docker.com\/search?q=bitrix&amp;type=image<\/a><\/noindex> <\/p>\n<p><\/p>\n<p>Reicht das aus, um eine vollwertige L\u00f6sung f\u00fcr Bitrix in Kubernetes zu schaffen?<br \/>\nNein. Es gibt viele Probleme, die gel\u00f6st werden m\u00fcssen.<\/p>\n<p><\/p>\n<h4 id=\"v-chem-problemy-s-bitriks-v-kubernetes\">Was sind die Probleme mit Bitrix in Kubernetes?<\/h4>\n<p><\/p>\n<p><strong>Erstens \u2013 die fertigen Images aus Dockerhub sind nicht f\u00fcr Kubernetes geeignet.<\/strong><\/p>\n<p><\/p>\n<p>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\u00fcssen sicherstellen, dass jeder Container eine kleine Funktion ausf\u00fchrt (und das gut macht). Warum nur eine? Kurz gesagt \u2013 je einfacher, desto zuverl\u00e4ssiger.<br \/>\nWenn Sie mehr Details m\u00f6chten \u2013 schauen Sie sich bitte diesen Artikel und das Video an: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/426637\/\">https:\/\/habr.com\/ru\/company\/southbridge\/blog\/426637\/<\/a><\/noindex> <\/p>\n<p><\/p>\n<p>Docker-Images in Dockerhub sind haupts\u00e4chlich nach dem Prinzip \"alles in einem\" erstellt, weshalb wir letztendlich unser eigenes Rad bauen und sogar die Images von Grund auf neu erstellen mussten.<\/p>\n<p><\/p>\n<p><strong>Zweitens \u2013 der Code der Website wird aus dem Administrationsbereich bearbeitet.<\/strong><\/p>\n<p><\/p>\n<p>Wir haben einen neuen Abschnitt auf der Website erstellt \u2013 der Code wurde aktualisiert (ein Verzeichnis mit dem Namen des neuen Abschnitts wurde hinzugef\u00fcgt).<\/p>\n<p><\/p>\n<p>Die Eigenschaften der Komponente im Admin-Bereich wurden ge\u00e4ndert \u2013 der Code hat sich ge\u00e4ndert.<\/p>\n<p><\/p>\n<p>Kubernetes kann standardm\u00e4\u00dfig nicht damit umgehen, Container m\u00fcssen unver\u00e4nderlich (stateless) sein.<\/p>\n<p><\/p>\n<p>Grund: Jeder Container (Pod) im Cluster verarbeitet nur einen Teil des Traffics. Wenn der Code nur in einem Container (Pod) ge\u00e4ndert 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.<\/p>\n<p><\/p>\n<p><strong>Drittens \u2013 es muss eine L\u00f6sung f\u00fcr das Deployment gefunden werden.<\/strong><\/p>\n<p><\/p>\n<p>Wenn wir ein Monolithen und einen \u201eklassischen\u201c Server haben, ist alles ganz einfach: wir setzen die neue Codebasis um, f\u00fchren die Datenbankmigration durch und leiten den Traffic auf die neue Version des Codes um. Der Wechsel geschieht sofort.<br \/>\nWenn unsere Website in Kubernetes l\u00e4uft, in Mikrodienste aufgeteilt ist und viele Container mit Code hat \u2013 oh je. Wir m\u00fcssen Container mit der neuen Codeversion bauen, sie anstelle der alten bereitstellen, die Datenbankmigration korrekt durchf\u00fchren und idealerweise dies f\u00fcr die Besucher unmerklich machen. Zum Gl\u00fcck hilft uns Kubernetes dabei und unterst\u00fctzt eine ganze Reihe von verschiedenen Deployment-Arten.<\/p>\n<p><\/p>\n<p><strong>Viertens \u2013 es muss eine L\u00f6sung zur Speicherung von Statischen gefunden werden.<\/strong><\/p>\n<p><\/p>\n<p>Wenn Ihre Website \u201enur\u201c 10 Gigabyte gro\u00df ist und Sie sie vollst\u00e4ndig in Containern bereitstellen, erhalten Sie Container mit einem Gewicht von 10 Gigabyte, die eine Ewigkeit zum Deployen ben\u00f6tigen.<br \/>\nDie schwersten Teile der Website m\u00fcssen au\u00dferhalb der Container gespeichert werden, und die Frage, wie das richtig gemacht wird, stellt sich.<\/p>\n<p><\/p>\n<h4 id=\"chego-net-v-nashem-reshenii\">Was in unserer L\u00f6sung nicht vorhanden ist.<\/h4>\n<p><\/p>\n<p>Der gesamte Bitrix-Code ist nicht auf Mikrofunktionen\/Mikrodienste aufgeteilt (so dass die Registrierung separat, das Modul f\u00fcr den Online-Shop separat usw. ist). Die gesamte Codebasis speichern wir in jedem Container vollst\u00e4ndig.<\/p>\n<p><\/p>\n<p>Die Datenbank speichern wir auch nicht in Kubernetes (ich habe zwar L\u00f6sungen mit einer Datenbank in Kubernetes f\u00fcr Entwicklerumgebungen implementiert, aber nicht f\u00fcr die Produktionsumgebung).<\/p>\n<p><\/p>\n<p>Die Administratoren der Website werden dennoch bemerken, dass die Website in Kubernetes l\u00e4uft. Die Funktion \"Systempr\u00fcfung\" funktioniert nicht korrekt, um den Code der Website im Admin-Bereich zu bearbeiten, muss zuerst der Knopf \u201eIch m\u00f6chte den Code bearbeiten\u201c gedr\u00fcckt werden.<\/p>\n<p><\/p>\n<p>Wir haben die Probleme gel\u00f6st, wir sind uns der Notwendigkeit der Implementierung von Mikrodiensten bewusst, das Ziel ist klar \u2013 ein funktionierendes System f\u00fcr Anwendungen auf Bitrix in Kubernetes zu erhalten, wobei sowohl die M\u00f6glichkeiten von Bitrix als auch die Vorteile von Kubernetes erhalten bleiben. Wir beginnen mit der Implementierung.<\/p>\n<p><\/p>\n<h4 id=\"arhitektura\">Architektur<\/h4>\n<p><\/p>\n<p>Viele \u00abarbeitsf\u00e4hige\u00bb Pods mit Webserver (Worker).<br \/>\nEin Pod mit Cron-Jobs (unbedingt nur einer).<br \/>\nEin Upgrade-Pod f\u00fcr die Bearbeitung des Website-Codes aus dem Admin-Panel (ebenfalls unbedingt nur einer).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge in Tscheljabinsk und Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/e26a787c11f78811b15a89f597331ef1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir kl\u00e4ren die Fragen:<\/p>\n<p><\/p>\n<ul>\n<li>Wo speichern wir die Sitzungen?<\/li>\n<li>Wo speichern wir den Cache?<\/li>\n<li>Wo speichern wir die Statischen Dateien? Wir k\u00f6nnen doch nicht Gigabytes an Statischen Dateien in einer Vielzahl von Containern lagern?<\/li>\n<li>Wie wird die Datenbank funktionieren?<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"docker-obraz\">Docker-Image<\/h4>\n<p><\/p>\n<p>Wir beginnen mit dem Aufbau des Docker-Images.<\/p>\n<p><\/p>\n<p>Die ideale L\u00f6sung \u2013 wir haben ein universelles Image, auf dessen Basis wir sowohl Worker-Pods als auch Pods mit Cron-Jobs und Upgrade-Pods erhalten.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centosadmin\/bitrixenv\">Wir haben genau so ein Image erstellt.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Es enth\u00e4lt nginx, apache\/php-fpm (bei der Erstellung ausw\u00e4hlbar), msmtp zum Versand von E-Mails und cron.<\/p>\n<p><\/p>\n<p>Bei der Erstellung des Images wird der vollst\u00e4ndige Code der Website in das Verzeichnis \/app kopiert (mit Ausnahme der Teile, die wir in einen separaten Shared Storage auslagern).<\/p>\n<p><\/p>\n<h4 id=\"mikroservisnost-servisy\">Mikrodienste, Services<\/h4>\n<p><\/p>\n<p><strong>Worker-Pods:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Container mit nginx + Container apache\/php-fpm + msmtp<\/li>\n<li>msmtp konnte nicht in einen separaten Mikrodienst ausgelagert werden, Bitrix beschwert sich, dass es die E-Mails nicht direkt senden kann.<\/li>\n<li>In jedem Container befindet sich der vollst\u00e4ndige Codebasis.<\/li>\n<li>Verbot von \u00c4nderungen am Code in Containern.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Cron-Pod:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Container mit apache, php, cron<\/li>\n<li>Im Paket befindet sich die vollst\u00e4ndige Codebasis.<\/li>\n<li>Verbot von \u00c4nderungen am Code in Containern.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Upgrade-Pod:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Container mit nginx + Container apache\/php-fpm + msmtp<\/li>\n<li>Kein Verbot von \u00c4nderungen am Code in Containern.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Sitzungsspeicher<\/strong><\/p>\n<p><\/p>\n<p><strong>Cache-Speicher f\u00fcr Bitrix<\/strong><\/p>\n<p><\/p>\n<p>Wichtig: Die Passw\u00f6rter f\u00fcr die Verbindung zu allem, von der Datenbank bis zur E-Mail, speichern wir in Kubernetes-Secrets. Wir erhalten den Bonus, dass die Passw\u00f6rter nur denjenigen sichtbar sind, denen wir Zugriff auf die Secrets gew\u00e4hren, und nicht allen, die Zugang zur Codebasis des Projekts haben.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-dlya-statiki\">Speicher f\u00fcr Statik<\/h4>\n<p><\/p>\n<p>Wir k\u00f6nnen alles verwenden: Ceph, NFS (aber NFS empfehlen wir nicht f\u00fcr die Produktion), Netzwerkspeicher von \u201aCloud\u2018-Anbietern usw.<\/p>\n<p><\/p>\n<p>Der Speicher muss in den Containern im Verzeichnis \/upload\/ der Website und in anderen Verzeichnissen mit Statischen Dateien eingebunden werden.<\/p>\n<p><\/p>\n<h4 id=\"baza-dannyh\">Datenbank<\/h4>\n<p><\/p>\n<p>Zur Vereinfachung empfehlen wir, die Datenbank au\u00dferhalb von Kubernetes zu platzieren. Die Datenbank in Kubernetes ist eine separate, komplexe Aufgabe, sie macht das Schema erheblich komplizierter.<\/p>\n<p><\/p>\n<h4 id=\"hranilische-sessiy\">Sitzungsspeicher<\/h4>\n<p><\/p>\n<p>Wir verwenden Memcached \ud83d\ude42<\/p>\n<p><\/p>\n<p>Er k\u00fcmmert sich gut um die Speicherung von Sitzungen, wird clusterf\u00e4hig und wird \u201enativ\u201c als session.save_path in PHP unterst\u00fctzt. Ein solches System wurde bereits in der klassischen monolithischen Architektur mehrfach erprobt, als wir Cluster mit einer Vielzahl von Webservern aufgebaut haben. F\u00fcr das Deployment verwenden wir Helm.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ helm install stable\/memcached --name session<\/code><\/pre>\n<p><\/p>\n<p>php.ini \u2014 hier sind im Image die Einstellungen f\u00fcr die Speicherung von Sitzungen in Memcached definiert<\/p>\n<p><\/p>\n<p>Wir haben Umgebungsvariablen verwendet, um Daten \u00fcber die Hosts mit Memcached zu \u00fcbertragen <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/inject-data-application\/define-environment-variable-container\/\">https:\/\/kubernetes.io\/docs\/tasks\/inject-data-application\/define-environment-variable-container\/<\/a><\/noindex>.<br \/>\nDies erm\u00f6glicht es, denselben Code in den Umgebungen dev, stage, test, prod zu verwenden (die Hostnamen von Memcached werden sich unterscheiden, daher m\u00fcssen wir jedem Umfeld einen einzigartigen Hostnamen f\u00fcr die Sitzungen \u00fcbergeben).<br \/>\nCache-Speicher von Bitrix<\/p>\n<p><\/p>\n<p>Wir ben\u00f6tigen einen ausfallsicheren Speicher, in den alle Pods schreiben und aus dem sie lesen k\u00f6nnen.<\/p>\n<p><\/p>\n<p>Wir nutzen ebenfalls Memcached.<br \/>\nDiese L\u00f6sung wird von Bitrix selbst empfohlen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ helm install stable\/memcached --name cache<\/code><\/pre>\n<p><\/p>\n<p>bitrix\/.settings_extra.php \u2014 hier wird in Bitrix definiert, wo wir den Cache speichern<\/p>\n<p><\/p>\n<p>Auch hier verwenden wir Umgebungsvariablen.<\/p>\n<p><\/p>\n<h3 id=\"krontaski\">Cron-Jobs<\/h3>\n<p><\/p>\n<p>Es gibt verschiedene Ans\u00e4tze zur Ausf\u00fchrung von Cron-Jobs in Kubernetes.<\/p>\n<p><\/p>\n<ul>\n<li>einen separaten Deployment mit einem Pod zur Ausf\u00fchrung von Cron-Jobs<\/li>\n<li>Cronjob zur Ausf\u00fchrung der Cron-Jobs (wenn es sich um eine Web-App handelt \u2014 mit wget <noindex>https:\/\/$host$cronjobname<\/noindex>, oder kubectl exec in einen der Worker Pods, usw.)<\/li>\n<li>usw.<\/li>\n<\/ul>\n<p><\/p>\n<p>Man kann \u00fcber den besten Weg streiten, aber in diesem Fall haben wir die Variante \u201eseparater Deployment mit Pods f\u00fcr Cron-Jobs\u201c gew\u00e4hlt.<\/p>\n<p><\/p>\n<p>So wurde es gemacht:<\/p>\n<p><\/p>\n<ul>\n<li>Cron-Jobs f\u00fcgen wir \u00fcber ConfigMap oder \u00fcber die Datei config\/addcron hinzu<\/li>\n<li>Wir starten einen Container in einem einzigen Exemplar, der dem Worker-Pod identisch ist + erlauben die Ausf\u00fchrung von Cron-Jobs in ihm<\/li>\n<li>Es wird dieselbe Codebasis verwendet, sodass der Aufbau des Containers einfach ist<\/li>\n<\/ul>\n<p><\/p>\n<p>Was wir Gutes erhalten:<\/p>\n<p><\/p>\n<ul>\n<li>Wir haben funktionierende Cron-Jobs in einer Umgebung, die der Umgebung der Entwickler (Docker) entspricht<\/li>\n<li>Cron-Jobs m\u00fcssen nicht f\u00fcr Kubernetes \u201eneu geschrieben\u201c werden, sie funktionieren genau so und in derselben Codebasis wie zuvor<\/li>\n<li>Cron-Jobs k\u00f6nnen von allen Teammitgliedern mit Commit-Rechten im Produktionszweig hinzugef\u00fcgt werden, nicht nur von Administratoren<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"modul-southbridge-k8sdeploy-i-redaktirovanie-koda-iz-admin-paneli\">Modul Southbridge K8SDeploy und Bearbeitung des Codes aus dem Administrationspanel<\/h3>\n<p><\/p>\n<p>Wir haben doch \u00fcber das Upgrade des Pods gesprochen?<br \/>\nWie leitet man den Verkehr dorthin?<br \/>\nHurra, wir haben daf\u00fcr ein Modul in PHP geschrieben \ud83d\ude42 Das ist ein kleines klassisches Modul f\u00fcr Bitrix. Es ist noch nicht \u00f6ffentlich zug\u00e4nglich, aber wir planen, es freizugeben.<br \/>\nDas Modul wird wie ein gew\u00f6hnliches Modul in Bitrix installiert:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge in Tscheljabinsk und Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/ba9f895ce645862c7ba003d523cd5656.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und so sieht es aus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge in Tscheljabinsk und Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/916ae9243fae9f6405cc68174ec5bb2b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es erm\u00f6glicht das Setzen eines Cookies, das den Administrator der Website identifiziert und Kubernetes erlaubt, den Traffic auf das Upgrade-Pod zu lenken.<\/p>\n<p><\/p>\n<p>Sobald die \u00c4nderungen abgeschlossen sind, muss man `git push` dr\u00fccken, die \u00c4nderungen 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.<\/p>\n<p><\/p>\n<p>Ja, etwas improvisiert, aber so bewahren wir die Microservice-Architektur und nehmen den Benutzern von Bitrix die M\u00f6glichkeit, den Code \u00fcber das Admin-Panel zu \u00e4ndern, nicht weg. Schlie\u00dflich ist das eine Option, die Aufgabe der Codeanpassung kann auch anders gel\u00f6st werden.<\/p>\n<p><\/p>\n<h4 id=\"helm-chart\">Helm-Chart<\/h4>\n<p><\/p>\n<p>F\u00fcr den Aufbau von Anwendungen in Kubernetes verwenden wir in der Regel den Paketmanager Helm.<br \/>\nF\u00fcr unsere L\u00f6sung Bitrix in Kubernetes hat Sergey Bondarev, unser leitender Systemadministrator, ein spezielles Helm-Chart geschrieben.<\/p>\n<p><\/p>\n<p>Es erstellt Worker-, Upgrade- und Cron-Pods, konfiguriert Ingresses, Services und \u00fcbertr\u00e4gt Variablen aus Kubernetes-Secrets in die Pods.<\/p>\n<p><\/p>\n<p>Wir speichern den Code in Gitlab, und das Helm-Build wird ebenfalls aus Gitlab gestartet.<\/p>\n<p><\/p>\n<p>Kurz gesagt, so sieht es aus<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ helm upgrade --install project .helm --set image=registrygitlab.local\/k8s\/bitrix -f .helm\/values.yaml --wait --timeout 300 --debug --tiller-namespace=production<\/code><\/pre>\n<p><\/p>\n<p>Helm erm\u00f6glicht auch einen \"nahtlosen\" Rollback, falls w\u00e4hrend 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.<\/p>\n<p><\/p>\n<h4 id=\"deploy\">Bereitstellung<\/h4>\n<p><\/p>\n<p>Ja, wir sind Fans von Gitlab &amp; Gitlab CI, wir verwenden es \ud83d\ude42<br \/>\nBeim Commit in Gitlab wird eine Pipeline im Projekt-Repository ausgef\u00fchrt, die die Bereitstellung der neuen Version der Umgebung durchf\u00fchrt.<\/p>\n<p><\/p>\n<p>Phasen:<\/p>\n<p><\/p>\n<ul>\n<li>build (neues Docker-Image erstellen)<\/li>\n<li>test (testen)<\/li>\n<li>clean up (Testumgebung l\u00f6schen)<\/li>\n<li>push (es in das Docker-Registry senden)<\/li>\n<li>deploy (Anwendung \u00fcber Helm in Kubernetes bereitstellen).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Southbridge in Tscheljabinsk und Bitrix in Kubernetes\" src=\"\/wp-content\/uploads\/74e565a0793b90c3cc19b8c7dedaff34.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hurra, es ist fertig, wir implementieren!<br \/>\nOder wir stellen Fragen, wenn welche vorhanden sind.<\/p>\n<p><\/p>\n<h2 id=\"itak-chto-my-sdelali\">Also, was haben wir gemacht<\/h2>\n<p><\/p>\n<p><strong>Aus technischer Sicht:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>wir haben Bitrix containerisiert;<\/li>\n<li>\"wir haben Bitrix in Container zerlegt, von denen jeder minimale Funktionen ausf\u00fchrt;<\/li>\n<li>wir haben einen zustandslosen Zustand der Container erreicht;<\/li>\n<li>wir haben das Problem mit dem Update von Bitrix in Kubernetes gel\u00f6st;<\/li>\n<li>alle Funktionen von Bitrix funktionieren weiterhin (fast alle);<\/li>\n<li>wir haben das Deployment in Kubernetes und den Rollback zwischen Versionen erfolgreich durchgef\u00fchrt.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Aus gesch\u00e4ftlicher Sicht:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Ausfallsicherheit;<\/li>\n<li>Kubernetes-Tools (einfache Integration mit Gitlab CI, nahtloses Deployment usw.);<\/li>\n<li>Passw\u00f6rter in Secrets (sind nur f\u00fcr diejenigen sichtbar, denen der Zugriff auf die Passw\u00f6rter direkt gew\u00e4hrt wurde);<\/li>\n<li>Es ist bequem, zus\u00e4tzliche Umgebungen (f\u00fcr Entwicklung, Tests usw.) innerhalb einer einheitlichen Infrastruktur zu erstellen.<\/li>\n<\/ul>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/456608\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u043c\u0435\u0441\u044c? \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u0438\u0437 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u0435\u0445\u0430\u043b\u0438! \u041c\u0438\u0442\u0430\u043f \u043f\u0440\u043e\u0448\u0435\u043b 18 \u0430\u043f\u0440\u0435\u043b\u044f \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435. \u041f\u0440\u043e \u043d\u0430\u0448\u0438 \u043c\u0438\u0442\u0430\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 Timepad \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35581","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Southbridge \u0432 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u0438 \u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:05:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:05:09+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Southbridge in Tscheljabinsk und Bitrix in Kubernetes | ProHoster","description":"In Tscheljabinsk finden die Meetups der Systemadministratoren Sysadminka statt, und bei dem letzten habe ich einen Vortrag \u00fcber unsere L\u00f6sung f\u00fcr die Arbeit mit Anwendungen auf 1C-Bitrix in Kubernetes gehalten. Bitrix, Kubernetes, Ceph \u2014.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Southbridge \u0432 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u0438 \u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes | ProHoster","og:description":"\u0412 \u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u0442\u0430\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 Sysadminka, \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 1\u0421-\u0411\u0438\u0442\u0440\u0438\u043a\u0441 \u0432 Kubernetes. \u0411\u0438\u0442\u0440\u0438\u043a\u0441, Kubernetes, \u0421eph \u2014.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/southbridge-v-chelyabinske-i-bitriks-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:05:09+00:00","article:modified_time":"2019-10-31T19:05:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35581","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 23:52:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:59:36","updated":"2026-01-21 23:52:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=35581"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35581\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=35581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=35581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=35581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}