Southbridge i Tjelyabinsk och Bitrix i Kubernetes

I Chelyabinsk, meetups for system administrators Sysadminka are taking place, and at the last one, I presented on our solution for running applications on 1C-Bitrix in Kubernetes.

Bitrix, Kubernetes, Ceph — a great mix?

I'll explain how we put all of this together into a working solution.

LÄt oss köra!

Southbridge i Tjelyabinsk och Bitrix i Kubernetes

The meetup took place on April 18 in Chelyabinsk. You can read about our meetups in Timepad and watch on YouTube.

If you want to join us as a speaker or as an attendee, feel free to write to vadim.isakanov@gmail.com and on Telegram t.me/vadimisakanov.

My presentation

Southbridge i Tjelyabinsk och Bitrix i Kubernetes

Bildspel

Solution "Bitrix in Kubernetes, version Southbridge 1.0"

I will discuss our solution in a "for beginners in Kubernetes" format, as it was done at the meetup. However, I assume that you are at least familiar with the terms Bitrix, Docker, Kubernetes, and Ceph at the Wikipedia article level.

What is actually available regarding Bitrix in Kubernetes?

There is very little information on the internet about running applications on Bitrix in Kubernetes.
I found only the following materials:

Presentation by Alexander Serbul, 1C-Bitrix, and Anton Tuzlukov from Qsoft:

Spela video

I recommend listening to it.

Development of a solution from a user serkyron I detta omrÄde har ocksÄ AI-system nÄtt fram. Smarta algoritmer förutspÄr serverfel genom att analysera deras "beteende". Till exempel, företaget Litbit.
I also found such a solution.

And... that's basically it.

I warn you, we haven't checked the quality of the solutions linked above 🙂
By the way, while preparing our solution, I communicated with Alexander Serbul, and at that time his presentation wasn't available yet, so there is a point in my slides stating that "Bitrix does not use Kubernetes."

But there are already many ready-made Docker images for running Bitrix in Docker: https://hub.docker.com/search?q=bitrix&type=image

Is this enough to create a full-fledged solution for Bitrix in Kubernetes?
No. There are a lot of problems that need to be solved.

What are the problems with Bitrix in Kubernetes?

The first is that the ready-made images from Dockerhub are not suitable for Kubernetes.

If we want to build a microservices architecture (which we usually want to do in Kubernetes), you need to break the application down into containers and ensure that each container performs one small function (and does it well). Why only one? In short — the simpler, the more reliable.
If you want a longer explanation — please take a look at this article and video: https://habr.com/ru/company/southbridge/blog/426637/

Docker images on Dockerhub are mainly built on the principle of "everything in one", so we had to reinvent the wheel and even create images from scratch.

The second is that the website code is modified from the admin panel.

Vi har skapat en ny sektion pÄ webbplatsen - koden har uppdaterats (en katalog med namnet pÄ den nya sektionen har lagts till).

Egenskaperna för komponenten har Àndrats frÄn administrationspanelen - koden har förÀndrats.

Kubernetes kan inte arbeta med det hÀr som standard, containrar mÄste vara oförÀnderliga (Stateless).

Orsaken: varje container (pod) i klustret hanterar endast en del av trafiken. Om koden Àndras endast i en container (pod), kommer koden att vara olika i olika pods, webbplatsen kommer att fungera olika, olika anvÀndare fÄr se olika versioner av webbplatsen. SÄ kan vi inte ha det.

Det tredje - vi mÄste ta itu med frÄgan om utplacering.

Om vi har en monolit och en "klassisk" server Àr allt ganska enkelt: vi rullar ut en ny kodbas, genomför databasmigrering, och dirigerar trafiken till den nya versionen av koden. Omkopplingen sker omedelbart.
Om vi har en webbplats i Kubernetes, uppdelad i mikrotjÀnster, och det finns mÄnga containrar med kod - oj. Vi mÄste bygga containrar med den nya versionen av koden, rulla ut dem istÀllet för de gamla, utföra databasmigreringen korrekt, och helst göra detta utan att besökarna mÀrker det. Lyckligtvis hjÀlper Kubernetes oss med detta, med en mÀngd olika typer av utplacering.

Det fjÀrde - vi mÄste ta itu med frÄgan om lagring av statiska filer.

Om din webbplats "bara" vÀger 10 gigabyte och du rullar ut den helt i containrar, fÄr du containrar som vÀger 10 gigabyte, som kommer att ta en evighet att distribuera.
De tyngsta delarna av webbplatsen mÄste lagras utanför containrarna, och frÄgan Àr hur man gör detta pÄ rÀtt sÀtt.

Vad som saknas i vÄr lösning.

Hela koden för Bitrix Àr inte uppdelad pÄ mikro-funktioner/mikrotjÀnster (sÄ att registrering Àr separat, modulen för e-handeln separat, och sÄ vidare). Vi lagrar hela kodbasen i varje container i sin helhet.

Vi lagrar Àven inte databasen i Kubernetes (jag har anvÀnt lösningar med databasen i Kubernetes för utvecklarmiljöer, men inte för produktion).

Webbplatsens administratörer kommer att mÀrka att webbplatsen arbetar i Kubernetes. Funktionen "systemkontroll" fungerar inte korrekt, för att redigera koden pÄ webbplatsen frÄn administrationspanelen mÄste man först klicka pÄ knappen "jag vill redigera koden".

Problemmerne er blevet lÞst, behovet for implementering af mikrotjenester er afklaret, mÄlet er klart - at fÄ et fungerende system til anvendelse af Bitrix i Kubernetes, mens vi bevarer bÄde Bitrix-funktionalitet og Kubernetes-fordele. Vi starter implementeringen.

Arkitektur

Mange 'arbejdende' pods med webserver (arbejdere).
En pod med cron-opgaver (kun én krÊves).
En upgrade pod til redigering af hjemmesidens kode fra administrationspanelet (ogsÄ kun én krÊves).

Southbridge i Tjelyabinsk och Bitrix i Kubernetes

Vi lÞser spÞrgsmÄlene:

  • Hvor skal sessioner gemmes?
  • Hvor skal cache gemmes?
  • Hvor skal statiske filer gemmes, skal vi virkelig placere gigabyte statiske filer i en bunke containere?
  • Hvordan vil databasen fungere?

Docker-billede

Vi starter med at opbygge Docker-billedet.

Den ideelle lÞsning er, at vi har et universelt billede, pÄ grundlag af dette fÄr vi bÄde arbejdende pods, pods med cron-opgaver og upgrade pods.

Vi har netop lavet et sÄdant billede.

Det inkluderer nginx, apache/php-fpm (kan vĂŠlges ved opbygning), msmtp til mailudsendelse og cron.

Under opbygningen kopieres hele kodebasen for hjemmesiden til mappen /app (undtagen de dele, vi vil flytte til et separat fĂŠlles lager).

Mikrotjenester, services

arbejdende pods:

  • Container med nginx + container apache/php-fpm + msmtp
  • Msmtp kunne ikke flyttes til en separat mikrotjeneste, Bitrix bliver utilfreds, fordi det ikke kan sende mails direkte.
  • I hver container er der hele kodebasen.
  • Der er forbud mod at ĂŠndre koden i containere.

cron pod:

  • container med apache, php, cron
  • sammen med hele kodebasen
  • forbud mod at ĂŠndre koden i containere

upgrade pod:

  • container med nginx + container apache/php-fpm + msmtp
  • der er ikke forbud mod at ĂŠndre koden i containere

sessionlager

cachelager for Bitrix

Det er ogsÄ vigtigt: adgangskoder til forbindelse til alt, fra databasen til mail, opbevares i Kubernetes secrets. Vi fÄr en bonus, adgangskoderne kan kun ses af dem, vi giver adgang til secrets, og ikke alle, der har adgang til kodebasen.

Lager til statiske filer

Vi kan bruge hvad som helst: ceph, nfs (men vi anbefaler ikke nfs til produktion), netvĂŠrkslager fra 'cloud'-udbydere osv.

Lageret skal tilsluttes i containere i /upload/ mappen pÄ hjemmesiden og andre mapper med statiske filer.

Databas

For enkelhedens skyld anbefaler vi at flytte databasen uden for Kubernetes. At have databasen i Kubernetes er en kompleks opgave, der vil gĂžre strukturen vĂŠsentligt mere kompleks.

sessionlager

Vi bruger memcached 🙂

Det hanterar sessioner vÀl, Àr klusterbaserat och stöds "naturligt" som session.save_path i php. SÄdana system har gÄng pÄ gÄng anvÀnts i den klassiska monolitiska arkitekturen, nÀr vi byggde kluster med ett stort antal webbservrar. För distribution anvÀnder vi helm.

$ helm install stable/memcached --name session

php.ini – hĂ€r stĂ€lls instĂ€llningar för lagring av sessioner i memcached in i bilden

Vi anvÀnde miljövariabler för att överföra data om vÀrdar med memcached https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/.
Detta möjliggör att anvÀnda samma kod i miljöer som dev, stage, test, prod (namnen pÄ vÀrdarna för memcached kommer att skilja sig Ät, sÄ vi behöver överföra unika vÀrdnamn för sessioner till varje miljö).
Cache-lagring i Bitrix

Vi behöver en kaustikresistent lagring dit alla pods kan skriva och lÀsa.

Vi anvÀnder Àven memcached.
Denna lösning rekommenderas av Bitrix sjÀlva.

$ helm install stable/memcached --name cache

bitrix/.settings_extra.php – hĂ€r anges var vi lagrar cachen i Bitrix

Vi anvÀnder ocksÄ miljövariabler.

Cron-jobb

