L-Aħjar Prattiki għall-Kontenituri Kubernetes: Kontrolli tas-Saħħa

L-Aħjar Prattiki għall-Kontenituri Kubernetes: Kontrolli tas-Saħħa

TL; DR

  • Biex tinkiseb osservabilità għolja ta 'kontenituri u mikroservizzi, zkuk u metriċi primarji mhumiex biżżejjed.
  • Għal irkupru aktar mgħaġġel u reżiljenza akbar, l-applikazzjonijiet għandhom japplikaw il-Prinċipju ta' Osservabbiltà Għolja (HOP).
  • Fil-livell tal-applikazzjoni, NOP jeħtieġ: illoggjar xieraq, monitoraġġ mill-qrib, kontrolli tas-sanità, u traċċar tal-prestazzjoni/tranżizzjoni.
  • Uża l-kontrolli bħala element ta' NOR prontezza Sonda и Ħajja Sonda Kubernetes.

X'inhu Mudell ta' Kontroll tas-Saħħa?

Meta tfassal applikazzjoni kritika għall-missjoni u disponibbli ħafna, huwa importanti ħafna li wieħed jaħseb dwar aspett bħal tolleranza għall-ħsarat. Applikazzjoni hija kkunsidrata tolleranti għall-ħsarat jekk tirkupra malajr mill-falliment. Applikazzjoni sħaba tipika tuża arkitettura ta' mikroservizzi - fejn kull komponent jitqiegħed f'kontenitur separat. U sabiex tiżgura li l-applikazzjoni fuq k8s tkun disponibbli ħafna meta tiddisinja cluster, trid issegwi ċerti mudelli. Fosthom hemm il-Mudell tal-Kontroll tas-Saħħa. Jiddefinixxi kif l-applikazzjoni tikkomunika lil k8s li hija b'saħħitha. Din mhix biss informazzjoni dwar jekk il-pod huwiex qed jaħdem, iżda wkoll dwar kif jirċievi u jirrispondi għat-talbiet. Aktar ma Kubernetes ikun jaf dwar is-saħħa tal-pod, iktar jieħu deċiżjonijiet intelliġenti dwar ir-rotot tat-traffiku u l-ibbilanċjar tat-tagħbija. Għalhekk, il-Prinċipju ta' Osservabbiltà Għolja jippermetti li l-applikazzjoni twieġeb għat-talbiet fil-ħin.

Prinċipju ta' Osservabbiltà Għolja (HOP)

Il-prinċipju ta 'osservabilità għolja huwa wieħed minn prinċipji għat-tfassil ta' applikazzjonijiet f'kontejners. F'arkitettura ta' mikroservizzi, is-servizzi ma jimpurtahomx kif it-talba tagħhom tiġi pproċessata (u bir-raġun), iżda l-importanti huwa kif jirċievu tweġibiet mis-servizzi li jirċievu. Pereżempju, biex jawtentika utent, kontenitur wieħed jibgħat talba HTTP lil ieħor, jistenna rispons f'ċertu format - dak kollu. PythonJS jista 'wkoll jipproċessa t-talba, u Python Flask jista' jirrispondi. Il-kontenituri huma bħal kaxxi suwed b'kontenut moħbi lil xulxin. Madankollu, il-prinċipju NOP jeħtieġ li kull servizz jesponi punti finali tal-API multipli li jindikaw kemm huwa b'saħħtu, kif ukoll l-istat ta 'prontezza u tolleranza tal-ħsarat tiegħu. Kubernetes jitlob dawn l-indikaturi sabiex jaħseb fil-passi li jmiss għar-rotot u l-ibbilanċjar tat-tagħbija.

Applikazzjoni sħaba mfassla tajjeb tirreġistra l-avvenimenti ewlenin tagħha billi tuża l-flussi standard I/O STDERR u STDOUT. Sussegwentement jiġi servizz awżiljarju, pereżempju filebeat, logstash jew fluentd, li jwassal zkuk għal sistema ċentralizzata ta’ monitoraġġ (pereżempju Prometheus) u sistema ta’ ġbir taz-zkuk (software ELK). Id-dijagramma t'hawn taħt turi kif taħdem applikazzjoni sħaba skont il-Mudell tat-Test tas-Saħħa u l-Prinċipju ta' Osservabbiltà Għolja.

L-Aħjar Prattiki għall-Kontenituri Kubernetes: Kontrolli tas-Saħħa

Kif tapplika l-Mudell tal-Kontroll tas-Saħħa f'Kubernetes?

Barra mill-kaxxa, k8s jimmonitorja l-istatus tal-imżiewed billi juża wieħed mill-kontrolluri (Skjeramenti, ReplicaSets, DaemonSets, StatefulSets eċċ., eċċ.). Wara li skopra li l-pod waqa 'għal xi raġuni, il-kontrollur jipprova jerġa' jibda jew imexxih għal nodu ieħor. Madankollu, pod jista 'jirrapporta li qed jaħdem, iżda huwa nnifsu mhux qed jaħdem. Ejja nagħtu eżempju: l-applikazzjoni tiegħek tuża Apache bħala web server, inti installajt il-komponent fuq diversi pods tal-cluster. Peress li l-librerija kienet ikkonfigurata ħażin, it-talbiet kollha lill-applikazzjoni jirrispondu bil-kodiċi 500 (iżball intern tas-server). Meta tiċċekkja l-kunsinna, il-verifika tal-istatus tal-imżiewed tagħti riżultat ta 'suċċess, iżda l-klijenti jaħsbu b'mod differenti. Aħna ser niddeskrivu din is-sitwazzjoni mhux mixtieqa kif ġej:

L-Aħjar Prattiki għall-Kontenituri Kubernetes: Kontrolli tas-Saħħa

Fl-eżempju tagħna, k8s jagħmel kontroll tal-funzjonalità. F'dan it-tip ta 'verifika, il-kubelet jiċċekkja kontinwament l-istat tal-proċess fil-kontenitur. Ladarba jifhem li l-proċess waqaf, jerġa 'jibda. Jekk l-iżball jista 'jiġi riżolt billi sempliċiment terġa' tibda l-applikazzjoni, u l-programm huwa ddisinjat biex jagħlaq fuq kwalunkwe żball, allura kontroll tas-saħħa tal-proċess huwa dak kollu li għandek bżonn biex issegwi n-NOP u l-Mudell tat-Test tas-Saħħa. L-unika ħasra hija li mhux l-iżbalji kollha jiġu eliminati billi jerġgħu jibdew. F'dan il-każ, k8s joffri 2 modi aktar profondi biex tidentifika problemi bil-pod: Ħajja Sonda и prontezza Sonda.

LivenessProbe

Matul il - Ħajja Sonda kubelet iwettaq 3 tipi ta 'kontrolli: mhux biss jiddetermina jekk il-pod huwiex qed jaħdem, iżda wkoll jekk huwiex lest biex jirċievi u jirrispondi b'mod adegwat għat-talbiet:

  • Stabbilixxi talba HTTP lill-pod. Ir-rispons għandu jkun fih kodiċi ta 'rispons HTTP fil-medda minn 200 sa 399. Għalhekk, il-kodiċijiet 5xx u 4xx jindikaw li l-pod qed ikollu problemi, minkejja li l-proċess ikun qed jaħdem.
  • Biex tittestja pods b'servizzi mhux HTTP (pereżempju, is-server tal-posta Postfix), trid tistabbilixxi konnessjoni TCP.
  • Teżegwixxi kmand arbitrarju għal pod (intern). Il-verifika titqies bħala suċċess jekk il-kodiċi tat-tlestija tal-kmand huwa 0.

Eżempju ta’ kif jaħdem dan. Id-definizzjoni tal-pod li jmiss fiha applikazzjoni NodeJS li tarmi żball 500 fuq talbiet HTTP. Biex niżguraw li l-kontenitur jerġa' jinbeda meta nirċievi żball bħal dan, nużaw il-parametru livenessProbe:

apiVersion: v1
kind: Pod
metadata:
 name: node500
spec:
 containers:
   - image: magalix/node500
     name: node500
     ports:
       - containerPort: 3000
         protocol: TCP
     livenessProbe:
       httpGet:
         path: /
         port: 3000
       initialDelaySeconds: 5

Din mhix differenti minn kwalunkwe definizzjoni oħra tal-pod, iżda qed inżidu oġġett .spec.containers.livenessProbe. Parametru httpGet jaċċetta t-triq li għaliha tintbagħat it-talba HTTP GET (fl-eżempju tagħna dan huwa /, iżda f'xenarji ta 'ġlieda jista' jkun hemm xi ħaġa simili /api/v1/status). LivenessProbe ieħor jaċċetta parametru initialDelaySeconds, li jagħti struzzjonijiet lill-operazzjoni ta' verifika biex tistenna numru speċifikat ta' sekondi. Id-dewmien huwa meħtieġ minħabba li l-kontenitur jeħtieġ iż-żmien biex jibda, u meta jerġa 'jibda ma jkunx disponibbli għal xi żmien.

Biex tapplika dan is-setting għal cluster, uża:

kubectl apply -f pod.yaml

Wara ftit sekondi, tista 'tiċċekkja l-kontenut tal-pod billi tuża l-kmand li ġej:

kubectl describe pods node500

Fl-aħħar tal-output, sib dak hu.

Kif tistgħu taraw, livenessProbe beda talba HTTP GET, il-kontenitur iġġenera żball 500 (li huwa dak li kien ipprogrammat biex jagħmel), u l-kubelet reġgħet bdiet.

Jekk qed tistaqsi kif ġiet ipprogrammata l-applikazzjoni NideJS, hawn huma l-app.js u Dockerfile li ntużaw:

app.js

var http = require('http');

var server = http.createServer(function(req, res) {
    res.writeHead(500, { "Content-type": "text/plain" });
    res.end("We have run into an errorn");
});

server.listen(3000, function() {
    console.log('Server is running at 3000')
})

dockerfile

FROM node
COPY app.js /
EXPOSE 3000
ENTRYPOINT [ "node","/app.js" ]

Huwa importanti li wieħed jinnota dan: livenessProbe jerġa' jibda l-kontenitur biss jekk ifalli. Jekk bidu mill-ġdid ma jikkoreġix l-iżball li qed jipprevjeni l-kontenitur milli jaħdem, il-kubelet ma jkunx jista’ jieħu azzjoni biex jikkoreġi l-problema.

prontezza Sonda

readinessProbe jaħdem b'mod simili għal livenessProbes (talbiet GET, komunikazzjonijiet TCP u eżekuzzjoni tal-kmand), ħlief għal azzjonijiet ta' soluzzjoni tal-problemi. Il-kontenitur li fih jinstab il-ħsara ma jerġax jinbeda, iżda jiġi iżolat mit-traffiku li jkun dieħel. Immaġina li wieħed mill-kontenituri qed iwettaq ħafna kalkoli jew qiegħed taħt tagħbija tqila, li jikkawża ż-żieda fil-ħinijiet tar-rispons. Fil-każ ta 'livenessProbe, il-kontroll tad-disponibbiltà tar-rispons jiġi attivat (permezz tal-parametru tal-kontroll timeoutSeconds), u wara l-kubelet jerġa' jibda l-kontenitur. Meta jinbeda, il-kontenitur jibda jwettaq kompiti intensivi fir-riżorsi u jerġa 'jinbeda. Dan jista 'jkun kritiku għal applikazzjonijiet li jeħtieġu veloċità ta' rispons. Pereżempju, karozza waqt li tkun fit-triq qed tistenna rispons mis-server, ir-rispons jittardja - u l-karozza tidħol f'inċident.

Ejja niktbu definizzjoni redinessProbe li se tissettja l-ħin tar-rispons tat-talba GET għal mhux aktar minn żewġ sekondi, u l-applikazzjoni tirrispondi għat-talba GET wara 5 sekondi. Il-fajl pod.yaml għandu jidher bħal dan:

apiVersion: v1
kind: Pod
metadata:
 name: nodedelayed
spec:
 containers:
   - image: afakharany/node_delayed
     name: nodedelayed
     ports:
       - containerPort: 3000
         protocol: TCP
     readinessProbe:
       httpGet:
         path: /
         port: 3000
       timeoutSeconds: 2

Ejja niskjeraw pod b'kubectl:

kubectl apply -f pod.yaml

Ejja nistennew ftit sekondi u mbagħad naraw kif ħadem il-reainessProbe:

kubectl describe pods nodedelayed

Fl-aħħar tal-output tista 'tara li xi wħud mill-avvenimenti huma simili dan wieħed.

Kif tistgħu taraw, kubectl ma reġax beda l-pod meta l-ħin tal-kontroll qabeż iż-2 sekondi. Minflok, ħassar it-talba. Il-komunikazzjonijiet deħlin huma diretti mill-ġdid lejn imżiewed oħra li jaħdmu.

Innota li issa li l-pod huwa mniżżel, kubectl jerġa' jgħaddi t-talbiet lejh: it-tweġibiet għal talbiet GET m'għadhomx jittardjaw.

Għal tqabbil, hawn taħt huwa l-fajl app.js modifikat:

var http = require('http');

var server = http.createServer(function(req, res) {
   const sleep = (milliseconds) => {
       return new Promise(resolve => setTimeout(resolve, milliseconds))
   }
   sleep(5000).then(() => {
       res.writeHead(200, { "Content-type": "text/plain" });
       res.end("Hellon");
   })
});

server.listen(3000, function() {
   console.log('Server is running at 3000')
})

TL; DR
Qabel il-miġja tal-applikazzjonijiet tal-cloud, zkuk kienu l-mezz primarju ta 'monitoraġġ u verifika tas-saħħa tal-applikazzjoni. Madankollu, ma kien hemm l-ebda mezz biex tittieħed xi azzjoni korrettiva. Iċ-zkuk għadhom utli llum; jeħtieġ li jinġabru u jintbagħtu lil sistema ta 'ġbir taz-zkuk biex jiġu analizzati sitwazzjonijiet ta' emerġenza u jittieħdu deċiżjonijiet. [Dan kollu seta 'jsir mingħajr applikazzjonijiet tal-cloud bl-użu ta' monit, pereżempju, iżda bil-k8s sar ħafna aktar faċli :) - nota tal-editur. ]

Illum, il-korrezzjonijiet iridu jsiru kważi f'ħin reali, u għalhekk l-applikazzjonijiet m'għadhomx għandhom ikunu kaxxi suwed. Le, għandhom juru endpoints li jippermettu lis-sistemi ta' monitoraġġ jitolbu u jiġbru dejta siewja dwar l-istat tal-proċessi sabiex ikunu jistgħu jirrispondu istantanjament jekk ikun meħtieġ. Dan jissejjaħ il-Mudell tad-Disinn tat-Test tal-Prestazzjoni, li jsegwi l-Prinċipju ta 'Osservabbiltà Għolja (HOP).

Kubernetes joffri 2 tipi ta’ kontrolli tas-saħħa b’mod awtomatiku: readinessProbe u livenessProbe. It-tnejn jużaw l-istess tipi ta’ kontrolli (talbiet HTTP GET, komunikazzjonijiet TCP u eżekuzzjoni tal-kmand). Huma differenti f'liema deċiżjonijiet jieħdu bi tweġiba għall-problemi fil-miżwed. livenessProbe jerġa' jibda l-kontenitur bit-tama li l-iżball ma jerġax iseħħ, u ReadinessProbe jiżola l-pod mit-traffiku li jkun dieħel sakemm il-kawża tal-problema tiġi solvuta.

Id-disinn xieraq tal-applikazzjoni għandu jinkludi ż-żewġ tipi ta' verifika u jiżgura li jiġbru biżżejjed data, speċjalment meta tintefa' eċċezzjoni. Għandu juri wkoll l-endpoints meħtieġa tal-API li jipprovdu lis-sistema ta 'monitoraġġ (Prometheus) b'metriċi importanti tas-saħħa.

Sors: www.habr.com

Żid kumment