Якҷоякунии 3-роҳа ба werf: ҷойгиркунӣ ба Kubernetes бо Helm "дар стероидҳо"

Он чизе, ки мо (на танҳо мо) муддати тӯлонӣ интизор будем, рӯй дод: верф, утилитаи кушодаасоси мо барои сохтани барномаҳо ва расонидани онҳо ба Kubernetes, ҳоло татбиқи тағиротро бо истифода аз часбҳои якҷоякунии 3-ро дастгирӣ мекунад! Илова бар ин, метавон захираҳои мавҷудаи K8s-ро ба релизҳои Helm бидуни барқарор кардани ин захираҳо қабул кард.

Якҷоякунии 3-роҳа ба werf: ҷойгиркунӣ ба Kubernetes бо Helm "дар стероидҳо"

Агар он хеле кӯтоҳ бошад, пас мо мегузорем WERF_THREE_WAY_MERGE=enabled — мо ҷойгиркунии «чунон ки дар kubectl apply", бо насбҳои мавҷудаи Helm 2 ва ҳатто каме бештар мувофиқ аст.

Аммо биёед аз назария оғоз кунем: часбҳои 3-роҳи якҷоя чист, одамон чӣ гуна равиши тавлиди онҳоро пайдо карданд ва чаро онҳо дар равандҳои CI/CD бо инфрасохтори Кубернетес муҳиманд? Ва пас аз он, биёед бубинем, ки якҷоякунии 3-роҳ дар werf чист, кадом режимҳо бо нобаёнӣ истифода мешаванд ва чӣ гуна онро идора кардан мумкин аст.

Ямоқи 3-роҳи якҷоя чист?

Пас, биёед аз вазифаи паҳн кардани захираҳои дар манифестҳои YAML тавсифшуда ба Kubernetes оғоз кунем.

Барои кор бо захираҳо API Kubernetes амалҳои асосии зеринро пешниҳод мекунад: эҷод кардан, часб кардан, иваз кардан ва нест кардан. Тахмин меравад, ки бо кӯмаки онҳо ба кластер интиқоли мунтазами қулайи захираҳо зарур аст. Чӣ хел?

фармонҳои императивии kubectl

Равиши аввал барои идоракунии объектҳо дар Kubernetes истифодаи фармонҳои императивии kubectl барои эҷод, тағир додан ва нест кардани ин объектҳо мебошад. Оддӣ карда гӯем:

  • даста kubectl run шумо метавонед ҷойгиркунӣ ё корро иҷро кунед:
    kubectl run --generator=deployment/apps.v1 DEPLOYMENT_NAME --image=IMAGE
  • даста kubectl scale — тағир додани шумораи нусхаҳо:
    kubectl scale --replicas=3 deployment/mysql
  • ва ғайра.

Ин равиш дар назари аввал қулай менамояд. Бо вуҷуди ин, мушкилот вуҷуд доранд:

  1. Ин душвор аст автоматиконида шавад.
  2. чи тавр конфигуратсияро инъикос мекунад дар Гит? Тағйироте, ки дар кластер рух медиҳанд, чӣ гуна бояд баррасӣ кард?
  3. Чӣ тавр таъмин кардан такроршавандагӣ конфигуратсияҳо дар бозоғоз?
  4. ...

Равшан аст, ки ин равиш бо нигоҳ доштани барнома ва инфрасохтор ҳамчун код (IaC; ё ҳатто) мувофиқат намекунад. GitOps ҳамчун як варианти муосиртар, дар экосистемаи Kubernetes маъруфият пайдо мекунад). Аз ин рӯ, ин фармонҳо дар kubectl рушди минбаъдаро қабул накарданд.

Эҷод, гирифтан, иваз ва нест кардани амалиёт

Бо ибтидоӣ офариниш Ин оддӣ аст: манифестро ба амалиёт фиристед create кубе api ва ресурс ба вучуд оварда шудааст. Намоиши YAML-и манифест метавонад дар Git нигоҳ дошта шавад ва бо истифода аз фармон эҷод карда шавад kubectl create -f manifest.yaml.

С бартараф кардан низ оддӣ: ҳамонро иваз кунед manifest.yaml аз Git ба даста kubectl delete -f manifest.yaml.

