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.
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à:
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
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.
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). ).
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.
Usu httpGet per i cuntrolli di prontezza attraversu i punti finali di cuntrollu di salute tipici (per esempiu, /health).
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).
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.
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:
Vi cunsigliu ancu di leghje u novu verificatu startupProbe, apparsu in a versione 1.16(avemu scrittu annantu à questu in russu ccà - ca. trad.).
Caveats
Ù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).
Ù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!
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;
Ùn aduprate micca cuntrolli esecutivi, postu chì sò assuciati cù prublemi cunnisciuti chì portanu à l'apparizione di prucessi zombie:
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).