Hadithi hii inahusu jinsi tunavyotumia kontena katika mazingira ya uzalishaji, haswa Kubernetes. Nakala hiyo imejitolea kukusanya vipimo na kumbukumbu kutoka kwa vyombo, pamoja na picha za ujenzi.
Sisi ni kutoka kampuni ya fintech Exness, ambayo inakuza huduma za biashara ya mtandaoni na bidhaa za fintech kwa B2B na B2C. R&D yetu ina timu nyingi tofauti, idara ya maendeleo ina wafanyikazi 100+.
Tunawakilisha timu ambayo inawajibika kwa jukwaa kwa wasanidi wetu kukusanya na kuendesha msimbo. Hasa, tuna jukumu la kukusanya, kuhifadhi na kuripoti vipimo, kumbukumbu na matukio kutoka kwa programu. Kwa sasa tunaendesha takriban kontena elfu tatu za Docker katika mazingira ya uzalishaji, kudumisha hifadhi yetu kubwa ya data ya TB 50, na kutoa masuluhisho ya usanifu ambayo yamejengwa karibu na miundombinu yetu: Kubernetes, Rancher, na watoa huduma mbalimbali wa wingu wa umma.
Motisha yetu
Ni nini kinachowaka? Hakuna anayeweza kujibu. Makao iko wapi? Ni vigumu kuelewa. Ilishika moto lini? Unaweza kujua, lakini sio mara moja.
Mbona makontena mengine yamesimama huku mengine yameanguka? Ni kontena gani lilipaswa kulaumiwa? Baada ya yote, nje ya vyombo ni sawa, lakini ndani ya kila mmoja ana Neo yake mwenyewe.
Watengenezaji wetu ni watu wenye uwezo. Wanafanya huduma nzuri zinazoleta faida kwa kampuni. Lakini kuna kushindwa wakati vyombo vilivyo na maombi vinapotoka. Chombo kimoja kinatumia CPU nyingi sana, kingine kinatumia mtandao, cha tatu kinatumia shughuli za I/O, na cha nne haijulikani kabisa kinafanya nini na soketi. Yote yaanguka na meli inazama.
Mawakala
Ili kuelewa kinachotokea ndani, tuliamua kuweka mawakala moja kwa moja kwenye makontena.
Mawakala hawa ni mipango ya kuzuia ambayo huweka makontena katika hali ambayo hayavunjiki. Mawakala ni sanifu, na hii inaruhusu mbinu sanifu ya kuhudumia kontena.
Kwa upande wetu, mawakala lazima watoe kumbukumbu katika umbizo la kawaida, zilizowekwa lebo na zilizopigwa. Wanapaswa pia kutupatia vipimo vilivyosanifiwa ambavyo vinaweza kupanuliwa kutoka kwa mtazamo wa maombi ya biashara.
Mawakala pia humaanisha huduma za uendeshaji na matengenezo ambazo zinaweza kufanya kazi katika mifumo tofauti ya okestration inayoauni picha tofauti (Debian, Alpine, Centos, nk.).
Hatimaye, mawakala lazima watumie CI/CD rahisi inayojumuisha faili za Docker. Vinginevyo, meli itaanguka, kwa sababu vyombo vitaanza kutolewa kando ya reli "zilizopotoka".
Kuunda mchakato na kifaa cha picha lengwa
Ili kuweka kila kitu kiwe sanifu na kudhibitiwa, aina fulani ya mchakato wa kawaida wa uundaji unahitaji kufuatwa. Kwa hivyo, tuliamua kukusanya vyombo na vyombo - hii ni kujirudia.
Hapa vyombo vinawakilishwa na muhtasari thabiti. Wakati huo huo, waliamua kuweka vifaa vya usambazaji ndani yao ili "maisha yasionekane kama raspberries." Kwa nini hii ilifanyika, tutaelezea hapa chini.
Matokeo yake ni zana ya kuundaβchombo maalum cha toleo ambacho kinarejelea matoleo mahususi ya usambazaji na matoleo mahususi ya hati.
Je, tunaitumiaje? Tuna Docker Hub ambayo ina kontena. Tunaiakisi ndani ya mfumo wetu ili kuondokana na utegemezi wa nje. Matokeo yake ni chombo kilichowekwa alama ya njano. Tunaunda kiolezo cha kusanikisha usambazaji na maandishi yote tunayohitaji kwenye chombo. Baada ya hayo, tunakusanya picha iliyo tayari kutumia: watengenezaji huweka msimbo na baadhi ya utegemezi wao maalum ndani yake.
Nini nzuri kuhusu mbinu hii?
- Kwanza, udhibiti wa toleo kamili la zana za ujenzi - chombo cha kujenga, hati na matoleo ya usambazaji.
- Pili, tumefikia viwango: tunaunda violezo, picha za kati na tayari kutumia kwa njia ile ile.
- Tatu, vyombo vinatupa uwezo wa kubebeka. Leo tunatumia Gitlab, na kesho tutabadilisha hadi TeamCity au Jenkins na tutaweza kuendesha vyombo vyetu kwa njia sawa.
- Nne, kupunguza utegemezi. Haikuwa bahati mbaya kwamba tuliweka vifaa vya usambazaji kwenye chombo, kwa sababu hii inaruhusu sisi kuzuia kupakua kutoka kwa mtandao kila wakati.
- Tano, kasi ya kujenga imeongezeka - kuwepo kwa nakala za ndani za picha inakuwezesha kuepuka kupoteza muda kwenye kupakua, kwa kuwa kuna picha ya ndani.
Kwa maneno mengine, tumefanikisha mchakato wa mkusanyiko unaodhibitiwa na unaonyumbulika. Tunatumia zana zile zile ili kujenga vyombo vyovyote vilivyotolewa kikamilifu.
Jinsi utaratibu wetu wa ujenzi unavyofanya kazi
Mkutano umezinduliwa kwa amri moja, mchakato unafanywa kwenye picha (iliyoonyeshwa kwa nyekundu). Msanidi programu ana faili ya Docker (iliyoangaziwa kwa manjano), tunaitoa, tukibadilisha vijiti na maadili. Na njiani tunaongeza vichwa na vijachini - hawa ni mawakala wetu.
Kijajuu huongeza usambazaji kutoka kwa picha zinazolingana. Na kijachini husakinisha huduma zetu ndani, husanidi uzinduzi wa mzigo wa kazi, kumbukumbu na mawakala wengine, kuchukua nafasi ya kiingilio, n.k.
Tulifikiria kwa muda mrefu ikiwa tutasakinisha msimamizi. Mwishowe, tuliamua kwamba tunamhitaji. Tulichagua S6. Msimamizi hutoa usimamizi wa kontena: hukuruhusu kuunganishwa nayo ikiwa mchakato mkuu utaanguka na kutoa usimamizi wa mwongozo wa kontena bila kuunda upya. Kumbukumbu na vipimo ni michakato inayoendeshwa ndani ya kontena. Pia zinahitaji kudhibitiwa kwa namna fulani, na tunafanya hivyo kwa msaada wa msimamizi. Hatimaye, S6 inachukua huduma ya uhifadhi wa nyumba, usindikaji wa ishara na kazi nyingine.
Kwa kuwa tunatumia mifumo tofauti ya ochestration, baada ya kujenga na kukimbia, chombo lazima kielewe ni mazingira gani na kutenda kulingana na hali hiyo. Kwa mfano:
Hii inaturuhusu kuunda picha moja na kuiendesha katika mifumo tofauti ya okestra, na itazinduliwa kwa kuzingatia mahususi ya mfumo huu wa okestration.
Kwa chombo kimoja tunapata miti tofauti ya mchakato huko Docker na Kubernetes:
Mzigo wa malipo unatekelezwa chini ya usimamizi wa S6. Zingatia wakusanyaji na matukio - hawa ni mawakala wetu wanaowajibika kwa kumbukumbu na vipimo. Kubernetes hana, lakini Docker anayo. Kwa nini?
Ikiwa tunatazama maelezo ya "pod" (hapa - pod ya Kubernetes), tutaona kwamba chombo cha matukio kinatekelezwa kwenye pod, ambayo ina chombo tofauti cha ushuru ambacho hufanya kazi ya kukusanya metrics na magogo. Tunaweza kutumia uwezo wa Kubernetes: kuendesha vyombo kwenye ganda moja, katika mchakato mmoja na/au nafasi ya mtandao. Kwa kweli watambulishe mawakala wako na utekeleze baadhi ya vipengele. Na ikiwa chombo sawa kitazinduliwa katika Docker, kitapokea uwezo wote sawa na pato, yaani, itaweza kutoa kumbukumbu na metriki, kwa kuwa mawakala watazinduliwa ndani.
Vipimo na kumbukumbu
Kuwasilisha vipimo na kumbukumbu ni kazi ngumu. Kuna mambo kadhaa katika uamuzi wake.
Miundombinu imeundwa kwa ajili ya utekelezaji wa mzigo wa malipo, na si kwa utoaji wa wingi wa magogo. Hiyo ni, mchakato huu lazima ufanyike na mahitaji madogo ya rasilimali ya chombo. Tunajitahidi kusaidia wasanidi wetu: "Pata kontena la Docker Hub, liendeshe, na tunaweza kuwasilisha kumbukumbu."
Kipengele cha pili ni kupunguza kiasi cha magogo. Ikiwa ongezeko la ujazo wa magogo hutokea katika vyombo kadhaa (programu itasababisha ufuatiliaji wa safu kwenye kitanzi), mzigo kwenye CPU, njia za mawasiliano, na mfumo wa usindikaji wa logi huongezeka, na hii inathiri utendakazi wa mwenyeji kama vyombo vyote na vingine kwenye mwenyeji, basi wakati mwingine hii inasababisha "kuanguka" kwa mwenyeji.
Kipengele cha tatu ni kwamba ni muhimu kutumia mbinu nyingi za ukusanyaji wa metriki iwezekanavyo nje ya kisanduku. Kutoka kwa kusoma faili na upigaji kura Prometheus-endpoint hadi kutumia itifaki maalum za programu.
Na jambo la mwisho ni kupunguza matumizi ya rasilimali.
Tulichagua suluhisho la Go la chanzo-wazi linaloitwa Telegraf. Hiki ni kiunganishi cha ulimwengu wote ambacho kinaauni zaidi ya aina 140 za chaneli za ingizo (ingizo jalizi) na aina 30 za chaneli za kutoa (plugins za pato). Tumeikamilisha na sasa tutakuambia jinsi tunavyoitumia kwa kutumia Kubernetes kama mfano.
Wacha tuseme msanidi programu anatumia mzigo wa kazi na Kubernetes inapokea ombi la kuunda ganda. Katika hatua hii, chombo kinachoitwa Collector kinaundwa kiotomatiki kwa kila ganda (tunatumia webhook ya mutation). Mtoza ni wakala wetu. Mwanzoni, chombo hiki kinajisanidi kufanya kazi na Prometheus na mfumo wa kukusanya kumbukumbu.
- Ili kufanya hivyo, hutumia maelezo ya pod, na kulingana na maudhui yake, huunda, sema, mwisho wa Prometheus;
- Kulingana na vipimo vya ganda na mipangilio mahususi ya kontena, huamua jinsi ya kutoa kumbukumbu.
Tunakusanya kumbukumbu kupitia API ya Docker: watengenezaji wanahitaji tu kuziweka kwenye stdout au stderr, na Mtoza ataitatua. Kumbukumbu hukusanywa kwa vipande na kucheleweshwa ili kuzuia uwezekano wa upakiaji wa mwenyeji.
Vipimo hukusanywa katika matukio ya mzigo wa kazi (michakato) katika vyombo. Kila kitu kimetambulishwa: nafasi ya majina, chini, na kadhalika, na kisha kubadilishwa kuwa muundo wa Prometheus - na inapatikana kwa mkusanyiko (isipokuwa kwa kumbukumbu). Pia tunatuma kumbukumbu, vipimo na matukio kwa Kafka na zaidi:
- Kumbukumbu zinapatikana katika Graylog (kwa uchambuzi wa kuona);
- Kumbukumbu, vipimo, matukio hutumwa kwa Clickhouse kwa hifadhi ya muda mrefu.
Kila kitu hufanya kazi sawa katika AWS, ni sisi tu tunabadilisha Graylog na Kafka na Cloudwatch. Tunatuma magogo huko, na kila kitu kinageuka kuwa rahisi sana: ni wazi mara moja ambayo ni ya nguzo na chombo. Ndivyo ilivyo kwa Google Stackdriver. Hiyo ni, mpango wetu hufanya kazi kwa msingi na Kafka na katika wingu.
Ikiwa hatuna Kubernetes na maganda, mpango huo ni ngumu zaidi, lakini unafanya kazi kwa kanuni sawa.
Taratibu sawa zinatekelezwa ndani ya chombo, zimepangwa kwa kutumia S6. Michakato yote sawa inaendeshwa ndani ya chombo kimoja.
Mwishowe
Tumeunda suluhisho kamili la kuunda na kuzindua picha, na chaguzi za kukusanya na kuwasilisha kumbukumbu na vipimo:
- Tulitengeneza mbinu sanifu ya kuunganisha picha, na kwa kuzingatia hilo tulitengeneza violezo vya CI;
- Mawakala wa kukusanya data ni viendelezi vyetu vya Telegraf. Tuliwajaribu vizuri katika uzalishaji;
- Tunatumia mutation webhook kutekeleza vyombo na mawakala katika maganda;
- Imejumuishwa katika mfumo ikolojia wa Kubernetes/Rancher;
- Tunaweza kutekeleza vyombo sawa katika mifumo tofauti ya okestration na kupata matokeo tunayotarajia;
- Imeunda usanidi wa usimamizi wa kontena unaobadilika kabisa.
Mwandishi mwenza: Ilya Prudnikov
Chanzo: mapenzi.com