Pi bon pratik pou kontenè Kubernetes: chèk sante

Pi bon pratik pou kontenè Kubernetes: chèk sante

TL; DR

  • Pou reyalize gwo observabilite resipyan ak mikwosèvis, mòso bwa ak paramèt prensipal yo pa ase.
  • Pou rekiperasyon pi vit ak ogmante rezistans, aplikasyon yo ta dwe aplike Prensip Obsèvabilite segondè (HOP).
  • Nan nivo aplikasyon an, NOP mande pou: bon enregistrement, siveyans fèmen, chèk saniti, ak pèfòmans/tranzisyon trase.
  • Sèvi ak chèk kòm yon eleman nan NOR ReadinessProbe и livenessProbe Kubernetes.

Ki sa ki se yon modèl chèk sante?

Lè w ap desine yon aplikasyon ki enpòtan pou misyon an e ki trè disponib, li trè enpòtan pou w reflechi sou yon aspè tankou tolerans fay. Yon aplikasyon konsidere kòm toleran pou fay si li refè byen vit apre echèk. Yon aplikasyon nwaj tipik itilize yon achitekti mikwosèvis - kote chak eleman yo mete nan yon veso separe. Ak nan lòd asire w ke aplikasyon an sou k8s trè disponib lè ou konsepsyon yon gwoup, ou bezwen swiv modèl sèten. Pami yo se Modèl Chèk Sante a. Li defini ki jan aplikasyon an kominike ak k8s ke li an sante. Sa a se pa sèlman enfòmasyon sou si wi ou non gous la ap kouri, men tou sou fason li resevwa ak reponn a demann. Plis Kubernetes konnen sou sante gous la, se pi entelijan li pran desizyon sou wout trafik ak balans chaj. Kidonk, Prensip Obsèvabilite Segondè a pèmèt aplikasyon an reponn demann nan yon fason apwopriye.

Prensip Obsèvabilite segondè (HOP)

Prensip la nan observability segondè se youn nan prensip pou desine aplikasyon nan kontenè. Nan yon achitekti mikwosèvis, sèvis yo pa okipe fason yo trete demann yo (ak rezon), men sa ki enpòtan se fason yo resevwa repons nan men sèvis k ap resevwa yo. Pou egzanp, otantifye yon itilizatè, yon veso voye yon demann HTTP nan yon lòt, espere yon repons nan yon fòma sèten - sa a tout. PythonJS kapab tou trete demann lan, epi Python Flask ka reponn. Kontenè yo se tankou bwat nwa ak kontni kache youn ak lòt. Sepandan, prensip NOP a mande pou chak sèvis ekspoze plizyè pwen final API ki endike kijan li an sante, ansanm ak preparasyon li ak estati tolerans fay li yo. Kubernetes mande endikatè sa yo nan lòd yo reflechi nan pwochen etap yo pou routage ak balans chaj.

Yon aplikasyon nwaj ki byen fèt anrejistre evènman prensipal li yo lè l sèvi avèk estanda I/O kouran STDERR ak STDOUT. Apre sa, gen yon sèvis oksilyè, pou egzanp filebeat, logstash oswa fluentd, ki bay mòso bwa nan yon sistèm siveyans santralize (pa egzanp Prometheus) ak yon sistèm koleksyon boutèy demi lit (swit lojisyèl ELK). Dyagram ki anba la a montre kouman yon aplikasyon nwaj fonksyone dapre Modèl Tès Sante a ak Prensip Obsèvabilite segondè a.

Pi bon pratik pou kontenè Kubernetes: chèk sante

Ki jan yo aplike modèl Tèks Sante a nan Kubernetes?

