Ҳангоми ҷойгиркунии барномаи аввал дар Kubernetes панҷ гумшуда

Ҳангоми ҷойгиркунии барномаи аввал дар Kubernetes панҷ гумшудаМуваффақият аз ҷониби Aris Dreamer

Бисёр одамон фикр мекунанд, ки интиқоли барнома ба Kubernetes кифоя аст (бо истифода аз Helm ё дастӣ) - ва хушбахтӣ хоҳад буд. Аммо на ҳама чиз ин қадар оддӣ аст.

гурӯҳ Mail.ru ҳалли абрӣ мақолаи муҳандиси DevOps Ҷулиан Гиндиро тарҷума кардааст. Ӯ нақл мекунад, ки ширкаташ дар ҷараёни муҳоҷират бо чӣ мушкилоте рӯбарӯ шуд, то шумо ба ҳамон рейка қадам нагузоред.

Қадами якум: Дархостҳо ва маҳдудиятҳои Pod насб кунед

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

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

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

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

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

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

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

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

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

Мутаассифона, ман наметавонам дастурҳои мушаххас диҳам, ки кадом арзишҳоро муқаррар кардан лозим аст, аммо мо худамон қоидаҳои зеринро риоя мекунем:

  1. Бо истифода аз асбоби санҷиши сарборӣ, мо сатҳи асосии трафикро тақлид мекунем ва истифодаи захираҳои подборро (хотира ва протсессор) мушоҳида мекунем.
  2. Дархостҳои подборро ба арзиши худсарона паст таъин кунед (бо маҳдудияти захираҳо тақрибан 5 маротиба аз арзиши дархостҳо) ва риоя кунед. Вақте ки дархостҳо дар сатҳи хеле паст қарор доранд, раванд оғоз карда наметавонад, ки аксар вақт боиси хатогиҳои рамзӣ дар вақти иҷро мешаванд.

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

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

Қадами дуюм: Ташкил кардани санҷишҳои зиндагонӣ ва омодагӣ

Ин боз як мавзӯи нозукест, ки аксар вақт дар ҷомеаи Кубернетес муҳокима карда мешавад. Фаҳмиши хуби санҷишҳои Ҳаёт ва Омодагӣ муҳим аст, зеро онҳо механизми кори устувори нармафзорро таъмин мекунанд ва вақти бекориро кам мекунанд. Бо вуҷуди ин, онҳо метавонанд ба кори барномаи шумо таъсир расонанд, агар дуруст танзим нашуда бошанд. Дар зер шарҳи мухтасари ҳарду намуна оварда шудааст.

Зиндагӣ нишон медиҳад, ки контейнер кор мекунад ё не. Агар он ноком шавад, kubelet контейнерро мекушад ва сиёсати бозоғозӣ барои он фаъол карда мешавад. Агар контейнер бо озмоиши Liveness муҷаҳҳаз набошад, пас ҳолати пешфарз муваффақ хоҳад шуд - тавре ки дар он гуфта шудааст Ҳуҷҷатҳои Kubernetes.

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

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

Дар ширкати мо санҷишҳои Liveness ҷузъҳои асосии барномаро месанҷанд, ҳатто агар маълумот (масалан, аз пойгоҳи дурдаст ё кэш) пурра дастрас набошад.

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

Намунаи Тайёрӣ нишон медиҳад, ки оё контейнер барои хидматрасонии дархостҳо омода аст. Агар санҷиши омодагӣ ноком шавад, нозири нуқтаи ниҳоӣ суроғаи IP-и подкастро аз нуқтаҳои ниҳоии ҳама хидматҳое, ки ба подк мувофиқанд, хориҷ мекунад. Ин дар ҳуҷҷатҳои Kubernetes низ гуфта шудааст.

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

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

Агар шумо қарор диҳед, ки ба пойгоҳи додаҳо барои санҷиши омодагии аризаатон муроҷиат кунед, боварӣ ҳосил кунед, ки он то ҳадди имкон арзон аст. Биёед ин пурсишро гирем:

SELECT small_item FROM table LIMIT 1

Дар ин ҷо як мисоли он аст, ки мо ин ду арзишро дар Кубернетес танзим мекунем:

livenessProbe: 
 httpGet:   
   path: /api/liveness    
   port: http 
readinessProbe:  
 httpGet:    
   path: /api/readiness    
   port: http  periodSeconds: 2

Шумо метавонед якчанд имконоти конфигуратсияи иловагиро илова кунед:

  • initialDelaySeconds — дар байни ба кор андохтани контейнер ва cap шудани зондхо чанд сония мегузарад.
  • periodSeconds — фосилаи интизорӣ байни даврони намунавӣ.
  • timeoutSeconds — микдори сонияхое, ки пас аз он под-разделения ба хисоб меравад. Вақти муқаррарӣ.
  • failureThreshold шумораи нокомиҳои санҷишӣ пеш аз фиристодани сигнали бозоғозӣ ба pod.
  • successThreshold шумораи озмоишҳои бомуваффақият пеш аз гузаштан ба ҳолати омода (пас аз нокомӣ ҳангоми оғозёбӣ ё барқароршавӣ).

Қадами сеюм: Муқаррар кардани сиёсати пешфарзии шабакаи Pod

Кубернетес топографияи шабакаи "ҳамвор" дорад, ба таври нобаёнӣ ҳамаи подкҳо мустақиман бо ҳамдигар муошират мекунанд. Дар баъзе мавридҳо ин матлуб нест.

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

Масалан, ин сиёсати оддӣест, ки ҳама трафики воридотӣ барои фазои номро рад мекунад:

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:  
 name: default-deny-ingress
spec:  
 podSelector: {}  
 policyTypes:  
   - Ingress

Намоиши ин конфигуратсия:

Ҳангоми ҷойгиркунии барномаи аввал дар Kubernetes панҷ гумшуда
(https://miro.medium.com/max/875/1*-eiVw43azgzYzyN1th7cZg.gif)
Маълумоти бештар дар ин ҷо.

Қадами чорум: Рафтори фармоишӣ бо қалмоқҳо ва контейнерҳои ибтидоӣ

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

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

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

lifecycle: 
 preStop:
   exec:
     command: ["/usr/local/bin/nginx-killer.sh"]

Аммо nginx-killer.sh:

#!/bin/bash
sleep 3
PID=$(cat /run/nginx.pid)
nginx -s quit
while [ -d /proc/$PID ]; do
   echo "Waiting while shutting down nginx..."
   sleep 10
done

Дигар парадигмаи хеле муфид ин истифодаи контейнерҳои init барои коркарди барномаҳои мушаххас мебошад. Ин махсусан муфид аст, агар шумо раванди интиқоли пойгоҳи додаҳои захиравӣ дошта бошед, ки бояд пеш аз оғози барнома иҷро карда шавад. Шумо инчунин метавонед маҳдудияти баландтари захираҳоро барои ин раванд бидуни муқаррар кардани чунин маҳдудият барои барномаи асосӣ муайян кунед.

Схемаи дигари маъмул ин дастрасӣ ба асрор дар контейнери ибтидоӣ мебошад, ки ин маълумотро ба модули асосӣ медиҳад, ки дастрасии беиҷозат ба асрорро аз худи модули асосии барнома пешгирӣ мекунад.

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

Қадами панҷум: Танзимоти ядро

Нихоят, биёед дар бораи техникаи мукаммалтар сухан ронем.

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

Бо вуҷуди ин, Kubernetes ба шумо имкон медиҳад, ки контейнери имтиёзнокро идора кунед, ки танҳо параметрҳои ядроро барои як подтаи мушаххас тағир медиҳад. Ин аст он чизе ки мо барои тағир додани шумораи максималии пайвастҳои кушод истифода мебурдем:

initContainers:
  - name: sysctl
     image: alpine:3.10
     securityContext:
         privileged: true
      command: ['sh', '-c', "sysctl -w net.core.somaxconn=32768"]

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

Дар охир

Гарчанде ки Kubernetes метавонад як ҳалли берун аз қуттӣ ба назар расад, якчанд қадамҳои калидӣ мавҷуданд, ки бояд барои кори бефосилаи барномаҳо андешида шаванд.

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

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

Ҳамеша ба худ ин саволҳоро диҳед:

  1. Барномаҳо чӣ қадар захираҳоро истеъмол мекунанд ва ин маблағ чӣ гуна тағир меёбад?
  2. Талаботи воқеии миқёс кадомҳоянд? Барнома ба ҳисоби миёна чӣ қадар трафикро идора мекунад? Дар бораи авҷи трафик чӣ гуфтан мумкин аст?
  3. Чӣ қадар вақт хидматро васеъ кардан лозим аст? Барои қабули трафик то чӣ андоза подкҳои нав бояд ба зудӣ кор кунанд?
  4. Подҳо то чӣ андоза зебо хомӯш мешаванд? Оё умуман зарур аст? Оё бе бекористӣ ба ҷойгиркунӣ ноил шудан мумкин аст?
  5. Чӣ гуна хатарҳои амниятро ба ҳадди ақалл кам кардан ва зарарро аз ҳама гуна қуттиҳои осебдида маҳдуд кардан мумкин аст? Оё ягон хидмат иҷозат ё дастрасӣ дорад, ки ба онҳо лозим нест?

Kubernetes як платформаи аҷиберо пешкаш мекунад, ки ба шумо имкон медиҳад таҷрибаҳои беҳтаринро барои ҷойгиркунии ҳазорҳо хидматҳо дар кластер истифода баред. Аммо, ҳама барномаҳо гуногунанд. Баъзан татбиқи он каме кори бештарро талаб мекунад.

Хушбахтона, Kubernetes танзимоти заруриро барои ноил шудан ба ҳама ҳадафҳои техникӣ таъмин мекунад. Бо истифода аз маҷмӯи дархостҳои захиравӣ ва маҳдудиятҳо, санҷишҳои Ҳаёт ва Омодагӣ, контейнерҳои ибтидоӣ, сиёсатҳои шабакавӣ ва танзими фармоишии ядро, шумо метавонед дар баробари таҳаммулпазирии хатогиҳо ва миқёспазирии зуд ба иҷрои баланд ноил шавед.

Боз чӣ хондан лозим аст:

  1. Таҷрибаҳои беҳтарин ва таҷрибаҳои беҳтарин барои идора кардани контейнерҳо ва кубернетҳо дар муҳити истеҳсолӣ.
  2. 90+ Воситаҳои муфид барои Kubernetes: Ҷойгиркунӣ, идоракунӣ, мониторинг, амният ва ғайра.
  3. Канали мо дар атрофи Kubernetes дар Telegram.

Манбаъ: will.com

Илова Эзоҳ