Моје име је Дмитриј Сугробов, ја сам програмер у Лерои Мерлин-у. У овом чланку ћу вам рећи зашто је Хелм потребан, како поједностављује рад са Кубернетес-ом, шта се променило у трећој верзији и како да га користите за ажурирање апликација у производњи без застоја.
Лерои Мерлин је лидер на малопродајном тржишту "уради сам" у Русији и Европи. Наша компанија има више од сто програмера, 33 интерних запослених и огроман број људи који посећују хипермаркете и веб страницу. Да бисмо их све учинили срећним, одлучили смо да следимо стандардне приступе у индустрији. Развити нове апликације користећи микросервисну архитектуру; користите контејнере да изолујете окружење и обезбедите правилну испоруку; и користите Кубернетес за оркестрацију. Цена коришћења оркестратора убрзано постаје јефтинија: број инжењера који познају ову технологију расте на тржишту, а појављују се провајдери који нуде Кубернетес као услугу.
Све што Кубернетес ради, наравно, може да се уради и на друге начине, на пример, прекривањем неких Џенкинса и доцкер-цомпосеа скриптама, али чему компликовати живот ако постоји готово и поуздано решење? Зато смо дошли у Кубернетес и већ годину дана га користимо у производњи. Тренутно имамо двадесет четири Кубернетес кластера, од којих је најстарији стар више од годину дана, са око две стотине махуна.
Проклетство великих ИАМЛ датотека у Кубернетесу
Да бисмо покренули микросервис у Кубернетес-у, креираћемо најмање пет ИАМЛ датотека: за Деплоимент, Сервице, Ингресс, ЦонфигМап, Сецретс - и послати их у кластер. За следећу апликацију ћемо написати исти пакет јамба, са трећом ћемо написати још један, и тако даље. Ако помножимо број докумената са бројем окружења, већ ћемо добити стотине датотека, а то још не узима у обзир динамичка окружења.
Опција функционише, али морате више пута копирати ИАМЛ датотеке. Да би се променио овај циклус, измишљен је Хелм.
Шта је Хелм
Прво, Хелм - менаџер пакета, који вам помаже да пронађете и инсталирате програме који су вам потребни. Да бисте инсталирали, на пример, МонгоДБ, не морате да идете на званичну веб локацију и преузимате бинарне датотеке, само покрените команду helm install stable/mongodb.
Друго, Хелм - шаблон мотора, помаже да се параметризују датотеке. Вратимо се на ситуацију са ИАМЛ датотекама у Кубернетесу. Лакше је написати исту ИАМЛ датотеку, додати јој неке чуваре места, у које ће Хелм заменити вредности. Односно, уместо великог скупа скела, постојаће скуп шаблона у које ће тражене вредности бити замењене у право време.
Треће, Хелм - мајстор распоређивања. Помоћу њега можете инсталирати, вратити и ажурирати апликације. Хајде да схватимо како то да урадимо.
Како користити Хелм за постављање сопствених апликација
Хајде да инсталирамо Хелм клијент на ваш рачунар, пратећи званични инструкције. Затим ћемо креирати скуп ИАМЛ датотека. Уместо специфицирања специфичних вредности, оставићемо чуваре места, које ће Хелм у будућности попуњавати информацијама. Скуп таквих датотека назива се Хелм графикон. Може се послати клијенту Хелм конзоле на три начина:
означите фасциклу са шаблонима;
спакујте архиву у .тар и покажите на њу;
ставите шаблон у удаљено спремиште и додајте везу до спремишта у Хелм клијенту.
Такође вам је потребна датотека са вредностима - валуес.иамл. Подаци одатле ће бити уметнути у шаблон. Хајде да и то створимо.
Друга верзија Хелм-а има додатну серверску апликацију - Тиллер. Виси ван Кубернетес-а и чека на захтеве Хелм клијента, а када се позове, замењује потребне вредности у шаблон и шаље га Кубернетес-у.
Хелм 3 је једноставнији: уместо обраде шаблона на серверу, информације се сада у потпуности обрађују на страни Хелм клијента и шаљу директно у Кубернетес АПИ. Ово поједностављење побољшава безбедност кластера и олакшава шему увођења.
Како то све функционише
Покрените команду helm install. Хајде да означимо име издања апликације и дамо путању до вредности.иамл. На крају ћемо навести спремиште у коме се налази графикон и назив графикона. У примеру, то су „лмру“ и „бестцхарт“, респективно.
Команда се може извршити само једном, када се поново изврши install треба користити upgrade. Ради једноставности, уместо две команде, можете покренути команду upgrade са додатним кључем --install. Када се изврши први пут, Хелм ће послати команду за инсталирање издања и ажурираће га у будућности.
У овом тренутку приче, играм се са публиком Ко жели да буде милионер, а ми смишљамо како да натерамо Хелма да ажурира верзију апликације. Погледајте видео.
Када сам учио како Хелм функционише, изненадило ме је чудно понашање када сам покушавао да ажурирам верзије покренутих апликација. Ажурирао сам код апликације, поставио нову слику у Доцкер регистар, послао команду за примену - и ништа се није догодило. Испод су неки не сасвим успешни начини за ажурирање апликација. Детаљније проучавајући сваки од њих, почињете да разумете унутрашњу структуру инструмента и разлоге за ово неочигледно понашање.
Метод 1. Не мењајте информације од последњег покретања
Како пише званични сајт Хелм, „Кубернетес графикони могу бити велики и сложени, тако да Хелм покушава да ништа не додирује превише. Стога, ако ажурирате најновију верзију слике апликације у доцкер регистру и покренете команду helm upgrade, онда се ништа неће догодити. Хелм ће мислити да се ништа није променило и да нема потребе да шаље наредбу Кубернетесу да ажурира апликацију.
Овде и испод, најновија ознака је приказана искључиво као пример. Када наведете ову ознаку, Кубернетес ће преузети слику из доцкер регистра сваки пут, без обзира на параметар имагеПуллПолици. Коришћење најновије у производњи је непожељно и изазива нежељене ефекте.
Метод 2. Ажурирајте ЛАБЕЛ на слици
Како је написано у истом документација, „Хелм ће ажурирати апликацију само ако се променила од последњег издања.“ Чини се да је логична опција за ово ажурирање ЛАБЕЛ-а у самој доцкер слици. Међутим, Хелм не гледа у слике апликације и нема појма о било каквим променама на њима. Сходно томе, приликом ажурирања ознака на слици, Хелм неће знати за њих, а команда за ажурирање апликације неће бити послата Кубернетесу.
Метод 3: Користите кључ --force
Хајде да се окренемо приручницима и потражимо потребан кључ. Кључ има највише смисла --force. Упркос очигледном имену, понашање је другачије од очекиваног. Уместо присилног ажурирања апликације, његова права сврха је да врати издање које је у статусу ФАИЛЕД. Ако не користите овај тастер, потребно је да извршите команде узастопно helm delete && helm install --replace. Предлаже се да се уместо тога користи кључ --force, који аутоматизује секвенцијално извршавање ових команди. Више информација у овоме захтев за повлачењем. Да бисте рекли Хелму да ажурира верзију апликације, нажалост, овај кључ неће радити.
Метод 4. Промените ознаке директно у Кубернетесу
Ажурирање ознаке директно у кластеру помоћу команде kubectl edit - Лоша идеја. Ова радња ће довести до недоследности информација између покренуте апликације и оне која је првобитно послата на примену. Понашање Хелм-а током примене у овом случају се разликује од његове верзије: Хелм 2 неће урадити ништа, а Хелм 3 ће применити нову верзију апликације. Да бисте разумели зашто, морате разумети како Хелм функционише.
Како Хелм функционише?
Да би утврдио да ли се апликација променила од последњег издања, Хелм може да користи:
покретање апликације у Кубернетесу;
нове вредности.иамл и тренутни графикон;
Хелмове интерне информације о издању.
За оне знатижељније: где Хелм чува интерне информације о издањима?Извршавањем команде helm history, добићемо све информације о верзијама инсталираним помоћу Хелм-а.
Ту су и детаљне информације о послатим шаблонима и вредностима. Можемо затражити:
У другој верзији Хелм-а, ове информације се налазе у истом именском простору где је покренут Тиллер (подразумевано кубе-систем), у ЦонфигМап-у, означеном ознаком „ОВНЕР=ТИЛЛЕР“:
Када се појавила трећа верзија Хелм-а, информације су се преселиле у тајне, иу исти простор имена где је апликација била покренута. Захваљујући томе, постало је могуће покренути неколико апликација истовремено у различитим именским просторима са истим именом издања. У другој верзији то је била озбиљна главобоља када су простори имена изоловани, али могу утицати једни на друге.
Други Хелм, када покушава да схвати да ли је потребно ажурирање, користи само два извора информација: оно што му се сада пружа и интерне информације о издањима, које се налазе у ЦонфигМап-у.
Трећи Хелм користи тросмерну стратегију спајања: поред тих информација, узима у обзир и апликацију која је тренутно покренута у Кубернетесу.
Из тог разлога, стара верзија Хелм-а неће учинити ништа, јер не узима у обзир информације о апликацији у кластеру, али ће Хелм 3 примити измене и послати нову апликацију на примену.
Метод 5. Користите прекидач --рецреате-подс
Са кључем --recreate-pods можете постићи оно што сте првобитно планирали да постигнете помоћу кључа --force. Контејнери ће се поново покренути и, у складу са политиком имагеПуллПолици: Увек за најновију ознаку (више о томе у горњој фусноти), Кубернетес ће преузети и покренути нову верзију слике. Ово неће бити урађено на најбољи начин: без узимања у обзир СтратегиТипе имплементације, нагло ће искључити све старе инстанце апликације и почети да покреће нове. Током поновног покретања, систем неће радити, корисници ће патити.
У самом Кубернетесу, сличан проблем је такође постојао дуго времена. И сада, 4 године након отварања Питање, проблем је решен, а почевши од верзије 1.15 Кубернетеса, појављује се могућност поновног покретања подова.
Хелм једноставно искључује све апликације и покреће нове контејнере у близини. Не можете то да урадите у продукцији, како не бисте изазвали прекид рада апликације. Ово је потребно само за развојне потребе и може се изводити само у сценским окружењима.
Како ажурирати верзију апликације користећи Хелм?
Променићемо вредности које су послате Хелму. Обично су то вредности које се замењују уместо ознаке слике. У случају најновијег, који се често користи за непродуктивна окружења, променљива информација је напомена, која је бескорисна за сам Кубернетес, а за Хелм ће деловати као сигнал за потребу ажурирања апликације. Опције за попуњавање вредности напомене:
Случајна вредност користећи стандардну функцију - {{ randAlphaNum 6 }}.
Постоји упозорење: након сваке примене помоћу графикона са таквом променљивом, вредност напомене ће бити јединствена, а Хелм ће претпоставити да постоје промене. Испоставило се да ћемо увек поново покренути апликацију, чак и ако нисмо променили њену верзију. Ово није критично, јер неће бити застоја, али је и даље непријатно.
Залепите струју Датум и време - {{ .Release.Date }}.
Варијанта је слична случајној вредности са трајно јединственом променљивом.
Исправнији начин је употреба контролне суме. Ово је СХА слике или СХА последњег урезивања у гит-у - {{ .Values.sha }}.
Требаће их пребројати и послати Хелм клијенту на страни која позива, на пример у Џенкинсу. Ако се апликација променила, онда ће се променити контролни збир. Стога ће Хелм ажурирати апликацију само када је то потребно.
Хајде да сумирамо наше покушаје
Хелм прави промене на најмање инвазиван начин, тако да било каква промена на нивоу слике апликације у Доцкер регистру неће резултирати ажурирањем: ништа се неће догодити након што се наредба изврши.
Кључ --force користи се за враћање проблематичних издања и није повезан са принудним ажурирањима.
Кључ --recreate-pods ће насилно ажурирати апликације, али ће то учинити на вандалски начин: нагло ће искључити све контејнере. Корисници ће патити од овога; то не би требало да радите у производњи.
Директно извршите измене у Кубернетес кластеру користећи команду kubectl edit немојте: нарушићемо доследност, а понашање ће се разликовати у зависности од верзије Хелма.
Са издавањем нове верзије Хелм-а, појавиле су се многе нијансе. Проблеми у Хелм репозиторијуму су описани јасним језиком, они ће вам помоћи да разумете детаље.
Додавање напомене за уређивање графикону учиниће га флексибилнијим. Ово ће вам омогућити да правилно покренете апликацију, без застоја.
Мисао „светског мира“ која функционише у свим областима живота: прочитајте упутства пре употребе, а не после. Само уз потпуне информације биће могуће изградити поуздане системе и усрећити кориснике.