Dzīvības zondes Kubernetes var būt bīstamas

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.

Dzīvības zondes Kubernetes var būt bīstamas

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:

Dzīvības zondes Kubernetes var būt bīstamas

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.

PiezÄ«me. Lielākā daļa tālāk norādÄ«tās pārbaudes sākotnēji tika iekļauta Zalando iekŔējā izstrādātāja dokumentācijā.

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):

# чŠ°ŃŃ‚ŃŒ Š¾Š±Ń‰ŠµŠ³Š¾ Š¾ŠæŠøсŠ°Š½Šøя deployment'Š°/стŠµŠŗŠ°
podTemplate:
  spec:
    containers:
    - name: my-container
      # ...
      readinessProbe:
        httpGet:
          path: /health
          port: 8080

Ieteikumi

  1. Mikropakalpojumiem ar HTTP galapunktu (REST utt.) vienmēr definējiet gatavÄ«bas zondi, kas pārbauda, ā€‹ā€‹vai lietojumprogramma (pod) ir gatava pieņemt trafiku.
  2. 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ā ).
  3. 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.

  4. Izmantojiet httpGet gatavības pārbaudēm, izmantojot tipiskus veselības pārbaudes galapunktus (piemēram, /health).
  5. Izprotiet noklusējuma pārbaudes parametrus (interval: 10s, timeout: 1s, successThreshold: 1, failureThreshold: 3):
    • noklusējuma opcijas nozÄ«mē, ka pods kļūs nav gatavs pēc aptuveni 30 sekundēm (3 nesekmÄ«gas saprāta pārbaudes).
  6. 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.
  7. 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:

Brīdinājumi

  1. 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).
  2. 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!
  3. 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;
  4. Neizmantojiet izpildpārbaudes, jo tie ir saistÄ«ti ar zināmām problēmām, kas izraisa zombiju procesu parādÄ«Å”anos:

Kopsavilkums

  • Izmantojiet gatavÄ«bas zondes, lai noteiktu, kad pods ir gatavs uztvert trafiku.
  • Izmantojiet dzÄ«vÄ«bas zondes tikai tad, kad tās patieŔām ir vajadzÄ«gas.
  • Nepareiza gatavÄ«bas/dzÄ«vÄ«bas zondes izmantoÅ”ana var izraisÄ«t samazinātu pieejamÄ«bu un kaskādes atteices.

Dzīvības zondes Kubernetes var būt bīstamas

Papildu materiāli par tēmu

Atjauninājums Nr. 1 no 2019-09-29

Par datu bāzes migrācijas init konteineriem: pievienota zemsvītras piezīme.

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).

Dzīvības zondes Kubernetes var būt bīstamas

Atjauninājums Nr. 2 no 2019-09-29

Par dokumentācijas izlasÄ«Å”anu pirms lietoÅ”anas: Es izveidoju atbilstoÅ”o pieprasÄ«jumu (funkcijas pieprasÄ«jums), lai pievienotu dokumentāciju par dzÄ«vÄ«guma zondēm.

PS no tulka

Lasi arī mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru