I sondi di Liveness in Kubernetes ponu esse periculosi

Nota. transl.: L'ingegnere principale di Zalando, Henning Jacobs, hà ripetutamente nutatu prublemi trà l'utilizatori di Kubernetes per capiscenu u scopu di e sonde di vivacità (è di prontezza) è u so usu currettu. Dunque, hà cullatu i so pinsamenti in questa nota capiente, chì eventualmente diventerà parte di a documentazione K8s.

I sondi di Liveness in Kubernetes ponu esse periculosi

Cuntrolli di salute, cunnisciutu in Kubernetes cum'è sonde di vivacità (vale à dì, literalmente, "testi di viabilità" - circa trad.), pò esse abbastanza periculosa. I ricumandemu d'evitallu s'ellu hè pussibule: l'unicu eccezzioni sò quandu sò veramente necessarii è site sanu sanu di e specifiche è e cunsequenze di u so usu. Sta publicazione parlerà di cuntrolli di vita è di prontezza, è vi dicerà ancu in quali casi vale è ùn avete micca aduprà.

U mo cullegu Sandor hà spartutu recentemente in Twitter l'errori più cumuni chì scontra, cumpresi quelli chì sò ligati à l'usu di sonde di prontezza / vivacità:

I sondi di Liveness in Kubernetes ponu esse periculosi

Cunfiguratu incorrectamente livenessProbe pò aggravà situazioni di carica elevata (arrestu di bola di neve + tempu potenzialmente longu di cuntainer / iniziu di l'applicazione) è purtà à altre cunsequenze negative cum'è caduta di dipendenza. (vede ancu u mo articulu recente circa a limitazione di u numeru di richieste in a combinazione K3s + ACME). Hè ancu peghju quandu a sonda di vivacità hè cumminata cù un cuntrollu di salute, chì hè una basa di dati esterna: un unicu fallimentu DB riavviarà tutti i vostri cuntenituri!

Missaghju generale "Ùn aduprate micca sonde di vivacità" in questu casu ùn aiuta micca assai, cusì fighjemu ciò chì sò i cuntrolli di prontezza è di vita.

Nota: A maiò parte di a prova sottu hè stata inizialmente inclusa in a documentazione interna di u sviluppatore di Zalando.

Cuntrolli di Prontezza è Liveness

Kubernetes furnisce dui miccanismi impurtanti chjamati sonde di vivacità e sonde di prontezza. Eseguinu periodicamente qualchì azzione, cum'è l'inviu di una dumanda HTTP, l'apertura di una cunnessione TCP, o l'esecuzione di un cumandamentu in u containeru, per cunfirmà chì l'applicazione funziona cum'è previstu.

Kubernetes usa sonde di prontezzaper capisce quandu u cuntinuu hè prontu à accettà u trafficu. Un pod hè cunsideratu pronta per l'usu se tutti i so cuntenituri sò pronti. Un usu di stu mecanismu hè di cuntrullà quali pods sò usati cum'è backends per i servizii Kubernetes (è in particulare Ingress).

Sonde di vivacità aiuta Kubernetes à capisce quandu hè u tempu di riavvia u containeru. Per esempiu, un tali cuntrollu vi permette di intercepte un bloccu quandu una applicazione si ferma in un locu. Riavvia u cuntinuu in questu statu aiuta à ottene l'applicazione da a terra malgradu l'errori, ma pò ancu purtà à fallimenti in cascata (vede sottu).

Se pruvate di implementà una aghjurnazione di l'applicazione chì falla i cuntrolli di vivacità / prontezza, u so rollout serà fermatu mentre Kubernetes aspetta u statutu. Ready da tutti i baccelli.

Esempiu:

Eccu un esempiu di una sonda di prontezza chì verifica una strada /health via HTTP cù paràmetri predeterminati (intervallu: 10 seconde, pausa: 1 seconde, u sogliu di successu: 1, soglia di fallimentu: 3):

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

ci voli

  1. Per i microservizi cù endpoint HTTP (REST, etc.) definisce sempre una sonda di prontezza, chì verifica se l'applicazione (pod) hè pronta per accettà u trafficu.
  2. Assicuratevi chì a sonda di prontezza copre a dispunibilità di u portu attuale di u servitore web:
    • utilizendu porti per scopi amministrativi, chjamati "admin" o "gestione" (per esempiu, 9090), per readinessProbe, assicuratevi chì l'endpoint solu torna OK se u portu HTTP primariu (cum'è 8080) hè prontu per accettà u trafficu *;

      * Sò cunuscenza di almenu un casu in Zalando induve questu ùn hè micca accadutu, i.e. readinessProbe Aghju verificatu u portu di "gestione", ma u servitore stessu ùn hà micca cuminciatu à travaglià per via di prublemi di carica di a cache.

    • Attaccà una sonda di prontezza à un portu separatu pò purtari à u fattu chì a sovraccarica nantu à u portu principale ùn serà micca riflessu in u cuntrollu di salute (vale à dì, a piscina di fili nantu à u servitore hè piena, ma u cuntrollu di salute mostra sempre chì tuttu hè OK). ).
  3. Assicuratevi chì a sonda di prontezza permette l'inizializazione / migrazione di a basa di dati;
    • U modu più faciule per ottene questu hè di cuntattà u servitore HTTP solu dopu chì l'inizializazione hè cumpleta (per esempiu, migrate una basa di dati da Flyway eccetera.); vale à dì, invece di cambià u statu di cuntrollu di salute, simpricimenti ùn principià micca u servitore web finu à chì a migrazione di a basa di dati hè cumpleta *.

      * Pudete ancu eseguisce migrazioni di basa di dati da cuntenituri init fora di u pod. Sò sempre un fan di l'applicazioni autonome, vale à dì quelli in quale u containeru di l'applicazioni sapi cumu portà a basa di dati in u statu desideratu senza coordinazione esterna.

  4. Usu httpGet per i cuntrolli di prontezza attraversu i punti finali di cuntrollu di salute tipici (per esempiu, /health).
  5. Capisce i paràmetri di verificazione predeterminati (interval: 10s, timeout: 1s, successThreshold: 1, failureThreshold: 3):
    • l'opzioni predeterminate significanu chì u pod diventerà micca prontu dopu à circa 30 seconde (3 cuntrolli di sanità falluti).
  6. Aduprate un portu separatu per "admin" o "gestione" se a pila di tecnulugia (per esempiu, Java / Spring) permette, per separà a gestione di salute è metrica da u trafficu regulare:
    • ma ùn vi scurdate di u puntu 2.
  7. In casu di necessariu, a sonda di prontezza pò esse usata per calà / carricà a cache è rinvià un codice di statutu 503 finu à chì u cuntinuu si riscalda:

Caveats

  1. Ùn si basa micca in dipendenze esterne (cum'è magazzini di dati) quandu eseguite teste di prontezza / vitalità - questu pò purtà à fallimenti in cascata:
    • Cum'è un esempiu, pigliemu un serviziu REST stateful cù 10 pods secondu una basa di dati Postgres: quandu u cuntrollu dipende da una cunnessione di travagliu à a DB, tutti i 10 pods ponu falli s'ellu ci hè un ritardu in u latu di a rete / DB - di solitu tuttu finisci peggiu chè pudia;
    • Per piacè nutate chì Spring Data verifica a cunnessione di a basa di dati per difettu *;

      * Questu hè u cumpurtamentu predeterminatu di Spring Data Redis (almenu era l'ultima volta chì aghju verificatu), chì hà purtatu à un fallimentu "catastròficu": quandu Redis ùn era micca dispunibule per un pocu tempu, tutti i pods "crashed".

    • "esternu" in questu sensu pò ancu significà altri pods di a listessa applicazione, vale à dì, idealmente u cuntrollu ùn deve micca dipende di u statu di l'altri pods di u stessu cluster per prevene i crash in cascata:
      • I risultati ponu varià per l'applicazioni cù u statu distribuitu (per esempiu, caching in memoria in pods).
  2. Ùn aduprate micca una sonda di vivacità per i pods (l'eccezzioni sò casi quandu sò veramente necessarii è site sanu sanu di e specifiche è e cunsequenze di u so usu):
    • Una sonda di vivacità pò aiutà à ricuperà i cuntenituri appiccicati, ma postu chì avete un cuntrollu tutale di a vostra applicazione, cose cum'è i prucessi appiccicati è i blocchi ùn devenu idealmente micca accadutu: a megliu alternativa hè di crash deliberatamente l'applicazione è di rinvià à u statu stabile precedente;
    • una sonda di vivacità falluta farà riavvià u containeru, aggravendu cusì potenzialmente e cunsequenze di l'errori di carica: u riavviamentu di u cuntinuu hà da risultà in tempi di inattività (almenu per a durata di l'iniziu di l'applicazione, dì 30 seconde), causendu novi errori. , aumentendu a carica nantu à altri cuntenituri è aumentendu a probabilità di u so fallimentu, etc.;
    • I cuntrolli di vivacità cumminati cù una dipendenza esterna sò a peghju cumminazione pussibule, minacciandu i fallimenti in cascata: un ligeru ritardu in u latu di a basa di dati porta à un riavviu di tutti i vostri cuntenituri!
  3. Paràmetri di cuntrolli di vivacità è prontezza deve esse differente:
    • pudete aduprà una sonda di vivacità cù u stessu cuntrollu di salute, ma un sogliu di risposta più altu (failureThreshold), per esempiu, assignà u statutu micca prontu dopu à 3 tentativi è cunsiderà chì a sonda di vivacità hà fiascatu dopu à 10 tentativi;
  4. Ùn aduprate micca cuntrolli esecutivi, postu chì sò assuciati cù prublemi cunnisciuti chì portanu à l'apparizione di prucessi zombie:

Resumen

  • Aduprate sonde di prontezza per determinà quandu un pod hè prontu per riceve u trafficu.
  • Aduprate sonde di vivacità solu quandu sò veramente necessarii.
  • L'usu impropriu di e sonde di prontezza / vitalità pò purtà à una dispunibilità ridutta è fallimenti in cascata.

I sondi di Liveness in Kubernetes ponu esse periculosi

Materiali supplementari nantu à u tema

Actualizazione N ° 1 da 2019-09-29

Circa i cuntenituri init per a migrazione di basa di dati: Nota a piè di pagina aghjunta.

EJ m'hà ricurdatu circa PDB: unu di i prublemi cù i cuntrolli di vivacità hè a mancanza di coordinazione trà e pods. Kubernetes hà Budget Disruption Pod (PDB) per limità u nùmeru di fallimenti cuncurrenti chì una applicazione pò sperienze, ma i cuntrolli ùn anu micca cunsideratu u PDB. Ideale, pudemu dì à K8s per "Riavvia un pod se a so prova falla, ma ùn li riavviate micca tutti per evità di peghju".

Bryan l'hà dettu perfettamente: "Usate a prova di vivacità quandu sapete esattamente ciò chì u megliu da fà hè di tumbà l'applicazione"(di novu, ùn lasciate micca purtatu).

I sondi di Liveness in Kubernetes ponu esse periculosi

Actualizazione N ° 2 da 2019-09-29

Riguardu à leghje a documentazione prima di l'usu: Aghju creatu a dumanda currispondente (dumanda di funzione) per aghjunghje documentazione nantu à e sonde di vita.

PS da u traduttore

Leghjite puru nant'à u nostru blog:

Source: www.habr.com

Add a comment