I Tsjeljabinsk holdes det mÞter for systemadministratoren Sysadminka, og pÄ det siste mÞtet presenterte jeg vÄr lÞsning for Ä kjÞre applikasjoner pÄ 1Х-Bitrix i Kubernetes.
Bitrix, Kubernetes, Ceph â en utmerket kombinasjon?
Jeg vil fortelle hvordan vi bygde en fungerende lĂžsning ut av alt dette.
La oss gÄ!

MÞtet fant sted 18. april i Tsjeljabinsk. Du kan lese om vÄre mÞter i og se dem pÄ .
Hvis du Ăžnsker Ă„ komme til oss med en presentasjon eller som lytter â velkommen, skriv til vadim.isakanov@gmail.com og pĂ„ Telegram t.me/vadimisakanov.
Min presentasjon
LÞsningen «Bitrix i Kubernetes, versjon Southbridge 1.0»
Jeg vil fortelle om vÄr lÞsning i formatet «for nybegynnere i Kubernetes», slik det ble gjort pÄ mÞtet. Men jeg antar at ordene Bitrix, Docker, Kubernetes, Ceph er kjent for deg, om ikke annet pÄ nivÄet av artikler pÄ Wikipedia.
Hva finnes egentlig av klare lĂžsninger for Bitrix i Kubernetes?
Det finnes veldig lite informasjon pÄ internett om kjÞring av applikasjoner pÄ Bitrix i Kubernetes.
Jeg fant bare disse materialene:
Presentasjonen til Alexander Serbul, 1ĐĄ-Bitrix, og Anton Tuzlukov fra Qsoft:

Jeg anbefaler Ä hÞre pÄ den.
Utvikling av en egen lĂžsning fra brukeren .
Fant ogsÄ .
Og⊠faktisk, det er alt.
Jeg advarer, kvaliteten pĂ„ lĂžsningene i lenkene ovenfor har vi ikke sjekket đ
Forresten, under forberedelsen av vÄr lÞsning snakket jeg med Alexander Serbul, da hans presentasjon ennÄ ikke var tilgjengelig, sÄ i lysbildene mine er det et punkt som sier «Bitrix bruker ikke Kubernetes».
Men det finnes allerede mange klare Docker-bilder for Ă„ jobbe med Bitrix i Docker:
Er dette nok for Ă„ lage en fullverdig lĂžsning for Bitrix i Kubernetes?
Nei. Det er mange problemer som mÄ lÞses.
Hva er problemene med Bitrix i Kubernetes?
Det fĂžrste â klare bilder fra Dockerhub er ikke egnet for Kubernetes
Hvis vi Ăžnsker Ă„ bygge en mikrotjenestearkitektur (som vi vanligvis Ăžnsker i Kubernetes), mĂ„ applikasjonen i Kubernetes deles inn i containere og sĂžrge for at hver container utfĂžrer en liten funksjon (og gjĂžr det godt). Hvorfor bare en? Kort sagt â jo enklere, jo mer pĂ„litelig.
For en lengre forklaring â vennligst sjekk denne artikkelen og videoen:
Docker-bildene i Dockerhub er hovedsakelig bygget etter prinsippet «alt i ett», derfor mÄtte vi faktisk lage vÄr egen lÞsning og til og med bygge bildene fra bunnen av.
Det andre â koden til nettsiden blir endret fra administrasjonspanelet
Vi har opprettet en ny seksjon pĂ„ nettstedet â koden har blitt oppdatert (en katalog med navnet pĂ„ den nye seksjonen har blitt lagt til).
Vi har endret egenskapene til komponenten fra administrasjonspanelet â koden har endret seg.
Kubernetes kan ikke jobbe med dette «som standard», containere mÄ vÊre uforanderlige (Stateless).
à rsaken: hver container (pod) i klyngen hÄndterer bare en del av trafikken. Hvis koden bare endres i én container (pod), vil koden vÊre forskjellig i forskjellige podder, nettstedet vil fungere forskjellig, og forskjellige brukere vil se forskjellige versjoner av nettstedet. Dette er ikke bÊrekraftig.
Det tredje â vi mĂ„ lĂžse problemet med deploy.
Hvis vi har et monolithisk system og én «klassisk» server, er alt ganske enkelt: vi distribuerer den nye kodebasen, gjennomfÞrer databasemigrering, og omdirigerer trafikken til den nye koden. Omdirigeringen skjer umiddelbart.
Hvis vi har et nettsted i Kubernetes, delt opp i mikrotjenester, og det er mange containere med kode â Ă„h. Vi mĂ„ bygge containere med den nye versjonen av koden, rulle dem ut i stedet for de gamle, utfĂžre databasemigreringen riktig, og ideelt sett gjĂžre dette uten at besĂžkende merker det. Heldigvis hjelper Kubernetes oss med dette, og stĂžtter en rekke forskjellige typer deploy.
Det fjerde â vi mĂ„ lĂžse lagringsproblemene for statisk innhold.
Hvis nettstedet ditt bare veier «10 gigabyte», og du distribuerer det helt i containere, fÄr du containere som veier 10 gigabyte, som vil bli deployet i en evighet.
Vi mÄ lagre de «tyngste» delene av nettstedet utenfor containerne, og spÞrsmÄlet oppstÄr om hvordan vi skal gjÞre dette pÄ riktig mÄte.
Hva som ikke er inkludert i vÄr lÞsning.
Hele Bitrix-koden er ikke delt opp i mikrofunksjoner/mikrotjenester (for eksempel er registrering separat, modulen for nettbutikken separat, osv.). Vi lagrer hele kodebasen i hver container i sin helhet.
Vi lagrer heller ikke databasen i Kubernetes (jeg har faktisk implementert lĂžsninger med databasen i Kubernetes for utviklermiljĂžer, men ikke for produksjon).
Administratorene pÄ nettstedet vil likevel merke at nettstedet kjÞrer pÄ Kubernetes. Funksjonen «systemkontroll» fungerer ikke korrekt, og for Ä redigere nettstedets kode fra administrasjonspanelet mÄ du fÞrst trykke pÄ knappen «jeg vil redigere koden».
Vi har identifisert problemene, vi har bestemt nÞdvendigheten av mikrotjenester, mÄlet er klart - Ä fÄ et fungerende system for applikasjoner pÄ Bitrix i Kubernetes, samtidig som vi opprettholder mulighetene fra Bitrix og fordelene ved Kubernetes. Vi begynner implementeringen.
Arkitektur
Mange "arbeids" pods med webserver (arbeidere).
Ăn pod med cron-jobber (kun Ă©n er obligatorisk).
Ăn upgrade pod for redigering av nettstedkode fra administrasjonspanelet (kun Ă©n er ogsĂ„ obligatorisk).

