Liveness probe'id Kuberneteses vÔivad olla ohtlikud

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.

Liveness probe'id Kuberneteses vÔivad olla ohtlikud

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:

Liveness probe'id Kuberneteses vÔivad olla ohtlikud

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 minu hiljutine artikkel 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 liveness probes ja readiness probes.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: 8080

Soovitused

  1. HTTP lÔpp-punktiga mikroteenuste (REST jne) puhul mÀÀrake alati valmiduse kontroll, mis kontrollib, kas rakendus (pod) on valmis liiklust vastu vÔtma.
  2. 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 readinessProbe kontrollisin "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).
  3. 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 Flyway 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.

  4. Kasutage httpGet readiness kontrollide jaoks tĂŒĂŒpiliste health check endpoint’ide kaudu (nĂ€iteks, /health).
  5. 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).
  6. 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.
  7. Vajadusel saab readiness probet kasutada kĂŒtmiseks/vahemĂ€lu laadimiseks ja tagastada olekukood 503, kuni konteiner on «soojenenud»:
    • soovitan samuti tutvuda uue kontrolliga, startupProbe, mis ilmus versioonis 1.16, (me oleme sellest kirjutanud vene keeles. siit — kt. tĂ”lge).

Hoiatused

  1. Ä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).
  2. Ä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!
  3. 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;
  4. Ärge kasutage exec-kontrolle, kuna nendega on seotud tuntud probleemid, mis vĂ”ivad viia zombiprotsesside tekkimiseni:

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.

Liveness probe'id Kuberneteses vÔivad olla ohtlikud

Lisatud materjalid teema kohta

Uuendus nr 1, 2019-09-29

Init-konteineritest andmebaasi migratsiooniks: lisatud jalus.

EJ meenutas mulle PDBst: ĂŒks liveness-proovide probleemidest on koordineerimise puudumine podide vahel. Kuberneteses on Pod Disruption Budgets (PDB) 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.”

Bryan sĂ”nastas selle suurepĂ€raselt: „Kasutage elavuse uuringut, kui te teate tĂ€pselt, et parim asi, mida teha, on „tapmine” rakendus“ (taaskord, selles ei tasu ĂŒle pingutada).

Liveness probe'id Kuberneteses vÔivad olla ohtlikud

Uuendus nr 2 2019-09-29

Mis puudutab dokumentatsiooni lugemist enne kasutamist: olen loonud vastava pÀringu (feature request) dokumentatsiooni tÀiendamiseks elavuse uurimise osas.

P.S. tÔlkija mÀrkused

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster