Liveness Sonden zu Kubernetes kënne geféierlech sinn

Note. iwwersat.: Lead Ingenieur aus Zalando, Henning Jacobs, huet ëmmer erëm Problemer ënner Kubernetes Benotzer gemierkt fir den Zweck vu Liveness (a Bereetschaft) Sonden an hir korrekt Notzung ze verstoen. Dofir huet hien seng Gedanken an dëser capacious Note gesammelt, déi schlussendlech en Deel vun der K8s Dokumentatioun ginn.

Liveness Sonden zu Kubernetes kënne geféierlech sinn

Gesondheet Kontrollen, bekannt an Kubernetes als Liewensdauer Sonden (dh wuertwiertlech "Viabilitéitstester" - ongeféier Iwwersetzung), ka ganz geféierlech sinn. Ech recommandéieren se ze vermeiden wa méiglech: déi eenzeg Ausnahmen sinn wann se wierklech néideg sinn an Dir sidd voll bewosst iwwer d'Spezifizitéiten an d'Konsequenze vun hirer Benotzung. Dës Publikatioun wäert iwwer Liveness a Bereetschaft Kontrollen schwätzen, a wäert Iech och soen a wéi enge Fäll ass et wäert an Dir sollt se net benotzen.

Mäi Kolleg Sandor huet viru kuerzem op Twitter déi heefegst Feeler gedeelt, déi hie begéint, och déi am Zesummenhang mat der Benotzung vu Bereetschafts-/Livenesssonden:

Liveness Sonden zu Kubernetes kënne geféierlech sinn

Falsch konfiguréiert livenessProbe kann Héichbelaaschtungssituatiounen verschäerfen (Schnéiballschaltung + potenziell laang Container / Uwendungsstartzäit) a féieren zu aner negativ Konsequenzen wéi Ofhängegkeetsfäll (kuck och meng rezent Artikel iwwer d'Begrenzung vun der Unzuel vun Ufroen an der K3s + ACME Kombinatioun). Et ass nach méi schlëmm wann d'Livenesssonde mat enger Gesondheetscheck kombinéiert ass, wat eng extern Datebank ass: een eenzegen DB Echec wäert all Är Container nei starten!

Allgemeng Message "Benotzt keng Liveness-Sonden" an dësem Fall hëlleft et net vill, also kucke mer wat d'Bereetschafts- a Livenesschecken sinn.

Notiz: De gréissten Deel vum Test hei drënner war ursprénglech an Zalando senger interner Entwécklerdokumentatioun abegraff.

Bereetschaft a Liveness Kontrollen

Kubernetes bitt zwee wichteg Mechanismen genannt Liewenssonden a Bereetschaftssonden. Si maachen periodesch eng Handlung - sou wéi eng HTTP-Ufro ze schécken, eng TCP-Verbindung opzemaachen oder e Kommando am Container auszeféieren - fir ze bestätegen datt d'Applikatioun funktionnéiert wéi erwaart.

Kubernetes benotzt Bereetschaft Sondenze verstoen wann de Container prett ass fir de Verkéier ze akzeptéieren. E Pod gëtt als prett ugesinn wann all seng Container prett sinn. Ee Gebrauch vun dësem Mechanismus ass fir ze kontrolléieren wéi eng Pods als Backends fir Kubernetes Servicer (a besonnesch Ingress) benotzt ginn.

Liveness Sonden hëllefen Kubernetes ze verstoen wann et Zäit ass de Container nei ze starten. Zum Beispill, esou e Scheck erlaabt Iech en Deadlock z'ënnerscheeden wann eng Applikatioun op enger Plaz festhält. De Container an dësem Zoustand nei starten hëlleft d'Applikatioun trotz Feeler aus dem Buedem ze kréien, awer et kann och zu Kaskadfehler féieren (kuckt hei ënnen).

Wann Dir probéiert en Applikatiounsupdate z'installéieren deen d'Liveness / Bereetschaftskontrolle feelt, gëtt seng Rollout gestoppt wéi Kubernetes op de Status waart Ready vun allen Hënn.

Beispill:

Hei ass e Beispill vun enger Bereetschaftssonde déi e Wee iwwerpréift /health iwwer HTTP mat Standardastellungen (Tëschenzäit: 10 Sekonnen, Äuszäit:1 Sekonnen, Succès Schwell: 1, Echec Schwell:3):

# часть общего описания deployment'а/стека
podTemplate:
  spec:
    containers:
    - name: my-container
      # ...
      readinessProbe:
        httpGet:
          path: /health
          port: 8080

Recommandatiounen

  1. Fir Mikroservicer mat HTTP Endpunkt (REST, etc.) definéieren ëmmer eng Bereetschaft Sonde, déi kontrolléiert ob d'Applikatioun (Pod) prett ass fir de Traffic ze akzeptéieren.
  2. Vergewëssert Iech d'Bereetschaft Sonde deckt d'Disponibilitéit vum aktuellen Webserverport:
    • benotzt Ports fir administrativ Zwecker, genannt "admin" oder "management" (zum Beispill, 9090), fir readinessProbe, vergewëssert Iech datt den Endpunkt nëmmen OK zréckkënnt wann de primäre HTTP-Port (wéi 8080) prett ass fir de Verkéier ze akzeptéieren *;

      *Ech weess op d'mannst ee Fall bei Zalando wou dat net geschitt ass, d.h. readinessProbe Ech hunn den Hafen "Gestioun" gepréift, awer de Server selwer huet net ugefaang ze schaffen wéinst Probleemer mam Cache ze lueden.

    • eng Bereetschaftssonde un engem getrennten Hafen befestegt kann zu der Tatsaach féieren datt d'Iwwerlaaschtung um Haapthafen net am Gesondheetscheck reflektéiert gëtt (dat ass, de Fuedempool um Server ass voll, awer d'Gesondheetscheck weist nach ëmmer datt alles OK ass ).
  3. Gitt sécher datt Bereetschaft Sonde erméiglecht Datebank initialization / Migratioun;
    • Deen einfachste Wee fir dëst z'erreechen ass den HTTP-Server ze kontaktéieren nëmmen nodeems d'Initialiséierung fäerdeg ass (zum Beispill d'Migratioun vun enger Datebank vun Fluchwee a sou weider.); dat heescht, amplaz de Status vun der Gesondheetscheck z'änneren, start de Webserver einfach net bis d'Datebankmigratioun fäerdeg ass*.

      * Dir kënnt och Datebankmigratiounen aus Init Container ausserhalb vum Pod lafen. Ech sinn nach ëmmer e Fan vu selbststännegen Uwendungen, dat heescht déi, an deenen den Applikatiounscontainer weess wéi d'Datebank ouni extern Koordinatioun an de gewënschten Zoustand bréngt.

  4. Benotzt httpGet fir Bereetschaftskontrollen duerch typesch Gesondheetscheck Endpoints (zum Beispill, /health).
  5. Verstinn d'Standardcheckparameter (interval: 10s, timeout: 1s, successThreshold: 1, failureThreshold: 3):
    • d'Standardoptiounen bedeiten datt de Pod wäert ginn net-prett no ongeféier 30 Sekonnen (3 gescheitert Sanitéitskontrollen).
  6. Benotzt e separaten Hafen fir "Admin" oder "Gestioun" wann den Technologiestack (zB Java / Fréijoer) et erlaabt, fir Gesondheets- a Metrikmanagement vum normale Traffic ze trennen:
    • awer vergiesst net den Punkt 2.
  7. Wann néideg, kann d'Bereetschaftssonde benotzt ginn fir de Cache opzemaachen / ze lueden an en 503 Statuscode zréckzebréngen bis de Container erwiermt:
    • Ech recommandéieren och, datt Dir déi nei kontrolléieren liesen startupProbe, erschéngt an der Versioun 1.16 (mir geschriwwen doriwwer op russesch hei — ca. Iwwersetzung).

Caveats

  1. Vertrau net op extern Ofhängegkeeten (sou wéi Datelager) wann Dir Bereetschafts- / Liewenstester leeft - dëst kann zu kaskadende Feeler féieren:
    • Als Beispill, loosst eis e staatleche REST Service mat 10 Pods huelen ofhängeg vun enger Postgres Datebank: wann de Scheck vun enger Aarbechtsverbindung mat der DB hänkt, kënnen all 10 Pods ausfalen wann et Verspéidung op der Netz / DB Säit ass - normalerweis ass et alles endet méi schlëmm wéi et kéint;
    • Maacht weg datt Fréijoersdaten d'Datebankverbindung als Standard iwwerpréift *;

      * Dëst ass d'Standardverhalen vu Spring Data Redis (op d'mannst war et déi leschte Kéier wou ech gepréift hunn), wat zu engem "katastrophesche" Versoen gefouert huet: wann Redis fir eng kuerz Zäit net verfügbar war, sinn all Pods "geklappt".

    • "extern" an dësem Sënn kann och aner Pods vun der selwechter Applikatioun bedeiten, dat heescht, am Idealfall sollt de Scheck net vum Zoustand vun anere Pods vum selwechte Stärekoup ofhänken fir Kaskadespären ze vermeiden:
      • Resultater kënne variéieren fir Uwendungen mat verdeeltem Zoustand (zum Beispill, In-Memory Caching a Pods).
  2. Benotzt keng Liveness Sonde fir Pods (Ausnahmen si Fäll wou se wierklech néideg sinn an Dir sidd voll bewosst iwwer d'Spezifizitéiten an d'Konsequenze vun hirer Benotzung):
    • Eng Liveness-Sond kann hëllefe hängkt Container ze recuperéieren, awer well Dir voll Kontroll iwwer Är Applikatioun hutt, sollten Saachen wéi hängeg Prozesser an Deadlocks am Idealfall net geschéien: déi bescht Alternativ ass d'Applikatioun bewosst ze crashen an se an de fréiere stabile Staat ze bréngen;
    • eng gescheitert Liveness-Sond wäert de Container nei starten, doduerch potenziell d'Konsequenze vu Luede-verwandte Feeler verschäerfen: de Container nei starten wäert zu Downtime féieren (op d'mannst fir d'Dauer vum Startup vun der Applikatioun, soen 30-komesch Sekonnen), verursaacht nei Feeler , d'Erhéijung vun der Belaaschtung op aner Container an d'Erhéijung vun der Wahrscheinlechkeet vun hirem Echec, etc.;
    • Liewenskontrolle kombinéiert mat enger externer Ofhängegkeet sinn déi schlëmmst méiglech Kombinatioun, bedroht Kaskadesfehler: e liichte Verspéidung op der Datebanksäit féiert zu engem Neistart vun all Äre Container!
  3. Parameteren vun Liveness a Bereetschaft Schecken muss anescht sinn:
    • Dir kënnt eng Liveness Sonde mat der selwechter Gesondheetscheck benotzen, awer eng méi héich Äntwertschwell (failureThreshold), zum Beispill de Status zouginn net-prett no 3 Versich a berücksichtegt datt d'Livenesssonde no 10 Versich gescheitert ass;
  4. Benotzt keng Exec Kontrollen, well se mat bekannte Probleemer verbonne sinn, déi zu der Erscheinung vun Zombieprozesser féieren:

Summary

  • Benotzt Bereetschaftssonden fir ze bestëmmen wann e Pod prett ass fir Traffic ze kréien.
  • Benotzt Liveness Sonde nëmme wann se wierklech gebraucht ginn.
  • Onkorrekt Notzung vu Bereetschaft / Liewenssonde kann zu enger reduzéierter Disponibilitéit a Kaskadfehler féieren.

Liveness Sonden zu Kubernetes kënne geféierlech sinn

Zousätzlech Material zum Thema

Update Nr 1 vun 2019-09-29

Iwwer Init Container fir Datebank Migratioun: Foussnot dobäigesat.

EJ erënnert mech iwwer PDB: Ee vun de Problemer mat Liveness Kontrollen ass de Mangel u Koordinatioun tëscht Pods. Kubernetes huet Pod Disruption Budgets (PDB) fir d'Zuel vun de concurrent Feeler ze limitéieren, déi eng Applikatioun kann erliewen, awer d'Kontrollen berücksichtegen net de PDB. Idealerweis kéinte mir K8s soen "Ee Pod nei starten wann säin Test klappt, awer net all nei starten fir d'Saache méi schlecht ze maachen."

De Bryan huet et perfekt gesot: "Benotzt d'Liveness-Sondéierung wann Dir genau wësst wat déi bescht Saach ze maachen ass d'Applikatioun ëmzebréngen"(nach eng Kéier, gitt net ewech).

Liveness Sonden zu Kubernetes kënne geféierlech sinn

Update Nr 2 vun 2019-09-29

Betreffend d'Liesen vun der Dokumentatioun virum Gebrauch: Ech hunn déi entspriechend Ufro erstallt (Funktioun Ufro) Dokumentatioun iwwer Liveness-Sonden ze addéieren.

PS vum Iwwersetzer

Liest och op eisem Blog:

Source: will.com

Setzt e Commentaire