werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

27 май дар толори асосии конфронси DevOpsConf 2019, ки дар доираи фестивал баргузор мешавад RIT++ 2019, дар доираи бахши "Интиқоли муттасил" гузориш дода шуд "werf - воситаи мо барои CI/CD дар Kubernetes". Дар бораи онхо сухан меравад мушкилот ва мушкилоте, ки ҳама ҳангоми ҷойгиркунӣ ба Kubernetes дучор мешаванд, инчунин дар бораи нозукиҳое, ки метавонанд фавран намоён нашаванд. Таҳлили ҳалли имконпазир, мо нишон медиҳем, ки ин чӣ гуна дар асбоби кушодаасос амалӣ карда мешавад верф.

Аз замони муаррифӣ, утилитаи мо (қаблан ҳамчун dapp маъруф буд) ба марҳалаи таърихии 1000 ситора дар GitHub — мо умедворем, ки ҷомеаи афзояндаи корбарони он ҳаёти бисёр муҳандисони DevOpsро осонтар хоҳад кард.

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Инак, пешкаш мекунем видеои гузориш (~47 дақиқа, назар ба мақола бештар иттилоотӣ) ва иқтибос аз он дар шакли матн. Бирав!

Интиқоли код ба Kubernetes

Гуфтугӯ дигар на дар бораи werf, балки дар бораи CI/CD дар Кубернетес хоҳад буд ва ин маънои онро дорад, ки нармафзори мо дар контейнерҳои Docker баста шудааст. (Ман дар ин бора дар ҳисоботи 2016), ва К8схо барои дар истехсолот чорй кардани он истифода мешаванд (бештар дар бораи ин дар Соли 2017).

Интиқол дар Кубернетес чӣ гуна ба назар мерасад?

  • Як анбори Git бо рамз ва дастурҳо барои сохтани он мавҷуд аст. Ин барнома ба тасвири Docker сохта шудааст ва дар Реестри Docker нашр шудааст.
  • Дар ҳамон анбор инчунин дастурҳо оид ба ҷойгиркунӣ ва иҷро кардани барнома мавҷуд аст. Дар марҳилаи ҷойгиркунӣ, ин дастурҳо ба Kubernetes фиристода мешаванд, ки тасвири дилхоҳро аз реестр қабул мекунад ва онро оғоз мекунад.
  • Илова бар ин, одатан санҷишҳо мавҷуданд. Баъзе аз инҳоро ҳангоми нашри тасвир кардан мумкин аст. Шумо инчунин метавонед (бо риояи ҳамон дастурҳо) нусхаи барномаро (дар фазои номи алоҳидаи K8s ё кластери алоҳида) ҷойгир кунед ва дар он ҷо санҷишҳоро иҷро кунед.
  • Ниҳоят, ба шумо системаи CI лозим аст, ки рӯйдодҳоро аз Git қабул мекунад (ё кликҳои тугмаҳо) ва ҳамаи марҳилаҳои таъиншударо даъват мекунад: сохтан, нашр кардан, ҷойгир кардан, озмоиш.

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Дар ин ҷо чанд ёддоштҳои муҳим мавҷуданд:

  1. Зеро мо инфрасохтори тағйирнопазир дорем (инфрасохтори тағирнашаванда), тасвири барнома, ки дар ҳама марҳилаҳо истифода мешавад (саҳнасозӣ, истеҳсол ва ғ.), бояд яке бошад. Дар ин бора муфассалтар ва бо мисолхо сухан рондам. дар ин ҷо.
  2. Зеро мо инфрасохторро ҳамчун равиши код риоя мекунем (IaC), коди барнома, дастур оид ба монтаж ва ба кор андохтани он бояд бошад маҳз дар як анбор. Барои маълумоти бештар дар бораи ин, нигаред ҳамон гузориш.
  3. Занҷираи интиқол (таҳвил) мо онро одатан чунин мебинем: барнома ҷамъ карда шуд, санҷида шуд, бароварда шуд (марҳилаи озодкунӣ) ва ин аст - интиқол ба амал омад. Аммо дар асл, корбар он чизеро, ки шумо баровардаед, мегирад, не пас вакте ки шумо онро ба истехсолот месупоред ва вакте ки вай ба он чо рафта тавонист ва ин истехсолот кор кард. Ҳамин тавр, ман боварӣ дорам, ки занҷири интиқол ба охир мерасад танҳо дар марҳилаи амалиёт (давидан), ё аниктараш, хатто дар лахзае, ки код аз истехсолот дур карда шуда буд (иваз кардани он бо коди нав).

Биёед ба нақшаи дар боло овардашуда дар Кубернетес баргардем: он на танҳо аз ҷониби мо, балки аз ҷониби ҳар касе, ки бо ин мушкилот сарукор дошт, ихтироъ кардааст. Дар асл, ин намуна ҳоло GitOps номида мешавад (шумо метавонед дар бораи истилоҳ ва ғояҳои паси он бештар хонед дар ин ҷо). Биёед ба марҳилаҳои нақша назар андозем.

Марҳилаи бунёд

Чунин ба назар мерасад, ки шумо метавонед дар бораи сохтани тасвирҳои Docker дар соли 2019 сӯҳбат кунед, вақте ки ҳама медонад, ки чӣ гуна Dockerfiles нависед ва иҷро кунед. docker build?.. Дар ин чо нозукихое хастанд, ки ба онхо диккат додан мехостам:

  1. Вазни тасвир муҳим аст, бинобар ин истифода баред бисёрмарҳилаки дар тасвир танхо замимаеро, ки барои амалиёт дар хакикат зарур аст, гузорад.
  2. Шумораи қабатҳо бояд бо роҳи якҷоя кардани занҷирҳо кам карда шавад RUN-мувофиқи маъно фармон медиҳад.
  3. Аммо, ин мушкилотро илова мекунад ислоҳ кардан, зеро вақте ки васлшавӣ ба садама дучор мешавад, шумо бояд фармони дурустро аз занҷире, ки боиси мушкилот шудааст, пайдо кунед.
  4. Суръати монтаж муҳим аст, зеро мо мехоҳем ба зудӣ тағирот ворид кунем ва натиҷаҳоро бубинем. Масалан, шумо намехоҳед, ки ҳар дафъае, ки барнома созед, вобастагиҳоро дар китобхонаҳои забонҳо барқарор кунед.
  5. Аксар вақт аз як анбори Git ба шумо лозим аст тасвирҳои зиёд, ки онро тавассути маҷмӯи Dockerfiles (ё марҳилаҳои номбаршуда дар як файл) ва скрипти Bash бо маҷлиси пайдарпайи онҳо ҳал кардан мумкин аст.

Ин танҳо нӯги айсберг буд, ки ҳама бо он рӯ ба рӯ мешаванд. Аммо мушкилоти дигар вуҷуд доранд, аз ҷумла:

  1. Аксар вақт дар марҳилаи васлшавӣ ба мо чизе лозим аст кӯҳ (масалан, натиҷаи фармонро ба монанди apt дар феҳристи тарафи сеюм кэш кунед).
  2. Мо мехоҳем Фаҳмост ба ҷои навиштан дар shell.
  3. Мо мехоҳем бе Docker созед (чаро ба мо мошини иловагии виртуалӣ лозим аст, ки дар он мо бояд ҳама чизро барои ин танзим кунем, вақте ки мо аллакай кластери Кубернетес дорем, ки дар он контейнерҳоро идора карда метавонем?).
  4. Маҷмаи параллелӣ, ки онҳоро бо тарзҳои гуногун фаҳмидан мумкин аст: фармонҳои гуногун аз Dockerfile (агар бисёрмарҳила истифода шавад), якчанд супоришҳои як репозиторий, якчанд Dockerfiles.
  5. Маҷлиси тақсимшуда: Мо мехоҳем, ки чизҳои дар pods ҷамъ, ки "эфемерӣ" аст, зеро кэши онҳо нопадид мешавад, ин маънои онро дорад, ки он бояд дар ҷои алоҳида нигоҳ дошта шавад.
  6. Ниҳоят, ман куллаи ҳавасҳоро ном бурдам автоматӣ: Идеалӣ мебуд, ки ба анбор равед, ягон фармонро ворид кунед ва тасвири тайёреро гиред, ки бо фаҳмидани он ки чӣ гуна ва чӣ тавр дуруст кор кардан лозим аст. Аммо, ман шахсан боварӣ надорам, ки ҳамаи нозукиҳоро бо ин роҳ пешбинӣ кардан мумкин аст.