Soti nan bwat la, k8s kontwole estati gous yo lè l sèvi avèk youn nan kontwolè yo (Deplwaman, ReplicaSets, DaemonSets, StatefulSets elatriye, elatriye). Lè w fin dekouvri gous la tonbe pou kèk rezon, kontwolè a eseye rekòmanse li oswa deplase li nan yon lòt ne. Sepandan, yon gous ka rapòte ke li kanpe ak fonksyone, men li menm li pa fonksyone. Ann bay yon egzanp: aplikasyon w lan sèvi ak Apache kòm yon sèvè entènèt, ou enstale eleman an sou plizyè gous nan gwoup la. Depi bibliyotèk la te configuré mal, tout demann nan aplikasyon an reponn ak kòd 500 (erè sèvè entèn). Lè w tcheke livrezon, tcheke estati gous yo bay yon rezilta siksè, men kliyan yo panse yon fason diferan. Nou pral dekri sitiyasyon sa a endezirab jan sa a:

Pi bon pratik pou kontenè Kubernetes: chèk sante

Nan egzanp nou an, k8s fè sa tcheke fonksyonalite. Nan kalite verifikasyon sa a, kubelet la kontinyèlman tcheke eta pwosesis la nan veso a. Yon fwa li konprann ke pwosesis la te sispann, li pral rekòmanse li. Si erè a ka rezoud pa senpleman rekòmanse aplikasyon an, epi pwogram nan fèt pou fèmen sou nenpòt erè, Lè sa a, yon chèk sante pwosesis se tout sa ou bezwen swiv NOP la ak Modèl Tès Sante a. Sèl pitye a se ke se pa tout erè yo elimine lè rekòmanse. Nan ka sa a, k8s ofri 2 fason pi fon yo idantifye pwoblèm ak gous la: livenessProbe и ReadinessProbe.

LivenessProbe

Pandan livenessProbe kubelet fè 3 kalite chèk: non sèlman detèmine si gous la ap fonksyone, men tou, si li pare pou resevwa ak byen reponn a demann:

  • Mete yon demann HTTP nan gous la. Repons lan dwe genyen yon kòd repons HTTP nan ranje ant 200 ak 399. Kidonk, kòd 5xx ak 4xx siyal ke gous la gen pwoblèm, menm si pwosesis la ap kouri.
  • Pou teste gous ak sèvis ki pa HTTP (pa egzanp, sèvè lapòs Postfix), ou bezwen etabli yon koneksyon TCP.
  • Egzekite yon kòmandman abitrè pou yon gous (entèn). Chèk la konsidere kòm siksè si kòd fini lòd la se 0.

Yon egzanp sou fason sa a travay. Pwochen definisyon gous la gen yon aplikasyon NodeJS ki voye yon erè 500 sou demann HTTP. Pou asire w ke veso a rekòmanse lè w ap resevwa yon erè konsa, nou itilize paramèt 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

Sa a pa diferan de nenpòt lòt definisyon gous, men nou ap ajoute yon objè .spec.containers.livenessProbe. Paramèt httpGet aksepte chemen kote yo voye demann HTTP GET (nan egzanp nou an sa a se /, men nan senaryo konba ka gen yon bagay tankou /api/v1/status). Yon lòt livenessProbe aksepte yon paramèt initialDelaySeconds, ki enstwi operasyon verifikasyon an pou tann yon kantite segonn espesifye. Reta a nesesè paske veso a bezwen tan pou kòmanse, epi lè rekòmanse li pral pa disponib pou kèk tan.

Pou aplike paramèt sa a nan yon gwoup, sèvi ak:

kubectl apply -f pod.yaml

Apre kèk segonn, ou ka tcheke sa ki nan gous la lè l sèvi avèk lòd sa a:

kubectl describe pods node500

Nan fen pwodiksyon an, jwenn se sa.

Kòm ou ka wè, livenessProbe inisye yon demann HTTP GET, veso a te pwodwi yon erè 500 (ki se sa li te pwograme fè), ak kubelet la rekòmanse li.

Si w ap mande ki jan yo te pwograme aplikasyon NideJS la, men app.js ak Dockerfile yo te itilize:

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" ]

Li enpòtan sonje sa a: livenessProbe pral sèlman rekòmanse veso a si li echwe. Si yon rekòmanse pa korije erè a ki anpeche veso a kouri, kubelet la pa pral kapab pran aksyon pou korije pwoblèm nan.

