PiezÄ«me. tulk.: VadoÅ”ais inženieris no Zalando Hennings Džeikobss vairÄkkÄrt ir novÄrojis Kubernetes lietotÄju problÄmas, lai saprastu dzÄ«vÄ«guma (un gatavÄ«bas) zondes mÄrÄ·i un to pareizu lietoÅ”anu. TÄpÄc viÅÅ” apkopoja savas domas Å”ajÄ ietilpÄ«gajÄ piezÄ«mÄ, kas galu galÄ kļūs par daļu no K8s dokumentÄcijas.
VeselÄ«bas pÄrbaudes, zinÄmas Kubernetes kÄ dzÄ«vÄ«guma zondes(t.i., burtiski ādzÄ«votspÄjas testiā ā aptuveni tulk.), var bÅ«t diezgan bÄ«stami. Iesaku no tiem izvairÄ«ties, ja iespÄjams: vienÄ«gie izÅÄmumi ir gadÄ«jumi, kad tie patieÅ”Äm ir nepiecieÅ”ami un jÅ«s pilnÄ«bÄ apzinÄties to lietoÅ”anas specifiku un sekas. Å ajÄ publikÄcijÄ tiks runÄts par dzÄ«vÄ«guma un gatavÄ«bas pÄrbaudÄm, kÄ arÄ« pastÄstÄ«ts, kÄdos gadÄ«jumos ir un jums nevajadzÄtu tos izmantot.
Mans kolÄÄ£is Sandors nesen vietnÄ Twitter dalÄ«jÄs ar visbiežÄk sastopamajÄm kļūdÄm, tostarp tÄm, kas saistÄ«tas ar gatavÄ«bas/dzÄ«vÄ«bas zondes izmantoÅ”anu:
Nepareizi konfigurÄts livenessProbe var saasinÄt lielas slodzes situÄcijas (sniega bumbas izslÄgÅ”ana + potenciÄli ilgs konteinera/lietojumprogrammas palaiÅ”anas laiks) un izraisÄ«t citas negatÄ«vas sekas, piemÄram, atkarÄ«bas samazinÄÅ”anos (SkatÄ«t arÄ« mans nesenais raksts par pieprasÄ«jumu skaita ierobežoÅ”anu kombinÄcijÄ K3s+ACME). VÄl trakÄk ir, ja dzÄ«vÄ«guma zondi apvieno ar veselÄ«bas pÄrbaudi, kas ir ÄrÄja datu bÄze: viena DB kļūme restartÄs visus jÅ«su konteinerus!
VispÄrÄ«gs ziÅojums "Neizmantojiet dzÄ«vÄ«guma zondes" Å”ajÄ gadÄ«jumÄ tas neko daudz nepalÄ«dz, tÄpÄc paskatÄ«simies, kam paredzÄtas gatavÄ«bas un dzÄ«vÄ«guma pÄrbaudes.
Kubernetes nodroÅ”ina divus svarÄ«gus mehÄnismus, ko sauc dzÄ«vÄ«bas zondes un gatavÄ«bas zondes. ViÅi periodiski veic dažas darbÄ«bas, piemÄram, nosÅ«ta HTTP pieprasÄ«jumu, atver TCP savienojumu vai izpilda komandu konteinerÄ, lai apstiprinÄtu, ka lietojumprogramma darbojas, kÄ paredzÄts.
Kubernetes izmanto gatavÄ«bas zondeslai saprastu, kad konteiners ir gatavs satiksmei. PÄksts tiek uzskatÄ«ta par gatavu lietoÅ”anai, ja visi tÄ konteineri ir gatavi. Viens no Ŕī mehÄnisma izmantoÅ”anas veidiem ir kontrolÄt, kuri podi tiek izmantoti kÄ Kubernetes pakalpojumu (un jo Ä«paÅ”i Ingress) aizmugursistÄmas.
DzÄ«vÄ«bas zondes palÄ«dziet Kubernetes saprast, kad ir pienÄcis laiks restartÄt konteineru. PiemÄram, Å”Äda pÄrbaude ļauj pÄrtvert strupceļu, kad lietojumprogramma iestrÄgst vienÄ vietÄ. Konteinera restartÄÅ”ana Å”ÄdÄ stÄvoklÄ« palÄ«dz lietojumprogrammai darboties, neskatoties uz kļūdÄm, taÄu tÄ var izraisÄ«t arÄ« kaskÄdes kļūmes (skatiet tÄlÄk).
Ja mÄÄ£inÄt izvietot lietojumprogrammas atjauninÄjumu, kas neiztur dzÄ«vÄ«bas/gatavÄ«bas pÄrbaudes, tÄ izlaiÅ”ana tiks apturÄta, jo Kubernetes gaidÄ«s statusu. Ready no visÄm pÄkstÄ«m.
PiemÄrs
Å eit ir piemÄrs gatavÄ«bas zondei, kas pÄrbauda ceļu /health izmantojot HTTP ar noklusÄjuma iestatÄ«jumiem (intervÄls: 10 sekundes, taimautu: 1 sekunde, veiksmes slieksnis: 1, neveiksmes slieksnis: 3):
Mikropakalpojumiem ar HTTP galapunktu (REST utt.) vienmÄr definÄjiet gatavÄ«bas zondi, kas pÄrbauda, āāvai lietojumprogramma (pod) ir gatava pieÅemt trafiku.
PÄrliecinieties par gatavÄ«bas zondi attiecas uz faktiskÄ tÄ«mekļa servera porta pieejamÄ«bu:
portu izmantoÅ”ana administratÄ«viem nolÅ«kiem, ko sauc par "admin" vai "management" (piemÄram, 9090), readinessProbe, pÄrliecinieties, vai galapunkts atgriež OK tikai tad, ja primÄrais HTTP ports (piemÄram, 8080) ir gatavs pieÅemt trafiku*;
*Man ir zinÄms vismaz viens Zalando gadÄ«jums, kad tas nav noticis, t.i. readinessProbe PÄrbaudÄ«ju āmanagementā portu, bet pats serveris nesÄka darboties keÅ”atmiÅas ielÄdes problÄmu dÄļ.
gatavÄ«bas zondes pievienoÅ”ana atseviŔķam portam var novest pie tÄ, ka galvenÄ porta pÄrslodze netiks atspoguļota veselÄ«bas pÄrbaudÄ (tas ir, pavedienu pÅ«ls serverÄ« ir pilns, bet veselÄ«bas pÄrbaude joprojÄm parÄda, ka viss ir kÄrtÄ«bÄ ).
PÄrliecinies ka gatavÄ«bas zonde nodroÅ”ina datu bÄzes inicializÄciju/migrÄciju;
VienkÄrÅ”Äkais veids, kÄ to panÄkt, ir sazinÄties ar HTTP serveri tikai pÄc inicializÄcijas pabeigÅ”anas (piemÄram, datu bÄzes migrÄÅ”ana no Lidotais ceļŔ un tÄ tÄlÄk.); tas ir, tÄ vietÄ, lai mainÄ«tu veselÄ«bas pÄrbaudes statusu, vienkÄrÅ”i nestartÄjiet tÄ«mekļa serveri, kamÄr datu bÄzes migrÄÅ”ana nav pabeigta*.
* Varat arÄ« palaist datu bÄzes migrÄciju no init konteineriem Ärpus pod. JoprojÄm esmu paÅ”pietiekamu aplikÄciju cienÄ«tÄjs, tas ir, tÄdÄm, kurÄs lietojumprogrammu konteiners prot novest datu bÄzi vajadzÄ«gajÄ stÄvoklÄ« bez ÄrÄjas saskaÅoÅ”anas.
noklusÄjuma opcijas nozÄ«mÄ, ka pods kļūs nav gatavs pÄc aptuveni 30 sekundÄm (3 nesekmÄ«gas saprÄta pÄrbaudes).
Izmantojiet atseviŔķu portu āadministrÄÅ”anaiā vai āpÄrvaldÄ«baiā, ja tehnoloÄ£iju steks (piem., Java/Spring) to atļauj, lai noŔķirtu veselÄ«bas un metrikas pÄrvaldÄ«bu no parastÄs trafika:
bet neaizmirstiet par 2. punktu.
Ja nepiecieÅ”ams, gatavÄ«bas zondi var izmantot, lai uzsildÄ«tu/ielÄdÄtu keÅ”atmiÅu un atgrieztu statusa kodu 503, lÄ«dz konteiners uzsilst:
Iesaku arÄ« izlasÄ«t jauno Äeku startupProbe, parÄdÄ«jÄs versijÄ 1.16(par to rakstÄ«jÄm krievu valodÄ Å”eit ā apm. tulk.).
BrÄ«dinÄjumi
Nepaļaujieties uz ÄrÄjÄm atkarÄ«bÄm (piemÄram, datu noliktavas), veicot gatavÄ«bas/dzÄ«vesspÄjas testus ā tas var izraisÄ«t kaskÄdes kļūmes:
KÄ piemÄru Åemsim statusful REST pakalpojumu ar 10 podiem atkarÄ«bÄ no vienas Postgres datu bÄzes: kad pÄrbaude ir atkarÄ«ga no darba savienojuma ar DB, visi 10 podi var neizdoties, ja tÄ«kla/DB pusÄ ir aizkave - parasti tÄ viss beidzas sliktÄk, nekÄ tas varÄtu bÅ«t;
LÅ«dzu, Åemiet vÄrÄ, ka Spring Data pÄc noklusÄjuma pÄrbauda datu bÄzes savienojumu*;
* Å Ä« ir Spring Data Redis noklusÄjuma darbÄ«ba (vismaz tÄ bija pÄdÄjÄ reize, kad pÄrbaudÄ«ju), kas noveda pie "katastrofÄlas" kļūmes: kad Redis Ä«su laiku nebija pieejams, visi podi "avarÄja".
āÄrÄjaisā Å”ajÄ nozÄ«mÄ var nozÄ«mÄt arÄ« citus tÄs paÅ”as lietojumprogrammas apvidus, proti, ideÄlÄ gadÄ«jumÄ pÄrbaudei nevajadzÄtu bÅ«t atkarÄ«gai no citu tÄs paÅ”as klastera podziÅu stÄvokļa, lai novÄrstu kaskÄdes avÄrijas:
rezultÄti var atŔķirties lietojumprogrammÄm ar izplatÄ«tu stÄvokli (piemÄram, atmiÅas keÅ”atmiÅa podiÅos).
Neizmantojiet dzÄ«vÄ«guma zondi pÄkstÄ«m (izÅÄmums ir gadÄ«jumi, kad tie patieÅ”Äm ir nepiecieÅ”ami un jÅ«s pilnÄ«bÄ apzinÄties to lietoÅ”anas specifiku un sekas):
AtdzÄ«vinÄÅ”anas zonde var palÄ«dzÄt atgÅ«t pakarinÄtos konteinerus, taÄu, tÄ kÄ jÅ«s pilnÄ«bÄ kontrolÄjat savu lietojumprogrammu, ideÄlÄ gadÄ«jumÄ nevajadzÄtu notikt tÄdÄm lietÄm kÄ pakarinÄti procesi un strupceļi: labÄkÄ alternatÄ«va ir apzinÄti avarÄt lietojumprogrammu un atjaunot to iepriekÅ”ÄjÄ lÄ«dzsvara stÄvoklÄ«;
neveiksmÄ«ga dzÄ«vÄ«guma zonde izraisÄ«s konteinera restartÄÅ”anu, tÄdÄjÄdi, iespÄjams, saasinot ar ielÄdi saistÄ«tu kļūdu ietekmi: konteinera restartÄÅ”ana izraisÄ«s dÄ«kstÄvi (vismaz lietojumprogrammas palaiÅ”anas laikÄ, piemÄram, 30 sekundes), radot jaunas kļūdas. , palielinot slodzi uz citiem konteineriem un palielinot to atteices iespÄjamÄ«bu utt.;
dzÄ«vÄ«guma pÄrbaudes apvienojumÄ ar ÄrÄju atkarÄ«bu ir sliktÄkÄ iespÄjamÄ kombinÄcija, kas apdraud kaskÄdes kļūmes: neliela aizkave datu bÄzes pusÄ novedÄ«s pie visu jÅ«su konteineru restartÄÅ”anas!
DzÄ«vÄ«bas un gatavÄ«bas pÄrbaužu parametri jÄbÅ«t atŔķirÄ«gam:
varat izmantot dzÄ«vÄ«guma zondi ar tÄdu paÅ”u veselÄ«bas pÄrbaudi, bet augstÄku reakcijas slieksni (failureThreshold), piemÄram, pieŔķiriet statusu nav gatavs pÄc 3 mÄÄ£inÄjumiem un uzskata, ka dzÄ«vÄ«guma zonde ir neizdevusies pÄc 10 mÄÄ£inÄjumiem;
Neizmantojiet izpildpÄrbaudes, jo tie ir saistÄ«ti ar zinÄmÄm problÄmÄm, kas izraisa zombiju procesu parÄdÄ«Å”anos:
EJ man atgÄdinÄja par PBP: viena no problÄmÄm saistÄ«bÄ ar dzÄ«vÄ«guma pÄrbaudÄm ir koordinÄcijas trÅ«kums starp pÄkstÄ«m. Kubernetes ir Pod darbÄ«bas traucÄjumu budžeti (PBP) lai ierobežotu lietojumprogrammas vienlaicÄ«gu kļūdu skaitu, taÄu pÄrbaudÄs netiek Åemts vÄrÄ PBP. IdeÄlÄ gadÄ«jumÄ mÄs varÄtu norÄdÄ«t K8s: "RestartÄjiet vienu podziÅu, ja tÄ pÄrbaude neizdodas, taÄu nerestartÄjiet tos visus, lai nepasliktinÄtu situÄciju."
Braiens to teica perfekti: āIzmantojiet dzÄ«vÄ«guma zondÄÅ”anu, kad precÄ«zi zinÄt, ko labÄkais, ko darÄ«t, ir iznÄ«cinÄt lietojumprogrammu"(atkal, neaizraujieties).