Helm құрылғысы және оның қателері

Helm құрылғысы және оның қателері
Typhon жүк тасымалдаушы тұжырымдамасы, Антон Свейнпол

Менің атым Дмитрий Сугробов, мен Лерой Мерлинде әзірлеушімін. Бұл мақалада мен сізге Helm не үшін қажет екенін, ол Kubernetes-пен жұмысты қалай жеңілдететінін, үшінші нұсқада не өзгергенін және оны тоқтаусыз өндірістегі қолданбаларды жаңарту үшін қалай пайдалану керектігін айтамын.

Бұл конференцияда сөйлеген сөзіне негізделген түйіндеме @Kubernetes конференциясы by Mail.ru бұлтты шешімдері — оқығыңыз келмесе, бейнені қараңыз.

Неліктен біз Кубернеттерді өндірісте қолданамыз

Лерой Мерлин - Ресей мен Еуропадағы DIY бөлшек сауда нарығында көшбасшы. Біздің компанияда жүзден астам әзірлеушілер, 33 000 ішкі қызметкерлер және гипермаркеттер мен веб-сайтқа келетін адамдар саны көп. Олардың барлығын қуанту үшін біз салалық стандартты тәсілдерді ұстануды жөн көрдік. Микросервис архитектурасын пайдалана отырып, жаңа қосымшаларды әзірлеу; ортаны оқшаулау және дұрыс жеткізуді қамтамасыз ету үшін контейнерлерді пайдаланыңыз; және оркестр үшін Kubernetes пайдаланыңыз. Оркестрлерді пайдалану бағасы тез арзандауда: нарықта технологияны меңгерген инженерлер саны артып келеді, ал провайдерлер Kubernetes-ті қызмет ретінде ұсынып жатыр.

Кубернетес жасайтын барлық нәрселерді, әрине, басқа жолдармен жасауға болады, мысалы, кейбір Дженкинсті қамту және сценарийлермен докер құрастыру, бірақ егер дайын және сенімді шешім болса, өмірді неге қиындатады? Сондықтан біз Кубернетеске келдік және оны бір жылдан бері өндірісте қолданып жатырмыз. Қазіргі уақытта бізде жиырма төрт Kubernetes кластері бар, олардың ең ескісі бір жылдан асқан, екі жүзге жуық бүршіктері бар.

Kubernetes-тегі үлкен YAML файлдарының қарғысы

Kubernetes-те микросервисті іске қосу үшін біз кемінде бес YAML файлын жасаймыз: Орналастыру, Қызмет, Кіру, Конфигкарта, Құпиялар үшін - және оларды кластерге жібереміз. Келесі қолданба үшін біз бірдей джемб пакетін жазамыз, үшіншіден басқасын жазамыз және т.б. Құжаттардың санын орталар санына көбейтсек, біз қазірдің өзінде жүздеген файлдарды аламыз және бұл әлі динамикалық орталарды есепке алмайды.

Helm құрылғысы және оның қателері
Адам Риз, Helm компаниясының негізгі қолдаушысы, «концепциясын енгізді.Кубернетестегі даму циклі", ол келесідей көрінеді:

  1. Copy YAML - YAML файлын көшіру.
  2. YAML қойыңыз - оны қойыңыз.
  3. Fix Indents - шегіністерді түзету.
  4. Қайталау - қайтадан қайталаңыз.

Опция жұмыс істейді, бірақ YAML файлдарын бірнеше рет көшіру керек. Бұл циклді өзгерту үшін Хельм ойлап табылды.

Helm дегеніміз не

Біріншіден, Хельм - пакет менеджері, ол сізге қажет бағдарламаларды табуға және орнатуға көмектеседі. Мысалы, MongoDB орнату үшін ресми веб-сайтқа өтіп, екілік файлдарды жүктеп алудың қажеті жоқ, жай ғана пәрменді іске қосыңыз. helm install stable/mongodb.

