Parimad praktikad Kubernetes konteinerite jaoks: töökindluse kontrollimine

Parimad praktikad Kubernetes konteinerite jaoks: töökindluse kontrollimine

TL;DR

  • Konteinerite ja mikroteenuste, logide ja primaarsete mÔÔdikute kĂ”rge jĂ€lgitavuse saavutamiseks on vĂ€he.
  • Kiiremaks taasteks ja rakenduse tĂ”rketaluvuse suurendamiseks peavad rakendused rakendama kĂ”rge jĂ€lgitavuse pĂ”himĂ”tteid (HOP, High Observability Principle).
  • Rakenduse tasandil nĂ”uab HOP nĂ”uetekohast logimist, hoolikal jĂ€lgimist, töökindluse kontrolli ja jĂ”udluse/ĂŒleminekute jĂ€lgimist.
  • HOP-i elemendina kasutage kontrollimisi readinessProbe ja livenessProbe Kuberneteses.

Mis on töökindluse kontrolli mall?

Kriitiliselt olulise ja kĂ”rgelt kĂ€ttesaadava rakenduse kavandamisel on vĂ€ga oluline mĂ”elda sellisele aspektile nagu tĂ”rketaluvus. Rakendus on tĂ”rketaluv, kui see taasteb kiiresti pĂ€rast ebaĂ”nnestumist. TĂŒĂŒpiline pilvrakendus kasutab mikroteenuste arhitektuuri – kus iga komponent asetatakse eraldi konteinerisse. Ja et veenduda, et rakendus k8s-is on kĂ”rgelt kĂ€ttesaadav, tuleb klastrit kavandades jĂ€rgida teatud malli. Nende seas on töökindluse kontrolli mall. See mÀÀratleb, kuidas rakendus teatab k8s-ile oma töökindlusest. See ei ole ainult teave selle kohta, kas pod töötab, vaid ka selle kohta, kuidas see pĂ€ringuid vastu vĂ”tab ja neile vastab. Mida rohkem Kubernetes teab pod’i töökindlusest, seda nutikamaid otsuseid ta teeb liikluse suunamise ja koormuse tasakaalustamise osas. Seega peab rakendus jĂ€rgima kĂ”rge jĂ€lgitavuse pĂ”himĂ”tteid, et Ă”igeaegselt vastata pĂ€ringutele.

KÔrge jÀlgitavuse pÔhimÔte (HOP)

KĂ”rge jĂ€lgitavuse pĂ”himĂ”te on ĂŒks konteineriseeritud rakenduste projekteerimise pĂ”himĂ”tteidMikroteenuste arhitektuuris ei oma teenused mingit tĂ€htsust sellele, kuidas nende pĂ€ringut töödeldakse (ja see on Ă”ige), kuid oluline on see, kuidas saada vastuseid vastuvĂ”tvate teenuste kĂ€est. NĂ€iteks, kasutaja autentimiseks saadab ĂŒks konteiner teisele HTTP pĂ€ringu, oodates vastust kindlas vormingus – ja see on kĂ”ik. PĂ€ringut vĂ”ib töödelda PythonJS ja vastuse vĂ”ib anda Python Flask. Konteinerid on ĂŒksteise jaoks justkui mustad kastid, mille sisu on varjatud. Siiski nĂ”uab NOR pĂ”himĂ”te, et iga teenus avaldaks mitmeid API lĂ”pp-punkte, mis nĂ€itavad, kui hĂ€sti see töötab, samuti oma valmisoleku ja vigade taluvuse seisundit. Need nĂ€itajad kĂŒsib Kubernetes, et mĂ”elda jĂ€rgmiste sammude ĂŒle marsruutimise ja koormuse tasakaalu mateerimise osas.

HĂ€sti projekteeritud pilve rakendus logib oma pĂ”hieevents kasutades standardseid sisend- ja vĂ€ljundvooge STDERR ja STDOUT. JĂ€rgmisena töötab abiteenus, nĂ€iteks filebeat, logstash vĂ”i fluentd, mis toimetavad logid tsentraliseeritud jĂ€lgimisse sĂŒsteemi (nt Prometheus) ja logide kogumise sĂŒsteemi (ELK tarkvara komplekt). Alloleval skeemil on nĂ€idatud, kuidas pilve rakendus töötab vastavalt töökindluse kontrollimise ĆĄabloonile ja kĂ”rge jĂ€lgitavuse pĂ”himĂ”ttele.

Parimad praktikad Kubernetes konteinerite jaoks: töökindluse kontrollimine

Kuidas rakendada töökindluse kontrollimise ƥablooni Kuberneteses?

K8s jĂ€lgib vĂ€lja pandud pod’ide olekut vĂ€lja arvatud kontrollijate abil (Deployments, ReplicaSets, DaemonSets, StatefulSets jne, jne). Kui kontrollija tuvastab, et pod mingi pĂ”hjusel kukkus, proovib see selle taaskĂ€ivitada vĂ”i ĂŒmber ajastada teisele sĂ”lmele. Siiski vĂ”ib pod teatada, et see on kĂ€ivitunud ja töötab, kuid tegelikult ei tööta see. Toome nĂ€ite: teie rakendus kasutab veebiserverina Apache’t, olete paigaldanud komponendi mitmesse pod’ide klastrisse. Kuna teek on halvasti konfigureeritud – kĂ”ik pĂ€ringud rakendusele tagastavad koodi 500 (sisevea). Tarnimise kontrollimisel annab pod’ide oleku kontrollimise tulemus positiivse tulemuse, kuid kliendid arvavad teisiti. Kirjeldame seda ebasoovitavat olukorda jĂ€rgmiselt:

Parimad praktikad Kubernetes konteinerite jaoks: töökindluse kontrollimine

Meie nĂ€ites teeb k8s töökindluse kontrollimistSelles kontrolliviisis kontrollib kubelet pidevalt konteineri protsessi seisundit. Kui ta mĂ”istab, et protsess on seisma jÀÀnud, kĂ€ivitab ta selle uuesti. Kui viga lahendatakse lihtsalt rakenduse taaskĂ€ivitamisega ja programm on ĂŒles ehitatud selleks, et igasuguste vigade korral sulguda, siis piisab NORM-i ja tööoleku kontrolldiagrammi jĂ€rgimiseks protsessi tööoleku kontrollimisest. Kahju ainult, et mitte kĂ”ik vead ei lahene taaskĂ€ivitamisega. Selleks pakub k8s kahte sĂŒgavamat viis, kuidas pod’i tĂ”rkeid avastada: livenessProbe ja readinessProbe.

LivenessProbe

Ajal livenessProbe kubelet viib ellu 3 tĂŒĂŒpi kontrolli: see mitte ainult ei selgita, kas pod töötab, vaid kontrollib ka, kas see on valmis vastu vĂ”tma ja adekvaatselt vastama pĂ€ringutele:

  • Seadistage HTTP-pĂ€ring pod'ile. Vastus peab sisaldama HTTP-koodi vahemikus 200 kuni 399. Nii tĂ€hendavad 5xx ja 4xx koodid, et pod'il on probleeme, isegi kui protsess töötab.
  • Pod'ide kontrollimiseks, millel ei ole HTTP teenuseid (nt Postfixi meiliserver), tuleb luua TCP-ĂŒhendus.
  • Siseprotsessi taotlemine pod'ile. Kontroll loetakse edukaks, kui kĂ€su vĂ€ljumiskood on 0.

NÀide, kuidas see töötab. JÀrgmise pod'i mÀÀratlemine sisaldab NodeJS rakendust, mis reageerib HTTP-pÀringutele veateatega 500. Veenduda, et konteiner taaskÀivitub, kui selline viga ilmneb, kasutame parameetrit 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

See ei erine millegi poolest igasugusest muust pod'i mÀÀratlemisest, kuid me lisame objekti .spec.containers.livenessProbe. Parameeter httpGet vÔtab vastu tee, kuhu saadetakse HTTP GET pÀring (meie nÀites see on /, kuid tÔelistel stsenaariumitel vÔib see olla midagi sellist nagu /api/v1/status). Samuti vÔtab livenessProbe vastu parameetri initialDelaySeconds, mis mÀÀrab, kui kaua kontrollimise tegevustele oodatakse. Ooteaeg on vajalik seetÔttu, et konteineril on kÀivitamiseks aega, ja taaskÀivitamise korral on see mÔnda aega kÀttesaamatu.

Selle seadistuse rakendamiseks klastrile kasutage:

kubectl apply -f pod.yaml

MÔne sekundi pÀrast saate pod'i sisu kontrollida jÀrgmise kÀsuga:

kubectl describe pods node500

VÀljundi lÔpus leidke selline asi.

Nagu nÀete, livenessProbe kÀivitas HTTP GET pÀringu, konteiner andis sisendi 500 (milleks ta oligi programmeeritud), kubelet ta taaskÀivitada.

Kui teil on huvi, kuidas oli programmeeritud NodeJS rakendus, siis siin on fail app.js ja Dockerfile, mida kasutati:

app.js

var http = require('http');