Det finns olika tillvÀgagÄngssÀtt för att köra cron-jobb i Kubernetes.

  • separat deployment med en pod för att köra cron-jobb
  • cronjob för att utföra cron-jobb (om det Ă€r webapp – med wget https://$host$cronjobname, eller kubectl exec in i en av worker-pods, osv.)
  • med flera.

Man kan diskutera vad som Àr mest korrekt, men i det hÀr fallet valde vi alternativet "separat deployment med pods för cron-jobb"

Hur det görs:

  • funktionerna lĂ€ggs till via ConfigMap eller genom filen config/addcron
  • i en instans kör vi en container som Ă€r identisk med worker-poden + vi tillĂ„ter körning av cron-jobb i den
  • den samma kodbas anvĂ€nds, tack vare standardiseringen Ă€r det enkelt att bygga containern

Vad vi fÄr bra:

  • vi har fungerande cron-jobb i en miljö som Ă€r identisk med utvecklarnas miljö (docker)
  • cron-jobb behöver inte "skrivas om" för Kubernetes, de fungerar i samma form och i samma kodbas som tidigare
  • cro-jobb kan lĂ€ggas till av alla teammedlemmar med commit-rĂ€ttigheter till produktionsgrenen, inte bara administratörer

Modul Southbridge K8SDeploy och redigering av kod frÄn adminpanelen

Vi talade ju om uppgradering av podden?
Och hur dirigerar vi trafiken dit?
Hurra, vi har skrivit en modul för detta i php 🙂 Det Ă€r en liten klassisk modul för Bitrix. Den finns Ă€nnu inte tillgĂ€nglig offentligt, men vi planerar att göra den tillgĂ€nglig.
Modulen installeras som en vanlig modul i Bitrix:

Southbridge i Tjelyabinsk och Bitrix i Kubernetes

Och ser sÄ hÀr ut:

Southbridge i Tjelyabinsk och Bitrix i Kubernetes

Det gör det möjligt att stÀlla in en cookie som identifierar webbplatsadministratören och lÄter Kubernetes dirigera trafik till uppgraderingspodden.

NÀr Àndringarna Àr klara mÄste du trycka pÄ git push, Àndringarna i koden skickas till git, och systemet kommer sedan att bygga en bild med den nya versionen av koden och "rulla" ut den i klustret, vilket ersÀtter de gamla poddarna.

Ja, lite krÄngligt, men vi bevarar samtidigt mikrotjÀnstarkitekturen och tar inte bort Bitrix-anvÀndarnas favoritfunktion att justera koden frÄn adminpanelen. I slutÀndan Àr det ett alternativ, man kan lösa kodjusteringsuppgiften pÄ ett annat sÀtt.

Helm-diagram

För att bygga appar i Kubernetes anvÀnder vi vanligtvis paketchefen Helm.
För vÄr Bitrix-lösning i Kubernetes har Sergey Bondarev, vÄr ledande systemadministratör, skrivit ett specialanpassat Helm-diagram.

Det utför byggandet av worker-, upgrade- och cron-poddar, konfigurerar ingressar, tjÀnster och överför variabler frÄn Kubernetes-secrets till poddarna.

Vi lagrar koden i Gitlab och initierar Àven Helm-byggnaden frÄn Gitlab.

Det ser ungefÀr ut sÄ hÀr

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

Helm möjliggör ocksÄ "sömlös" nedgradering om nÄgot gÄr fel vid distributionen. Det Àr trevligt nÀr det inte Àr du som panikartat "fixar koden via ftp för att produktionen har kraschat", utan Kubernetes gör det automatiskt, dessutom utan driftstopp.

Utveckla

Ja, vi Ă€r fans av Gitlab & Gitlab CI, vi anvĂ€nder det 🙂
Vid commit i Gitlab i projektets repository startar Gitlab en pipeline som utför distributionen av den nya versionen av miljön.

Steg:

  • build (bygger en ny Docker-bild)
  • test (testar)
  • clean up (tar bort testmiljön)
  • push (skickar den till Docker registry)
  • deploy (distribuerar applikationen i Kubernetes via Helm).

Southbridge i Tjelyabinsk och Bitrix i Kubernetes

Hurra, klart, vi implementerar!
Eller stÀller frÄgor om det finns nÄgra.

SĂ„, vad har vi gjort

Ur ett tekniskt perspektiv:

  • dockeriserade Bitrix;
  • "skar upp" Bitrix i containrar, dĂ€r varje utför minimalt med funktioner;
  • uppnĂ„dde stateless tillstĂ„nd i containrarna;
  • löste problemet med att uppdatera Bitrix i Kubernetes;
  • alla funktioner i Bitrix fortsatte att fungera (nĂ€stan allt);
  • testade distributionen i Kubernetes och nedgradering mellan versioner.

Ur ett affÀrsperspektiv:

  • felfunktionstolerans;
  • Kubernetes-verktyg (enkel integration med Gitlab CI, sömlös distribution, etc);
  • lösenord i secrets (synliga endast för dem som direkt beviljas Ă„tkomst till lösenorden);
  • Det Ă€r enkelt att skapa ytterligare miljöer (för utveckling, tester m.m.) inom en och samma infrastruktur.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster