MĂ€rk. tĂ”lge.: Zalando peainsener Henning Jacobs on korduvalt mĂ€rganud, et Kubernetesega kasutajatel on probleeme liveness (ja readiness) probe'ide mĂ”istmisega ning nende Ă”ige rakendamisega. SeetĂ”ttu kogus ta oma mĂ”tted kokku selles lĂŒhikeses mĂ€rkuses, mis ajapikku saab K8s dokumentatsiooni osaks.

Kuberneteses tuntud olekusektsioonid liveness probe'id (s.t. sĂ”na-sĂ”nalt "elujĂ”udlustestid" â tĂ”lkija mĂ€rkus), vĂ”ivad olla ĂŒsna ohtlikud. Soovitan neid vĂ”imalusel vĂ€ltida; eranditeks on vaid juhtumid, kui need on tĂ”eliselt vajalikud ning te mĂ”istate tĂ€ielikult nende kasutamise spetsiifikat ja tagajĂ€rgi. Selles postituses rÀÀgitakse liveness- ja readiness-probe'idest ning ka sellest, millal maksavad ja millal mitte neid kasutada.
Minu kolleeg Sandor jagas hiljuti Twitteris kÔige sagedasemaid vigu, millega ta kokku puutub, sealhulgas neid, mis on seotud readiness/liveness probe'ide kasutamisega:
Vale seadistamine livenessProbe vĂ”ib keerulisemaks muuta olukordi, kus on kĂ”rge koormus (laviinilised katkestused + potentsiaalselt pikaajaline konteineri/rakenduse kĂ€ivitamine) ja pĂ”hjustada muid negatiivseid tagajĂ€rgi, nagu sĂ”ltuvuste kokkuvarisemine. (vt ka pĂ€ringute arvu piiramise kohta koos K3s+ACME-ga). Veelgi hullem on see, kui live probe on ĂŒhendatud sĂ”ltuvuse tervise kontrollimise (health check) kaudu, milleks on vĂ€line andmebaas: ĂŒks andmebaasi rike taaskĂ€ivitab kĂ”ik teie konteinerid.!
Ăks peamine punkt âĂrge kasutage liveness probesâ selles kontekstis aitab vĂ€he, seega vaatame, milleks on mĂ”eldud readiness- ja liveness-kontrollid.
MĂ€rkus: suurem osa allpool olevast testist oli algselt lisatud Zalando arendajate sisemisse dokumentatsioonisse.
Readiness ja Liveness kontrollid
Kubernetes pakub kahte olulist mehhanismi, mida nimetatakse Need teevad perioodiliselt teatud toimingut â nĂ€iteks saadavad HTTP-pĂ€ringu, avavad TCP-ĂŒhenduse vĂ”i tĂ€idavad konteineris kĂ€su â et kinnitada, et rakendus töötab korralikult.
Kubernetes kasutab readiness probes, et mĂ”ista, millal konteiner on valmis liiklust vastu vĂ”tma. Pod loetakse töövalmiks, kui kĂ”ik selle konteinerid on valmis. Ăks selle mehhanismi rakendusi on jĂ€lgida, milliseid podâe kasutatakse Kubernetesâi teenuste (ja eriti Ingressâi) tagaplaanidena.
Eluiga kontrollib aitavad Kubernetesâil mĂ”ista, millal on aeg konteiner taaselustada. NĂ€iteks selline kontroll aitab kinni pidada deadlockâi, kui rakendus âjĂ€ ĐŒĐŸŃĐŸĐ·ĐžŃŃŃâ ĂŒhes kohas. Konteineri taaskĂ€ivitamine sellises olekus aitab rakendust elustada, hoolimata veadest, kuid see vĂ”ib samuti pĂ”hjustada kaskaadne tĂ”rkeid (vt allpool).
Kui proovite juurutada rakenduse vĂ€rskendust, mis ebaĂ”nnestub eluiga/valmiduse kontrollides, jÀÀb selle rakendamine seisma, kuna Kubernetes ootab Valmis kĂ”igi podâide staatust.
NĂ€ide
Siin on nÀide valmiduse kontrollist, mis kontrollib teed /health HTTP kaudu vaikeseadetega (interval: 10 sekundit, ajakava: 1 sekund, edukuse kynrakindlus: 1, ebaÔnnestumise kynrakindlus: 3):
# ŃаŃŃŃ ĐŸĐ±ŃĐ”ĐłĐŸ ĐŸĐżĐžŃĐ°ĐœĐžŃ deployment'а/ŃŃĐ”Đșа
podTemplate:
spec:
containers:
- name: my-container
# ...
readinessProbe:
httpGet:
path: /health
port: 8080Soovitused
- HTTP lÔpp-punktiga mikroteenuste (REST jne) puhul mÀÀrake alati valmiduse kontroll, mis kontrollib, kas rakendus (pod) on valmis liiklust vastu vÔtma.
- Veenduge, et valmiduse kontroll katab veebiserveri tegeliku sadama valmisolekut:
- kasutades haldussorte, nimetatakse neid "admin" vÔi "management" (nÀiteks 9090),
readinessProbe, veenduge, et lĂ”pp-punkt tagastab OK ainult siis, kui pĂ”hihttp-sadam (nagu 8080) on valmis liiklust vastu vĂ”tma*;* Olen teadlik vĂ€hemalt ĂŒhest juhtumist Zalando's, kui seda ei juhtunud, st
readinessProbekontrollisin "management" sadamat, kuid server ei hakanud tööle, kuna oli probleemidega vahemÀlu laadimisega. - valmistamiskatse riputamine eraldi sadamale vÔib pÔhjustada peamise sadama koormuse mittepeegeldumist tervise kontrollis (st serveri sÔnumite bassein on tÀis, kuid tervise kontroll nÀitab siiski, et kÔik on OK).
- kasutades haldussorte, nimetatakse neid "admin" vÔi "management" (nÀiteks 9090),
- Veenduge, et valmistamiskatse hÔlmab andmebaasi initsialiseerimist/migratsiooni;
- lihtsaim viis selle saavutamiseks on pöörduda HTTP-serveri poole alles pÀrast initsialiseerimise lÔppu (nt andmebaasi migratsiooniga jne); see tÀhendab, et tervise kontrolli staatuse muutmise asemel Àrge lihtsalt kÀivitage veebiserverit enne andmebaasi migratsiooni lÔppu*.
* Samuti on vÔimalik kÀivitada andmebaasi migratsioone init-konteineritest pod'ist vÀljaspool. Ma olen endiselt iseseisvate rakenduste fÀnn, st selliste, kus rakenduse konteiner ilma vÀlist koordineerimiseta teab, kuidas viia andmebaas soovitud seisu.
- lihtsaim viis selle saavutamiseks on pöörduda HTTP-serveri poole alles pÀrast initsialiseerimise lÔppu (nt andmebaasi migratsiooniga jne); see tÀhendab, et tervise kontrolli staatuse muutmise asemel Àrge lihtsalt kÀivitage veebiserverit enne andmebaasi migratsiooni lÔppu*.
- Kasutage
httpGetreadiness kontrollide jaoks tĂŒĂŒpiliste health check endpointâide kaudu (nĂ€iteks,/health). - Tutvuge vaikeparameetritega. (
interval: 10s,timeout: 1s,successThreshold: 1,failureThreshold: 3):- vaikeparameetrid tÀhendavad, et pod muutub not-ready umbes 30 sekundi pÀrast (3 ebaÔnnestunud töövÔimekuse kontrolli).
- Kasutage «admin» vÔi «management» jaoks eraldi porti, kui tehnoloogiline stack (nÀiteks Java/Spring) seda vÔimaldab, et eraldada «tervishoiu» ja mÔÔdikute haldamine tavalisest liiklusest:
- aga Àrge unustage punkti 2.
- Vajadusel saab readiness probet kasutada kĂŒtmiseks/vahemĂ€lu laadimiseks ja tagastada olekukood 503, kuni konteiner on «soojenenud»:
- soovitan samuti tutvuda uue kontrolliga,
startupProbe, (me oleme sellest kirjutanud vene keeles. â kt. tĂ”lge).
- soovitan samuti tutvuda uue kontrolliga,
Hoiatused
- Ărge toetuge vĂ€listele sĂ”ltuvustele. (nĂ€iteks andmehoidlad) readiness/liveness testide lĂ€biviimisel â see vĂ”ib pĂ”hjustada kaskaadseid tĂ”rkeid:
- kuna nĂ€itena vĂ”tame stateful-teenuse REST koos 10 pod'iga, mis sĂ”ltuvad ĂŒhest Postgres andmebaasist: kui kontroll sĂ”ltub töötavast ĂŒhendusest DB-ga, vĂ”ivad kĂ”ik 10 pod'i kukkuda, kui vĂ”rgu/DB-poolel tekib viivitus â tavaliselt lĂ”peb kĂ”ik halvemini, kui vĂ”iks;
- pange tĂ€hele, et Spring Data kontrollib vaikimisi ĂŒhendust andmebaasiga*;
* See on Spring Data Redis vaikimisi kĂ€itumine (vĂ€hemalt oli see nii, kui ma viimati kontrollisin), mis viis âkatastroofiliseâ tĂ”rkeni: kui Redis oli lĂŒhikeseks ajaks kĂ€ttesaamatu, kukkusid kĂ”ik pod'id kokku.
- âvĂ€lineâ vĂ”ib selles tĂ€henduses tĂ€hendada ka teisi sama rakenduse pod'e, see tĂ€hendab, et ideaalis ei tohiks kontroll sĂ”ltuda sama klastris olevate teiste pod'ide seisundist, et vĂ€ltida kaskaadseid kokku kukkumisi:
- tulemused vÔivad varieeruda rakendustes, millel on jaotatud seisund (nÀiteks in-memory cache pod'ides).
- Ărge kasutage liveness probe podâide jaoks (vĂ€lja arvatud olukorrad, kus need on tĂ”eliselt vajalikud ja teate tĂ€ielikult nende kasutamise spetsiifikat ja tagajĂ€rgi):
- liveness probe vĂ”ib aidata taastada âhanginudâ konteinerid, kuid kuna teil on oma rakenduse ĂŒle tĂ€ielik kontroll, ei tohiks ideeliselt toimuda selliseid asju nagu âhangunudâ protsessid ja deadlockid: parim alternatiiv on rakenduse tahtlik kokkuvarisemine ja selle taastamine eelnevalt stabiilsesse olekusse;
- ebaĂ”nnestunud liveness probe pĂ”hjustab konteineri taaskĂ€ivitamist, mis vĂ”ib potentsiaalselt sĂŒvendada laadimisvigade tagajĂ€rgi: konteineri taaskĂ€ivitamine toob kaasa seisaku (vĂ€hemalt rakenduse kĂ€ivitamise ajaks, ĂŒtleme, ĂŒle 30 sekundi), tekitades uusi vigu ja suurendades teiste konteinerite koormust ning suurendades tĂ”rkeid jne;
- liveness-kontrollid koos vÀlise sÔltuvusega on halvim vÔimalik kombinatsioon, mis Àhvardab kaskaadi ebaÔnnestumistega: isegi vÀike viivitus andmebaasi poolel toob kaasa kÔigi teie konteinerite taaskÀivitamise!
- liveness- ja readiness-kontrollide parameetrid peavad olema erinevad:
- saab kasutada liveness-proovi sama health checkiga, kuid kÔrgema lÀvivÀÀrtusega (
failureThreshold), nÀiteks mÀÀrata olek not-ready pÀrast 3 katset ja pidada liveness-proovi ebaÔnnestunuks pÀrast 10 katset;
- saab kasutada liveness-proovi sama health checkiga, kuid kÔrgema lÀvivÀÀrtusega (
- Ărge kasutage exec-kontrolle, kuna nendega on seotud tuntud probleemid, mis vĂ”ivad viia zombiprotsesside tekkimiseni:
- tĂ€iendavaid ĂŒksikasju: vt. .
KokkuvÔte
- Kasutage readiness probe, et mÀÀrata, millal pod on valmis liiklust vastu vÔtma.
- Kasutage liveness probe ainult siis, kui need on tÔeliselt vajalikud.
- Vale readiness/liveness proovi kasutamine vÔib viia kÀttesaadavuse languseni ja kaskaadsetesse tÔrgetesse.
Lisatud materjalid teema kohta
- ;
- ;
- (kÀtkeb ka livenessProbi).
Uuendus nr 1, 2019-09-29
: lisatud jalus.
PDBst: ĂŒks liveness-proovide probleemidest on koordineerimise puudumine podide vahel. Kuberneteses on rakenduse samal ajal toimuvaid paralleelseid rikkeid piirates, kuid kontrollid ei arvestata PDB-ga. Ideaalis vĂ”iksime K8s-ile öelda: âTaaskĂ€ivita ĂŒks pod, kui selle kontroll ebaĂ”nnestub, kuid Ă€ra taaskĂ€ivita neid kĂ”iki, et mitte veelgi halvemaks teha.â
: âKasutage elavuse uuringut, kui te teate tĂ€pselt, et parim asi, mida teha, on âtapmineâ rakendusâ (taaskord, selles ei tasu ĂŒle pingutada).
Uuendus nr 2 2019-09-29
: olen loonud vastava pÀringu () dokumentatsiooni tÀiendamiseks elavuse uurimise osas.
P.S. tÔlkija mÀrkused
Lugege ka meie blogist:
- «»;
- «»;
- «».
Allikas: habr.com