Екіншіден, Хельм - шаблон қозғалтқышы, файлдарды параметрлеуге көмектеседі. Kubernetes-тегі YAML файлдары жағдайына оралайық. Бірдей YAML файлын жазу оңайырақ, оған Helm мәндерді алмастыратын кейбір толтырғыштарды қосыңыз. Яғни, тіректердің үлкен жиынтығының орнына қажетті мәндер қажетті уақытта ауыстырылатын үлгілер жинағы болады.

Үшіншіден, Хельм - орналастыру шебері. Оның көмегімен қолданбаларды орнатуға, кері қайтаруға және жаңартуға болады. Мұны қалай жасау керектігін анықтап көрейік.

Helm құрылғысы және оның қателері

Жеке қолданбаларды орналастыру үшін Helm қалай пайдалануға болады

Ресми нұсқау бойынша Helm клиентін компьютеріңізге орнатайық нұсқаулар. Содан кейін YAML файлдарының жинағын жасаймыз. Нақты мәндерді көрсетудің орнына, біз Helm болашақта ақпаратпен толтыратын толтырғыштарды қалдырамыз. Мұндай файлдар жиыны Helm диаграммасы деп аталады. Оны Helm консолі клиентіне үш жолмен жіберуге болады:

  • үлгілері бар қалтаны көрсетіңіз;
  • мұрағатты .tar ішіне жинап, оны көрсетіңіз;
  • үлгіні қашықтағы репозиторийге қойыңыз және Helm клиентіндегі репозиторийге сілтеме қосыңыз.

Сондай-ақ мәндері бар файл қажет - values.yaml. Сол жерден алынған деректер үлгіге енгізіледі. Оны да жасайық.

Helm құрылғысы және оның қателері
Helm-тің екінші нұсқасында қосымша серверлік қосымша бар - Tiller. Ол Kubernetes сыртында ілулі тұрады және Helm клиентінен сұрауларды күтеді және шақырылған кезде қажетті мәндерді үлгіге ауыстырады және оны Kubernetes-ке жібереді.

Helm құрылғысы және оның қателері
Helm 3 оңайырақ: серверде үлгілерді өңдеудің орнына, ақпарат толығымен Helm клиенттік жағында өңделеді және тікелей Kubernetes API-ге жіберіледі. Бұл оңайлату кластердің қауіпсіздігін жақсартады және шығару схемасын жеңілдетеді.

Мұның бәрі қалай жұмыс істейді

Пәрменді іске қосыңыз helm install. Қолданбаның шығарылымының атын көрсетейік және values.yaml жолын берейік. Соңында біз диаграмма орналасқан репозиторийді және диаграмманың атын көрсетеміз. Мысалда бұлар сәйкесінше «lmru» және «бестчарт».

helm install --name bestapp --values values.yaml lmru/bestchart

Пәрменді тек бір рет орындауға болады, оның орнына қайта орындалғанда install пайдалану қажет upgrade. Қарапайымдылық үшін екі пәрменнің орнына пәрменді орындауға болады upgrade қосымша кілтпен --install. Бірінші рет орындалған кезде, Helm шығарылымды орнату пәрменін жібереді және оны болашақта жаңартады.

helm upgrade --install bestapp --values values.yaml lmru/bestchart

Helm көмегімен қолданбаның жаңа нұсқаларын қолданудың қателері

Оқиғаның осы тұсында мен аудиториямен «Кім миллионер болғысы келеді» ойынын ойнап жатырмын және біз Helm қолданбасының нұсқасын жаңарту үшін қалай алуға болатынын анықтап жатырмыз. Бейнені қараңыз.

Мен Helm қалай жұмыс істейтінін білген кезде, іске қосылған қолданбалардың нұсқаларын жаңартуға тырысқанда, мені біртүрлі мінез-құлық таң қалдырды. Мен қолданба кодын жаңарттым, Docker тізіліміне жаңа суретті жүктеп салдым, орналастыру пәрменін жібердім - және ештеңе болмады. Төменде қолданбаларды жаңартудың мүлдем сәтті емес жолдары берілген. Олардың әрқайсысын егжей-тегжейлі зерттей отырып, сіз құралдың ішкі құрылымын және бұл айқын емес мінез-құлықтың себептерін түсіне бастайсыз.

1-әдіс. Соңғы іске қосылғаннан кейін ақпаратты өзгертпеңіз

Айтқандай ресми сайт Хельм, «Кубернетес диаграммалары үлкен және күрделі болуы мүмкін, сондықтан Хельм ештеңеге тым көп тимеуге тырысады». Сондықтан, егер сіз докер тізіліміндегі қолданба кескінінің соңғы нұсқасын жаңартып, пәрменді іске қоссаңыз helm upgrade, содан кейін ештеңе болмайды. Helm ештеңе өзгермеген деп ойлайды және қолданбаны жаңарту үшін Кубернетеске пәрмен жіберудің қажеті жоқ.

Мұнда және төменде соңғы тег тек мысал ретінде көрсетілген. Бұл тегті көрсеткенде, Kubernetes суретті imagePullPolicy параметріне қарамастан әр уақытта докер тізілімінен жүктеп алады. Соңғы өндірісті пайдалану жағымсыз және жанама әсерлерді тудырады.

2-әдіс. Кескіндегі LABEL жаңартыңыз

Бірдей жазылғандай құжаттама, “Helm қолданбаны соңғы шығарылымнан кейін өзгерген жағдайда ғана жаңартады.” Бұл үшін логикалық опция докер кескініндегі LABEL-ді жаңарту болып көрінеді. Дегенмен, Helm қолданбаның кескіндерін қарастырмайды және оларға қандай да бір өзгерістер туралы түсінігі жоқ. Тиісінше, кескіндегі белгілерді жаңартқан кезде, Helm олар туралы білмейді және қолданбаны жаңарту пәрмені Kubernetes-ке жіберілмейді.

3-әдіс: кілтті пайдаланыңыз --force

Helm құрылғысы және оның қателері
Нұсқаулықтарға жүгініп, қажетті кілтті іздейік. Кілт ең мағыналы --force. Аты-жөні анық болғанымен, мінез-құлық күткеннен өзгеше. Қолданбаны жаңартуды мәжбүрлеудің орнына оның нақты мақсаты - СӘТТІЛІК күйіндегі шығарылымды қалпына келтіру. Бұл пернені пайдаланбасаңыз, командаларды ретімен орындау керек helm delete && helm install --replace. Оның орнына кілтті пайдалану ұсынылады --force, ол осы командалардың ретімен орындалуын автоматтандырады. Бұл туралы толығырақ ақпарат сұрауды тарту. Helm-ге қолданба нұсқасын жаңартуды айту үшін, өкінішке орай, бұл кілт жұмыс істемейді.

4-әдіс. Белгілерді тікелей Kubernetes ішінде өзгертіңіз

Helm құрылғысы және оның қателері
Таңбаны тікелей кластерде пәрмен арқылы жаңарту kubectl edit - жаман ой. Бұл әрекет іске қосылған қолданба мен бастапқыда орналастыруға жіберілген арасындағы ақпараттың сәйкессіздігіне әкеледі. Бұл жағдайда орналастыру кезінде Helm әрекеті оның нұсқасынан ерекшеленеді: Helm 2 ештеңе жасамайды, ал Helm 3 қолданбаның жаңа нұсқасын орналастырады. Неліктен екенін түсіну үшін Helm қалай жұмыс істейтінін түсіну керек.

Helm қалай жұмыс істейді?

Қолданбаның соңғы шығарылымнан бері өзгергенін анықтау үшін Helm мыналарды пайдалана алады:

  • Kubernetes-те жұмыс істейтін қолданба;
  • жаңа мәндер.yaml және ағымдағы диаграмма;
  • Helm ішкі шығарылымы туралы ақпарат.

Қызықтырақ: Helm шығарылымдар туралы ішкі ақпаратты қайда сақтайды?Пәрменді орындау арқылы helm history, біз Helm көмегімен орнатылған нұсқалар туралы барлық ақпаратты аламыз.

Helm құрылғысы және оның қателері
Сондай-ақ жіберілген үлгілер мен мәндер туралы толық ақпарат бар. Біз оны сұрай аламыз:

Helm құрылғысы және оның қателері
Helm бағдарламасының екінші нұсқасында бұл ақпарат Tiller іске қосылған аттар кеңістігінде (әдепкі бойынша kube жүйесі), ConfigMap картасында «OWNER=TILLER» белгісімен белгіленген:

Helm құрылғысы және оның қателері
Helm бағдарламасының үшінші нұсқасы пайда болған кезде, ақпарат құпияларға және қолданба жұмыс істейтін бірдей аттар кеңістігіне көшті. Осының арқасында бір шығарылым атымен әртүрлі аттар кеңістігінде бірнеше қолданбаларды бір уақытта іске қосу мүмкін болды. Екінші нұсқада аттар кеңістігі оқшауланған, бірақ бір-біріне әсер ете алатын кезде бұл ауыр бас ауруы болды.

Helm құрылғысы және оның қателері

Екінші Helm жаңарту қажет пе екенін түсінуге тырысқанда, тек екі ақпарат көзін пайдаланады: қазір оған не берілген және ConfigMap ішіндегі шығарылымдар туралы ішкі ақпарат.

Helm құрылғысы және оның қателері
Үшінші Helm үш жақты біріктіру стратегиясын пайдаланады: бұл ақпаратқа қосымша, ол дәл қазір Kubernetes-те жұмыс істеп тұрған қолданбаны да ескереді.

Helm құрылғысы және оның қателері
Осы себепті Helm бағдарламасының ескі нұсқасы ештеңе жасамайды, өйткені ол кластердегі қолданба ақпаратын ескермейді, бірақ Helm 3 өзгертулерді қабылдап, жаңа қолданбаны орналастыруға жібереді.

5-әдіс. --recreate-pods қосқышын пайдаланыңыз

Кілтпен --recreate-pods кілттің көмегімен сіз бастапқыда қол жеткізуді жоспарлаған нәрсеге қол жеткізе аласыз --force. Контейнерлер қайта іске қосылады және imagePullPolicy: Әрқашан соңғы тегке арналған саясат (бұл туралы толығырақ жоғарыдағы сілтемеде) сәйкес Kubernetes суреттің жаңа нұсқасын жүктеп алып, іске қосады. Бұл ең жақсы жолмен жасалмайды: орналастырудың StrategyType түрін есепке алмағанда, ол барлық ескі қолданба даналарын кенеттен өшіріп, жаңаларын іске қоса бастайды. Қайта іске қосу кезінде жүйе жұмыс істемейді, пайдаланушылар зардап шегеді.

Кубернетестің өзінде ұқсас мәселе ұзақ уақыт бойы болды. Ал енді ашылғанына 4 жыл болды Іс, мәселе түзетілді және Kubernetes бағдарламасының 1.15 нұсқасынан бастап, қосқыштарды айналдыру-қайта іске қосу мүмкіндігі пайда болады.

Helm жай ғана барлық қолданбаларды өшіріп, жақын жерде жаңа контейнерлерді іске қосады. Қолданбаның тоқтап қалуына жол бермеу үшін оны өндірісте жасай алмайсыз. Бұл тек даму қажеттіліктері үшін қажет және тек сахналық орталарда орындалуы мүмкін.

Helm көмегімен қолданба нұсқасын қалай жаңартуға болады?

Біз Helm-ге жіберілген мәндерді өзгертеміз. Әдетте, бұл кескін тегінің орнына ауыстырылатын мәндер. Өнімсіз орталар үшін жиі қолданылатын соңғы жағдайда, өзгермелі ақпарат Кубернетестің өзі үшін пайдасыз аннотация болып табылады, ал Helm үшін ол қолданбаны жаңарту қажеттілігі туралы сигнал ретінде әрекет етеді. Аннотация мәнін толтыру опциялары:

  1. Кездейсоқ мән стандартты функцияны пайдалану - {{ randAlphaNum 6 }}.
    Ескерту бар: мұндай айнымалысы бар диаграмманы пайдаланып әрбір орналастырудан кейін аннотация мәні бірегей болады және Helm өзгерістер бар деп есептейді. Оның нұсқасын өзгертпесек те, біз әрқашан қолданбаны қайта іске қосатынымыз белгілі болды. Бұл маңызды емес, өйткені бос уақыт болмайды, бірақ бұл әлі де жағымсыз.
  2. Ағымды қою күні мен уақыты - {{ .Release.Date }}.
    Нұсқа тұрақты бірегей айнымалысы бар кездейсоқ мәнге ұқсас.
  3. Неғұрлым дұрыс әдіс - пайдалану бақылау сомалары. Бұл кескіннің SHA немесе гиттегі соңғы орындалған SHA - {{ .Values.sha }}.
    Оларды санап, қоңырау шалушы жағындағы Helm клиентіне жіберу керек, мысалы, Дженкинсте. Егер қолданба өзгерсе, бақылау сомасы өзгереді. Сондықтан Helm қолданбаны қажет болғанда ғана жаңартады.

Талпыныстарымызды қорытындылайық

  • Helm өзгертулерді ең аз инвазивті жолмен жасайды, сондықтан Docker тізіліміндегі қолданба кескіні деңгейіндегі кез келген өзгеріс жаңартуға әкелмейді: пәрмен орындалғаннан кейін ештеңе болмайды.
  • Кілт --force проблемалық шығарылымдарды қалпына келтіру үшін пайдаланылады және мәжбүрлі жаңартулармен байланысты емес.
  • Кілт --recreate-pods қолданбаларды күштеп жаңартады, бірақ оны вандалдық жолмен жасайды: ол барлық контейнерлерді кенеттен өшіреді. Пайдаланушылар бұдан зардап шегеді; сіз мұны өндірісте жасамауыңыз керек.
  • Пәрменді пайдаланып Kubernetes кластеріне тікелей өзгерістер енгізіңіз kubectl edit жасамаңыз: біз бірізділікті бұзамыз және мінез-құлық Helm нұсқасына байланысты әр түрлі болады.
  • Helm жаңа нұсқасының шығуымен көптеген нюанстар пайда болды. Helm репозиторийіндегі мәселелер түсінікті тілмен сипатталған, олар егжей-тегжейлерді түсінуге көмектеседі.
  • Диаграммаға өңделетін аннотация қосу оны икемді етеді. Бұл қолданбаны үзіліссіз дұрыс шығаруға мүмкіндік береді.

Өмірдің барлық салаларында жұмыс істейтін «әлемдік тыныштық» ойы: пайдаланудан кейін емес, пайдалану алдында нұсқауларды оқып шығыңыз. Толық ақпаратпен ғана сенімді жүйелерді құру және пайдаланушыларды қуанту мүмкін болады.

Басқа қатысты сілтемелер:

  1. -мен танысу Хельм 3
  2. Helm ресми сайты
  3. GitHub сайтындағы Helm репозиторийі
  4. 25 Пайдалы Kubernetes құралдары: орналастыру және басқару

Бұл баяндама алғаш рет осында ұсынылды @Kubernetes конференциясы Mail.ru Cloud Solutions. Қараңыз видео басқа қойылымдар және Telegram-да оқиғалар туралы хабарландыруларға жазылу Mail.ru Group сайтындағы Kubernetes айналасында.

Ақпарат көзі: www.habr.com

пікір қалдыру