Амалиёт replace ба шумо имкон медиҳад, ки конфигуратсияи захираҳоро бо конфигуратсияи нав, бидуни аз нав сохтани захира комилан иваз кунед. Ин маънои онро дорад, ки пеш аз ворид кардани тағирот ба захира, дархост кардани версияи ҷорӣ бо амалиёт мантиқист get, онро тағир диҳед ва бо амалиёт навсозӣ кунед replace. apiserver kube сохта шудааст бастани оптимистӣ ва агар пас аз ҷарроҳӣ get объект тагьир ёфт, пас амалиёт replace он кор намекунад.

Барои нигоҳ доштани конфигуратсия дар Git ва навсозии он бо истифода аз иваз, шумо бояд амалиётро иҷро кунед get, конфигуратсияро аз Git бо он чизе, ки мо гирифтаем, якҷоя кунед ва иҷро кунед replace. Бо нобаёнӣ, kubectl танҳо ба шумо имкон медиҳад, ки фармонро истифода баред kubectl replace -f manifest.yamlки дар manifest.yaml — манифести аллакай пурра омодашуда (дар ҳолати мо, якҷояшуда), ки бояд насб карда шавад. Маълум мешавад, ки корбар бояд манифестҳои муттаҳидшударо амалӣ созад ва ин кори ночиз нест...

Хаминро хам кайд кардан бамаврид аст, ки гарчанде manifest.yaml ва дар Git нигоҳ дошта мешавад, мо наметавонем пешакӣ донем, ки оё эҷод кардани объект ё навсозии он зарур аст - ин бояд тавассути нармафзори корбар анҷом дода шавад.

Њамагї: мо метавонем як rollout муттасил созем танҳо бо истифода аз эҷод, иваз ва нест кардан, кафолат додани он, ки конфигуратсияи инфрасохтор дар Git дар якҷоягӣ бо рамз ва CI/CD қулай нигоҳ дошта мешавад?

Принсипи мо метавонем... Барои ин ба шумо лозим меояд, ки амалиёти якҷоякуниро амалӣ кунед манифестҳо ва як навъ ҳатмӣ, ки:

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

Ҳангоми навсозӣ, лутфан қайд кунед захира метавонад тағйир ёбад аз охир get ва ба таври худкор ҳолати бастани оптимистиро ҳал кунед - кӯшишҳои такрории навсозӣ кунед.

Аммо, чаро чархро дубора ихтироъ кунед, вақте ки kube-apiserver роҳи дигари навсозии захираҳоро пешниҳод мекунад: амалиёт patch, ки корбарро аз баъзе мушкилоти тавсифшуда озод мекунад?

дарбеҳ

Акнун мо ба лавҳаҳо меравем.

Часбҳо роҳи асосии татбиқи тағирот ба объектҳои мавҷуда дар Kubernetes мебошанд. Амалиёт patch он чунин кор мекунад:

  • корбари kube-apiserver бояд дар шакли JSON ямоқи фиристад ва объектро муайян кунад,
  • ва худи apiserver бо ҳолати кунунии объект сарукор дорад ва онро ба шакли зарурӣ меорад.

Дар ин ҳолат бастани оптимистӣ талаб карда намешавад. Ин амалиёт назар ба иваз кардан бештар декларативӣ аст, гарчанде ки дар аввал он метавонад ба таври дигар ба назар расад.

Бо ин роҳ:

  • бо истифода аз амалиёт create мо мувофиқи манифест аз Git объект эҷод мекунем,
  • бо кӯмаки delete — нест кунед, агар объект дигар лозим набошад,
  • бо кӯмаки patch — мо объектро иваз карда, онро ба шакли дар Гит тавсифшуда меорем.

Аммо, барои ин, шумо бояд эҷод кунед лавҳаи дуруст!

Чӣ тавр часпакҳо дар Helm 2 кор мекунанд: 2-якҷоякунӣ

Вақте ки шумо бори аввал релизро насб мекунед, Helm амалиётро иҷро мекунад create барои захираҳои диаграмма.

Ҳангоми навсозии версияи Helm барои ҳар як манбаъ:

  • ямоқи байни версияи манбаъ аз диаграммаи қаблӣ ва версияи ҷории диаграммаро баррасӣ мекунад,
  • ин патчро татбиқ мекунад.

Мо ин пачкаро даъват мекунем Ямоқи якҷоякунии 2-роҳ, зеро дар офаридани он 2 манифест иштирок дорад:

  • манифести манифест аз нашри қаблӣ,
  • манифести манбаъ аз манбаи ҷорӣ.

Ҳангоми бартараф кардани амалиёт delete apiserver дар kube барои захираҳое даъват карда мешавад, ки дар версияи қаблӣ эълом шуда буданд, аммо дар версияи ҷорӣ эълом нашудаанд.

Муносибати 2-роҳи якҷоякунии часпак мушкилот дорад: он ба он оварда мерасонад бо ҳолати воқеии манбаъ дар кластер ва манифест дар Git ҳамоҳанг нест.

Тасвири мушкилот бо мисол

  • Дар Git, диаграмма манифестеро, ки дар он майдон ҷойгир аст, нигоҳ медорад image Масъалаҳои ҷойгиркунӣ ubuntu:18.04.
  • Истифодабаранда тавассути kubectl edit арзиши ин майдонро ба тағйир дод ubuntu:19.04.
  • Ҳангоми аз нав ҷойгиркунии диаграммаи Helm пачка тавлид намекунад, зеро майдон image дар версияи қаблии нашр ва дар диаграммаи ҷорӣ якхелаанд.
  • Пас аз ҷойгиркунии дубора image бощимонда ubuntu:19.04, гарчанде ки диаграмма гуфта мешавад ubuntu:18.04.

Мо десинхронизатсия кардем ва декларативиро аз даст додем.

Манбаи ҳамоҳангшуда чист?

Одатан сухан мегӯянд пурра Ба даст овардани мувофиқат байни манифести манбаъ дар кластери иҷрошаванда ва манифест аз Git ғайриимкон аст. Зеро дар манифести воқеӣ метавонад эзоҳҳо/тамғаҳои хидматӣ, контейнерҳои иловагӣ ва дигар маълумоте бошанд, ки аз ҷониби баъзе контроллерҳо динамикӣ аз манбаъ илова ва хориҷ карда мешаванд. Мо наметавонем ва намехоҳем ин маълумотро дар Git нигоҳ дорем. Бо вуҷуди ин, мо мехоҳем, ки майдонҳое, ки мо дар Git ба таври возеҳ нишон додаем, ҳангоми паҳнкунӣ арзишҳои мувофиқро гиранд.

Ин хеле умумӣ мегардад Қоидаи захираҳои ҳамоҳангшуда: ҳангоми паҳн кардани манбаъ, шумо метавонед танҳо он майдонҳоеро, ки дар манифест аз Git ба таври возеҳ нишон дода шудаанд, тағир диҳед ё нест кунед (ё дар версияи қаблӣ нишон дода шуда буданд ва ҳоло нест карда шудаанд).

Ямоқи якҷоякунии 3-роҳ

Ҳадафи асосӣ Ямоқи якҷоякунии 3-роҳ: мо дар байни версияи охирини татбиқшудаи манифест аз Git ва версияи мақсадноки манифест аз Git, бо дарназардошти версияи ҷории манифест аз кластери иҷрошаванда пачка тавлид мекунем. Ямоқи натиҷавӣ бояд ба қоидаи захираҳои ҳамоҳангшуда мувофиқат кунад:

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

Маҳз аз рӯи ин принсип он часпакҳоро тавлид мекунад kubectl apply:

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

Ҳоло, ки мо назарияро ҷудо кардем, вақти он расидааст, ки ба шумо бигӯем, ки мо дар werf чӣ кор кардем.

Татбиқи тағйирот ба werf

Пештар, werf, ба монанди Helm 2, часбҳои 2-роҳи якҷояро истифода мебурд.

Пахши таъмир

Барои гузаштан ба намуди нави часпакҳо - 3-якҷоякунӣ - қадами аввал мо ба истилоҳро ҷорӣ кардем. таъмири лавҳаҳо.

Ҳангоми ҷобаҷогузорӣ, ямоқи стандартии якҷоякунии 2-роҳӣ истифода мешавад, аммо werf ба таври илова ямоқи тавлид мекунад, ки ҳолати воқеии манбаро бо он чизе, ки дар Git навишта шудааст ҳамоҳанг созад (чунин патч бо истифода аз ҳамон қоидаи захираҳои ҳамоҳангшудаи дар боло тавсифшуда сохта мешавад) .

Агар синхронизатсия рух диҳад, дар охири ҷойгиркунӣ корбар Огоҳӣ бо паёми мувофиқ ва часбе мегирад, ки бояд барои ба шакли ҳамоҳангшуда интиқол додани манбаъ татбиқ карда шавад. Ин патч низ дар тафсири махсус сабт шудааст werf.io/repair-patch. Тахмин меравад, ки дасти истифодабарандагон сам ин патчро татбиқ хоҳад кард: werf онро умуман татбиқ намекунад.

Эҷоди часбҳои таъмирӣ як тадбири муваққатӣ мебошад, ки ба шумо имкон медиҳад, ки эҷоди часбҳоро дар асоси принсипи 3-роҳ-якҷоякунӣ воқеан санҷед, аммо ин часбҳоро ба таври худкор татбиқ накунед. Дар айни замон, ин режими корӣ бо нобаёнӣ фаъол аст.

Ямоқи 3-роҳи якҷоякунӣ танҳо барои релизҳои нав

Аз 1 декабри соли 2019 версияҳои бета ва алфа werf оғоз мешаванд бо нобаёнӣ часбҳои мукаммали 3-роҳи якҷояро истифода баред, то тағиротро танҳо ба версияҳои нави Helm, ки тавассути werf бароварда шудаанд, татбиқ кунед. Варақаҳои мавҷуда усули якҷоякунии 2-роҳӣ + часбҳои таъмирро идома медиҳанд.

Ин реҷаи кориро метавон ба таври возеҳ тавассути танзим фаъол кард WERF_THREE_WAY_MERGE_MODE=onlyNewReleases ҳозир.

эрод гирифтан: хусусият дар werf зиёда аз якчанд нашрияҳо пайдо шуд: дар канали алфа он бо версия омода шуд v1.0.5-alpha.19, ва дар канали бета - бо v1.0.4-beta.20.

Ямоқи 3-роҳи муттаҳидшавӣ барои ҳама релизҳо

Аз 15 декабри соли 2019, версияҳои бета ва алфа-и werf ба таври нобаёнӣ ба истифодаи часбҳои пурраи 3-роҳӣ оғоз мекунанд, то тағиротро ба ҳама нашрияҳо татбиқ кунанд.

Ин реҷаи кориро метавон ба таври возеҳ тавассути танзим фаъол кард WERF_THREE_WAY_MERGE_MODE=enabled ҳозир.

Бо автоматизатсияи захираҳо чӣ бояд кард?

Дар Kubernetes 2 намуди автоматизатсия вуҷуд дорад: HPA (уфуқӣ) ва VPA (вертикалӣ).

Уфуқӣ ба таври худкор шумораи репликаҳо, амудӣ - шумораи захираҳоро интихоб мекунад. Ҳам шумораи нусхаҳо ва ҳам талаботи захираҳо дар манифести манбаъҳо нишон дода шудаанд (ниг. Манифести захираҳо). spec.replicas ё spec.containers[].resources.limits.cpu, spec.containers[].resources.limits.memory и другие).

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

Ду роҳи ҳалли мушкилот вуҷуд дорад. Барои оғоз кардан, беҳтар аст, ки дар манифести диаграмма ба таври возеҳ нишон додани арзишҳои автоматиконидашуда худдорӣ кунед. Агар ин хосият бо ягон сабаб мувофиқ набошад (масалан, барои муқаррар кардани маҳдудияти захираҳои ибтидоӣ ва шумораи такрорҳо дар диаграмма қулай аст), пас werf эзоҳҳои зеринро пешниҳод мекунад:

  • werf.io/set-replicas-only-on-creation=true
  • werf.io/set-resources-only-on-creation=true

Агар чунин тавзеҳот мавҷуд бошад, werf арзишҳои мувофиқро дар ҳар як ҷойгиркунӣ аз нав танзим намекунад, балки онҳоро танҳо ҳангоми эҷоди манбаъ муқаррар мекунад.

Барои тафсилоти бештар, ба ҳуҷҷатҳои лоиҳа нигаред HPA и VPA.

Истифодаи ямоқи 3-роҳи якҷояро манъ кунед

Дар айни замон корбар метавонад истифодаи часбҳои навро дар werf бо истифода аз тағирёбандаи муҳити зист манъ кунад WERF_THREE_WAY_MERGE_MODE=disabled. Бо вуҷуди ин, оғоз Аз 1 марти соли 2020 ин мамнӯъ дигар амал намекунад. ва он танҳо имконпазир аст, ки часбҳои 3-роҳи якҷояро истифода баранд.

Қабули захираҳо дар werf

Азхуд кардани усули татбиқи тағирот бо часбчаҳои 3-роҳи якҷоякунӣ ба мо имкон дод, ки фавран чунин хусусиятро ба мисли қабули захираҳои дар кластер мавҷудбуда ба релизҳои Helm татбиқ кунем.

Helm 2 мушкилот дорад: шумо наметавонед ба манифестҳои диаграмма, ки аллакай дар кластер мавҷуд аст, бе аз нав сохтани ин манбаъ захира илова кунед (ниг. #6031, #3275). Мо ба werf таълим додем, ки захираҳои мавҷударо барои озод қабул кунанд. Барои ин ба шумо лозим аст, ки эзоҳро дар версияи ҷории манбаъ аз кластери иҷрошаванда насб кунед (масалан, бо истифода аз kubectl edit):

"werf.io/allow-adoption-by-release": RELEASE_NAME

Ҳоло захира бояд дар диаграмма тавсиф карда шавад ва дафъаи оянда werf релизро бо номи мувофиқ ҷойгир мекунад, манбаи мавҷуда ба ин нашрия қабул карда мешавад ва таҳти назорати он мемонад. Ғайр аз он, дар ҷараёни қабули манбаъ барои озодкунӣ, werf ҳолати кунунии захираро аз кластери иҷрошаванда ба ҳолати дар диаграмма тавсифшуда бо истифода аз ҳамон часбҳои якҷоякунии 3-роҳ ва қоидаҳои ҳамоҳангшудаи захираҳо меорад.

эрод гирифтан: танзим WERF_THREE_WAY_MERGE_MODE ба қабули захираҳо таъсир намерасонад - дар сурати қабул, ямоқи 3-роҳ ҳамеша истифода мешавад.

Тафсилот - дар хуччатхо.

Хулоса ва нақшаҳои оянда

Умедворам, ки пас аз ин мақола маълум шуд, ки часбҳои 3-роҳи якҷоя чист ва чаро онҳо ба онҳо омадаанд. Аз нуқтаи назари амалии таҳияи лоиҳаи werf, татбиқи онҳо як қадами дигар дар самти такмил додани ҷойгиркунии Helm буд. Акнун шумо метавонед мушкилоти ҳамоҳангсозии конфигуратсияро фаромӯш кунед, ки аксар вақт ҳангоми истифодаи Helm 2 ба миён меоянд. Ҳамзамон, ба версияи Helm хусусияти нави муфиди қабули захираҳои аллакай зеркашидашудаи Kubernetes илова карда шуд.

Ҳанӯз баъзе масъалаҳо ва мушкилот бо ҷойгиркунии ба Helm монанд мавҷуданд, ба монанди истифодаи қолибҳои Go, ки мо онҳоро ҳаллу фасл хоҳем кард.

Маълумот дар бораи усулҳои навсозии захираҳо ва қабули онро низ дар ин ҷо пайдо кардан мумкин аст ин саҳифаи ҳуҷҷат.

Руль 3

Шоёни кайди махсус озод карда шуд танҳо рӯзи дигар як версияи нави асосии Helm - v3 - он инчунин часбҳои 3-ро муттаҳид мекунад ва аз Тиллер халос мешавад. Версияи нави Helm талаб мекунад муҳоҷират насбҳои мавҷуда барои табдил додани онҳо ба формати нави нигаҳдории озод.

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

Аммо, гузариши werf ба коди Helm 3 ногузир аст ва дар ояндаи наздик рӯй хоҳад дод. Эҳтимол, ин werf 1.1 ё werf 1.2 хоҳад буд (дар айни замон версияи асосии werf 1.0 аст; барои маълумоти бештар дар бораи дастгоҳи версияи werf, нигаред ба дар ин ҷо). Дар ин муддат Хелм 3 барои мӯътадил шудан вақт хоҳад дошт.

PS

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

Манбаъ: will.com

Илова Эзоҳ