Chelyabinskis toimuvad Sysadminka sĂŒsteemiadministraatorite kohtumised ning viimasel neist esitlesin meie lahendust 1C-Bitrix'i rakenduste kĂ€itamiseks Kuberneteses.
Bitrix, Kubernetes, Ceph â suurepĂ€rane segu?
RÀÀgin, kuidas me sellest kokku panime töötava lahenduse.
LĂ€hme!

Kohtumine toimus 18. aprillil Chelyabinskis. Meie kohtumiste kohta saab lugeda ja vaadata .
Kui soovite meiega esitlusele tulla vĂ”i kuulajana osaleda â olete teretulnud, kirjutage aadressile vadim.isakanov@gmail.com ja Telegramis t.me/vadimisakanov.
Minu ettekande pealkiri
Lahendus âBitrix Kuberneteses, versioon Southbridge 1.0â
RÀÀgin meie lahendusest formaadis âKubernetesi for dummiesâ, kuidas see kohtumisel teoks sai. Kuid ma eeldan, et sĂ”nad Bitrix, Docker, Kubernetes, Ceph on teile tuttavad vĂ€hemalt Wikipedias artiklite tasemel.
Mis valmis lahendust Bitrix Kuberneteses on?
Internetis on vÀga vÀhe teavet Bitrix'i rakenduste töö kohta Kuberneteses.
Leidsin vaid sellised materjalid:
Ettekanne Aleksandr Serbuli ja Anton Tuzlukovi poolt Qsoft'ist:

Soovitan seda kuulata.
Kasutajalt enda lahenduse arendamine .
Leidsin veel .
Ja... tÔepoolest, see on kÔik.
Maadan, mehaanika lahenduste töö kvaliteeti, mis on antud ĂŒlalpool, me pole kontrollinud đ
Muide, meie lahenduse ettevalmistamise kĂ€igus suhtlesin Aleksandr Serbuliiga. Tema ettekannet ei olnud veel, seega mu slaididel on punkt âBitrix ei kasuta Kubernetesetâ.
Aga Bitrixi jaoks on juba palju valmis Docker-imaid:
Kas see on piisav, et luua tÀielik lahendus Bitrixi jaoks Kuberneteses?
Ei. On palju probleeme, mida tuleb lahendada.
Millised on probleemid Bitrixiga Kuberneteses?
Esimene probleem on see, et Dockerhubist leitud valmis pildid ei sobi Kubernetesesse.
Kui me tahame ehitada mikroteenuste arhitektuuri (ja Kuberneteses me tavaliselt tahame), tuleb rakendus Kuberneteses jagada konteineriteks ja pĂŒĂŒdma tagada, et iga konteiner tĂ€idab ĂŒksikut vĂ€ikest funktsiooni (ja teeb seda hĂ€sti). Miks ainult ĂŒks? Lihtsalt öeldes â mida lihtsam, seda kindlam.
Pikemalt vaadake palun seda artiklit ja videot:
Dockerhubi Docker-imaid ehitatakse peamiselt pĂ”himĂ”ttel âkĂ”ik ĂŒhesâ, seega pidime ikkagi oma rattaga asja kĂ€ivitama ja isegi pilte nullist tegema.
Teine probleem on see, et saidi koodi muudetakse admin-paneeli kaudu.
Loodud on uus jaotis veebisaidil â kood on uuendatud (ilmunud on uue jaotise nimeline kaust).
Muudeti komponendi omadusi admin-paneelist â kood on muutunud.
Kubernetes ei oska sellise konfiguratsiooniga töötada, konteinerid peaksid olema muutumatud (Stateless).
PĂ”hjus: iga konteiner (pod) klastri sees töötleb ainult osa liiklusest. Kui muuta koodi ainult ĂŒhes konteineris (podis), siis erinevates podides on kood erinev, veebisait töötab erinevalt ja erinevatele kasutajatele kuvatakse veebisaidi erinevaid versioone. Nii ei saa eksisteerida.
Kolmas â tuleb lahendada juurutamise kĂŒsimus.
Kui meil on monoliitne rakendus ja ĂŒks «klassikaline» server, on kĂ”ik vĂ€ga lihtne: kĂ€ivitame uue koodibaasi, teeme andmebaasi migratsiooni, suuname liikluse uue koodiversiooni suunas. Suunamine toimub kohe.
Kui meil on veebisait Kuberneteses, jagatud mikroteenusteks, on konteineritega, kus on uus kood, palju â oioi. Tuleb koguda konteinerid uue koodiversiooniga, asendada need vanadega, Ă”igesti teostada andmebaasi migratsioon ja ideaaljuhul teha seda kĂŒlalistele mĂ€rkamatult. On seejuures hea, et Kubernetes aitab, toetades erinevaid juurutusviise.
Neljas â peate lahendama staatilise salvestamise kĂŒsimuse
Kui teie veebileht kaalub âvaidâ 10 gigabaiti ja te kĂ€ivitate selle tĂ€ielikult konteinerites, siis saadud konteinerite kaal on 10 gigabaiti, mis paigaldatakse igavesti.
Veebilehe kĂ”ige âraskeidâ osi tuleb hoida vĂ€ljaspool konteineri, ja tekib kĂŒsimus, kuidas seda Ă”igesti teha
Mida meie lahenduses ei ole
Kogu Bitrixi kood ei ole jagatud mikrofunktsioonide/mikroteenuste vahel (nii, et registreerimine eraldi, e-poe moodul eraldi jne). Kogu koodibaas on iga konteineri sees tÀies mahus.
Andmebaasi me Kuberneteses samuti ei hoia (olen siiski rakendanud lahendusi andmebaasi jaoks Kuberneteses arenduskeskkondades, kuid mitte tootmises).
Veebisaidi administraatorid mĂ€rkavad ikkagi, et veebileht töötab Kuberneteses. Funktsioon âsĂŒsteemi kontrollâ ei tööta Ă”igesti, veebilehe koodi toimetamiseks administreerimisliidesest tuleb esmalt vajutada nuppu âtahan koodi toimetadaâ.
Oleme probleemid lahendanud ning mikrotasandite rakendamise vajadused mÀÀratletud, eesmĂ€rk on selge â luua töötav sĂŒsteem rakenduste kĂ€itamiseks Bitrixis Kuberneteses, sĂ€ilitades nii Bitrixi funktsionaalsuse kui ka Kubernetes eelised. Alustame rakendamist.
Arhitektuur
Palju 'töötavaid' pod'e veebiserveriga (töötajad).
Ăks pod krontööride jaoks (ainult ĂŒks on kohustuslik).
Ăks upgrade pod saidi koodi redigeerimiseks admin-paneelist (samuti on kohustuslik ainult ĂŒks).

Lahendame kĂŒsimused:
- Kus sÀilitada sessioone?
- Kus hoida vahemÀlu?
- Kus hoida staatilist sisu, ei saa ju gigabaite statiilist sisu hunnikus konteinerites hoida?
- Kuidas töötab andmebaas?
Docker pilt
Alustame Docker pildi kogumisega.
Ideaalne variant â meil on ĂŒks universaalne pilt, mille alusel saame nii töötaja pod'id kui ka krontööride pod'id ja upgrade pod'id.
.
See sisaldab nginx'i, apache/php-fpm (valitav kogumise ajal), msmtp meilide saatmiseks ja krontöör.
Pildi kogumise kĂ€igus kopeeritakse kaustasse /app kogu saidi koodibaas (v.a need osad, mille viime ĂŒle eraldi jagatud salvestusse).
Mikroteenused, teenused
töötaja pod'id:
- Konteiner nginx'iga + konteiner apache/php-fpm + msmtp
- msmtp ei saanud eraldi mikroteenuseks vÀlja viidud, Bitrix hakkab protestima, et ei saa otse e-kirju saata
- Igas konteineris on tÀielik koodibaas.
- Keeld koodi muutmiseks konteinerites.
cron all:
- konteiner koos apache'i, php ja croniga
- komplektis on tÀielik koodibaas
- keeld koodi muutmiseks konteinerites
upgrade all:
- konteiner nginxiga + konteiner apache/php-fpm + msmtp
- koodi muutmiseks konteinerites ei ole keeldu
sessioonide salvestamine
Bitrixi vahemÀlu salvestamine
Veel oluline: ĂŒhendamise paroolid, alates andmebaasist kuni e-kirjadeni, sĂ€ilitame kubernetes secrets. Saame boonuse, et paroolid on nĂ€htavad ainult neile, kellele anname juurdepÀÀsu saladustele, mitte kĂ”igile, kellel on juurdepÀÀs projekti koodibaasile.
staatika salvestamine
VÔib kasutada mida iganes: ceph, nfs (aga nfs ei ole tootmises soovitatav), pilveteenuse pakkujate vÔrgu salvestus jne.
Salvestus tuleb ĂŒhendama konteinerites /upload/ veebilehe katalooge ja teisi staatika katalooge.
Andmebaas
Lihtsuse huvides soovitame andmebaasi viia vĂ€ljapoole Kuberneteset. Andmebaas Kuberneteses on eraldi keeruline ĂŒlesanne, mis muudab skeemi oluliselt keerukamaks.
sessioonide salvestamine
Kasutame memcached đ
See sĂ€ilitab sessioone tĂ”husalt, klastreerub ja toetab "natiivselt" session.save_path'i php-s. Selline sĂŒsteem on korduvalt tööle pandud klassikalises monoliitarkitektuuris, kui ehitasime suure arvu veebi serveritega klastreid. Deployment'i jaoks kasutame helm'i.
$ helm install stable/memcached --name sessionphp.ini â siin on pildis mÀÀratud seaded sessioonide hoidmiseks memcached'is
Me kasutasime keskkonnamuutujaid hostide andmete edastamiseks memcached'iga .
See vÔimaldab kasutada sama koodi dev, stage, test, prod keskkondades (memcached'i hostide nimed neil erinevad, seetÔttu peame igasse keskkonda edastama unikaalsed hostide nimed sessioonide jaoks).
Bitrix'i vahemÀlu salvestamine
Me vajame kÔrge usaldusvÀÀrsusega salvestust, kuhu kÔik podid saaksid kirjutada ja kust nad saaksid lugeda.
Kasutame ka memcached'i.
Seda lahendust soovitab Bitrix ise.
$ helm install stable/memcached --name cachebitrix/.settings_extra.php â siin Bitrix'is mÀÀritakse, kus meie vahemĂ€lu asub
Kasutame ka keskkonnamuutujaid.
Kronitasud
Kuberneteses on erinevad lÀhenemisviisid cron-tasude tÀitmiseks.
- eraldi deployment pod cron-tasude tÀitmiseks
- cronjob krontaskide tĂ€itmiseks (kui see on veebirakendus â koos wget , vĂ”i kubectl exec ĂŒhe töötaja podi sisse jne)
- jne.
Saame vaielda, mis on kĂ”ige Ă”igem, kuid antud juhul valisime variandi âeraldi deployment podide jaoks krontaskide jaoksâ
Kuidas seda teha:
- krontaskid lisame lÀbi ConfigMapi vÔi config/addcron faili
- kÀivitame konteineri, mis on identne töötaja podiga + lubame krontaskide tÀitmise selles
- kasutame sama koodibaasi, tĂ€nu ĂŒhtsusele on konteineri koostamine lihtne
Mida head me saame:
- meil on töötavad krontaskid keskkonnas, mis on identne arendajate keskkonnaga (docker)
- krontaskid ei vaja Kubernetes'i jaoks 'ĂŒle kirjutamist', need töötavad samas vormis ja samas koodibaasis nagu varem
- krontaskid saavad lisada kÔik meeskonna liikmed, kellel on commit Ôigused tootmisvihikus, mitte ainult administraatorid
Moodul Southbridge K8SDeploy ja koodi redigeerimine administraatoripaneelis
RÀÀkisime me ju podi uuendamisest?
Aga kuidas suunata sinna liiklust?
Hurraa, me kirjutasime selle jaoks mooduli PHP-s đ See on vĂ€ike klassikaline moodul Bittrexile. Seda ei ole veel avalikult saadaval, kuid plaanime selle avada.
Moodul installitakse Bitrixis nagu tavaline moodul:

Ja see nÀeb vÀlja selline:

See vĂ”imaldab seadistada kĂŒpsise, mis identifitseerib saidi administraatori ja vĂ”imaldab Kubernetesel suunata liiklust upgrade podile.
Kui muudatused on lĂ”petatud, tuleb vajutada git push, koodimuudatused saadetakse git'i, seejĂ€rel kogub sĂŒsteem uue versiooni koodiga pildi ja âjaotabâ selle klastrisse, asendades vanad podid.
Jah, see on veidi tobe, kuid samas sĂ€ilitame mikroteenuste arhitektuuri ja ei vĂ”ta Bitrixi kasutajatelt armastatud vĂ”imalust koodi adminpaneelilt parandada. LĂ”ppkokkuvĂ”ttes on see valik, koodi muutmise ĂŒlesanne vĂ”ib olla lahendatud ka teisiti.
Helm chart
Kuberneteses rakenduste kogumiseks kasutame tavaliselt pakihaldurit Helm.
Meie Bitrixi lahenduse jaoks Kuberneteses kirjutas meie juhtiv sĂŒsteemiadministraator Sergei Bondarev spetsiaalse Helm charti.
See kogub worker, upgrade, cron podes, seadistab ingressid, teenused ja edastab muutujad Kubernetesi salajastes podidesse.
Koodi hoiame Gitlabis, samuti kÀivitame Helm kogumise Gitlabist.
LĂŒhidalt öeldes, see nĂ€eb vĂ€lja selline
$ helm upgrade --install project .helm --set image=registrygitlab.local/k8s/bitrix -f .helm/values.yaml --wait --timeout 300 --debug --tiller-namespace=productionHelm vÔimaldab ka "sÔltumatut" tagasipöördumist, kui juhtub, et juurutamisel lÀheb midagi valesti. On tore, et te ei pea Àrevuses "koodi FTP kaudu parandama, sest tootmine kukkus", vaid Kubernetes teeb seda automaatselt, ilma seisakuta.
Juhtimistöö
Jah, me oleme Gitlabi ja GitLab CI fĂ€nnid, kasutame seda đ
Gitlabi projektireposiitiumisse commitimisel kÀivitab GitLab torustiku, mis viib ellu keskkonna uue versiooni.
Etapid:
- build (uus Docker pilt kokku monteerimine)
- test (testimine)
- clean up (testkeskkonna eemaldamine)
- push (kujundi saatmine Docker registrisse)
- deploy (rakenduse juurutamine Kuberneteses Helmi kaudu).

Hurraa, valmis, juurutame!
VĂ”i kĂŒsime kĂŒsimusi, kui neid on.
Niisiis, mida me tegime
Tehnilisest vaatenurgast:
- dockeriseerisime Bitrixi;
- "lĂ”ikasime" Bitrixi konteineriteks, millest igaĂŒks tĂ€idab minimaalset funktsiooni;
- saavutasime konteinerite state-less oleku;
- lahendasime Bitrixi uuendamise probleem Kuberneteses;
- kÔik Bitrixi funktsioonid töötasid edasi (peaaegu kÔik);
- kasutasime Kuberneteses juurutamist ja versioonide vahelist tagasipöördumist.
Ărivaatepunktist:
- rikketolerantsus;
- Kubernetesi tööriistad (lihtne integratsioon Gitlab CI-ga, sujuv deploy, jne);
- salasonad salvestustes (nÀhtavad ainult neile, kellele on otseselt antud juurdepÀÀs salasonadele);
- tĂ€iendavate keskkondade loomine (arenduseks, testimiseks jne) ĂŒhes infrastruktuuris on mugav.
Allikas: habr.com
