ShĂ«n. pĂ«rk.: Inxhinier i kryesor nga kompania Zalando â Henning Jacobs â shpesh ka vĂ«rejtur te pĂ«rdoruesit e Kubernetes probleme nĂ« kuptimin e qĂ«llimit tĂ« provave tĂ« jetĂ«gjatĂ«sisĂ« (dhe gatishmĂ«risĂ«) dhe pĂ«rdorimit tĂ« saktĂ« tĂ« tyre. Prandaj ai ka mbledhur mendimet e tij nĂ« kĂ«tĂ« nota tĂ« shkurtĂ«r, e cila me kalimin e kohĂ«s do tĂ« bĂ«het pjesĂ« e dokumentacionit K8s.

Kontrolli i gjendjes, i njohur nĂ« Kubernetes si provat e jetĂ«gjatĂ«sisĂ« (dmth, nĂ« dosje, âtestet pĂ«r jetĂ«gjatĂ«siâ â shĂ«n. pĂ«rkth.), mund tĂ« jenĂ« mjaft tĂ« rrezikshme. Rekomandoj tĂ« shmangni ato sa mĂ« shumĂ« qĂ« tĂ« jetĂ« e mundur: pĂ«rjashtimet janĂ« vetĂ«m rastet kur ato janĂ« me tĂ« vĂ«rtetĂ« tĂ« nevojshme dhe ju e kuptoni plotĂ«sisht specifikat dhe pasojat e pĂ«rdorimit tĂ« tyre. NĂ« kĂ«tĂ« publikim do tĂ« flasĂ« pĂ«r provat e jetĂ«gjatĂ«sisĂ« dhe gatishmĂ«risĂ«, si dhe do tĂ« diskutohet se kur kushtojnĂ« dhe kur nuk duhen aplikuar.
Kolegu im Sandor së fundmi ndau në Twitter gabimet më të zakonshme që i takohen, përfshirë ato që lidhen me përdorimin e provave të gatishmërisë/jetëgjatësisë:
Konfiguruar gabim livenessProbe mund të përkeqësojë situatat me ngarkesë të lartë (ndërprerje në zinxhir + nisje potencialisht e gjatë të kontejnerit/aplikacionit) dhe të sjellë pasojat e tjera negative siç janë rëniet e varësive (shih gjithashtu për kufizimin e numrit të kërkesave në kombinimin K3s+ACME). Akoma më keq, kur liveness probe kombinohet me kontrollin e shëndetit të varësisë (health check), e cila është një bazë të dhënash e jashtme: një dështim i vetëm i DB do të rinisë të gjithë kontejnerët tuaj!
Mesazhi i përgjithshëm «Mos përdorni liveness probes» në këtë rast ndihmon pak, prandaj le të shqyrtojmë për çfarë janë krijuar kontrollet readiness dhe liveness.
Shënim: pjesa më e madhe e testit të mëposhtëm ishte fillimisht përfshirë në dokumentacionin e brendshëm për zhvilluesit e Zalando.
Kontrolli Readiness dhe Liveness
Kubernetes ofron dy mekanizma tĂ« rĂ«ndĂ«sishĂ«m, tĂ« quajtur . Ato kryejnĂ« njĂ« veprim tĂ« caktuar nĂ« mĂ«nyrĂ« periodike â pĂ«r shembull, dĂ«rgojnĂ« njĂ« kĂ«rkesĂ« HTTP, hapin njĂ« lidhje TCP ose ekzekutojnĂ« njĂ« komandĂ« nĂ« kontejner â pĂ«r tĂ« konfirmuar qĂ« aplikacioni funksionon siç duhet.
Kubernetes përdor readiness probes, për të kuptuar se kur kontejneri është gati për të pranuar trafik. Pod-i konsiderohet i gatshëm për punë kur të gjitha kontejnerët e tij janë gati. Një nga përdorimet e këtij mekanizmi është të kontrollojë cilat pod-e përdoren si backend për shërbimet Kubernetes (dhe sidomos Ingress-in).
Kontrollet e gatishmërisë ndihmojnë Kubernetes të kuptojë kur është koha për të rinisur kontejnerin. Për shembull, një verifikim i tillë lejon kapjen e ngërçit, kur aplikacioni "ngjitet" në një vend. Rinisi i kontejnerit në një gjendje të tillë ndihmon në lëvizjen e aplikacionit nga pika e vdekur, pavarësisht nga gabimet, megjithatë, ai gjithashtu mund të çojë në dështime kaskadë (shih më poshtë).
Nëse përpiqeni të implementoni një përditësim të aplikacionit që dështon në kontrollet e gatishmërisë/gjallërisë, nxjerrja e tij do të ngecë, sepse Kubernetes do të presë statusin Gati nga të gjitha pod-et.
Shembuj
Ja një shembull i një kontrolli të gatishmërisë, që kontrollon rrugën /health nëpërmjet HTTP me cilësimet e parazgjedhura (interval: 10 sekonda, koha e skadimit: 1 sekondë, kufi suksesi: 1, kufi dështimi: 3):
# ŃаŃŃŃ ĐŸĐ±ŃĐ”ĐłĐŸ ĐŸĐżĐžŃĐ°ĐœĐžŃ deployment'а/ŃŃĐ”Đșа
podTemplate:
spec:
containers:
- name: my-container
# ...
readinessProbe:
httpGet:
path: /health
port: 8080R rekomandimet
- Për mikroshërbimet me endpoint HTTP (REST etj.) këtu duhet të përcaktoni gjithmonë një kontroll gatishmërie, e cila kontrollon nëse aplikacioni (pod-i) është gati për të pranuar trafik.
- Sigurohuni që kontrolli i gatishmërisë mbulon gatishmërinë e portit të vërtetë të serverit të uebit:
- duke përdorur porte për nevoja administrative, të quajtur "admin" ose "management" (p.sh. 9090), për
readinessProbe, sigurohuni që endpoint-i kthen OK vetëm nëse porta kryesore HTTP (si 8080) është e gatshme të pranojë trafik*;* Kam dijeni për të paktën një rast në Zalando kur kjo nuk ndodhi, domethënë
readinessProbeverifikoi portin "management", por serveri vetë nuk filloi ndonjëherë të punonte për shkak të problemeve me ngarkimin e caches. - varësimi i readiness probe në një port të veçantë mund të çojë në atë që ngarkesa në portin kryesor nuk pasqyrohet në health check (domethënë, porta e fijeve në server është e mbushur, por health check vazhdon të tregojë se gjithçka është OK).
- duke përdorur porte për nevoja administrative, të quajtur "admin" ose "management" (p.sh. 9090), për
- Sigurohuni që readiness probe përfshin inicializimin/migrimin e bazës së të dhënave;
- mënyra më e thjeshtë për ta arritur këtë është të kontaktoni me serverin HTTP vetëm pas përfundimit të inicializimit (p.sh. migrimi i DB me etj.); domethënë, në vend që të ndryshoni statusin e health check-it, thjesht mos e nise serverin e uebit deri sa të përfundojë migrimi i DB*.
* Po ashtu mund tĂ« filloni migrimet e DB nga init-kontejnerĂ«t jashtĂ« podâit. Ende jam njĂ« adhurues i aplikacioneve tĂ« vetĂ«-mjaftueshme, domethĂ«nĂ« atyre ku konteineri i aplikacionit e di si ta çojĂ« DB-nĂ« nĂ« gjendjen e duhur pa koordinim tĂ« jashtĂ«m.
- mënyra më e thjeshtë për ta arritur këtë është të kontaktoni me serverin HTTP vetëm pas përfundimit të inicializimit (p.sh. migrimi i DB me etj.); domethënë, në vend që të ndryshoni statusin e health check-it, thjesht mos e nise serverin e uebit deri sa të përfundojë migrimi i DB*.
- Përdorni
httpGetpĂ«r kontrollet e gatishmĂ«risĂ« pĂ«rmes endpointâĂ«ve tipikĂ« tĂ« kontrolleve tĂ« shĂ«ndetit (pĂ«r shembull,/health). - Shqyrtoni parametrat e kontrolleve tĂ« caktuar si parazgjedhje (
interval: 10s,timeout: 1s,successThreshold: 1,failureThreshold: 3):- parametrat e parazgjedhur do të thotë se pod-i do të bëhet not-ready afërsisht pas 30 sekondave (3 dështime të kontrolleve të funksionit).
- Përdorni një port të veçantë për 'admin' ose 'menaxhim', nëse stoku i teknologjisë (për shembull, Java/Spring) e lejon këtë, për të ndarë menaxhimin e 'shëndetit' dhe metrikave nga trafiku normal:
- por mos harroni pikën 2.
- Nëse është e nevojshme, mund të përdorni readiness probe për të ngrohur/ngarkuar cache-në dhe të ktheni kodin e statusit 503, derisa konteineri të 'ngrohet':
- po ashtu rekomandoj të njiheni me kontrollin e ri
startupProbe, (ne kemi shkruar rreth saj nĂ« rusisht â shĂ«nim i pĂ«rkthyesit.).
- po ashtu rekomandoj të njiheni me kontrollin e ri
Paralajmërime
- Mos u mbĂ«shtetni nĂ« varĂ«si tĂ« jashtme (si tĂ« dhĂ«nat e ruajtjes) gjatĂ« testeve pĂ«r gatishmĂ«ri/gjendemĂ«ri â kjo mund tĂ« çojĂ« nĂ« dĂ«shtime tĂ« kaskadĂ«s:
- si njĂ« shembull, le tĂ« marrim njĂ« shĂ«rbim stateful REST me 10 podâĂ« qĂ« varen nga njĂ« bazĂ« tĂ« dhĂ«nash Postgres: kur kontrolli varet nga njĂ« lidhje aktive me DB, tĂ« gjithĂ« 10 podâĂ«t mund tĂ« dĂ«shtojnĂ« nĂ«se ka njĂ« vonesĂ« nĂ« rrjet/nĂ« anĂ«n e DB-sĂ« â zakonisht kjo pĂ«rfundon mĂ« keq se sa mund tĂ« kishte qenĂ«;
- vini re se Spring Data kontrollon lidhjen me DB si parazgjedhje*;
* Kjo Ă«shtĂ« sjellja e parazgjedhjes sĂ« Spring Data Redis (tĂ« paktĂ«n ka qenĂ« kĂ«shtu kur e kontrolova herĂ«n e fundit), e cila çoi nĂ« njĂ« dĂ«shtim "katastrofik": kur Redis ishte pĂ«r njĂ« kohĂ« tĂ« shkurtĂ«r i paqasshĂ«m, tĂ« gjithĂ« podâĂ«t "dĂ«shtuan".
- "jashtĂ«" nĂ« kĂ«tĂ« kuptim gjithashtu mund tĂ« nĂ«nkuptojĂ« podâĂ«t e tjerĂ« tĂ« tĂ« njĂ«jtit aplikacion, domethĂ«nĂ« nĂ« idealin kontrolli nuk duhet tĂ« varet nga gjendja e podâĂ«ve tĂ« tjerĂ« tĂ« tĂ« njĂ«jtit grup pĂ«r tĂ« parandaloi dĂ«shtimet e kaskadĂ«s:
- rezultatet mund tĂ« ndryshojnĂ« pĂ«r aplikacionet me gjendje tĂ« shpĂ«rndarĂ« (p.sh., caching nĂ« memorie nĂ« podâĂ«).
- Mos përdorni liveness probe për pod'ët (përjashtimet janë rastet kur ato janë me të vërtetë të nevojshme dhe ju jeni plotësisht në dijeni të specifikave dhe pasojave të përdorimit të tyre):
- probe liveness mund të ndihmojë në rikuperimin e konteinerëve 'të ngecur', por, pasi keni kontroll të plotë mbi aplikacionin tuaj, situata të tilla si proceset 'të ngecura' dhe deadlock nuk duhet të ndodhin në mënyrë ideale: alternativa më e mirë është rënia e qëllimshme e aplikacionit dhe rikthimi në gjendjen e mëparshme të qëndrueshme;
- dështimi i probe liveness do të shkaktojë ribërjen e konteinerit, duke përkeqësuar potencialisht pasojat e gabimeve të lidhura me ngarkesën: ribërja e konteinerit do të çojë në pezullim (të paktën për kohën e nisjes së aplikacionit, le të themi, për më shumë se 30 sekonda), duke shkaktuar gabime të reja, duke rritur ngarkesën në konteinerët e tjerë dhe duke rritur shanset për dështimin e tyre, etj.;
- kontrollimet e liveness në kombinim me një varësi të jashtme janë kombinimi më i keq i mundshëm, që rrezikon dështime në cascada: një vonesë e vogël në anën e DB do të çojë në ribërjen e të gjithë konteinerëve tuaj!
- Parametrat e kontrolleve liveness dhe readiness duhet të jenë të ndryshëm:
- mund të përdoret liveness probe me të njëjtin health check, por me një prag më të lartë aktivizimi (
failureThreshold), për shembull, të caktohet statusi not-ready pas 3 përpjekjeve dhe të konsiderohet se liveness probe ka dështuar pas 10 përpjekjeve;
- mund të përdoret liveness probe me të njëjtin health check, por me një prag më të lartë aktivizimi (
- Mos përdorni kontrolla exec, pasi ato kanë probleme të njohura, që çojnë në shfaqjen e proceseve zombie:
- detajet: shihni .
Curriculum Vitae
- Përdorni readiness probes për të përcaktuar kur pod-i është i gatshëm të pranojë trafik.
- Përdorni liveness probes vetëm kur janë me të vërtetë të nevojshme.
- Përdorimi i gabuar i readiness/liveness probes mund të çojë në ulje të disponueshmërisë dhe dështime kaskadë.
Materiale shtesë për temën
- ;
- ;
- (flitet gjithashtu për livenessProbe).
PĂ«rditĂ«simi â1 nga 2019-09-29
: është shtuar një shënim.
për PDB: një nga problemet e liveness-probave është mungesa e koordinimit mes pod-eve. Në Kubernetes ka për të kufizuar numrin e dështimeve paralele që aplikacioni mund të përjetojë, megjithatë Kontrollimet nuk marrin parasysh PDB. Idealisht, mund të urdhërojmë K8s: "Rivado një pod, nëse kontrolli i tij dështoi, por mos e rivado të gjithë, që të mos e bësh edhe më keq."
: "Përdorni sondimin e gjallërisë kur e dini saktësisht se gjëja më e mirë që mund të bëni është të 'vritni' aplikacionin" (përsëri, mos i jepni shumë).
Kënaqësi e dytë nga 2019-09-29
: krijova një kërkesë përkatëse () për të shtuar dokumentacionin për sondat e gjallërisë.
P.S. nga përkthyesi
Lexoni gjithashtu në blogun tonë:
- «»;
- «»;
- «».
Burimi: habr.com
