NĂ« Ăeljabinsk po zhvillohen takime pĂ«r administratorĂ«t e sistemeve Sysadminka, dhe nĂ« takimin e fundit pata njĂ« prezantim mbi zgjidhjen tonĂ« pĂ«r funksionimin e aplikacioneve nĂ« 1C-Bitrix nĂ« Kubernetes.
Bitrix, Kubernetes, Ceph â njĂ« pĂ«rzierje e shkĂ«lqyer?
Do të flas për mënyrën se si ne e përbëm një zgjidhje funksionale nga të gjitha këto.
Fillojmë!

Takimi u zhvillua mĂ« 18 prill nĂ« Ăeljabinsk. Mund tĂ« lexoni mbi takimet tona nĂ« dhe tĂ« shikoni nĂ« .
NĂ«se dĂ«shiron tĂ« vish me njĂ« prezantim ose si dĂ«gjues â je i mirĂ«pritur, shkruaj nĂ« vadim.isakanov@gmail.com dhe nĂ« Telegram t.me/vadimisakanov.
Prezntimi im
Zgjidhja "Bitrix në Kubernetes, versioni Southbridge 1.0"
Do të flas për zgjidhjen tonë në formatin "për fillestarët në Kubernetes", siç ishte bërë në takimin. Por supozoj që fjalët Bitrix, Docker, Kubernetes, Ceph të jenë të njohura për ju të paktën në nivelin e artikujve në Wikipedia.
ĂfarĂ« ka nĂ« dispozicion pĂ«r Bitrix nĂ« Kubernetes?
Në të gjithë internetin ka shumë pak informacion rreth funksionimit të aplikacioneve në Bitrix në Kubernetes.
Kam gjetur vetëm këto materiale:
Prezntimi i Aleksandër Serbulit, 1C-Bitrix dhe Anton Tuzlukov nga Qsoft:

E rekomandoj ta dëgjoni atë.
Zhvillimi i një zgjidhjeje të vetme nga përdoruesi .
Kam gjetur gjithashtu .
Dhe, në thelb, kjo është e gjitha.
Kujtoj se nuk e kemi verifikuar cilĂ«sinĂ« e zgjidhjeve sipas lidhjeve mĂ« sipĂ«r đ
Për më tepër, gjatë përgatitjes së zgjidhjes tonë kam biseduar me Aleksandër Serbulin, atëherë referati i tij ende nuk ishte në dispozicion, prandaj në prezentimet e mia ka një pikë «Bitrix nuk përdor Kubernetes».
Sidoqoftë, tashmë ka shumë imazhe Docker të gatshme për të punuar me Bitrix në Docker:
A është e mjaftueshme kjo për të krijuar një zgjidhje të plotë për Bitrix në Kubernetes?
Jo. Ekzistojnë shumë probleme që duhet të zgjidhen.
Cilat janë problemet me Bitrix në Kubernetes?
E para â imazhet e gatshme nga Dockerhub nuk janĂ« tĂ« pĂ«rshtatshme pĂ«r Kubernetes
NĂ«se duam tĂ« ndĂ«rtojmĂ« njĂ« arkitekturĂ« mikroshĂ«rbimesh (dhe zakonisht e duam kĂ«tĂ« nĂ« Kubernetes), aplikacioni nĂ« Kubernetes duhet tĂ« ndahet nĂ« kontejnerĂ« dhe tĂ« sigurohemi qĂ« çdo kontejner tĂ« kryejĂ« njĂ« funksion tĂ« vogĂ«l (dhe ta bĂ«jĂ« atĂ« mirĂ«). Pse vetĂ«m njĂ«? NĂ«se flasim shkurt â sa mĂ« e thjeshtĂ«, aq mĂ« e besueshme.
NĂ«se do tĂ« donit mĂ« shumĂ« informacion â ju lutem shikoni kĂ«tĂ« artikull dhe video:
Imazhet Docker në Dockerhub kryesisht janë ndërtuar sipas parimit «gjithçka në një», prandaj duhej të krijonim një rast të ri dhe madje të bënim imazhet nga fillimi.
E dyta â kodi i faqes rregullohet nga paneli i administratorit
Kemi krijuar një seksion të ri në faqen e internetit - është përmirësuar kodi (është shtuar një dosje me emrin e seksionit të ri).
Kemi ndryshuar cilësitë e komponentit nga paneli administrativ - kodi është ndryshuar.
Kubernetes «default» nuk di të punojë me këtë, kontejnerët duhet të jenë të papërmbajtur (Stateless).
Arsyeja: çdo kontejner (pod) në klaster trajton vetëm një pjesë të trafikut. Nëse ndryshoni kodin vetëm në një kontejner (pod), atëherë në pod-e të ndryshme kodi do të jetë ndryshe, faqja do të funksionojë ndryshe, përdoruesve të ndryshëm do t'u tregohen versione të ndryshme të faqes. Një jetë të tillë nuk e duam.
E treta - duhet të zgjidhim çështjen e shpërndarjes.
Nëse kemi një monolit dhe një server «klasik», gjithçka është shumë e thjeshtë: shpalosim një bazë të re kodi, kryejmë migrimin e DB, kalojmë trafikun në versionin e ri të kodit. Kalimi ndodh menjëherë.
Nëse kemi një faqe në Kubernetes, të ndarë në mikroshërbime, shumë kontejnerë me kod - oj. Duhet të ndërtojmë kontejnerë me versionin e ri të kodit, t'i lançojmë ato në vend të të vjetrave, të kryejmë migrimin e DB në mënyrë të duhur, dhe idealisht ta bëjmë këtë pa u vënë re nga vizitorët. Fatmirësisht, Kubernetes na ndihmon në këtë, duke mbështetur një mori të ndryshme llojesh shpërndarjeje.
E katĂ«rta â duhet tĂ« zgjidhni çështjen e ruajtjes sĂ« statikĂ«s
Nëse faqja juaj peshon "vetëm" 10 gigabajt dhe ju e vendosni atë tërësisht në konteinerë, do të merrni konteinerë me peshë 10 gigabajt, të cilët do të implementohen përjetësisht.
Duhet të ruani pjesët "më të rënda" të faqes jashtë konteinerëve, dhe lind pyetja se si ta bëni këtë siç duhet
ĂfarĂ« nuk ka nĂ« zgjidhjen tonĂ«
Të gjithë kodi i Bitrix nuk është ndarë në mikrofunksione/mikroshërbime (p.sh., regjistrimi veçmas, moduli i dyqanit online veçmas, etj.). E gjithë baza e kodit ruhet në çdo konteiner në tërësi.
Baza në Kubernetes gjithashtu nuk ruhen (unë megjithatë kam realizuar zgjidhje me bazën në Kubernetes për mjediset e zhvilluesve, por jo për prodhim).
Administratorëve të faqes do t'u bëhet e dukshme se faqja funksionon në Kubernetes. Funksioni "kontrolli i sistemit" nuk funksionon saktë, për të redaktuar kodin e faqes nga paneli i administratorit, së pari duhet të klikoni në butonin "dua të redaktoj kodin".
Problemet u zgjidhĂ«n, e pĂ«rcaktuam nevojĂ«n pĂ«r implementimin e mikrosĂ«rvices, qĂ«llimi Ă«shtĂ« i qartĂ« â tĂ« krijojmĂ« njĂ« sistem funksional pĂ«r aplikacionet nĂ« Bitrix nĂ« Kubernetes, duke ruajtur mundĂ«sitĂ« e Bitrix dhe pĂ«rfitimet e Kubernetes. TĂ« fillojmĂ« realizimin.
Arkitektura
Shumë pod të 'punës' me server web (punëtorë).
Një pod me detyrat e kront (domosdoshmërisht vetëm një).
Një upgrade pod për redaktimin e kodit të faqes nga paneli i administrimit (po ashtu domosdoshmërisht vetëm një).

Po zgjidhim çështjet:
- Ku do të ruhen sesionet?
- Ku do të ruhet cache?
- Ku do të ruhet statika, nuk mund të vendosim gigabajt statike në një grumbull kontejnerësh?
- Si do të funksionojë baza e të dhënave?
Docker image
Fillojmë me ndërtimin e Docker image-it.
Varianti ideal â kemi njĂ« imazh universale, mbi tĂ« cilin krijojmĂ« dhe pod punĂ«torĂ«sh, dhe pod me detyrat e kront, dhe pod upgrade.
.
Ai përfshin nginx, apache/php-fpm (mund të zgjidhet gjatë ndërtimit), msmtp për dërgimin e postës, dhe cron.
Gjatë ndërtimit të imazhit, baza e plotë e kodit të faqes kopjohet në direktorinë /app (përveç atyre pjesëve që do t'i nxjerrim në një ruajtje të veçantë të përbashkët).
Mikrosërvices, shërbime
pod punëtorësh:
- Kontejner me nginx + konteiner apache/php-fpm + msmtp
- Nuk arritëm ta nxjerrim msmtp si një mikroshërbim të veçantë, Bitrix fillon të protestojë që nuk mund të dërgojë email direkt.
- Në çdo enë është baza e plotë e kodit.
- Ndalohet ndryshimi i kodit në enët.
cron nën:
- enë me apache, php, cron
- vjen me bazën e plotë të kodit
- ndalohet ndryshimi i kodit në enët
upgrade nën:
- enë me nginx + enë apache/php-fpm + msmtp
- nuk ka ndalim për ndryshimin e kodit në enët
depozita e sesioneve
depozita e caches për Bitrix
E rëndësishme gjithashtu: fjalëkalimet për lidhje me gjithçka, nga databaza deri te emaili, i ruajmë në sekrete të kubernetes. Marrim një përfitim, fjalëkalimet duken vetëm për ata që i japim qasje sekreteve, e jo për të gjithë ata që kanë qasje në bazën e kodit të projektit.
depozita për statikën
Mund të përdorni çfarëdo: ceph, nfs (por nuk e rekomandojmë për prodhim), ruajtje në rrjet nga ofruesit "cloud", etj.
Depozita duhet të lidhet në enët në direktorinë /upload/ të faqes dhe drejtoritë e tjera me statikën.
Baza e të dhënave
Për thjeshtësi, rekomandojmë të nxjerrim databazën jashtë Kubernetes. Databaza në Kubernetes është një detyrë komplekse, ajo do ta bëjë skemën shumë më të komplikuar.
depozita e sesioneve
PĂ«rdorim memcached đ
Ai menaxhon mirë ruajtjen e seancave, është e grumbulluar, mbështetet "nativisht" si session.save_path në php. Ky sistem është testuar shumë herë edhe në arkitekturën klasike monolite, kur ndërtuam klastere me numër të madh serverash web. Ne përdorim helm për shpërndarje.
$ helm install stable/memcached --name sessionphp.ini â kĂ«tu nĂ« imazh janĂ« vendosur cilĂ«simet pĂ«r ruajtjen e seancave nĂ« memcached
Ne kemi përdorur Environment Variables për të kaluar të dhënat mbi hostet me memcached .
Kjo lejon përdorimin e të njëjtit kod në ambientet dev, stage, test, prod (emrat e hosteve memcached në to do të ndryshojnë, prandaj në çdo ambient ne duhet të kalojmë emra unikë hostesh për seancat).
Ruajtja e caches Bitrix
Na nevojitet një ruajtje rezistente ndaj gabimeve, në të cilën të gjithë pods të mund të shkrijnë dhe të lexojnë.
Po ashtu përdorim memcached.
Ky zgjidhje rekomandohet nga vetë Bitrix.
$ helm install stable/memcached --name cachebitrix/.settings_extra.php â kĂ«tu nĂ« Bitrix pĂ«rcaktohet se ku ruhet cache
Po ashtu përdorim Environment Variables.
Kron Tasks
Ka qasje të ndryshme për ekzekutimin e krontaskave në Kubernetes.
- ndarë deployment me pod për ekzekutimin e krontaskave
- cronjob pĂ«r tĂ« ekzekutuar krontaskat (nĂ«se kjo Ă«shtĂ« njĂ« aplikacion web â me wget , ose kubectl exec brenda njĂ«rit nga pod-et punues, etj.)
- etc.
Mund të diskutohet për më të saktin, por në këtë rast ne zgjodhëm variantin "deploy i veçantë me pod-e për krontaskat"
Si është bërë kjo:
- krontaskat i shtojmë përmes ConfigMap ose përmes skedarit config/addcron
- në një ekzemplar ekzekutojmë kontejnerin, identik me pod-in punues + lejojmë ekzekutimin e krontaskave në të
- përdoret e njëjta bazë kodi, falë unifikimit ndërtimi i kontejnerit është i thjeshtë
ĂfarĂ« mirĂ«sie marrim:
- kemi krontaska funksionale në një ambient, identik me ambientin e zhvilluesve (docker)
- krontaskat nuk kanë nevojë të "rishkruhen" për Kubernetes, ato funksionojnë në të njëjtën formë dhe me të njëjtin bazë kodi, si më parë
- krontaskat mund tâi shtojnĂ« tĂ« gjithĂ« anĂ«tarĂ«t e ekipit me tĂ« drejta commit nĂ« degĂ«n production, dhe jo vetĂ«m administratorĂ«t
Moduli Southbridge K8SDeploy dhe redaktimi i kodit nga paneli i administratës
Sepse ne folëm për upgrade-in e pod-it?
Si ta drejtojmë aty trafikun?
Hurra, ne shkruam njĂ« modul pĂ«r kĂ«tĂ« nĂ« php đ Kjo Ă«shtĂ« njĂ« modul klasik i vogĂ«l pĂ«r Bitrix. Nuk Ă«shtĂ« ende nĂ« akses tĂ« hapur, por ne planifikojmĂ« ta hapim.
Moduli instalohet si një modul standard në Bitrix:

Dhe duket kështu:

Ai lejon të vendoset një cookie, e cila identifikon administratorin e faqes dhe lejon Kubernetes të dërgojë trafik në upgrade pod.
Pasi të përfundojnë ndryshimet, duhet të klikoni git push, ndryshimet në kod do të dërgohen në git, pastaj sistemi do të ndërtojë një imazh me versionin e ri të kodit dhe do ta "shpërndajë" atë në klaster, duke zëvendësuar pod-et e vjetra.
Po, disi me pengesa, por me këtë ne ruajmë arkitekturën mikroshërbimi dhe nuk e heqim nga përdoruesit e Bitrix mundësinë e preferuar për të modifikuar kodin nga admin paneli. Fundja, kjo është një mundësi, mund ta zgjidhni detyrën e modifikimit të kodit ndryshe.
Helm chart
Për ndërtimin e aplikacioneve në Kubernetes, zakonisht përdorim menaxherin e paketave Helm.
Për zgjidhjen tonë Bitrix në Kubernetes, Sergey Bondarev, administratori ynë kryesor i sistemeve, shkroi një Helm chart të veçantë.
Ai ndihmon në ndërtimin e pod-eve worker, upgrade, cron, konfigurimin e ingress-ëve, shërbimeve, dhe kalon variabla nga Kubernetes secrets në pod-e.
Kodet i ruajmë në Gitlab, dhe ndërtimin e Helm gjithashtu e nisim nga Gitlab.
Nëse e shikoni shkurt, duket kështu
$ helm upgrade --install project .helm --set image=registrygitlab.local/k8s/bitrix -f .helm/values.yaml --wait --timeout 300 --debug --tiller-namespace=productionHelm gjithashtu lejon rikthim «pa ndihmĂ«s» nĂ«se ndodhi ndonjĂ« problem gjatĂ« shpĂ«rndarjes. ĂshtĂ« e kĂ«ndshme kur nuk jeni nĂ« panic duke «korrigjuar kodin pĂ«rmes FTP-sĂ« qĂ« prodhimi Ă«shtĂ« ndalur», ndĂ«rsa Kubernetes e bĂ«n kĂ«tĂ« automatikisht, pa ndonjĂ« ndalim.
Dërgo
Po, ne jemi fanatikĂ« tĂ« Gitlab & Gitlab CI, e pĂ«rdorim đ
Kur bëni një commit në Gitlab, depozitimi i projektit aktivizon një pipeline në Gitlab që realizon shpërndarjen e versionit të ri të mjedisit.
Hapat:
- build (krijojmë imazhin e ri Docker)
- test (testojmë)
- clean up (heqim mjedisin e testimit)
- push (e dërgojmë në Docker registry)
- deploy (shpërndajmë aplikacionin në Kubernetes përmes Helm).

Hurrah, e gatshme, e implementojmë!
Ose bëjmë pyetje, nëse ka.
Pra, çfarë kemi bërë
Nga një pikëpamje teknike:
- dockerizuam Bitrix;
- «prishëm» Bitrix në konteinerë, secili nga të cilët kryen funksione minimale;
- arritëm një gjendje stateless për konteinerët;
- zgjidhëm problemin e përditësimit të Bitrix në Kubernetes;
- të gjitha funksionet e Bitrix vazhduan të punojnë (pothuajse të gjitha);
- punuam shpërndarjen në Kubernetes dhe rikthimin midis versioneve.
Nga një pikëpamje biznesi:
- qëndrueshmëri;
- instrumentat Kubernetes (integrim i thjeshtë me Gitlab CI, shpërndarje pa ndërlikime, etj);
- fjalëkalimet në sekretet (shihen vetëm nga ata që janë drejtpërdrejt të autorizuar për fjalëkalimet);
- është lehtë të bësh ambiente shtesë (për zhvillim, teste dhe të tjera) brenda infrastrukturës së vetme.
Burimi: habr.com
