Kubernetes konteinerite parimad praktikad: töövÔimekuse kontrollid

Kubernetes konteinerite parimad praktikad: töövÔimekuse kontrollid

TL;DR

  • Konteinerite ja mikroteenuste, logide ja algsete mÔÔdikute kĂ”rge jĂ€lgitavuse saavutamiseks on ebapiisav ainult logimine.
  • Rakenduste kiireks taastamiseks ja tĂ”rgeteta töökindluse suurendamiseks peaksid rakendused rakendama kĂ”rge jĂ€lgitavuse pĂ”himĂ”tet (HOP, High Observability Principle).
  • Rakenduse tasandil kĂ”rge jĂ€lgitavuse rakendamisel on vajalik: korralik logimine, hoolikas jĂ€lgimine, töökindluse kontrollid ja jĂ”udluse / ĂŒleminekute jĂ€lgimine.
  • NĂ”udmise elemendina kasutage kontrolle readinessProbe ja livenessProbe Kubernetes.

Mis on töökindluse kontrollimise mall?

Kui kavandatakse kriitilise tĂ€htsusega ja pidevalt kĂ€tte saadavat rakendust, on oluline mĂ”elda sellisele aspektile nagu tĂ”rke taluvus. Rakendus on tĂ”rke taluv, kui see taastub kiiresti rikke korral. TĂŒĂŒpiline pilverakendus kasutab mikroteenuste arhitektuuri – iga komponent paigutatakse eraldi konteinerisse. Ja et veenduda, et rakendus k8s on pidevalt kĂ€tte saadav, tuleb klastrit kavandades jĂ€rgida teatud mustreid. Nende hulka kuulub ka elujĂ”udluse kontrollimise muster. See mÀÀratleb, kuidas rakendus teavitab k8s oma elujĂ”udlusest. See ei ole mitte ainult teave selle kohta, kas pod töötab, vaid ka see, kuidas ta pĂ€ringutele vastab. Mida rohkem Kubernetes teab pod'i elujĂ”udlusest, seda nutikamaid otsuseid ta teeb liikluse suunamise ja koormuse tasakaalustamise osas. Seega peab kĂ”rge jĂ€lgitavuse pĂ”himĂ”te rakendusele Ă”igeaegselt pĂ€ringutele vastama.

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

KĂ”rge jĂ€lgitavuse pĂ”himĂ”te on ĂŒks konteneriseeritud rakenduste projekteerimise pĂ”himĂ”tteid. Mikroteenuse arhitektuuris ei oma teenustele tĂ€htsust, kuidas nende pĂ€ringut töödeldakse (ja see on Ă”ige), vaid oluline on, kuidas saada vastuseid vastuvĂ”tvate teenuste kĂ€est. NĂ€iteks kasutaja autentimiseks saadab ĂŒks konteiner teisele HTTP-pĂ€ringu, oodates vastust teatud formaadis – ja see on kĂ”ik. PĂ€ringut vĂ”ib töödelda PythonJS ning vastata vĂ”ib Python Flask. Konteinerid on ĂŒksteise jaoks nagu mustad kastid, mille sisu on varjatud. Siiski nĂ”uab NORA pĂ”himĂ”te, et iga teenus avalikustaks mitu API lĂ”pp-punkti, mis nĂ€itavad, kui hĂ€sti see töötab, samuti selle valmiduse ja tĂ”rkekindluse seisundit. Need nĂ€itajad kĂŒsib Kubernetes, et teha lĂ€bi mĂ”eldud jĂ€rgmised sammud marsruutimise ja koormuse tasakaalu seadistamisel.

HĂ€sti kavandatud pilve rakendus logib oma pĂ”hitegevusi, kasutades standardseid sisendi- ja vĂ€ljundi vooge STDERR ja STDOUT. SeejĂ€rel töötab abiteenus, nĂ€iteks filebeat, logstash vĂ”i fluentd, mis edastab logid tsentraliseeritud jĂ€lgimissĂŒsteemi (nt Prometheus) ja logide kogumise sĂŒsteemi (ELK tarkvarakogum). Allolevas skeemis on nĂ€idatud, kuidas pilve rakendus töötab töökindluse kontrollimise Malli ja kĂ”rge jĂ€lgitavuse pĂ”himĂ”tte kohaselt.

Kubernetes konteinerite parimad praktikad: töövÔimekuse kontrollid

Kuidas rakendada töökindluse kontrollimise Malli Kuberneteses?

Karbist vĂ€lja k8s jĂ€lgib pod'ide seisundit ĂŒhe kontrollimise abil (Deployments, ReplicaSets, DaemonSets, StatefulSets ja ja muud). Kui k8s avastab, et pod mingil pĂ”hjusel on kukkunud, ĂŒritab kontroller seda taaskĂ€ivitada vĂ”i teisele sĂ”lmele ĂŒle viia. Kuid pod vĂ”ib teatada, et see on kĂ€ivitatud ja töötab, samas aga ei tĂ€ida oma ĂŒlesandeid. NĂ€iteks: teie rakendus kasutab veebiserverina Apache't ja olete seadnud komponendi mitmele pod'ile klastris. Kuna teek on valesti konfigureeritud – kĂ”ik rakendusele suunatud pĂ€ringud vastavad koodiga 500 (sisemine serveri viga). Toimuvate kontrollide ajal annab pod'ide oleku kontrollimine positiivse tulemuse, kuid kliendid arvavad teisiti. Kirjeldame seda soovimatut olukorda jĂ€rgmiselt:

Kubernetes konteinerite parimad praktikad: töövÔimekuse kontrollid

Meie nĂ€ites k8s teostab olekukontrolli. Sellisel kontrolli vormil kontrollib kubelet pidevalt konteineriprotsessi seisundit. Kui ta mĂ”istab, et protsess on seisma jÀÀnud, ta taaskĂ€ivitab selle. Kui viga lahendatakse rakenduse lihtsa taaskĂ€ivitamisega ning programm on loodud nii, et see lĂŒlitub vĂ€lja iga vea korral, siis piisab töökindluse ja töövĂ”imekuse kontrollimiseks protsessi seisundi jĂ€lgimisest. Kahju, et mitte kĂ”ik vead ei lahene taaskĂ€ivitamisega. Selleks pakub k8s kahte sĂŒgavamat viisi pod'i tööprobleemide tuvastamiseks: livenessProbe ja readinessProbe.

LivenessProbe

Ajal livenessProbe kubelet teostab 3 tĂŒĂŒpi kontrolle: selgitatakse vĂ€lja mitte ainult see, kas pod töötab, vaid ka see, kas see on valmis vastu vĂ”tma ja adekvaatselt vastama pĂ€ringutele:

  • Seadke HTTP-pĂ€ring pod'ile. Vastus peab sisaldama HTTP-koodi vahemikus 200 kuni 399. Seega, koodid 5xx ja 4xx annavad mĂ€rku pod'i probleemidest, isegi kui protsess töötab.
  • Pod'ide kontrollimiseks, kus on mitte-HTTP teenused (nĂ€iteks postiserver Postfix), tuleb luua TCP-ĂŒhendus.
  • VĂ”imaldage sisemiselt suvalise kĂ€su tĂ€itmine pod'ile. Kontroll loetakse edukaks, kui kĂ€su lĂ”petamise kood on 0.

NÀide sellest, kuidas see töötab. JÀrgmise pod'i mÀÀratlemine sisaldab NodeJS rakendust, mis tagastab HTTP-pÀringutele veakoodi 500. Veendumiseks, et konteiner taaskÀivitub, kui see 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 ĂŒhegi teise pod'i mÀÀratlemisest, kuid me lisame objekti .spec.containers.livenessProbe. Parameeter httpGet vĂ”tab tee, kuhu saadetakse HTTP GET pĂ€ring (meie nĂ€ites on see /, kuid tootmisstsenaariumides vĂ”ib see olla ka midagi sellist nagu /api/v1/status). Samuti vĂ”tab livenessProbe parameetri initialDelaySeconds, mis mÀÀrab, et kontrollimise operatsioon peab ootama mÀÀratud arvu sekundeid. Ooteaeg on vajalik, kuna konteiner vajab kĂ€ivitamiseks aega ja taaskĂ€ivitamisel ei ole see mĂ”nda aega saadaval.

Selle seadistuse rakendamiseks klastrile, kasutage:

kubectl apply -f pod.yaml

MÔne sekundi pÀrast saab pod'i sisu kontrollida jÀrgmisel kÀsul:

kubectl describe pods node500

LÔpus vÀljundi leidmiseks otsige sellist asja.

Kuidas nÀha, livenessProbe kÀivitas HTTP GET pÀringu, konteiner andis vea 500 (nagu oli ette nÀhtud), kubelet taaskÀivitas selle.

Kui teid huvitab, kuidas NideJS rakendust programmeeritud, 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 sattunud veassen");
});

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

Dockerfile

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

Oluline on tÀhele panna jÀrgmist: livenessProbe taaskÀivitab konteineri ainult tÔrke korral. Kui taaskÀivitamine ei paranda viga, mis takistab konteineri tööd, ei saa kubelet astuda samme rikke kÔrvaldamiseks.

readinessProbe

readinessProbe töötab samamoodi nagu livenessProbe (GET-pĂ€ringud, TCP ĂŒhendused ja kĂ€su tĂ€itmine), vĂ€lja arvatud tĂ”rkeotsingu tegevused. Konteiner, millel on ilmnenud tĂ”rge, ei taaskĂ€ivitu, vaid eraldatakse sissetulevast liiklusest. Kujutage ette, et ĂŒks konteineritest teeb palju arvutusi vĂ”i talub suurt koormust, mistĂ”ttu vastuse aeg pĂ€ringutele tĂ”useb. LivenessProbe puhul kontrollitakse vastuse kĂ€ttesaadavust (parameetri timeoutSeconds kaudu), mille jĂ€rel kubelet taaskĂ€ivitab konteineri. Kui konteiner kĂ€ivitub, hakkab ta tegema ressursimahukaid ĂŒlesandeid ja teda taaskĂ€ivitavad taas. See vĂ”ib olla kriitiline rakenduste jaoks, millele on oluline vastuse kiirus. NĂ€iteks auto ootab serverilt vastust, vastus viibib – ja auto satub avariisse.

Kirjutame readinessProbe mÀÀratluse, mis seadistab GET-pĂ€ringu vastuse aja mitte ĂŒle kahe sekundi ja rakendus vastab GET-pĂ€ringule viie 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Ă€ivitame pod'i kubectl-iga:

kubectl apply -f pod.yaml

Ootame paar sekundit ja seejÀrel vaatame, kuidas readinessProbe tööle hakkas:

kubectl describe pods nodedelayed

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

Nagu nĂ€ete, ei kĂ€ivitanud kubectl pod'i uuesti, kui kontrolli aeg ĂŒletas 2 sekundit. Selle asemel tĂŒhistati pĂ€ring. Sisse tulevad ĂŒhendused suunatakse teistele, töötavatele pod'idele.

MĂ€rkige: nĂŒĂŒd, kui pod'il on vĂ€henenud koormus, suunab kubectl taas pĂ€ringud sellele: GET-pĂ€ringutele vastamine ei viibinud enam.

VÔrdluseks: allpool on toodud 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 pilvetehnoloogia rakenduste tekkimist olid logid pĂ”hi tööriistad rakenduste jĂ€lgimiseks ja oleku kontrollimiseks. Siiski puudusid meetodid tĂ”rgete kĂ”rvaldamiseks. Logid on endiselt kasulikud, neid tuleb koguda ja saata logide kogumisse sĂŒsteemi analĂŒĂŒsimiseks ning otsuste tegemiseks. [Seda kĂ”ik sai teha ka ilma pilvetehnoloogiateta, nĂ€iteks monitiga, kuid k8s-i abil on see saanud oluliselt lihtsamaks 🙂 – toimetaja kommentaar. ]

TĂ€napĂ€eval tuleb muudatusi teha peaaegu reaalajas, seega ei tohiks rakendused enam olla mustad karbid. Ei, need peaksid nĂ€itama lĂ”pp-punkte, mis vĂ”imaldavad jĂ€lgimissĂŒsteemidel kĂŒsida ja koguda vÀÀrtuslikku teavet protsesside oleku kohta, et reageerida vajadusel hetkega. Seda nimetatakse töövĂ”imekuse kontrollimise kujundimudeliks, mis jĂ€rgib kĂ”rge jĂ€lgitavuse printsiipi (NORM).

Kubernetes pakub vaikimisi kahte tĂŒĂŒpi kasutatavuse kontrolli: readinessProbe ja livenessProbe. MĂ”lemad kasutavad samu kontrollitĂŒĂŒpe (HTTP GET-pĂ€ringud, TCP-ĂŒhendused ja kĂ€skude tĂ€itmine). Erinevus seisneb selles, milliseid otsuseid nad teevad, kui pod’ides esineb tĂ”rkeid. livenessProbe taaskĂ€ivitab konteineri, lootes, et viga enam ei kordu, samas kui readinessProbe eraldab pod’i sisenevast liiklusest kuni tĂ”rke pĂ”hjuse kĂ”rvaldamiseni.

Rakenduse Ă”ige projekteerimine peab hĂ”lmama mĂ”lemat tĂŒĂŒpi kontrolli ning koguma piisavalt andmeid, eriti siis, kui tekib erandlik olukord. Samuti peab see nĂ€itama vajalikke API lĂ”pp-punkte, mis edastavad sĂŒsteemile jĂ€lgimiseks (nt Prometheus) olulisi jĂ”udluse oleku mÔÔdikuid.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster