NepÄrtrauktas piegÄdes prakse ar Docker (pÄrskats un video)
MÄs sÄksim savu emuÄru ar publikÄcijÄm, kuru pamatÄ ir mÅ«su tehniskÄ direktora jaunÄkÄs runas distol (Dmitrijs Stoļarovs). TÄs visas notika 2016. gadÄ dažÄdos profesionÄlos pasÄkumos un bija veltÄ«tas DevOps un Docker tÄmai. Viens video no Docker Moscow sanÄksmes Badoo birojÄ jau ir publicÄts TieÅ”saistÄ. Jaunajiem tiks pievienoti raksti, kas atspoguļo ziÅojumu bÅ«tÄ«bu. TÄtadā¦
31. maijÄ konferencÄ RootConf 2016, kas notika festivÄla āKrievijas interneta tehnoloÄ£ijasā (RIT++ 2016) ietvaros, sadaļa āNepÄrtraukta ievieÅ”ana un izvietoÅ”anaā tika atklÄta ar ziÅojumu āParaugprakse nepÄrtrauktai piegÄdei ar Dockerā. TajÄ tika apkopota un sistematizÄta labÄkÄ prakse nepÄrtrauktas piegÄdes (CD) procesa izveidei, izmantojot Docker un citus atvÄrtÄ pirmkoda produktus. Ar Å”iem risinÄjumiem strÄdÄjam ražoÅ”anÄ, kas ļauj paļauties uz praktisko pieredzi.
Ja ir iespÄja pavadÄ«t stundu reportÄžas video, iesakÄm to noskatÄ«ties pilnÄ«bÄ. PretÄjÄ gadÄ«jumÄ tÄlÄk ir sniegts galvenais kopsavilkums teksta formÄ.
NepÄrtraukta piegÄde ar Docker
SaskaÅÄ ar NepÄrtraukta PiegÄde mÄs saprotam notikumu Ä·Ädi, kuras rezultÄtÄ lietojumprogrammas kods no Git repozitorija vispirms nonÄk ražoÅ”anÄ un pÄc tam nonÄk arhÄ«vÄ. Tas izskatÄs Å”Ädi: Git ā BÅ«vÄÅ”ana ā PÄrbaudÄ«t ā Atlaist ā DarbinÄt.
LielÄkÄ daļa ziÅojuma ir veltÄ«ta izveides posmam (lietojumprogrammas montÄžai), un Ä«sumÄ tiek skartas tÄmas, kas tiek atbrÄ«votas un darbojas. MÄs runÄsim par problÄmÄm un modeļiem, kas ļauj tos atrisinÄt, un Å”o modeļu konkrÄtÄs realizÄcijas var atŔķirties.
KÄpÄc Å”eit vispÄr vajadzÄ«gs Dokers? Ne velti mÄs nolÄmÄm runÄt par nepÄrtrauktas piegÄdes praksi Ŕī atvÄrtÄ pirmkoda rÄ«ka kontekstÄ. Lai gan viss pÄrskats ir veltÄ«ts tÄ lietoÅ”anai, apsverot galveno lietojumprogrammas koda izlaiÅ”anas modeli, tiek atklÄti daudzi iemesli.
Galvenais izvÄrÅ”anas modelis
TÄtad, izlaižot jaunas lietojumprogrammas versijas, mÄs noteikti saskaramies ar dÄ«kstÄves problÄma, kas Ä£enerÄts ražoÅ”anas servera pÄrslÄgÅ”anas laikÄ. Trafiku no lietojumprogrammas vecÄs versijas uz jauno nevar pÄrslÄgt uzreiz: vispirms ir jÄpÄrliecinÄs, ka jaunÄ versija ir ne tikai veiksmÄ«gi lejupielÄdÄta, bet arÄ« āiesildÄ«taā (t.i., pilnÄ«bÄ gatava pieprasÄ«jumu apkalpoÅ”anai).
TÄdÄjÄdi kÄdu laiku abas lietojumprogrammas versijas (vecÄ un jaunÄ) darbosies vienlaikus. Kas automÄtiski noved pie kopÄ«gu resursu konflikts: tÄ«kls, failu sistÄma, IPC utt. Izmantojot Docker, Ŕī problÄma ir viegli atrisinÄma, palaižot dažÄdas lietojumprogrammas versijas atseviŔķos konteineros, kuriem tiek garantÄta resursu izolÄcija vienÄ un tajÄ paÅ”Ä resursdatorÄ (serveris/virtuÄlÄ maŔīna). Protams, ar dažiem trikiem var iztikt arÄ« bez siltinÄÅ”anas, taÄu, ja ir gatavs un Ärts rÄ«ks, tad ir pretÄjs pamatojums - nepamest to novÄrtÄ.
Ievietojot konteineru, tiek nodroÅ”inÄtas daudzas citas priekÅ”rocÄ«bas. JebkurÅ” pieteikums ir atkarÄ«gs no konkrÄta versija (vai versiju diapazons) tulks, moduļu/paplaÅ”inÄjumu pieejamÄ«ba utt., kÄ arÄ« to versijas. Un tas attiecas ne tikai uz tieÅ”o izpildÄmo vidi, bet arÄ« uz visu vidi, ieskaitot sistÄmas programmatÅ«ra un tÄ versija (lÄ«dz izmantotajam Linux izplatÄ«Å”anai). SakarÄ ar to, ka konteineros ir ne tikai lietojumprogrammas kods, bet arÄ« iepriekÅ” instalÄta nepiecieÅ”amo versiju sistÄmas un lietojumprogrammatÅ«ra, jÅ«s varat aizmirst par problÄmÄm ar atkarÄ«bÄm.
VispÄrinÄsim galvenais izvÄrÅ”anas modelis jaunas versijas, Åemot vÄrÄ Å”Ädus faktorus:
SÄkumÄ lietojumprogrammas vecÄ versija darbojas pirmajÄ konteinerÄ.
PÄc tam jaunÄ versija tiek izrullÄta un āuzsildÄ«taā otrÄ konteinerÄ. JÄatzÄ«mÄ, ka Å”ajÄ jaunajÄ versijÄ var bÅ«t ne tikai atjauninÄts lietojumprogrammas kods, bet arÄ« jebkura no tÄ atkarÄ«bÄm, kÄ arÄ« sistÄmas komponenti (piemÄram, jauna OpenSSL versija vai viss izplatÄ«jums).
Kad jaunÄ versija ir pilnÄ«bÄ gatava pieprasÄ«jumu apkalpoÅ”anai, datplÅ«sma tiek pÄrslÄgta no pirmÄ konteinera uz otro.
Veco versiju tagad var apturÄt.
Å Äda pieeja dažÄdu lietojumprogrammas versiju izvietoÅ”anai atseviŔķos konteineros nodroÅ”ina vÄl vienas ÄrtÄ«bas - Ätra atgrieÅ”ana uz veco versiju (galu galÄ pietiek, lai pÄrslÄgtu trafiku uz vÄlamo konteineru).
PÄdÄjais pirmais ieteikums izklausÄs pÄc kaut kÄ tÄda, kurÄ pat kapteinis nevarÄja atrast vainu: "[organizÄjot nepÄrtrauktu piegÄdi ar Docker]Izmantojiet Docker[un saprast, ko tas dod]" Atcerieties, ka Ŕī nav "sudraba lode", kas atrisinÄs katru problÄmu, bet gan instruments, kas nodroÅ”ina brÄ«niŔķīgu pamatu.
ReproducÄjamÄ«ba
Ar āreproducÄjamÄ«buā mÄs saprotam vispÄrÄju problÄmu kopumu, kas raduÅ”Äs, darbinot lietojumprogrammas. MÄs runÄjam par Å”Ädiem gadÄ«jumiem:
Skripti, kurus kvalitÄtes nodaļa ir pÄrbaudÄ«jusi iestudÄÅ”anai, ir precÄ«zi jÄatveido ražoÅ”anÄ.
Lietojumprogrammas tiek publicÄtas serveros, kas var saÅemt pakotnes no dažÄdiem repozitoriju spoguļiem (laika gaitÄ tÄs tiek atjauninÄtas, un lÄ«dz ar tÄm arÄ« instalÄto lietojumprogrammu versijas).
āUz vietas man viss darbojas!ā (...un izstrÄdÄtÄjiem nav atļauts ražot.)
Vajag kaut ko pÄrbaudÄ«t vecajÄ (arhivÄtajÄ) versijÄ.
...
To vispÄrÄjÄ bÅ«tÄ«ba ir saistÄ«ta ar to, ka ir nepiecieÅ”ama pilnÄ«ga izmantotÄs vides atbilstÄ«ba (kÄ arÄ« cilvÄka faktora neesamÄ«ba). KÄ mÄs varam garantÄt reproducÄjamÄ«bu? Izveidojiet Docker attÄlus pamatojoties uz kodu no Git, un pÄc tam izmantot tos jebkuram uzdevumam: testÄÅ”anas vietÄs, ražoÅ”anÄ, programmÄtÄju vietÄjÄs iekÄrtÄs... TajÄ paÅ”Ä laikÄ ir svarÄ«gi samazinÄt darbÄ«bas, kas tiek veiktas. pÄc attÄla salikÅ”ana: jo vienkÄrÅ”Äk tas ir, jo mazÄka ir kļūdu iespÄjamÄ«ba.
Infrastruktūra ir kods
Ja infrastruktÅ«ras prasÄ«bas (servera programmatÅ«ras pieejamÄ«ba, tÄs versija utt.) nav formalizÄtas un āieprogrammÄtasā, jebkura lietojumprogrammas atjauninÄjuma ievieÅ”ana var izraisÄ«t postoÅ”as āāsekas. PiemÄram, inscenÄjot jÅ«s jau esat pÄrgÄjis uz PHP 7.0 un attiecÄ«gi pÄrrakstÄ«jis kodu - tad tÄ parÄdÄ«Å”anÄs ražoÅ”anÄ ar kÄdu vecu PHP (5.5) noteikti kÄdu pÄrsteigs. JÅ«s nedrÄ«kstat aizmirst par bÅ«tiskÄm izmaiÅÄm tulka versijÄ, taÄu "velns slÄpjas detaļÄs": pÄrsteigums var bÅ«t nelielas atkarÄ«bas atjauninÄjums.
Pieeja Ŕīs problÄmas risinÄÅ”anai ir pazÄ«stama kÄ IaC (infrastruktÅ«ra kÄ kods, "infrastruktÅ«ra kÄ kods") un ietver infrastruktÅ«ras prasÄ«bu uzglabÄÅ”anu kopÄ ar lietojumprogrammas kodu. Izmantojot to, izstrÄdÄtÄji un DevOps speciÄlisti var strÄdÄt ar vienu un to paÅ”u Git lietojumprogrammu repozitoriju, bet dažÄdÄs tÄ daļÄs. No Ŕī koda Git tiek izveidots Docker attÄls, kurÄ lietojumprogramma tiek izvietota, Åemot vÄrÄ visas infrastruktÅ«ras specifikas. VienkÄrÅ”i sakot, attÄlu salikÅ”anas skriptiem (noteikumiem) jÄatrodas vienÄ repozitorijÄ ar avota kodu un jÄapvieno kopÄ.
DaudzslÄÅu lietojumprogrammu arhitektÅ«ras gadÄ«jumÄ, piemÄram, ir nginx, kas atrodas lietojumprogrammas priekÅ”Ä, kas jau darbojas Docker konteinerÄ, katram slÄnim ir jÄizveido Docker attÄli no koda Git. Tad pirmajÄ attÄlÄ bÅ«s lietojumprogramma ar tulku un citÄm ātuvÄmā atkarÄ«bÄm, bet otrajÄ attÄlÄ bÅ«s augÅ”pus nginx.
Docker attÄli, komunikÄcija ar Git
Visi no Git savÄktie Docker attÄli tiek sadalÄ«ti divÄs kategorijÄs: pagaidu un izlaiÅ”anas. Pagaidu attÄli ir atzÄ«mÄti ar filiÄles nosaukumu Git, tos var pÄrrakstÄ«t ar nÄkamo apÅemÅ”anos, un tie tiek izlaisti tikai priekÅ”skatÄ«Å”anai (nevis ražoÅ”anai). Å Ä« ir viÅu galvenÄ atŔķirÄ«ba no izlaiduma versijÄm: jÅ«s nekad nezinÄt, kura konkrÄtÄ apÅemÅ”anÄs tajÄs ir ietverta.
Ir jÄga apkopot pagaidu attÄlos: galveno atzaru (to var automÄtiski izlikt atseviÅ”Ä·Ä vietnÄ, lai pastÄvÄ«gi redzÄtu paÅ”reizÄjo galvenÄ versija), filiÄles ar izlaidumiem, konkrÄtu jauninÄjumu filiÄles.
PÄc tam, kad pagaidu attÄlu priekÅ”skatÄ«jumÄ rodas nepiecieÅ”amÄ«ba pÄc tulkoÅ”anas ražoÅ”anÄ, izstrÄdÄtÄji ievieto noteiktu atzÄ«mi. AutomÄtiski savÄkti pÄc atzÄ«mes atbrÄ«vot attÄlu (tÄ atzÄ«me atbilst tagam no Git) un tiek izlaista uz iestudÄjumu. Ja kvalitÄtes departaments to veiksmÄ«gi pÄrbauda, āātas nonÄk ražoÅ”anÄ.
dapp
Visu aprakstÄ«to (izplatÄ«Å”anu, attÄla montÄžu, turpmÄko apkopi) var Ä«stenot neatkarÄ«gi, izmantojot Bash skriptus un citus āimprovizÄtusā rÄ«kus. Bet, ja jÅ«s to darÄt, kÄdÄ brÄ«dÄ« ievieÅ”ana radÄ«s lielu sarežģītÄ«bu un sliktu vadÄmÄ«bu. To saprotot, mÄs izveidojÄm savu specializÄto darbplÅ«smas utilÄ«tu CI/CD izveidei - dapp.
TÄ pirmkods ir rakstÄ«ts Ruby, atvÄrtÄ koda valodÄ un publicÄts GitHub. DiemžÄl dokumentÄcija Å”obrÄ«d ir rÄ«ka vÄjÄkÄ vieta, taÄu mÄs pie tÄs strÄdÄjam. Un par dappi rakstÄ«sim un runÄsim ne reizi vien, jo... MÄs patiesi nevaram vien sagaidÄ«t, kad varÄsim dalÄ«ties ar tÄ iespÄjÄm ar visu ieinteresÄto kopienu, taÄu tikmÄr sÅ«tiet savus jautÄjumus un pieprasiet pieprasÄ«jumus un/vai sekojiet lÄ«dzi projekta attÄ«stÄ«bai GitHub.
AtjauninÄts 13. gada 2019. augustÄ: Å”obrÄ«d ir projekts dapp pÄrdÄvÄta par werf, tÄ kods ir pilnÄ«bÄ pÄrrakstÄ«ts programmÄ Go, un tÄ dokumentÄcija ir ievÄrojami uzlabota.
Kubernetes
VÄl viens gatavs atvÄrtÄ pirmkoda rÄ«ks, kas jau guvis ievÄrojamu atzinÄ«bu profesionÄlajÄ vidÄ, ir Kubernetes,Dokera pÄrvaldÄ«bas klasteris. TÄma par tÄ izmantoÅ”anu projektos, kas balstÄ«ti uz Docker, ir Ärpus ziÅojuma jomas, tÄpÄc prezentÄcija aprobežojas ar dažu interesantu funkciju pÄrskatu.
IzlaiÅ”anai Kubernetes piedÄvÄ:
Readiness Probe ā jaunas lietojumprogrammas versijas gatavÄ«bas pÄrbaude (lai pÄrslÄgtu uz to trafiku);
sinhronÄ atjauninÄÅ”ana - attÄla atjauninÄÅ”ana klasterÄ« ar atŔķirÄ«gu pieeju: vispirms uz pusi konteineru, tad uz pÄrÄjiem;
canary releases - jauna attÄla palaiÅ”ana ierobežotÄ (nelielÄ) konteineru skaitÄ, lai uzraudzÄ«tu anomÄlijas.
TÄ kÄ Continuous Delivery nav tikai jaunas versijas izlaiÅ”ana, Kubernetes ir vairÄkas iespÄjas turpmÄkai infrastruktÅ«ras uzturÄÅ”anai: iebÅ«vÄta visu konteineru uzraudzÄ«ba un reÄ£istrÄÅ”ana, automÄtiska mÄrogoÅ”ana utt. Tas viss jau darbojas un tikai gaida pareizu darbÄ«bu. ievieÅ”anu savos procesos.