var server = http.createServer(function(req, res) {
    res.writeHead(500, { "Content-type": "text/plain" });
    res.end("Oleme kohtunud veaga
");
});

server.listen(3000, function() {
    console.log('Server töötab 3000 peal')
})

Dockerfile

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

Oluline on tÀhele panna, et livenessProbe taaskÀivitab konteineri ainult rikke korral. Kui taaskÀivitamine ei paranda muudatust, mis takistab konteineri tööd, ei suuda kubelet tegeleda tÔrke kÔrvaldamisega.

readinessProbe

readinessProbe töötab sarnaselt livenessProbes'ile (GET-pĂ€ringud, TCP ĂŒhendused ja kĂ€skude tĂ€itmine), vĂ€lja arvatud tĂ”rgete kĂ”rvaldamise toimingud. Konnteiner, kus rike on registreeritud, ei taaskĂ€ivita, vaid isoleeritakse sissetulevast liiklusest. Kujutage ette, et ĂŒks konteiner teeb palju arvutusi vĂ”i sellest on suur koormus, mis pĂ”hjustab vastuste aeglustumist. LivenessProbe'i puhul aktiveeritakse vastuvĂ”tu kĂ€ttesaadavuse kontroll (timeoutSeconds parameetri kaudu), pĂ€rast mida kubelet taaskĂ€ivitab konteineri. Taevas konteiner hakkab uuesti ressursimahukaid ĂŒlesandeid tĂ€itma ja taaskĂ€ivitavad seda taas. See vĂ”ib olla kriitiline rakendustele, mis peavad vastama kiiresti. NĂ€iteks masin on Ă”igeaegselt serveri vastuse ootuses, vastus viibib - ja masin satub avariisse.

Kirjutame readinessProbe'i mÀÀratlemise, mis seab GET-pÀringute vastuseaja mitte rohkem kui kaks sekundit, samas kui rakendus vastab GET-pÀringule 5 sekundi jooksul. Fail pod.yaml peaks vÀlja nÀgema jÀrgmiselt:

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

KĂ€ivita pod kubectliga:

kubectl apply -f pod.yaml

Ootame paar sekundit ja siis vaatame, kuidas readinessProbe töötab:

kubectl describe pods nodedelayed

VĂ€ljundi lĂ”pus on nĂ€ha, et osa sĂŒndmustest on sarnane sellega.

Nagu nĂ€ete, ei taaskĂ€ivitanud kubectl pod'i, kui kontrollimise aeg ĂŒletas 2 sekundit. Selle asemel tĂŒhistati pĂ€ring. Sissetulevad ĂŒhendused suunatakse teistele, töötavatele pod'idele.

MĂ€rkus: nĂŒĂŒd, kui pod’ilt on eemaldatud liigne koormus, suunab kubectl taas pĂ€ringud sellele: GET-pĂ€ringute vastused ei viivita enam.

VÔrdluseks: allpool on muudetud fail app.js:

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
Enne pilveteenuste ilmumist olid rakenduste jĂ€lgimise ja oleku kontrollimise pĂ”hivahendid logid. Kuid puudusid vahendid, et probleemide lahendamiseks midagi ette vĂ”tta. Logid on tĂ€napĂ€eval endiselt kasulikud, neid tuleb koguda ja saata logide kogumisse sĂŒsteemi analĂŒĂŒsimiseks ja otsuste tegemiseks. [kĂ”ike seda oleks saanud teha ka ilma pilveteenusteta, nĂ€iteks monit’i abil, kuid k8s on teinud selle palju lihtsamaks 🙂 – toimetaja mĂ€rkus. ]

TĂ€napĂ€eval peavad parandused toimuma peaaegu reaalajas, seega ei tohiks rakendused enam olla mustad kastid. Ei, nad peavad nĂ€itama lĂ”pp-punkte, mis vĂ”imaldavad jĂ€lgimissĂŒsteemidel koguda vÀÀrtuslikke andmeid protsesside oleku kohta, et vajadusel kiirelt reageerida. Seda nimetatakse Töökindluse kontrollimise disainimustriks, mis jĂ€rgib KĂ”rge JĂ€lgitavuse Printsiipi (HOP).

Kubernetes pakub vaikimisi kahte tĂŒĂŒpi töökindluse kontrollimist: readinessProbe ja livenessProbe. MĂ”lemad kasutavad samu kontrollimise tĂŒĂŒpe (HTTP GET pĂ€ringud, TCP ĂŒhendused ja kĂ€skude tĂ€itmine). Need erinevad selles, milliseid otsuseid tehakse pod’ide probleemide korral. livenessProbe taaskĂ€ivitab konteineri lootuses, et viga ei kordu, samas kui readinessProbe eraldab pod’i sissetulevast liiklusest – kuni probleemi pĂ”hjus on kĂ”rvaldatud.

Rakenduse Ă”ige projekteerimine peaks hĂ”lmama mĂ”lemat tĂŒĂŒpi kontrolli ning need peaksid koguma piisavalt andmeid, eriti erandlike olukordade korral. Samuti peab see nĂ€itama vajalikke API lĂ”pp-punkte, mis edastavad jĂ€lgimissĂŒsteemile (nĂ€iteks Prometheus) olulisi töökindluse oleku mÔÔdikuid.

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