ReadinessProbe

ReadinessProbe travay menm jan ak livenessProbes (demann GET, kominikasyon TCP ak ekzekisyon lòd), eksepte pou aksyon depanaj. Kontenè kote yo detekte echèk la pa rekòmanse, men li izole nan trafik k ap rantre. Imajine ke youn nan veso yo ap fè anpil kalkil oswa li anba gwo chaj, sa ki lakòz tan repons yo ogmante. Nan ka livenessProbe, chèk disponiblite repons lan deklanche (via paramèt chèk timeoutSeconds), apre sa kubelet la rekòmanse veso a. Lè yo kòmanse, veso a kòmanse fè travay ki gen anpil resous epi li rekòmanse ankò. Sa a ka kritik pou aplikasyon ki bezwen vitès repons. Pou egzanp, yon machin pandan y ap sou wout la ap tann pou yon repons nan men sèvè a, repons lan an reta - ak machin nan vin nan yon aksidan.

Ann ekri yon definisyon redinessProbe ki pral fikse tan repons demann GET a pa plis pase de segonn, epi aplikasyon an pral reponn demann GET apre 5 segonn. Fichye pod.yaml a ta dwe sanble sa a:

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

Ann deplwaye yon gous ak kubectl:

kubectl apply -f pod.yaml

Ann tann yon koup de segonn epi gade ki jan ReadinessProbe a te travay:

kubectl describe pods nodedelayed

Nan fen pwodiksyon an ou ka wè ke kèk nan evènman yo sanble yon sèl sa a.

Kòm ou ka wè, kubectl pa t 'rekòmanse gous la lè tan an tcheke depase 2 segonn. Olye de sa, li anile demann lan. Kominikasyon k ap fèk ap rantre yo redireksyone nan lòt gous k ap travay.

Remake byen ke kounye a ke gous la dechaje, kubectl wout demann yo ba li ankò: repons a demann GET yo pa retade ankò.

Pou konparezon, anba a se dosye modifye app.js la:

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
Anvan aparisyon aplikasyon nwaj yo, mòso bwa yo te mwayen prensipal pou kontwole ak tcheke sante aplikasyon an. Sepandan, pa te gen okenn mwayen pou pran okenn aksyon korektif. Jounal yo toujou itil jodi a; yo bezwen kolekte epi voye yo nan yon sistèm koleksyon boutèy demi lit pou analize sitiyasyon ijans ak pran desizyon. [Tout bagay sa a ta ka fè san aplikasyon pou nwaj lè l sèvi avèk monit, pou egzanp, men ak k8s li te vin pi fasil :) - nòt editè a. ]

Jodi a, koreksyon yo dwe fèt prèske an tan reyèl, kidonk aplikasyon yo pa oblije bwat nwa ankò. Non, yo ta dwe montre pwen final ki pèmèt sistèm siveyans yo mande ak kolekte done ki gen anpil valè sou eta a nan pwosesis pou yo ka reponn imedyatman si sa nesesè. Yo rele sa a modèl konsepsyon tès pèfòmans, ki swiv Prensip Obsèvabilite segondè (HOP).

Kubernetes ofri 2 kalite chèk sante pa default: ReadinessProbe ak livenessProbe. Tou de sèvi ak menm kalite chèk (HTTP GET demann, kominikasyon TCP ak ekzekisyon lòd). Yo diferan nan ki desizyon yo pran an repons a pwoblèm nan gous yo. livenessProbe rekòmanse veso a avèk espwa ke erè a pa pral rive ankò, epi ReadinessProbe izole gous la soti nan trafik fèk ap rantre jiskaske kòz pwoblèm nan rezoud.

Konsepsyon aplikasyon apwopriye ta dwe gen ladan tou de kalite tcheke epi asire yo kolekte ase done, espesyalman lè yo voye yon eksepsyon. Li ta dwe montre tou pwen final API ki nesesè yo ki bay sistèm siveyans lan (Prometheus) ak mezi sante enpòtan.

Sous: www.habr.com

Add nouvo kòmantè