Vi lÞser spÞrsmÄlene:
- Hvor skal vi lagre sesjoner?
- Hvor skal vi lagre cache?
- Hvor skal vi lagre statiske filer, vi kan ikke plassere gigabyte med statiske filer i en haug med containere?
- Hvordan vil databasen fungere?
Docker-bilde
Vi begynner med Ă„ bygge Docker-bildet.
Den ideelle lÞsningen er at vi har ett universelt bilde, pÄ grunnlag av dette fÄr vi bÄde arbeids-pods, pods med cron-jobber, og upgrade pods.
.
Det inkluderer nginx, apache/php-fpm (kan velges under byggingen), msmtp for sending av e-post, og cron.
Under byggingen kopieres hele kodebasen til /app-mappen (unntatt de delene vi vil flytte til en egen delt lagring).
Mikrotjenester, tjenester
arbeider-pods:
- Container med nginx + container apache/php-fpm + msmtp
- Det ble ikke mulig Ă„ flytte msmtp til en egen mikrotjeneste, Bitrix begynner Ă„ klage over at den ikke kan sende e-post direkte.
- Hver container har hele kodebasen.
- Forbud mot Ă„ endre kode i containerne.
cron pod:
- container med apache, php, cron
- med full kodebase inkludert
- forbud mot Ă„ endre kode i containerne
upgrade pod:
- container med nginx + container apache/php-fpm + msmtp
- det er ingen forbud mot Ă„ endre kode i containerne
lagringslĂžsning for sesjoner
cache-lagring for Bitrix
Det er ogsÄ viktig: passord for tilkobling til alt, fra databasen til e-post, lagrer vi i Kubernetes secrets. Vi fÄr en bonus, passordene kan kun sees av de vi gir tilgang til hemmelighetene, og ikke av alle som har tilgang til kodebasen.
Lagring for statiske filer
Vi kan bruke hva som helst: ceph, nfs (men vi anbefaler ikke nfs for produksjon), nettverkslagring fra "skyleverandĂžrer", osv.
Lagring mÄ kobles til containerne i /upload/-mappen pÄ nettstedet og andre mapper med statiske filer.
Database
For enkelhetens skyld anbefaler vi Ă„ flytte databasen utenfor Kubernetes. En database i Kubernetes er en egen kompleks oppgave, og den vil gjĂžre systemet betydelig mer komplisert.
Lagring for sesjoner
Vi bruker memcached đ
Det gjÞr en god jobb med sesjonslagring, kanClusters, og stÞttes «nativt» som session.save_path i php. Et slikt system er allerede godt utprÞvd i klassisk monolitisk arkitektur, da vi bygde klynger med et stort antall webservere. For distribusjon bruker vi helm.
$ helm install stable/memcached --name sessionphp.ini â her er konfigurasjonene for sesjonslagring i memcached angitt i bildet
Vi har brukt miljĂžvariabler for Ă„ overfĂžre data om vertene med memcached .
Dette gjÞr at vi kan bruke den samme koden i dev-, stage-, test- og prod-miljÞene (vertens navn for memcached vil variere, sÄ i hvert miljÞ mÄ vi overfÞre unike vertsnavn for sesjoner).
Cache-lager for Bitrix
Vi trenger et distribuert lager som alle podene kan skrive til og lese fra.
Vi bruker ogsÄ memcached.
Denne lĂžsningen anbefales av Bitrix selv.
$ helm install stable/memcached --name cachebitrix/.settings_extra.php â her angis hvor vĂ„rt cachelagring er i Bitrix
Vi bruker ogsÄ miljÞvariabler.
Kronoppgaver
Det er ulike tilnĂŠrminger til Ă„ kjĂžre kronoppgaver i Kubernetes.
- separat distribusjon med pod for Ă„ kjĂžre kronoppgaver
- cronjob for Ă„ gjennomfĂžre kronoppgaver (hvis dette er en webapp â med wget , eller kubectl exec inne i en av worker-podene, osv.)
- etc.
Man kan diskutere hva som er mest korrekt, men i dette tilfellet valgte vi alternativet «separat distribusjon med podder for kronoppgaver»
Slik er det gjort:
- kronoppgaver legges til gjennom ConfigMap eller gjennom filen config/addcron
- vi kjĂžrer en enkel container, identisk med worker-poden + tillater kjĂžring av kronoppgaver i den
- den samme kodebasen brukes, takket vĂŠre standardiseringen, er containeropprettelsen enkel
Hva fÄr vi ut av dette:
- vi har fungerende kronoppgaver i et miljĂž som ligner utviklermiljĂžet (docker)
- kronoppgaver trenger ikke Ä «skribles» for Kubernetes, de fungerer i sin originale form og med den samme kodebasen som fÞr
- kronoppgaver kan bli lagt til av alle teammedlemmer med commit-rettigheter i produksjonsgrenen, ikke bare administratorer
Modul Southbridge K8SDeploy og redigering av kode fra admin-panelet
Vi snakket jo om oppgradering av pod, ikke sant?
Hvordan dirigerer vi trafikken dit?
Hurra, vi har skrevet en modul for dette i php đ Det er en liten klassisk modul for Bitrix. Den er ikke tilgjengelig offentlig ennĂ„, men vi planlegger Ă„ gjĂžre den tilgjengelig.
Modulen installeres som en vanlig modul i Bitrix:

Og ser slik ut:

Det lar deg angi en cookie som identifiserer nettstedets administrator, og lar Kubernetes sende trafikk til oppgraderingspodden.
NÄr endringene er fullfÞrt, mÄ du trykke pÄ git push, endringene i koden vil bli sendt til git, deretter vil systemet bygge et bilde med den nye versjonen av koden og "rulle den ut" over klyngen, og erstatte gamle podder.
Ja, litt klÞnete, men vi bevarer mikroservicearkitekturen og tar ikke bort Bitrix-brukernes elskede mulighet til Ä endre koden fra adminpanelet. Til syvende og sist er dette et valg, og man kan lÞse oppgave om Ä redigere koden pÄ en annen mÄte.
Helm-diagram
For Ä bygge applikasjoner i Kubernetes bruker vi vanligvis pakkehÄndtereren Helm.
For vÄr Bitrix-lÞsning i Kubernetes har Sergej Bondarev, vÄr ledende systemadministrator, skrevet et spesialdesignert Helm-diagram.
Det bygger worker-, upgrade-, cron-podder, konfigurerer ingress-er, tjenester, og overfĂžrer variabler fra Kubernetes-hemmeligheter til podder.
Vi lagrer koden i Gitlab, og vi starter ogsÄ Helm-byggeren fra Gitlab.
I korte trekk ser det slik ut
$ helm upgrade --install project .helm --set image=registrygitlab.local/k8s/bitrix -f .helm/values.yaml --wait --timeout 300 --debug --tiller-namespace=productionHelm lar deg ogsÄ gjÞre en "sÞmlÞs" tilbakestilling hvis noe gÄr galt under distribusjonen. Det er fint at du ikke er i panikk og "fikser koden via ftp fordi produksjonen har falt", mens Kubernetes gjÞr dette automatisk, uten nedetid.
UTPLASSERING
Ja, vi er fans av Gitlab & Gitlab CI, vi bruker det đ
Ved committing til Gitlab i prosjektets repository, starter Gitlab en pipeline som distribuerer den nye versjonen av miljĂžet.
Faser:
- build (bygger et nytt Docker-bilde)
- test (testar)
- clean up (fjerner testmiljĂžet)
- push (sender det til Docker registry)
- deploy (distribuerer applikasjonen i Kubernetes via Helm).

Hurra, ferdig, implementerer!
Eller stiller spÞrsmÄl hvis det finnes.
SĂ„, hva har vi gjort
Fra et teknisk perspektiv:
- dockeriserte vi Bitrix;
- "delte" vi Bitrix i containere, hver av dem utfĂžrer minimum funksjoner;
- oppnÄdde stateless tilstand for containerne;
- lĂžste vi problemet med oppdatering av Bitrix i Kubernetes;
- alle funksjoner i Bitrix fortsatte Ă„ fungere (nesten alle);
- vi har gjennomfĂžrt distribusjon i Kubernetes og tilbakekobling mellom versjoner.
Fra et forretningsperspektiv:
- feiltoleranse;
- Kubernetes-verktĂžy (enkel integrasjon med Gitlab CI, sĂžmlĂžs distribusjon, etc);
- passord i hemmeligheter (synlig kun for de som har fÄtt direkte tilgang til passordene);
- Det er praktisk Ä lage ekstra miljÞer (for utvikling, testing osv.) innenfor én infrastruktur.
Kilde: habr.com
