Санҷиши зиндагӣ дар Кубернетес метавонад хатарнок бошад

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

Санҷиши зиндагӣ дар Кубернетес метавонад хатарнок бошад

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

Ҳамкасби ман Сандор ба наздикӣ дар Твиттер хатогиҳои маъмултаринеро, ки ӯ дучор мешавад, мубодила кард, аз ҷумла хатогиҳои марбут ба истифодаи санҷишҳои омодагӣ/зиндагӣ:

Санҷиши зиндагӣ дар Кубернетес метавонад хатарнок бошад

Нодуруст танзим карда шудааст livenessProbe метавонад ҳолатҳои сарбории баландро бадтар кунад (қатъ шудани тӯби барфӣ + вақти эҳтимолии тӯлонии контейнер/барнома) ва ба дигар оқибатҳои манфие, аз қабили коҳиши вобастагӣ оварда расонад. (ниг мақолаи охирини ман дар бораи маҳдуд кардани шумораи дархостҳо дар комбинатсияи K3s+ACME). Вақте ки санҷиши зинда бо санҷиши саломатӣ, ки пойгоҳи додаҳои беруна аст, якҷоя карда мешавад, боз ҳам бадтар аст: нокомии ягонаи DB ҳамаи контейнерҳои шуморо аз нав оғоз мекунад!

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

Эзоҳ: Аксари санҷишҳои дар поён овардашуда дар ибтидо ба ҳуҷҷатҳои дохилии таҳиягари Заландо дохил карда шудаанд.

Санҷиши омодагӣ ва зиндагонӣ

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

Kubernetes истифода мебарад санҷишҳои омодагӣто фахмад, ки кай контейнер барои кабули трафик тайёр аст. Подшоҳ барои истифода омода ҳисобида мешавад, агар ҳама зарфҳои он омода бошанд. Яке аз истифодаи ин механизм назорат кардани он аст, ки кадом подкҳо ҳамчун пуштибон барои хидматҳои Kubernetes (ва махсусан Ingress) истифода мешаванд.

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

Агар шумо кӯшиш кунед, ки навсозии барномаеро ҷойгир кунед, ки аз санҷиши зиндагӣ/тайёрӣ ноком мешавад, коркарди он қатъ карда мешавад, зеро Kubernetes ҳолати интизориро интизор аст. Ready аз хамаи гулхо.

Мисол

Ин аст мисоли санҷиши омодагӣ, ки роҳро тафтиш мекунад /health тавассути HTTP бо танзимоти пешфарз (фосила: 10 сония, Вақти итмом: 1 сония, остонаи муваффақият: 1, ҳадди нокомӣ: 3):

# часть общего описания deployment'а/стека
podTemplate:
  spec:
    containers:
    - name: my-container
      # ...
      readinessProbe:
        httpGet:
          path: /health
          port: 8080

тавсияњои

  1. Барои микросервисҳо бо нуқтаи ниҳоии HTTP (REST ва ғайра) ҳамеша санҷиши омодагӣ муайян мекунад, ки тафтиш мекунад, ки оё барнома (под) барои қабули трафик омода аст.
  2. Боварӣ ҳосил кунед, ки санҷиши омодагӣ мавҷудияти порти воқеии веб-серверро фаро мегирад:
    • истифодаи портҳо барои мақсадҳои маъмурӣ, ки "админ" ё "идоракунӣ" ном доранд (масалан, 9090), барои readinessProbe, боварӣ ҳосил кунед, ки нуқтаи ниҳоӣ танҳо OK бармегардонад, агар порти асосии HTTP (ба монанди 8080) барои қабули трафик омода бошад*;

      * Ман ҳадди аққал як парвандаро дар Заландо медонам, ки дар он ҷо ин тавр нашуд, яъне. readinessProbe Ман бандари "идоракуниро" тафтиш кардам, аммо худи сервер аз сабаби мушкилоти боркунии кэш ба кор шурӯъ накард.

    • пайваст кардани санҷиши омодагӣ ба бандари алоҳида метавонад ба он оварда расонад, ки изофабори порти асосӣ дар санҷиши саломатӣ инъикос наёбад (яъне ҳавзи ришта дар сервер пур аст, аммо санҷиши саломатӣ ҳоло ҳам нишон медиҳад, ки ҳама чиз хуб аст ).
  3. Боварӣ ҳосил кунед, ки Санҷиши омодагӣ ба оғозсозӣ/муҳоҷирати пойгоҳи додаҳо имкон медиҳад;
    • Роҳи осонтарини ноил шудан ба ин тамос бо сервери HTTP танҳо пас аз ба итмом расидани оғозёбӣ мебошад (масалан, интиқоли пойгоҳи додаҳо аз Роҳи парвоз ва ғайра.); яъне ба ҷои тағир додани ҳолати санҷиши саломатӣ, танҳо то анҷоми интиқоли пойгоҳи додаҳо сервери вебро оғоз накунед*.

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

  4. Истифода кунед httpGet барои санҷиши омодагӣ тавассути нуқтаҳои муқаррарии санҷиши саломатӣ (масалан, /health).
  5. Параметрҳои санҷиши пешфарзро фаҳмед (interval: 10s, timeout: 1s, successThreshold: 1, failureThreshold: 3):
    • имконоти пешфарз маънои онро дорад, ки pod мешавад тайёр нест пас аз тақрибан 30 сония (3 санҷиши солимфикрии ноком).
  6. Барои "администратор" ё "идоракунӣ" порти алоҳидаеро истифода баред, агар стеки технологӣ (масалан, Java/Spring) ба он иҷозат диҳад, то идоракунии саломатӣ ва ченакҳоро аз трафики муқаррарӣ ҷудо кунад:
    • аммо дар бораи банди 2 фаромӯш накунед.
  7. Агар лозим бошад, санҷиши омодагӣ метавонад барои гарм кардан/бор кардани кэш ва баргардонидани рамзи ҳолати 503 то гарм шудани контейнер истифода шавад:

Умедворам

  1. Ба вобастагии беруна такя накунед (ба монанди анборҳои маълумот) ҳангоми гузаронидани санҷишҳои омодагӣ/зиндагӣ - ин метавонад ба нокомиҳои пай дар пай оварда расонад:
    • Ҳамчун мисол, биёед хидмати давлатии REST-ро бо 10 подкаст вобаста ба як пойгоҳи додаҳои Postgres гирем: вақте ки чек аз пайвасти корӣ ба DB вобаста аст, ҳама 10 подкҳо метавонанд ноком шаванд, агар дар шабака/тарафи DB таъхир вуҷуд дошта бошад - одатан он ҳама бадтар аз он ки метавонист анҷом ёфт;
    • Лутфан таваҷҷӯҳ намоед, ки Spring Data пайвасти пойгоҳи додаҳоро бо нобаёнӣ тафтиш мекунад*;

      * Ин рафтори пешфарзии Spring Data Redis аст (ҳадди ақал ин бори охирон буд, ки ман тафтиш кардам), ки боиси нокомии "фалокатбор" гардид: вақте ки Редис дар муддати кӯтоҳ дастнорас буд, ҳама подкҳо "фалокат" шуданд.

    • Ба ин маъно "берунӣ" инчунин метавонад маънои дигар қадҳои ҳамон як барномаро дошта бошад, яъне дар идеалӣ чек набояд аз ҳолати дигар қуттиҳои ҳамон кластер вобаста бошад, то садамаҳои каскадиро пешгирӣ кунад:
      • натиҷаҳо метавонанд барои замимаҳои дорои ҳолати тақсимшуда фарқ кунанд (масалан, кэшкунии дохили хотира дар подкастҳо).
  2. Санҷиши зиндаро истифода набаред барои pods (истисно ҳолатҳое мебошанд, ки онҳо воқеан заруранд ва шумо аз хусусиятҳо ва оқибатҳои истифодаи онҳо комилан огоҳед):
    • Санҷиши зинда метавонад барои барқарор кардани контейнерҳои овезон кӯмак кунад, аммо азбаски шумо назорати пурраи барномаатонро доред, чизҳои ба мисли равандҳои овезон ва бунбастҳо набояд рӯй диҳанд: беҳтарин алтернатива дидаву дониста вайрон кардани барнома ва баргардонидани он ба ҳолати пештараи устувор аст;
    • санҷиши нокомии зинда боиси аз нав оғоз шудани контейнер мегардад ва ба ин васила оқибатҳои хатогиҳои марбут ба боркуниро шадидтар мекунад: аз нав ба кор андохтани контейнер ба бекористӣ оварда мерасонад (ҳадди ақал дар давоми оғози барнома, масалан 30 сонияи тоқ), боиси хатогиҳои нав мегардад. , зиёд кардани бори дигар контейнерҳо ва зиёд кардани эҳтимолияти аз кор баромадани онҳо ва ғайра;
    • Санҷиши зиндагонӣ дар якҷоягӣ бо вобастагии беруна як комбинатсияи бадтаринест, ки ба нокомиҳои пай дар пай таҳдид мекунад: таъхири каме дар паҳлӯи пойгоҳи додаҳо боиси аз нав оғоз шудани ҳама контейнерҳои шумо мегардад!
  3. Параметрҳои санҷиши зиндагонӣ ва омодагӣ бояд гуногун бошад:
    • шумо метавонед санҷиши зиндаро бо ҳамон санҷиши саломатӣ истифода баред, аммо ҳадди посухи баландтар (failureThreshold), масалан, мақом таъин кунед тайёр нест пас аз 3 кӯшиш ва ҳисоб кунед, ки санҷиши зинда пас аз 10 кӯшиш ноком шудааст;
  4. Санҷишҳои exec -ро истифода набаред, зеро онҳо бо мушкилоти маълуме алоқаманданд, ки боиси пайдоиши равандҳои зомби мешаванд:

Натиҷа

  • Санҷиши омодагиро истифода баред, то муайян кунед, ки кай поддон барои қабули трафик омода аст.
  • Санҷишҳои зиндаро танҳо вақте истифода баред, ки онҳо воқеан лозиманд.
  • Истифодаи нодурусти санҷишҳои омодагӣ/зиндагӣ метавонад ба кам шудани дастрасӣ ва нокомиҳои пай дар пай оварда расонад.

Санҷиши зиндагӣ дар Кубернетес метавонад хатарнок бошад

Маводҳои иловагӣ дар мавзӯъ

Навсозии № 1 аз 2019-09-29

Дар бораи контейнерҳои ибтидоӣ барои интиқоли пойгоҳи додаҳо: Эзоҳ илова карда шуд.

EJ ба ман хотиррасон кард дар бораи PDB: яке аз мушкилоте, ки бо санҷиши зиндагонӣ мавҷуд аст, набудани ҳамоҳангӣ байни қубурҳо мебошад. Кубернетес дорад Буҷетҳои вайронкунии Pod (PDB) барои маҳдуд кардани шумораи нокомиҳои ҳамзамон барнома метавонад аз сар гузаронад, аммо санҷишҳо PDB-ро ба назар намегиранд. Идеалӣ, мо метавонем ба K8 бигӯем, ки "Агар санҷиши он ноком шавад, як подкро аз нав оғоз кунед, аммо ҳамаро аз нав оғоз накунед, то вазъ бадтар нашавад."

Брайан онро ба таври комил баён кард: "Вақте ки шумо дақиқ медонед, аз санҷиши зинда истифода баред беҳтарин чизе, ки бояд кард, куштани барнома аст"(боз, аз худ дур нашавед).

Санҷиши зиндагӣ дар Кубернетес метавонад хатарнок бошад

Навсозии № 2 аз 2019-09-29

Дар бораи хондани ҳуҷҷатҳо пеш аз истифода: Ман дархости мувофиқро эҷод кардам (дархости хусусият) барои илова кардани ҳуҷҷатҳо дар бораи санҷишҳои зинда.

PS аз тарҷумон

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

Манбаъ: will.com

Илова Эзоҳ