Ва инҳоянд лоиҳаҳо:

  • moby/buildkit — меъмори Docker Inc (аллакай ба версияҳои ҷории Docker муттаҳид карда шудааст), ки кӯшиш мекунад ҳамаи ин мушкилотро ҳал кунад;
  • канико — меъмори Google, ки ба шумо имкон медиҳад бидуни Docker созед;
  • Buildpacks.io - Кӯшиши CNCF барои сохтани ҷодуи худкор ва махсусан, ҳалли ҷолиб бо барқарорсозии қабатҳо;
  • ва як қатор дигар воситаҳои коммуналӣ, ба монанди буилда, genuinetools/img...

...ва бубинед, ки онҳо дар GitHub чӣ қадар ситора доранд. Яъне, аз як тараф, docker build вуҷуд дорад ва чизе карда метавонад, аммо дар асл масъала пурра хал нашудааст — далели ин инкишофи параллели коллекторхои альтернативй мебошад, ки хар кадоми онхо як кисми проблемахоро хал мекунанд.

Маҷлис дар werf

Пас, мо бояд верф (қаблан машҳур мисли dapp) — Як барномаи кушодаасос аз ширкати Flant, ки мо онро солҳои зиёд месозад. Ҳамааш 5 сол пеш аз скриптҳои Bash оғоз шуда буд, ки маҷмӯи Dockerfiles-ро оптимизатсия карданд ва дар тӯли 3 соли охир таҳияи мукаммал дар доираи як лоиҳа бо анбори Git-и худ анҷом дода шуд. (аввал дар Ruby, ва баъд аз нав навишта шудааст ба Гузаштан ва ҳамзамон номашро иваз кард). Кадом масъалаҳои маҷлис дар werf ҳал карда мешаванд?

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Мушкилоте, ки бо ранги кабуд соя карда шудаанд, аллакай амалӣ шудаанд, сохтмони мувозӣ дар як мизбон анҷом дода шудааст ва масъалаҳои бо зард таъкидшуда то охири тобистон ба нақша гирифта шудаанд.

Марҳилаи интишор дар реестр (нашр)

Мо занг задем docker push... - бор кардани тасвир ба реестр чӣ душвор буда метавонад? Ва он гоҳ саволе ба миён меояд: "Ба тасвир чӣ тег гузорам?" Он барои он ба миён меояд, ки мо дорем Gitflow (ё стратегияи дигари Git) ва Kubernetes ва саноат кӯшиш мекунад, ки боварӣ ҳосил кунад, ки он чизе, ки дар Кубернетес рӯй медиҳад, пас аз он чизе ки дар Git рӯй медиҳад, мувофиқат кунад. Дар ниҳоят, Гит манбаи ягонаи ҳақиқати мост.

Ин чӣ қадар мушкил аст? Таъмини такрористеҳсолкунӣ: аз ӯҳдадорӣ дар Git, ки табиатан тағйирнопазир аст (тағирнопазир), ба тасвири Docker, ки бояд ҳамон тавре нигоҳ дошта шавад.

