werf - chida chathu cha CI / CD ku Kubernetes (mwachidule ndi lipoti lamavidiyo)
Meyi 27 muholo yayikulu ya msonkhano wa DevOpsConf 2019, womwe unachitika ngati gawo la chikondwererochi RIT++ 2019, monga gawo la gawo la "Kutumiza Kopitiriza", lipoti linaperekedwa "werf - chida chathu cha CI / CD ku Kubernetes". Imakamba za izo mavuto ndi zovuta zomwe aliyense amakumana nazo akamatumiza ku Kubernetes, komanso za ma nuances omwe sangawonekere nthawi yomweyo. Kusanthula mayankho zotheka, tikuwonetsa momwe izi zimagwiritsidwira ntchito mu chida cha Open Source werf.
Chiyambireni chiwonetserochi, ntchito yathu (yomwe kale inkadziwika kuti dapp) yafika pachimake chambiri 1000 nyenyezi pa GitHub - tikukhulupirira kuti gulu lomwe likukula la ogwiritsa ntchito lipangitsa moyo kukhala wosavuta kwa mainjiniya ambiri a DevOps.
Kotero, tiyeni tiyambitse kanema wa lipoti (~ Mphindi 47, yophunzitsa zambiri kuposa nkhaniyo) komanso zotulukapo zake mwamalemba. Pitani!
Kutumiza code kwa Kubernetes
Nkhaniyi sikhalanso ya werf, koma za CI / CD ku Kubernetes, kutanthauza kuti pulogalamu yathu imayikidwa muzotengera za Docker. (Ndinayankhula izi mu Ripoti la 2016), ndipo ma K8 adzagwiritsidwa ntchito popanga (zambiri za izi mu Chaka cha 2017).
Kodi kutumiza kumawoneka bwanji ku Kubernetes?
Pali malo a Git omwe ali ndi code ndi malangizo opangira. Ntchitoyi imapangidwa mu chithunzi cha Docker ndikusindikizidwa mu Docker Registry.
Malo omwewo alinso ndi malangizo amomwe mungatumizire ndikuyendetsa pulogalamuyo. Pa gawo lotumizira, malangizowa amatumizidwa ku Kubernetes, omwe amalandira chithunzi chomwe akufuna kuchokera ku registry ndikuchiyambitsa.
Kuphatikiza apo, nthawi zambiri pamakhala mayeso. Zina mwa izi zitha kuchitika posindikiza chithunzi. Muthanso (motsatira malangizo omwewo) kutumiza kopi ya pulogalamuyo (m'malo ena a K8s kapena gulu lapadera) ndikuyesa mayeso pamenepo.
Pomaliza, mufunika dongosolo la CI lomwe limalandira zochitika kuchokera ku Git (kapena kudina batani) ndikuyitanitsa magawo onse osankhidwa: kumanga, kusindikiza, kutumiza, kuyesa.
Pali zolemba zingapo zofunika apa:
Chifukwa tili ndi maziko osasinthika (magawo osasinthika), chithunzi chogwiritsira ntchito chomwe chimagwiritsidwa ntchito pazigawo zonse (magawo, kupanga, etc.), payenera kukhala mmodzi. Ndinayankhula za izi mwatsatanetsatane komanso ndi zitsanzo. apa.
Chifukwa timatsatira zomangamanga monga njira ya code (IaC), kachidindo ka ntchito, malangizo a kusonkhanitsa ndi kuyambitsa ziyenera kukhala ndendende m'nkhokwe imodzi. Kuti mudziwe zambiri za izi, onani lipoti lomwelo.
Tiyeni tibwerere ku dongosolo loperekera pamwambapa ku Kubernetes: silinapangidwe ndi ife tokha, komanso ndi aliyense amene adakumana ndi vutoli. M'malo mwake, mawonekedwewa tsopano akutchedwa GitOps (mutha kuwerenga zambiri za mawuwa ndi malingaliro omwe ali kumbuyo kwake apa). Tiyeni tiwone magawo a chiwembu.
Mangani siteji
Zikuwoneka kuti mutha kuyankhula zomanga zithunzi za Docker mu 2019, pomwe aliyense amadziwa kulemba Dockerfiles ndikuyendetsa. docker build?.. Nawa ma nuances omwe ndikufuna kulabadira:
Nthawi zambiri kuchokera pamalo amodzi a Git omwe mumafunikira zithunzi zambiri, yomwe imatha kuthetsedwa ndi seti ya Dockerfiles (kapena masitepe otchulidwa mu fayilo imodzi) ndi script ya Bash ndi msonkhano wawo wotsatizana.
Iyi inali nsonga chabe ya madzi oundana omwe aliyense amakumana nawo. Koma pali mavuto ena, makamaka:
Nthawi zambiri pa siteji ya msonkhano timafuna chinachake phiri (mwachitsanzo, sungani zotsatira za lamulo ngati apt mu chikwatu chachitatu).
Ife tikufuna Amatha mβmalo molemba mβchigoba.
Ife tikufuna kumanga popanda Docker (chifukwa chiyani timafunikira makina owonjezera omwe timafunikira kukonza chilichonse pa izi, pomwe tili ndi gulu la Kubernetes momwe titha kuyendetsa zotengera?).
Msonkhano wofanana, zomwe zitha kumveka m'njira zosiyanasiyana: malamulo osiyanasiyana kuchokera ku Dockerfile (ngati masitepe angapo agwiritsidwa ntchito), angapo amasunga malo omwewo, ma Dockerfiles angapo.
...ndipo onani nyenyezi zomwe ali nazo pa GitHub. Ndiko kuti, mbali imodzi, docker build alipo ndipo akhoza kuchita chinachake, koma kwenikweni nkhaniyo sinatheretu - umboni wa izi ndi chitukuko chofanana cha osonkhanitsa ena, omwe amathetsa mbali zina za mavuto.
Assembly mu werf
Kotero ife tiyenera werf(m'mbuyomu wotchuka ngati dapp) - Ntchito yotseguka yochokera ku kampani ya Flant, yomwe takhala tikupanga kwa zaka zambiri. Zonse zidayamba zaka 5 zapitazo ndi zolemba za Bash zomwe zidakometsa msonkhano wa Dockerfiles, ndipo kwa zaka zitatu zapitazi chitukuko chokwanira chachitika mkati mwa projekiti imodzi yokhala ndi malo ake a Git. (choyamba mu Ruby, ndiyeno olembedwanso kupita, ndipo nthawi yomweyo adasinthidwanso). Ndi zovuta zotani zomwe zimathetsedwa mu werf?
Mavuto omwe ali ndi mthunzi wa buluu akhazikitsidwa kale, kumanga kofananirako kunachitika mkati mwa wolandira yemweyo, ndipo nkhani zomwe zasonyezedwa muchikasu zakonzedwa kuti zidzatsirizidwe kumapeto kwa chilimwe.
Gawo lofalitsidwa mu registry (kusindikiza)
Tinaimba docker push... - ndi chiyani chomwe chingakhale chovuta pakukweza chithunzi ku registry? Ndiyeno funso limabuka: "Ndiyenera kuika chizindikiro chanji pachithunzichi?" Zimabwera chifukwa chomwe tili nacho Gitflow (kapena njira ina ya Git) ndi Kubernetes, ndipo makampani akuyesera kuonetsetsa kuti zomwe zimachitika Kubernetes zikutsatira zomwe zimachitika ku Git. Kupatula apo, Git ndiye gwero lathu lokhalo la chowonadi.
Chovuta ndi chiyani pamenepa? Onetsetsani kuberekanso: kuchokera pakudzipereka ku Git, komwe ndi kosasinthika (osasinthika), ku chithunzi cha Docker, chomwe chiyenera kusungidwa chimodzimodzi.
Ndilofunikanso kwa ife kudziwa chiyambi, chifukwa tikufuna kumvetsetsa komwe ntchito yomwe ikuyendetsa ku Kubernetes idapangidwira (ndiye titha kuchita zosiyana ndi zofanana).
Ma Tagging Strategies
Yoyamba ndi yosavuta git tag. Tili ndi kaundula wokhala ndi chithunzi cholembedwa kuti 1.0. Kubernetes ali ndi siteji ndi kupanga, pomwe chithunzichi chimakwezedwa. Ku Git timapanga mapangano ndipo nthawi ina timayika chizindikiro 2.0. Timasonkhanitsa molingana ndi malangizo ochokera kunkhokwe ndikuyika mu registry ndi tag 2.0. Timayika pa siteji ndipo, ngati zonse zili bwino, ndiye kuti timapanga.
Vuto ndi njirayi ndikuti tidayamba kuyika chizindikirocho, kenako ndikuchiyesa ndikuchitulutsa. Chifukwa chiyani? Choyamba, sizomveka: tikupereka mtundu wa mapulogalamu omwe sitinayesepo (sitingathe kuchita mosiyana, chifukwa kuti tiwone, tifunika kuyika chizindikiro). Kachiwiri, njira iyi siyogwirizana ndi Gitflow.
Njira yachiwiri ndiyakuti git commit + tag. Nthambi ya master ili ndi tag 1.0; kwa izo mu registry - chithunzi chomwe chatumizidwa kuti chipangidwe. Kuphatikiza apo, gulu la Kubernetes lili ndi zowonera komanso zowonera. Kenako timatsatira Gitflow: mu nthambi yayikulu yachitukuko (develop) timapanga zatsopano, zomwe zimapangitsa kudzipereka ndi chizindikiritso #c1. Timasonkhanitsa ndikuzifalitsa mu registry pogwiritsa ntchito chizindikiritso ichi (#c1). Ndi chizindikiritso chomwecho timatulutsa kuti tiwonetseretu. Timachita chimodzimodzi ndi ma commits #c2 ΠΈ #c3.
Kenako timaphatikiza (ndi mtsogolo) nthambi yotulutsa (release_1.1) mu master. Timayika tag yokhala ndi mtundu watsopano pakupanga uku (1.1). Koma chithunzichi chasonkhanitsidwa kale mu registry, kotero kuti tisasonkhanitsenso, timangowonjezera chizindikiro chachiwiri pa chithunzi chomwe chilipo (tsopano chili ndi ma tag mu registry. #c25 ΠΈ 1.1). Pambuyo pake, timayika pakupanga.
Pali zovuta kuti chithunzi chimodzi chokha chimakwezedwa ku siteji (#c25), ndipo pakupanga kumakhala kosiyana (1.1), koma tikudziwa kuti "mwathupi" awa ndi chithunzi chomwecho kuchokera ku registry.
SHA256 kuchokera pazidziwitso za zithunzi zomwe zagwiritsidwa ntchito (ruby:2.3 ΠΈ nginx:alpine), zomwe ndi macheke a zomwe zili mkati mwake;
magulu onse (RUN, CMD ndi zina zotero.);
SHA256 kuchokera pamafayilo omwe adawonjezedwa.
... ndipo tengani cheke (kachiwiri SHA256) kuchokera pafayilo yotere. Izi siginecha chilichonse chomwe chimatanthauzira zomwe zili mu chithunzi cha Docker.
Tiyeni tibwerere ku chithunzi ndi m'malo mwazochita tidzagwiritsa ntchito ma signature oterowo,ndi. tag zithunzi ndi siginecha.
Tsopano, pakafunika, mwachitsanzo, kuphatikiza zosintha kuchokera kumasulidwe kupita ku master, titha kupanga mgwirizano weniweni: zidzakhala ndi chizindikiritso chosiyana, koma siginecha yomweyo. Ndi chizindikiritso chomwecho tidzatulutsa chithunzichi kuti chipangidwe.
Choyipa ndichakuti tsopano sizingatheke kudziwa mtundu wanji womwe unakankhidwira kupanga - macheke amangogwira mbali imodzi. Vutoli limathetsedwa ndi wosanjikiza wowonjezera wokhala ndi metadata - ndikuuzani zambiri mtsogolo.
Kulemba mu werf
Mu werf tinapita patsogolo kwambiri ndipo tikukonzekera kupanga nyumba yogawidwa ndi cache yomwe siisungidwa pa makina amodzi ... Kotero, tikumanga mitundu iwiri ya zithunzi za Docker, timazitcha. siteji ΠΈ chithunzi.
Malo osungira a werf Git amasungira malangizo enieni omwe amafotokoza magawo osiyanasiyana a zomangamanga (beforeInstall, kukhazikitsa, beforeSetup, khazikitsa). Timasonkhanitsa chithunzi cha gawo loyamba ndi siginecha yomwe imatanthauzidwa ngati cheke cha masitepe oyamba. Kenaka timawonjezera kachidindo ka gwero, kwa chithunzi chatsopano cha siteji timawerengera checksum yake ... Ntchitozi zimabwerezedwa kwa magawo onse, chifukwa chake timapeza zithunzi za siteji. Kenako timapanga chithunzi chomaliza, chomwe chilinso ndi metadata yokhudza chiyambi chake. Ndipo timayika chithunzichi m'njira zosiyanasiyana (zambiri pambuyo pake).
Tiyerekeze kuti izi zitachitika kudzipereka kwatsopano kukuwoneka komwe khodi yokhayo yasinthidwa. Kodi chidzachitike n'chiyani? Pakusintha ma code, chigamba chidzapangidwa ndipo chithunzi chatsopano chidzakonzedwa. Siginecha yake idzatsimikiziridwa ngati cheke cha chithunzi chakale komanso chigamba chatsopano. Chithunzi chatsopano chomaliza chidzapangidwa kuchokera ku chithunzichi. Khalidwe lofananalo lidzachitika ndi kusintha kwa magawo ena.
Chifukwa chake, zithunzi za siteji ndi cache yomwe imatha kusungidwa mogawidwa, ndipo zithunzi zomwe zidapangidwa kale kuchokera pamenepo zimakwezedwa ku Docker Registry.
Kuyeretsa kaundula
Sitikulankhula za kuchotsa zigawo zomwe zidatsalira zitachotsedwa ma tag - ichi ndi gawo lokhazikika la Docker Registry palokha. Tikulankhula za momwe ma tag ambiri a Docker amadziunjikira ndipo timamvetsetsa kuti sitifunikiranso ena mwa iwo, koma amatenga malo (ndi / kapena timalipira).
Njira zoyeretsera ndi ziti?
Inu simungakhoze basi kuchita kanthu osayeretsa. Nthawi zina zimakhala zosavuta kulipira pang'ono malo owonjezera kusiyana ndi kutsegula tangle yaikulu ya ma tag. Koma izi zimangogwira ntchito mpaka pomwe.
Kukonzanso kwathunthu. Ngati muchotsa zithunzi zonse ndikumanganso zomwe zilipo mu dongosolo la CI, vuto likhoza kubwera. Ngati chidebecho chitayambiranso kupanga, chithunzi chatsopano chidzakwezedwa - chomwe sichinayesedwe ndi aliyense. Izi zimapha lingaliro la zomangamanga zosasinthika.
Buluu wobiriwira. Kaundula wina adayamba kusefukira - timayika zithunzi ku wina. Vuto lomwelo ndi njira yapitayi: ndi nthawi iti yomwe mungachotsere registry yomwe yayamba kusefukira?
Pofika nthawi. Chotsani zithunzi zonse zakale kuposa mwezi umodzi? Koma padzakhaladi ntchito yomwe sinasinthidwe kwa mwezi umodzi ...
Manja kudziwa zomwe zitha kuchotsedwa kale.
Pali njira ziwiri zomwe zingatheke: osayeretsa kapena kuphatikiza blue-green + pamanja. M'nkhani yotsirizayi, tikukamba za izi: pamene mumvetsetsa kuti ndi nthawi yoyeretsa kaundula, mumapanga yatsopano ndikuwonjezera zithunzi zonse zatsopano, mwachitsanzo, mwezi umodzi. Ndipo patatha mwezi umodzi, onani ma pods ku Kubernetes omwe akugwiritsabe ntchito zolembera zakale, ndikuwasamutsiranso ku registry yatsopano.
Tabwera ku chiyani werf? Timasonkhanitsa:
Mutu wa Git: ma tag onse, nthambi zonse - poganiza kuti tikufuna chilichonse chomwe chalembedwa mu Git pazithunzi (ndipo ngati sichoncho, ndiye kuti tiyenera kuzichotsa mu Git yokha);
ma pod onse omwe akuponyedwa pakali pano ku Kubernetes;
Old ReplicaSets (zomwe zatulutsidwa posachedwa), ndipo tikukonzekeranso kusanthula zotulutsa za Helm ndikusankha zithunzi zaposachedwa pamenepo.
... ndi kupanga zoyera kuchokera pagululi - mndandanda wazithunzi zomwe sitidzazichotsa. Timatsuka china chilichonse, kenako timapeza zithunzi za siteji ya ana amasiye ndikuzichotsanso.
Deploy stage
Kulengeza kodalirika
Mfundo yoyamba yomwe ndikufuna kuti ndiwonetsere pakuyikirako ndikutulutsidwa kwa kasinthidwe kazinthu zosinthidwa, zolengezedwa momveka bwino. Chikalata choyambirira cha YAML chofotokoza za Kubernetes nthawi zonse chimakhala chosiyana kwambiri ndi zotsatira zomwe zikuyenda mgululi. Chifukwa Kubernetes akuwonjezera kasinthidwe:
zozindikiritsa;
zambiri zautumiki;
zambiri zokhazikika;
gawo lomwe lili ndi udindo pano;
zosintha zopangidwa ngati gawo la webhook yovomerezeka;
zotsatira za ntchito ya olamulira osiyanasiyana (ndi scheduler).
Timatumiza mapulogalamu 1000+ ndi Helm, kotero timakhala ndi kuphatikiza njira ziwiri. Komabe, ili ndi mavuto angapo omwe tawathetsa ndi zigamba zathu, zomwe zimathandiza Helm kugwira ntchito bwino.
Zotulutsa zenizeni
Dongosolo lathu la CI likapanga masinthidwe atsopano a Kubernetes kutengera chochitika chotsatira, amachitumiza kuti chigwiritsidwe ntchito. (lembani) ku gulu - pogwiritsa ntchito Helm kapena kubectl apply. Chotsatira, kuphatikizika komwe kwafotokozedwa kale kwa N-way kumachitika, komwe Kubernetes API imayankha movomerezeka ku dongosolo la CI, komanso kwa wogwiritsa ntchito.
Komabe, pali vuto lalikulu: pambuyo pake kugwiritsa ntchito bwino sikutanthauza kutulutsa kopambana. Ngati Kubernetes amvetsetsa zomwe ziyenera kusinthidwa ndikuzigwiritsa ntchito, sitikudziwabe kuti zotsatira zake zidzakhala zotani. Mwachitsanzo, kukonzanso ndi kuyambitsanso ma pods ku frontend kungakhale kopambana, koma osati kumbuyo, ndipo tidzapeza mitundu yosiyanasiyana ya zithunzi zogwiritsira ntchito.
Kuti muchite zonse molondola, chiwembuchi chimafuna ulalo wowonjezera - tracker yapadera yomwe ilandila zidziwitso kuchokera ku Kubernetes API ndikuitumiza kuti iwunikenso momwe zinthu zilili. Tinapanga laibulale ya Open Source ku Go - cubedog(onani chilengezo chake apa), yomwe imathetsa vutoli ndikumangidwa mu werf.
Makhalidwe a tracker iyi pamlingo wa werf amakonzedwa pogwiritsa ntchito zofotokozera zomwe zimayikidwa pa Deployments kapena StatefulSets. Ndemanga zazikulu - fail-mode - amamvetsetsa matanthauzo awa:
kukhala zobweza zodziwikiratu ngati china chake chalakwika (ndipo ndikofunikira kudziwa momwe ntchitoyo ikuyendera). Kutulutsa kuyenera kukhala kwa atomiki: mwina kumadutsa mpaka kumapeto, kapena chilichonse chibwerere m'malo mwake.
Zotsatira
Kwa ife monga kampani, kukhazikitsa ma nuances onse omwe akufotokozedwa pamagawo osiyanasiyana operekera (kumanga, kusindikiza, kutumiza), dongosolo la CI ndi zofunikira ndizokwanira. werf.
M'malo momaliza:
Mothandizidwa ndi werf, tapita patsogolo bwino pakuthana ndi mavuto ambiri kwa mainjiniya a DevOps ndipo tingakhale okondwa ngati anthu ambiri ayesa kugwiritsa ntchito izi. Zidzakhala zosavuta kukwaniritsa zotsatira zabwino pamodzi.