
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 Mikroteenuste 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.

Kuidas rakendada töökindluse kontrollimise ƥablooni Kuberneteses?
K8s jĂ€lgib vĂ€lja pandud podâide olekut vĂ€lja arvatud kontrollijate abil (, , , 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:

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: ja .
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: 5See 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.yamlMÔne sekundi pÀrast saate pod'i sisu kontrollida jÀrgmise kÀsuga:
kubectl describe pods node500VÀljundi lÔpus leidke .
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: 2KĂ€ivita pod kubectliga:
kubectl apply -f pod.yamlOotame paar sekundit ja siis vaatame, kuidas readinessProbe töötab:
kubectl describe pods nodedelayedVĂ€ljundi lĂ”pus on nĂ€ha, et osa sĂŒndmustest on sarnane .
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
