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!

The meetup took place on April 18 in Chelyabinsk. You can read about our meetups in and watch on .
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
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:

I recommend listening to it.
Development of a solution from a user .
I also found .
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:
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:
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).

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.
.
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 sessionphp.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 .
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 cachebitrix/.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 , 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:

Och ser sÄ hÀr ut:

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

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