Барои мо низ муҳим аст пайдоишро муайян кунад, зеро мо мехоҳем бифаҳмем, ки барномае, ки дар Кубернетес кор мекунад, аз кадом иҷро сохта шудааст (пас мо метавонем фарқиятҳо ва корҳои шабеҳро иҷро кунем).

Стратегияҳои барчасп

Якум оддӣ аст git теги. Мо феҳрист дорем, ки тасвире ҳамчун нишонгузорӣ шудааст 1.0. Кубернетес дорои саҳна ва истеҳсолот аст, ки дар он ин тасвир бор карда мешавад. Дар Git мо ӯҳдадор мешавем ва дар баъзе мавридҳо тег мегузорем 2.0. Мо онро мувофиқи дастурҳои анбор ҷамъоварӣ мекунем ва онро дар реестр бо тег ҷойгир мекунем 2.0. Мо онро ба саҳна мегузорем ва агар ҳамааш хуб бошад, пас ба истеҳсолот.

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Мушкилоти ин равиш дар он аст, ки мо аввал тегро гузоштем ва танҳо баъд онро санҷида ва паҳн кардем. Чаро? Аввалан, ин ғайримантиқӣ аст: мо як версияи нармафзорро бароварда истодаем, ки онро то ҳол озмоиш накардаем (мо дигар тавр карда наметавонем, зеро барои тафтиш, мо бояд тег гузорем). Дуюм, ин роҳ бо Gitflow мувофиқ нест.

Варианти дуюм аст git commit + барчасп. Филиали усто тег дорад 1.0; барои он дар реестр - тасвири дар истеҳсолот ҷойгиршуда. Илова бар ин, кластери Kubernetes дорои контурҳои пешнамоиш ва саҳнасозӣ мебошад. Минбаъд мо Gitflow пайравӣ мекунем: дар шохаи асосӣ барои рушд (develop) мо хусусиятҳои нав месозем, ки дар натиҷа бо идентификатор иҷро карда мешавад #c1. Мо онро ҷамъ мекунем ва бо истифода аз ин идентификатор дар реестр нашр мекунем (#c1). Бо ҳамон идентификатор мо ба пешнамоиш мебароем. Мо бо ӯҳдадориҳо низ ҳамин тавр мекунем #c2 и #c3.

Вақте ки мо фаҳмидем, ки хусусиятҳои кофӣ мавҷуданд, мо ҳама чизро ба эътидол меорем. Дар Git филиал эҷод кунед release_1.1 (дар асоси #c3 аз он develop). Ҷамъоварии ин нашрия лозим нест, зеро... ин дар қадами қаблӣ анҷом дода шуд. Аз ин рӯ, мо метавонем онро танҳо ба саҳна гузорем. Мо хатогиҳоро ислоҳ мекунем #c4 ва ба ҳамин монанд ба саҳнасозӣ мебароянд. Дар баробари ин ободо-нй дар ин чо давом дорад develop, ки тағиротҳо давра ба давра аз куҷо гирифта мешаванд release_1.1. Дар баъзе мавридҳо, мо ӯҳдадор мешавем, ки тартиб дода ва ба саҳна бор карда мешавад, ки мо аз он қаноатмандем (#c25).

Сипас, мо шохаи озодро (бо зуд ба пеш) муттаҳид мекунем.release_1.1) дар устод. Мо дар ин ӯҳдадорӣ барчасп бо версияи нав гузоштем (1.1). Аммо ин тасвир аллакай дар реестр ҷамъоварӣ шудааст, аз ин рӯ барои он ки онро дубора ҷамъ накунем, мо танҳо ба тасвири мавҷуда теги дуюмро илова мекунем (ҳоло он дар реестр тегҳо дорад. #c25 и 1.1). Пас аз он мо онро ба истеҳсолот мебарем.

Камбудие вуҷуд дорад, ки танҳо як тасвир ба саҳна бор карда мешавад (#c25), ва дар истеҳсолот он як навъ гуногун аст (1.1), аммо мо медонем, ки "ҷисман" инҳо ҳамон тасвир аз феҳрист мебошанд.

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Камбудии воқеӣ дар он аст, ки ҳеҷ гуна дастгирии ӯҳдадориҳои якҷоякунӣ вуҷуд надорад, шумо бояд пешрафтро зуд иҷро кунед.

Мо метавонем пештар равем ва ҳиллаеро анҷом диҳем... Биёед мисоли файли оддии Dockerfile-ро дида бароем:

FROM ruby:2.3 as assets
RUN mkdir -p /app
WORKDIR /app
COPY . ./
RUN gem install bundler && bundle install
RUN bundle exec rake assets:precompile
CMD bundle exec puma -C config/puma.rb

FROM nginx:alpine
COPY --from=assets /app/public /usr/share/nginx/www/public

Биёед аз он мувофиқи принсипи зерин файл созем:

  • SHA256 аз идентификаторҳои тасвирҳои истифодашуда (ruby:2.3 и nginx:alpine), ки маблағи назоратии мундариҷаи онҳо мебошанд;
  • ҳама дастаҳо (RUN, CMD ва ғайра.);
  • SHA256 аз файлҳои иловашуда.

... ва маблағи санҷишро (боз SHA256) аз чунин файл гиред. Ин имзо ҳама чизест, ки мундариҷаи тасвири Docker-ро муайян мекунад.

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Биёед ба диаграмма баргардем ва ба чои ухдадорй аз чунин имзохо истифода мебарем, яъне. тасвирҳоро бо имзоҳо нишон диҳед.

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Ҳоло, вақте ки лозим аст, масалан, барои якҷоя кардани тағирот аз релиз ба устод, мо метавонем як воқеии якҷоякунӣ анҷом диҳем: он идентификатори дигар, аммо як имзо дорад. Бо ҳамон идентификатор мо тасвирро ба истеҳсолот мебарем.

Камбудй дар он аст, ки акнун муайян кардан мумкин нест, ки чй гуна ухдадорй ба истехсолот тела дода шудааст — чекхо танхо дар як самт кор мекунанд. Ин мушкилот бо як қабати иловагӣ бо метамаълумот ҳал карда мешавад - ман баъдтар ба шумо мегӯям.

Барчасп дар werf

Дар werf мо боз ҳам дуртар рафтем ва омода карда истодаем, ки сохтани тақсимшуда бо кэш дар як мошин нигоҳ дошта намешавад... Ҳамин тавр, мо ду намуди тасвирҳои Docker сохта истодаем, мо онҳоро меномем. марҳила и Садо.

Анбори werf Git дастурҳои мушаххаси сохтмонро нигоҳ медорад, ки марҳилаҳои гуногуни сохтмонро тавсиф мекунанд (пеш аз насб, насб кунед, пеш аз насб, ташкил кардан). Мо тасвири марҳилаи аввалро бо имзо ҷамъ меорем, ки ҳамчун маблағи санҷиши қадамҳои аввал муайян карда шудааст. Баъд коди ибтидоиро илова мекунем, барои тасвири нави саҳнавӣ маблағи назоратии онро ҳисоб мекунем... Ин амалҳо барои ҳама марҳилаҳо такрор мешаванд, ки дар натиҷа маҷмӯи тасвирҳои саҳнавӣ ба даст меоранд. Сипас мо тасвири ниҳоиро месозем, ки он инчунин метамаълумотро дар бораи пайдоиши он дар бар мегирад. Ва мо ин тасвирро бо роҳҳои гуногун қайд мекунем (тафсилот баъдтар).

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Фарз мекунем, ки пас аз ин ӯҳдадории нав пайдо мешавад, ки дар он танҳо рамзи барнома иваз шудааст. Чӣ мешавад? Барои тағир додани код, патч сохта мешавад ва тасвири нави саҳна омода карда мешавад. Имзои он ҳамчун маҷмӯи санҷиши тасвири кӯҳнаи саҳна ва ямоқи нав муайян карда мешавад. Аз ин тасвир тасвири нави ниҳоӣ ташаккул меёбад. Чунин рафтор бо тағирот дар марҳилаҳои дигар рух медиҳад.

Ҳамин тариқ, тасвирҳои саҳна як кэш мебошанд, ки метавонанд ба таври тақсимшуда нигоҳ дошта шаванд ва тасвирҳои аллакай аз он сохташуда ба Реестри Docker бор карда мешаванд.

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Тоза кардани реестр

Мо дар бораи нест кардани қабатҳое, ки пас аз барчаспҳои ҳазфшуда овезон монданд, сухан намегӯем - ин хусусияти стандартии худи Реестри Docker аст. Мо дар бораи вазъияте сухан меронем, ки тегҳои зиёди Docker ҷамъ мешаванд ва мо мефаҳмем, ки мо дигар ба баъзеи онҳо ниёз надорем, аммо онҳо ҷойро ишғол мекунанд (ва/ё мо барои он пардохт мекунем).

Стратегияҳои тозакунӣ кадомҳоянд?

  1. Шумо танҳо ҳеҷ кор карда наметавонед тоза накунед. Баъзан он воқеан осонтар аст, ки каме барои фазои иловагӣ пардохт кунед, назар ба кушодани як печи бузурги барчаспҳо. Аммо ин танҳо то як нуқтаи муайян кор мекунад.
  2. Бозсозии пурра. Агар шумо ҳамаи тасвирҳоро нест кунед ва танҳо тасвирҳои ҷорӣро дар системаи CI аз нав барқарор кунед, мушкилот метавонад ба миён ояд. Агар контейнер дар истеҳсолот дубора ба кор андохта шавад, барои он тасвири нав бор карда мешавад - тасвире, ки то ҳол аз ҷониби касе санҷида нашудааст. Ин ғояи инфрасохтори тағйирнопазирро мекушад.
  3. Кабуд-сабз. Як феҳрист пур шудан гирифт - мо тасвирҳоро ба дигараш бор мекунем. Мушкилоте, ки дар усули қаблӣ буд: дар кадом лаҳза шумо метавонед феҳристро, ки аз ҳад зиёд пур карда шудааст, тоза кунед?
  4. Бо вақт. Ҳама тасвирҳои аз 1 моҳ калонтарро нест кунед? Аммо ҳатман хидмате пайдо мешавад, ки як моҳ боз нав нашудааст...
  5. Дастӣ муайян кунед, ки чиро аллакай нест кардан мумкин аст.

Ду варианти воқеӣ вуҷуд дорад: тоза накунед ё омехтаи кабуд-сабз + дастӣ. Дар ҳолати охирин, мо дар бораи чизҳои зерин гап мезанем: вақте ки шумо фаҳмед, ки вақти тоза кардани реестр расидааст, шумо як реестри нав эҷод мекунед ва дар давоми як моҳ, масалан, ҳама тасвирҳои навро ба он илова мекунед. Ва пас аз як моҳ, бубинед, ки кадом қуттиҳои Кубернетес то ҳол феҳристи кӯҳнаро истифода мебаранд ва онҳоро низ ба феҳристи нав интиқол медиҳанд.

Мо ба чй омадем верф? Мо ҷамъ мекунем:

  1. Сарвари Git: ҳама барчаспҳо, ҳама шохаҳо - агар мо ҳама чизеро, ки дар Git дар тасвирҳо нишон дода шудааст, лозим аст (ва агар не, мо бояд онро дар худи Git нест кунем);
  2. тамоми пораҳое, ки ҳоло ба Кубернетес интиқол дода мешаванд;
  3. ReplicaSets-и кӯҳна (он чизе ки ба наздикӣ бароварда шуд) ва мо инчунин нақша дорем, ки релизҳои Helm-ро скан кунем ва тасвирҳои охиринро дар он ҷо интихоб кунем.

... ва аз ин маҷмӯа рӯйхати сафед тартиб диҳед - рӯйхати тасвирҳоеро, ки мо нест намекунем. Мо ҳама чизи боқимондаро тоза мекунем ва пас аз он тасвирҳои саҳнаи ятимро пайдо мекунем ва онҳоро низ нест мекунем.

Марҳилаи ҷойгиркунӣ

Декларативии боэътимод

Аввалин нуктае, ки ман мехостам ба он ҳангоми густариш диққат диҳам, ин интишори конфигуратсияи захираҳои навшуда мебошад, ки ба таври декларативӣ эълом шудааст. Ҳуҷҷати аслии YAML, ки захираҳои Kubernetes-ро тавсиф мекунад, ҳамеша аз натиҷае, ки воқеан дар кластер кор мекунад, хеле фарқ мекунад. Азбаски Kubernetes ба конфигуратсия илова мекунад:

  1. идентификаторҳо;
  2. маълумоти хизматрасонӣ;
  3. бисёр арзишҳои пешфарз;
  4. бахш бо вазъи кунунӣ;
  5. тағйироте, ки дар доираи веб-ҳук қабул карда шудаанд;
  6. натиҷаи кори контролерҳои гуногун (ва нақшакаш).

Аз ин рӯ, вақте ки конфигуратсияи нави манбаъ пайдо мешавад (нав), мо наметавонем бо он конфигуратсияи ҷории "зинда" -ро бигирем ва баргардонем (зинда). Барои ин мо бояд муқоиса кунем нав бо конфигуратсияи охирини татбиқшуда (охирин муроҷиат) ва ғелонед зинда пачка гирифт.

Ин равиш номида мешавад якҷояшавии 2-роҳ. Он, масалан, дар Helm истифода мешавад.

Инчунин вуҷуд дорад якҷояшавии 3-роҳ, ки бо он фарқ мекунад:

  • муқоиса кардан охирин муроҷиат и нав, мо ба он чизе, ки нест карда шудааст, дида мебароем;
  • муқоиса кардан нав и зинда, мо ба он назар мекунем, ки чӣ илова ё тағир дода шудааст;
  • патч чамъбаст карда мешавад зинда.

Мо 1000+ барномаҳоро бо Helm ҷойгир мекунем, аз ин рӯ мо воқеан бо якҷоякунии дутарафа зиндагӣ мекунем. Бо вуҷуди ин, он як қатор мушкилот дорад, ки мо онҳоро бо часпакҳои худ ҳал кардем, ки ба Ҳелм муътадил кор мекунанд.

Ҳолати воқеии паҳнкунӣ

Пас аз он ки системаи CI мо конфигуратсияи навро барои Kubernetes дар асоси ҳодисаи навбатӣ тавлид мекунад, онро барои истифода интиқол медиҳад (дархост) ба кластер - бо истифода аз Helm ё kubectl apply. Минбаъд, якҷояшавии N-роҳи аллакай тавсифшуда ба амал меояд, ки ба он API Kubernetes ба системаи CI ва он ба корбари он ҷавоб медиҳад.

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Бо вуҷуди ин, як мушкилоти бузург вуҷуд дорад: охир татбиқи бомуваффақият маънои паҳнкунии муваффақро надорад. Агар Кубернетес фаҳмад, ки чӣ гуна тағирот бояд татбиқ карда шавад ва онро татбиқ кунад, мо то ҳол намедонем, ки натиҷа чӣ мешавад. Масалан, навсозӣ ва бозоғозкунии подкҳо дар фронт метавонад бомуваффақият бошад, аммо на дар пушти сар ва мо версияҳои гуногуни тасвирҳои татбиқшавандаро ба даст меорем.

Барои дуруст иҷро кардани ҳама чиз, ин схема пайванди иловагӣ - трекери махсусро талаб мекунад, ки аз API Kubernetes маълумотро қабул мекунад ва онро барои таҳлили минбаъдаи ҳолати воқеии чизҳо интиқол медиҳад. Мо дар Go китобхонаи кушодаасос таъсис додем - кубедог (ба эълони он нигаред дар ин ҷо), ки ин мушкилотро ҳал мекунад ва дар werf сохта шудааст.

Рафтори ин трекер дар сатҳи werf бо истифода аз эзоҳҳое, ки дар Deployments ё StatefulSets ҷойгир шудаанд, танзим карда мешавад. Шарҳи асосӣ - fail-mode - маънои зеринро мефаҳмад:

  • IgnoreAndContinueDeployProcess — мо проблемахои чорй намудани ин компонентро сарфи назар карда, чойгиркуниро давом медихем;
  • FailWholeDeployProcessImmediately — хато дар ин ќисмат раванди љойгиркуниро ќатъ мекунад;
  • HopeUntilEndOfDeployProcess — мо умедворем, ки ин компонент то охири ҷойгиркунӣ кор мекунад.

Масалан, ин маҷмӯи захираҳо ва арзишҳои эзоҳ fail-mode:

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Вақте ки мо бори аввал ҷойгир мекунем, пойгоҳи додаҳо (MongoDB) шояд ҳанӯз омода набошад - Ҷойгиркунӣ ноком хоҳад шуд. Аммо шумо метавонед лаҳзаи оғози онро интизор шавед ва ҷойгиркунӣ ҳанӯз сурат хоҳад гирифт.

Ду эзоҳи дигар барои kubedog дар werf мавҷуданд:

  • failures-allowed-per-replica - шумораи афтиши иҷозатдодашуда барои ҳар як реплика;
  • show-logs-until — лаҳзаеро танзим мекунад, ки то он даме, ки werf гузоришҳоро аз ҳама қуттиҳои ғелондашуда нишон медиҳад (дар stdout). Пешфарз аст PodIsReady (барои нодида гирифтани паёмҳое, ки мо эҳтимол намехоҳем, вақте ки трафик ба подкаст оғоз меёбад), аммо арзишҳо низ эътибор доранд: ControllerIsReady и EndOfDeploy.

Мо аз ҷойгиркунӣ боз чӣ мехоҳем?

Илова ба ду нуктаи дар боло тавсифшуда, мо мехоҳем:

  • барои дидани гузоришҳо - ва танҳо чизҳои зарурӣ, на ҳама чиз дар як саф;
  • пайгирӣ пешрафт, зеро агар кор чанд дакика «хомушона» овезон шавад, дарк кардан лозим аст, ки дар он чо чй вокеа руй медихад;
  • доранд бозгашти автоматӣ дар сурати ноком шудан (ва аз ин рӯ донистани вазъи воқеии ҷойгиркунӣ муҳим аст). Намоиш бояд атомӣ бошад: ё он то охир мегузарад, ё ҳама чиз ба ҳолати қаблии худ бармегардад.

Натиҷаҳо

Барои мо ҳамчун як ширкат, барои татбиқи тамоми нозукиҳои тавсифшуда дар марҳилаҳои гуногуни таҳвил (сохт, нашр, ҷойгиркунӣ), системаи CI ва утилита кифоя аст. верф.

Ба ҷои хулоса:

werf - воситаи мо барои CI / CD дар Kubernetes (шарҳ ва гузориши видео)

Бо кӯмаки werf, мо дар ҳалли шумораи зиёди мушкилот барои муҳандисони DevOps пешрафти хуб ба даст овардем ва аз он шод мешудем, ки агар ҷомеаи васеъ ҳадди аққал ин утилитаро дар амал санҷида бошад. Якҷоя ба натиҷаи хуб ноил шудан осонтар мешавад.

Видеоҳо ва слайдҳо

Видео аз намоиш (~47 дақиқа):

Муаррифии гузориш:

PS

Дигар гузоришҳо дар бораи Kubernetes дар блоги мо:

Манбаъ: will.com

Илова Эзоҳ