Kuberneteses olevad Liveness probes vÔivad olla ohtlikud

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.

Kuberneteses olevad Liveness probes vÔivad olla ohtlikud

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:

Kuberneteses olevad Liveness probes vÔivad olla ohtlikud

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 minu hiljutine artikkel 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 liveness probes ja readiness probes. 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: 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 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 readinessProbe et 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).
  3. 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; Flyway 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.

  4. Kasutage httpGet valmistumisproovide jaoks lĂ€bi tĂŒĂŒpiliste tervisekontrollide lĂ”pp-punkte (nĂ€iteks, /health).
  5. 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).
  6. 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.
  7. Vajadusel vĂ”ib valmisoleku kontrolli kasutada teadmiste kaldumiseks/vahemĂ€lu laadimiseks ja vĂ€ljastada olekukoodi 503, kuni konteiner ei ole ‘soojenenud’:

Hoiatused

  1. Ä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).
  2. Ä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!
  3. 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;
  4. Ärge kasutage exec-proove, kuna nendega on seotud tuntud probleemid, mis pĂ”hjustavad zombiprotsesside tekkimist:

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.

Kuberneteses olevad Liveness probes vÔivad olla ohtlikud

TĂ€iendavad materjalid teema kohta

Uuendus nr 1 alates 2019-09-29

Init-konteinerite kohta andmebaasi migreerimisel: lisatud jalus.

EJ tuletas mulle meelde PDB: ĂŒheks liveness proovide probleemiks on pod'ide vahelise koordineerimise puudumine. Kubernetesel on Pod Disruption Budgets (PDB) 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”.

Bryan vĂ€ljendas seda suurepĂ€raselt: „Kasutage elususe proove, kui teate tĂ€pselt, et parim asi, mida teha, on rakendus „tapmine“(Ă€rge ĂŒle pingutage).

Kuberneteses olevad Liveness probes vÔivad olla ohtlikud

Uuendus nr 2, 29.09.2019

Seoses dokumentatsiooni lugemisega enne kasutamist: lÔin vastava taotluse (feature request) elususe proove kÀsitleva dokumentatsiooni tÀiustamiseks.

P.S. tÔlkijalt

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster