Проблемаи тозакунии «ақлонаи» тасвирҳои контейнер ва ҳалли он дар werf

Проблемаи тозакунии «ақлонаи» тасвирҳои контейнер ва ҳалли он дар werf

Дар мақола мушкилоти тоза кардани тасвирҳо, ки дар реестрҳои контейнерӣ ҷамъ мешаванд (Registr Docker ва аналогҳои он) дар воқеияти лӯлаҳои муосири CI/CD барои замимаҳои абрии ба Кубернетес расонидашуда баррасӣ мешаванд. Меъёрҳои асосии мувофиқати тасвирҳо ва мушкилоти дар натиҷаи автоматикунонии тозакунӣ, сарфаи ҷой ва қонеъ кардани ниёзҳои дастаҳо оварда шудаанд. Дар охир, бо истифода аз мисоли лоиҳаи мушаххаси кушодаасос, мо ба шумо мегӯям, ки чӣ гуна ин мушкилотро бартараф кардан мумкин аст.

Муқаддима

Миқдори тасвирҳо дар феҳристи контейнер метавонад босуръат афзоиш ёбад, фазои бештари нигоҳдорӣ ишғол кунад ва ба ин васила арзиши онро ба таври назаррас афзоиш диҳад. Барои назорат, маҳдуд кардан ё нигоҳ доштани афзоиши қобили қабули фазои ишғол дар реестр қабул карда мешавад:

  1. барои тасвирҳо шумораи муайяни барчаспҳоро истифода баред;
  2. тасвирҳоро бо ягон роҳ тоза кунед.


Маҳдудияти аввал баъзан барои дастаҳои хурд қобили қабул аст. Агар таҳиягарон барчаспҳои доимии кофӣ дошта бошанд (latest, main, test, boris ва ғайра), реестр ҳаҷм варам намекунад ва дар муддати тӯлонӣ ба шумо лозим нест, ки дар бораи тоза кардани он тамоман фикр кунед. Дар ниҳоят, ҳама тасвирҳои номатлуб тоза карда мешаванд ва барои тоза кардан коре боқӣ намемонад (ҳама кор аз ҷониби як коллектори оддии ахлот анҷом дода мешавад).

Аммо, ин равиш рушдро хеле маҳдуд мекунад ва ба лоиҳаҳои муосири CI/CD хеле кам татбиқ мешавад. Кисми таркибии тараккиёт буд автоматика, ки ба шумо имкон медиҳад, ки функсияҳои навро ба корбарон зудтар санҷед, ҷойгир кунед ва расонед. Масалан, дар ҳама лоиҳаҳои мо, бо ҳар як ӯҳдадорӣ ба таври худкор лӯлаи CI сохта мешавад. Дар он, тасвир ҷамъоварӣ, озмуда, ба схемаҳои гуногуни Kubernetes барои ислоҳ ва санҷишҳои боқимонда интиқол дода мешавад ва агар ҳамааш хуб бошад, тағирот ба корбари ниҳоӣ мерасад. Ва ин дигар илми ракета нест, балки як ҳодисаи ҳамарӯза барои бисёриҳост - эҳтимоли зиёд барои шумо, зеро шумо ин мақоларо мехонед.

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

Аммо чӣ тавр шумо ҳатто муайян мекунед, ки оё тасвир мувофиқ аст?

Меъёрҳои мувофиқати тасвир

Дар аксари ҳолатҳо, меъёрҳои асосӣ инҳоянд:

1. Аввалин (аз ҳама аёнтарин ва танқидӣтарин) образҳое мебошанд, ки ҳоло дар Kubernetes истифода мешавад. Хориҷ кардани ин тасвирҳо метавонад боиси хароҷоти назарраси вақти истеҳсолот гардад (масалан, тасвирҳо метавонанд барои такрор талаб карда шаванд) ё кӯшишҳои дастаҷамъонаро дар ҳама гуна ҳалқаҳо рад кунанд. (Аз ин сабаб мо ҳатто як махсус кардем содиркунандаи Prometheus, ки мавҷуд набудани чунин тасвирҳоро дар ҳама гуна кластери Kubernetes пайгирӣ мекунад.)

2. Дуюм (камтар аён, вале хеле муҳим ва боз ба истисмор дахл дорад) - тасвирҳое, ки барои бозгашт дар сурати ошкор шудани мушкилоти ҷиддӣ зарур аст дар версияи ҷорӣ. Масалан, дар мавриди Helm, инҳо тасвирҳое мебошанд, ки дар версияҳои захирашудаи нашр истифода мешаванд. (Дар омади гап, бо нобаёнӣ дар Helm маҳдудият 256 тафсирро ташкил медиҳад, аммо аз эҳтимол дур нест, ки касе воқеан захира кардан лозим аст. чунин аст шумораи зиёди версияҳо?..) Охир, мо, аз ҷумла, версияҳоро нигоҳ медорем, то ки мо баъдтар онҳоро истифода барем, яъне. Агар лозим бошад, ба онҳо "бозгашт".

3. Сеюм - ниёзҳои таҳиякунанда: Ҳама тасвирҳое, ки ба кори ҷории онҳо алоқаманданд. Масалан, агар мо PR-ро баррасӣ кунем, пас гузоштани тасвири мувофиқ ба супоридани охирин ва масалан, ба ӯҳдадории қаблӣ мувофиқ аст: бо ин роҳ таҳиякунанда метавонад зуд ба ҳама гуна вазифа баргардад ва бо тағироти охирин кор кунад.

4. Чорум - тасвирҳо, ки ба версияҳои барномаи мо мувофиқат мекунанд, яъне. маҳсулоти ниҳоӣ мебошанд: v1.0.0, 20.04.01/XNUMX/XNUMX, sierra ва ғайра.

Эзоҳ: Меъёрҳои дар ин ҷо муайяншуда дар асоси таҷрибаи ҳамкорӣ бо даҳҳо гурӯҳҳои рушд аз ширкатҳои гуногун таҳия шудаанд. Аммо, албатта, вобаста ба хусусиятҳои равандҳои рушд ва инфрасохтори истифодашуда (масалан, Kubernetes истифода намешавад), ин меъёрҳо метавонанд фарқ кунанд.

Талабот ва ҳалли мавҷуда

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

* Аз татбиқи феҳристи контейнерҳои мушаххас вобаста аст. Мо имкониятҳои ҳалли зеринро баррасӣ кардем: Azure CR, Docker Hub, ECR, GCR, бастаҳои GitHub, Registry Container GitLab, Registry Harbor, JFrog Artifactory, Quay.io - аз моҳи сентябри'2020.

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

Масалан, меъёри сеюм - вобаста ба эҳтиёҷоти таҳиягарон - метавонад тавассути ташкили равандҳо дар дохили гурӯҳҳо ҳал карда шавад: номгузории мушаххаси тасвирҳо, нигоҳ доштани рӯйхатҳои иҷозатдодашуда ва созишномаҳои дохилӣ. Аммо дар ниҳояти кор он бояд автоматӣ карда шавад. Ва агар имкониятҳои қарорҳои тайёр кофӣ набошанд, шумо бояд кореро аз худ кунед.

Вазъият бо ду меъёри аввал шабеҳ аст: онҳоро бидуни гирифтани маълумот аз системаи беруна қонеъ кардан мумкин нест - системае, ки дар он барномаҳо ҷойгир карда мешаванд (дар ҳолати мо, Kubernetes).

Тасвири ҷараёни кор дар Git

Фарз мекунем, ки шумо дар Git чунин кор карда истодаед:

Проблемаи тозакунии «ақлонаи» тасвирҳои контейнер ва ҳалли он дар werf

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

Чӣ мешавад, агар сиёсати тозакунӣ танҳо нигоҳ доштани тасвирҳоро иҷозат диҳад (нест карда нашавад) бо номҳои тегҳои додашуда?

