MĂ€rkus tĂ”lke kohta.: Zalando juhtiv insener Henning Jacobs on korduvalt mĂ€rganud Kubernetes'i kasutajatel probleeme liveness (ja readiness) probe'ide mĂ”istmise ja nende Ă”ige rakendamisega. SeetĂ”ttu koondas ta oma mĂ”tted sellesse lĂŒhikesse mĂ€rkusesse, mis aja jooksul muutub K8si dokumentatsiooni osaks.

Kubernetes'is tuntud kui liveness probes (st. sĂ”na otseses mĂ”ttes «elujĂ”udluse testid» â mĂ€rk. tĂ”lk.), vĂ”ivad olla ĂŒsna ohtlikud. Soovitan neid vĂ”imaluse korral vĂ€ltida: eranditeks on ainult juhtumid, kui need on tĂ”eliselt vajalikud ja te tĂ€ielikult mĂ”istate nende kasutamise eripĂ€ra ja tagajĂ€rgi. Selles publikatsioonis rÀÀgitakse liveness- ja readiness-kontrollidest ning tuuakse vĂ€lja, millal asub ja millal neid ei tohiks rakendada.
Minu kolleeg Sandor jagas hiljuti Twitter'is kÔige levinumaid vigu, millega ta kokku puutub, sealhulgas readiness/liveness probe'ide kasutamisega seotud vigu:
Vale seadistamine livenessProbe vĂ”ib halvendada kĂ”rge koormuse olukordi (lumepalliefekt + potentsiaalselt pikk konteineri/rakenduse kĂ€ivitamine) ja pĂ”hjustada teisi negatiivseid tagajĂ€rgi, nagu sĂ”ltuvuste kokkuvarisemine (vt ka K3s+ACME kombineeritud pĂ€ringute piiramisest). Veel hullem on, kui liveness probe on kombineeritud sĂ”ltuvuse tervisekontrolliga, milleks on vĂ€line andmebaas: ĂŒks andmebaasi rike taaskĂ€ivitab kĂ”ik teie konteinerid!
Ăks peamine sĂ”num «Ărge kasutage liveness probe'e» antud juhul aitab vĂ€he, seega vaatame, milleks readiness- ja liveness-kontrollid on mĂ”eldud.
MĂ€rkus: enamik allpool toodud testidest oli algselt kaasatud Zalando arendajate sisemisse dokumentatsiooni.
Readiness ja Liveness kontrollid
Kubernetes pakub kahte olulist mehhanismi, mida nimetatakse . Need tĂ€idavad perioodiliselt teatud toimingut â nĂ€iteks saadavad HTTP-pĂ€ringu, avavad TCP-ĂŒhenduse vĂ”i kĂ€ivitavad kĂ€su konteineris â 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 kontrollida, milliseid podâe kasutatakse Kubernetesâi teenuste (ja eeskĂ€tt Ingressâi) tagaplaanidena.
Elamise kontrollid aitavad Kubernetesâil mĂ”ista, millal on aeg konteinerit taaskĂ€ivitada. NĂ€iteks vĂ”imaldab selline kontroll haarata deadlockâist, kus rakendus âhakkabâ paigale. Konteineri taaskĂ€ivitamine sellises seisundis aitab rakendust liigutada surnud punktist edasi, hoolimata vigadest, kuid see vĂ”ib samuti viia kaskaadsete tĂ”rgeteni (vt allpool).
Kui proovite rakenduse vĂ€rskendust juurutada, mis ei lĂ€hi elamise / valmiduse kontrollidest, jÀÀb selle juurutamine seisma, kuna Kubernetes ootab staatust Valmis kĂ”igilt podâidelt.
NĂ€ide
Siin on nĂ€ide valmiduse kontrollist, mis kontrollib teed /health HTTP kaudu vaikeseadetega (intervall: 10 sekundit, aegumine: 1 sekund, eduka kĂŒnnise: 1, ebaĂ”nnestumise kĂŒnnise: 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 porti valmiduse:
- kasutades haldusotstarbeliseks portides, mida nimetatakse âadminâ vĂ”i âmanagementâ (nt 9090),
readinessProbe, veenduge, et lĂ”pp-punkt tagastab OK, ainult kui peamine HTTP-port (nĂ€iteks 8080) on valmis liiklust vastu vĂ”tma*;* Olen teadlik vĂ€hemalt ĂŒhest juhtumist Zalandoâs, kus seda ei juhtunud, see tĂ€hendab
readinessProbeet kontrolliti âhaldusâ porti, kuid server ise ei hakanud tööle, kuna vahemĂ€lu laadimisega olid probleeme. - valmiduse kontrolli rakendamine eraldi porti vĂ”ib tĂ€hendada, et koormus peamisel pordil ei kajastu tervisekontrollis (see tĂ€hendab, et serveri niitide poolsus on tĂ€itunud, kuid tervisekontroll nĂ€itab endiselt, et kĂ”ik on OK).
- kasutades haldusotstarbeliseks portides, mida nimetatakse âadminâ vĂ”i âmanagementâ (nt 9090),
- Veenduge, et valmiduse kontroll hÔlmab andmebaasi initsialiseerimist / migratsiooni;
- kÔige lihtsam viis selle saavutamiseks on pöörduda HTTP-serveri poole alles pÀrast initsialiseerimise (nt andmebaasi migratsiooni) lÔppu; st selle asemel, et muuta tervisekontrolli staatust, lihtsalt Àrge kÀitage veebiserverit enne, kui andmebaasi migratsioon on lÔpule viidud*.
* Samuti on vĂ”imalik kĂ€ivitada andmebaasi migreerimist init-konteineritest vĂ€ljaspool podâi. Ma olen endiselt iseseisvate rakenduste (self-contained) fĂ€nn, st selliste, kus rakenduse konteiner teab ilma vĂ€list kooskĂ”lastuseta, kuidas viia andmebaas soovitud olekusse.
- kÔige lihtsam viis selle saavutamiseks on pöörduda HTTP-serveri poole alles pÀrast initsialiseerimise (nt andmebaasi migratsiooni) lÔppu; st selle asemel, et muuta tervisekontrolli staatust, lihtsalt Àrge kÀitage veebiserverit enne, kui andmebaasi migratsioon on lÔpule viidud*.
- Kasutage
httpGetvalmistumisproovide jaoks lĂ€bi tĂŒĂŒpiliste tervisekontrollide lĂ”pp-punkte (nĂ€iteks,/health). - Tutvu vaikevÀÀrtustega kontrolli parameetrite osas. (
interval: 10s,timeout: 1s,successThreshold: 1,failureThreshold: 3):- vaikevÀÀrtused tÀhendavad, et pod muutub not-ready umbes 30 sekundi pÀrast (3 ebaÔnnestunud tervisekontrolli).
- Kasutage eraldi porti âadminâ vĂ”i âmanagementâ jaoks, kui tehnoloogiline virn (nĂ€iteks Java/Spring) seda vĂ”imaldab, et eraldada tervise ja metoodika haldamine tavaliikluse eest:
- aga Àrge unustage punkti 2.
- Vajadusel vĂ”ib valmisoleku kontrolli kasutada teadmiste kaldumiseks/vahemĂ€lu laadimiseks ja vĂ€ljastada olekukoodi 503, kuni konteiner ei ole âsoojenenudâ:
- soovitan tuttavaks saada uue kontrolliga
startupProbe, (oleme sellest kirjutanud vene keeles. â toimetaja mĂ€rkus).
- soovitan tuttavaks saada uue kontrolliga
Hoiatused
- Ărge toetuge vĂ€listele sĂ”ltuvustele (nagu andmete ladustamine) valmisoleku/eluviiside testide lĂ€biviimisel â see vĂ”ib pĂ”hjustada kaskaadseid ebaĂ”nnestumisi:
- nĂ€iteks vĂ”tame stateful-teenuse REST 10 podâiga, mis sĂ”ltub ĂŒhest Postgres andmebaasist: kui kontroll sĂ”ltub töötavast ĂŒhendusest andmebaasiga, vĂ”ivad kĂ”ik 10 podâi kokku kukkuda, kui tekib viivitus vĂ”rgu/andmebaasi mĂ”ttes â tavaliselt lĂ”peb kĂ”ik hullemalt, kui vĂ”iks;
- pange tĂ€hele, et Spring Data kontrollib vaikimisi andmebaasiga ĂŒhendust*;
* Selline on Spring Data Redis vaikimisi kĂ€itumine (vĂ€hemalt oli see nii, kui ma eelmisel korral kontrollisin), mis viis âkatastroofiliseâ ebaĂ”nnestumiseni: kui Redis oli lĂŒhiajaliselt kĂ€ttesaamatu, kukkusid kĂ”ik podâid kokku.
- âvĂ€lineâ selles tĂ€henduses vĂ”ib samuti tĂ€hendada muid sama rakenduse podâe, st ideaaljuhul ei peaks kontroll sĂ”ltuma sama klastrisse kuuluvate teiste podâide olekust, et vĂ€ltida kaskaadseid kukkumisi:
- tulemused vĂ”ivad varieeruda rakenduste puhul, millel on jaotatud olek (nĂ€iteks, in-memory vahemĂ€lu podâides).
- Ărge kasutage eluviisi kontrolli podâide jaoks (vĂ€lja arvatud juhul, kui see on tĂ”eliselt vajalik ja olete tĂ€ielikult teadlik nende kasutamise eripĂ€radest ja tagajĂ€rgedest):
- liveness probe vĂ”ib aidata taastada âseisvaidâ konteinerite, kuid kuna teil on tĂ€ielik kontroll oma rakenduse ĂŒle, ei tohiks sellised asjad nagu âseisvadâ protsessid ja deadlock'id ideaalis tekkida: parem alternatiiv on rakenduse tahtlik kokku kukkumine ja selle naasmine eelmisse stabiilsesse seisundisse;
- ebaĂ”nnestunud liveness probe toob kaasa konteineri taaskĂ€ivitamise, mis vĂ”ib potentsiaalselt sĂŒvendada laadimisega seotud vigu: konteineri taaskĂ€ivitamine pĂ”hjustab seiskumise (vĂ€hemalt rakenduse kĂ€ivitamise ajal, ĂŒtleme, ĂŒle 30 sekundi), tekitades uusi vigu, suurendades koormust teistele konteineritele ja tĂ”stes nende rikke tĂ”enĂ€osust jne;
- liveness-proovid koos vĂ€lise sĂ”ltuvusega on halvim vĂ”imalik kombinatsioon, mis Ă€hvardab kaskaadsete tĂ”rgete ohtu: isegi vĂ€ike viivitus andmebaasi kĂŒljelt vĂ”ib pĂ”hjustada kĂ”igi teie konteinerite taaskĂ€ivitamise!
- liveness- ja readiness-proovide parameetrid peavad olema erinevad:
- vĂ”ib kasutada liveness probe sama health check'iga, kuid kĂ”rgema aktiveerimiskĂŒnnisega (
failureThreshold), nÀiteks mÀÀrata olek not-ready pÀrast 3 katset ja arvata, et liveness probe ebaÔnnestus pÀrast 10 katset;
- vĂ”ib kasutada liveness probe sama health check'iga, kuid kĂ”rgema aktiveerimiskĂŒnnisega (
- Ărge kasutage exec-proove, kuna nendega on seotud tuntud probleemid, mis pĂ”hjustavad zombiprotsesside tekkimist:
- detailid: vt. .
Elulookirjeldus
- Kasutage readiness probe'e, et mÀÀrata, millal pod on valmis liiklust vastu vÔtma.
- Kasutage liveness proove ainult siis, kui need on tÔeliselt vajalikud.
- Valesti kasutatud readiness/liveness probes vÔivad pÔhjustada kÀttesaadavuse vÀhenemist ja kaskaadseid tÔrkeid.
TĂ€iendavad materjalid teema kohta
- ;
- ;
- (kÀtkeb ka livenessProbe'i).
Uuendus nr 1 alates 2019-09-29
: lisatud jalus.
PDB: ĂŒheks liveness proovide probleemiks on pod'ide vahelise koordineerimise puudumine. Kubernetesel on rakenduse paralleelsete rikete arvu piiramiseks, mida see vĂ”ib kogeda, kuid proovide puhul ei arvestata PDB-d. Ideaalis saame kĂ€skida K8s: âTaaskĂ€ivita ĂŒks pod, kui selle proov ebaĂ”nnestub, kuid Ă€ra taaskĂ€ivita kĂ”iki, et mitte olukorda halvendadaâ.
: âKasutage elususe proove, kui teate tĂ€pselt, et parim asi, mida teha, on rakendus âtapmineâ(Ă€rge ĂŒle pingutage).
Uuendus nr 2, 29.09.2019
: lÔin vastava taotluse () elususe proove kÀsitleva dokumentatsiooni tÀiustamiseks.
P.S. tÔlkijalt
Lugege ka meie blogist:
- «»;
- «»;
- «».
Allikas: habr.com