Проблемаи тозакунии «ақлонаи» тасвирҳои контейнер ва ҳалли он дар werf

Равшан аст, ки чунин сенария касеро шод намегардонад.

Агар сиёсатҳо иҷозат надиҳанд, ки тасвирҳо нест карда шаванд, чӣ тағир меёбад? мувофиқи фосилаи вақти додашуда / шумораи ӯҳдадориҳои охирин?

Проблемаи тозакунии «ақлонаи» тасвирҳои контейнер ва ҳалли он дар werf

Натиҷа хеле беҳтар шуд, аммо ҳанӯз аз идеал дур нест. Дар ниҳоят, мо то ҳол таҳиягарон дорем, ки барои ислоҳи хатогиҳо дар реестр тасвирҳо лозиманд (ё ҳатто дар K8s ҷойгир карда шудаанд) ...

Барои ҷамъбасти вазъи кунунии бозор: функсияҳои дар реестрҳои контейнерӣ мавҷудбуда ҳангоми тозакунӣ чандирии кофӣ надоранд ва сабаби асосии ин роҳи муошират бо ҷаҳони беруна нест. Маълум мешавад, ки дастаҳое, ки чунин чандириро талаб мекунанд, маҷбур мешаванд, ки бо истифода аз API Docker Registry (ё API-и аслии татбиқи мувофиқ) ҳазфи тасвирро "аз берун" мустақилона амалӣ кунанд.

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

Роҳи мо ба тоза кардани симои универсалӣ

Ин ниёз аз куҷо пайдо мешавад? Гап дар сари он аст, ки мо як гурӯҳи алоҳидаи таҳиягарон нестем, балки як гурӯҳе ҳастем, ки якбора ба бисёре аз онҳо хидмат мерасонад ва дар ҳалли ҳамаҷонибаи масъалаҳои CI/CD кӯмак мекунад. Ва воситаи асосии техникӣ барои ин утилитаи Open Source мебошад верф. Хусусияти он дар он аст, ки вай як вазифаи ягонаро иҷро намекунад, балки дар ҳама марҳилаҳо равандҳои пайвастаи интиқолро ҳамроҳӣ мекунад: аз васлкунӣ то ҷойгиркунӣ.

Интишори тасвирҳо ба реестр* (дарҳол пас аз сохта шудани онҳо) вазифаи равшани чунин утилита мебошад. Ва азбаски тасвирҳо дар он ҷо барои нигоҳдорӣ ҷойгир карда мешаванд, пас - агар нигаҳдории шумо номаҳдуд набошад, шумо бояд барои тозакунии минбаъдаи онҳо масъул бошед. Чӣ гуна мо дар ин муваффақият ба даст овардаем, ки ҳамаи меъёрҳои зикршударо қонеъ карда будем, минбаъд муҳокима карда мешавад.

* Гарчанде ки худи реестрҳо метавонанд гуногун бошанд (Рестри Docker, Registry GitLab Container, Harbor ва ғайра), корбарони онҳо бо ҳамон мушкилот рӯбарӯ мешаванд. Ҳалли универсалӣ дар ҳолати мо аз татбиқи реестр вобаста нест, зеро берун аз худи реестрҳо кор мекунад ва рафтори якхеларо барои ҳама пешниҳод мекунад.

Гарчанде ки мо werf-ро ҳамчун намуна истифода мебарем, мо умедворем, ки равишҳои истифодашуда барои дигар дастаҳое, ки бо чунин мушкилот дучор меоянд, муфид хоҳанд буд.

Ҳамин тавр мо банд шудем берун татбиқи механизми тоза кардани тасвирҳо - ба ҷои он имкониятҳое, ки аллакай дар реестрҳои контейнерҳо сохта шудаанд. Қадами аввал истифодаи API-и Docker Registry барои сохтани ҳамон сиёсатҳои ибтидоӣ барои шумораи тегҳо ва вақти эҷоди онҳо (дар боло зикршуда) буд. Ба онҳо илова карда шуд Рӯйхатро дар асоси тасвирҳое, ки дар инфрасохтори ҷойгиршуда истифода мешаванд, иҷозат диҳед, яъне. Кубернетес. Барои охирин, истифодаи Kubernetes API барои такрор кардани тамоми захираҳои ҷойгиршуда ва гирифтани рӯйхати арзишҳо кофӣ буд image.

Ин халли ночиз масъалаи мухимтаринро (критерияи № 1) хал кард, аммо танхо ибтидои сафари мо барои такмил додани механизми тозакунй буд. Қадами навбатӣ - ва хеле ҷолибтар - ин қарор буд тасвирҳои нашршударо бо таърихи Git пайваст кунед.

Схемаҳои тамғагузорӣ

Барои оғоз кардан, мо равишеро интихоб кардем, ки дар он тасвири ниҳоӣ бояд маълумоти заруриро барои тоза нигоҳ дорад ва ин равандро дар схемаҳои барчаспҳо сохтааст. Ҳангоми нашри тасвир, корбар варианти мушаххаси барчаспро интихоб кард (git-branch, git-commit ё git-tag) ва арзиши мувофиқро истифода бурд. Дар системаҳои CI, ин арзишҳо ба таври худкор дар асоси тағирёбандаҳои муҳити зист муқаррар карда шуданд. Дар асл тасвири ниҳоӣ бо ибтидоии мушаххаси Git алоқаманд буд, нигоҳ доштани маълумоти зарурӣ барои тозакунӣ дар тамғакоғазҳо.

Ин равиш боиси як қатор сиёсатҳо гардид, ки ба Git имкон дод, ки ҳамчун манбаи ягонаи ҳақиқат истифода шавад:

  • Ҳангоми нест кардани филиал/тег дар Git, тасвирҳои алоқаманд дар реестр ба таври худкор нест карда шуданд.
  • Миқдори тасвирҳои бо барчаспҳо ва супоришҳои Git алоқамандро метавон аз рӯи шумораи тегҳои дар схемаи интихобшуда истифодашуда ва вақти эҷоди ӯҳдадории алоқаманд идора кард.

Дар маҷмӯъ, татбиқи натиҷа ниёзҳои моро қонеъ кард, аммо ба зудӣ моро мушкилоти нав интизор буд. Гап дар сари он аст, ки ҳангоми истифодаи схемаҳои барчасп дар асоси ибтидоии Git, мо ба як қатор камбудиҳо дучор шудем. (Азбаски тавсифи онҳо аз доираи ин мақола берун аст, ҳама метавонанд бо тафсилот шинос шаванд. дар ин ҷо.) Аз ин рӯ, бо тасмими гузаштан ба равиши муассиртари тегҳо (тегҳои ба мундариҷа асосёфта), мо маҷбур шудем, ки татбиқи тозакунии тасвирро аз нав дида бароем.

Алгоритми нав

Чаро? Бо барчаспҳои ба мундариҷа асосёфта, ҳар як тег метавонад ӯҳдадориҳои сершуморро дар Git қонеъ кунад. Ҳангоми тоза кардани тасвирҳо, шумо дигар тасаввур карда наметавонед танҳо аз ӯҳдадорие, ки теги нав ба реестр илова карда шудааст.

Барои алгоритми тозакунии нав, қарор дода шуд, ки аз схемаҳои барчаспҳо дурӣ ҷӯед ва бунёд кунед раванди мета-тасвир, ки ҳар яки онҳо як хӯшаи зеринро нигоҳ медоранд:

  • ӯҳдадорие, ки интишор аз рӯи он иҷро шудааст (фарқ надорад, ки тасвир илова карда шудааст, тағир дода шудааст ё дар реестри контейнерӣ бетағйир мондааст);
  • ва идентификатори дохилии мо, ки ба тасвири ҷамъшуда мувофиқ аст.

Ба ибораи дигар, таъмин карда шуд пайваст кардани барчаспҳои нашршуда бо супоришҳо дар Git.

Конфигуратсияи ниҳоӣ ва алгоритми умумӣ

Ҳангоми танзими тозакунӣ, корбарон акнун ба сиёсатҳое дастрасӣ доранд, ки тасвирҳои ҷориро интихоб мекунанд. Ҳар як чунин сиёсат муайян карда мешавад:

  • истинодҳои зиёде, яъне. Тегҳои Git ё шохаҳои Git, ки ҳангоми сканер истифода мешаванд;
  • ва маҳдудияти тасвирҳои ҷустуҷӯшуда барои ҳар як истинод аз маҷмӯи.

Барои нишон додани он, конфигуратсияи сиёсати пешфарз ин аст, ки чунин ба назар мерасад:

cleanup:
  keepPolicies:
  - references:
      tag: /.*/
      limit:
        last: 10
  - references:
      branch: /.*/
      limit:
        last: 10
        in: 168h
        operator: And
    imagesPerReference:
      last: 2
      in: 168h
      operator: And
  - references:  
      branch: /^(main|staging|production)$/
    imagesPerReference:
      last: 10

Ин конфигуратсия дорои се сиёсатест, ки ба қоидаҳои зерин мувофиқат мекунанд:

  1. Тасвирро барои 10 барчаспҳои охирини Git захира кунед (аз рӯи санаи таъсиси барчасп).
  2. На бештар аз 2 тасвири дар ҳафтаи охир нашршударо барои на бештар аз 10 ришта бо фаъолият дар ҳафтаи охир захира кунед.
  3. 10 тасвирро барои филиалҳо захира кунед main, staging и production.

Алгоритми ниҳоӣ ба қадамҳои зерин поён меёбад:

  • Гирифтани манифестҳо аз феҳристи контейнер.
  • Ба истиснои тасвирҳое, ки дар Kubernetes истифода мешаванд, зеро Мо аллакай онҳоро тавассути пурсиш дар API K8s пешакӣ интихоб кардаем.
  • Сканкунии таърихи Git ва истисно кардани тасвирҳо дар асоси сиёсатҳои муайян.
  • Хориҷ кардани тасвирҳои боқимонда.

Ба мисоли мо бармегардем, ин бо werf рӯй медиҳад:

Проблемаи тозакунии «ақлонаи» тасвирҳои контейнер ва ҳалли он дар werf

Аммо, ҳатто агар шумо werf-ро истифода набаред, равиши шабеҳ ба тозакунии пешрафтаи тасвир - дар ин ё он татбиқ (мувофиқи равиши бартарӣ барои барчаспкунии тасвир) - метавонад ба дигар системаҳо/утилитҳо татбиқ карда шавад. Барои ин кифоя аст, ки мушкилоти ба миён омадаро ба ёд оред ва он имкониятҳоро дар стеки худ пайдо кунед, ки ба шумо имкон медиҳанд ҳалли онҳоро то ҳадди имкон осонтар муттаҳид кунед. Умедворем, ки роҳи тайкардаи мо ба шумо кӯмак мекунад, ки ба парвандаи мушаххаси худ бо тафсилот ва андешаҳои нав назар кунед.

хулоса

  • Дер ё зуд, аксари дастаҳо бо мушкилоти пур кардани сабти ном дучор мешаванд.
  • Хангоми чустучуи роххо пеш аз хама меъёрхои мувофик будани тасвирро муайян кардан лозим аст.
  • Асбобҳое, ки аз ҷониби хадамоти маъмули феҳристи контейнерҳо пешниҳод карда мешаванд, ба шумо имкон медиҳанд, ки тозакунии хеле соддаро ташкил кунед, ки "ҷаҳони беруна" -ро ба назар намегирад: тасвирҳои дар Кубернетес истифодашуда ва хусусиятҳои ҷараёнҳои кории даста.
  • Алгоритми чандир ва муассир бояд фаҳмиши равандҳои CI/CD дошта бошад ва на танҳо бо маълумоти тасвири Docker кор кунад.

PS

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