TL; DR
- Lai panÄktu augstu konteineru un mikropakalpojumu novÄrojamÄ«bu, ar žurnÄliem un primÄrajiem rÄdÄ«tÄjiem nepietiek.
- Lai nodroÅ”inÄtu ÄtrÄku atkopÅ”anu un palielinÄtu elastÄ«bu, lietojumprogrammÄm ir jÄpiemÄro augstas novÄrojamÄ«bas princips (HOP).
- Lietojumprogrammas lÄ«menÄ« NOP pieprasa: pareizu reÄ£istrÄÅ”anu, cieÅ”u uzraudzÄ«bu, saprÄta pÄrbaudes un veiktspÄjas/pÄrejas izsekoÅ”anu.
- Izmantojiet Äekus kÄ NOR elementu gatavÄ«bas zonde Šø dzÄ«vÄ«guma zonde Kubernetes.
Kas ir veselÄ«bas pÄrbaudes veidne?
IzstrÄdÄjot misijai kritisku un ļoti pieejamu lietojumprogrammu, ir ļoti svarÄ«gi padomÄt par tÄdu aspektu kÄ kļūdu tolerance. Lietojumprogramma tiek uzskatÄ«ta par defektu tolerantu, ja tÄ Ätri atjaunojas pÄc neveiksmes. Tipiska mÄkoÅa lietojumprogramma izmanto mikropakalpojumu arhitektÅ«ru ā kur katrs komponents tiek ievietots atseviÅ”Ä·Ä konteinerÄ. Un, lai nodroÅ”inÄtu, ka lietojumprogramma k8s ir ļoti pieejama, veidojot klasteru, jums ir jÄievÄro noteikti modeļi. Starp tiem ir VeselÄ«bas pÄrbaudes veidne. Tas nosaka, kÄ lietojumprogramma paziÅo k8s, ka tÄ ir veselÄ«ga. Å Ä« ir ne tikai informÄcija par to, vai pods darbojas, bet arÄ« par to, kÄ tas saÅem pieprasÄ«jumus un reaÄ£Ä uz tiem. Jo vairÄk Kubernetes zina par poda stÄvokli, jo gudrÄkus lÄmumus tÄ pieÅem par satiksmes marÅ”rutÄÅ”anu un slodzes lÄ«dzsvaroÅ”anu. TÄdÄjÄdi augstas novÄrojamÄ«bas princips ļauj lietojumprogrammai reaÄ£Ät uz pieprasÄ«jumiem savlaicÄ«gi.
Augstas novÄrojamÄ«bas princips (HOP)
Augstas novÄrojamÄ«bas princips ir viens no
Labi izstrÄdÄta mÄkoÅa lietojumprogramma reÄ£istrÄ savus galvenos notikumus, izmantojot standarta I/O straumes STDERR un STDOUT. TÄlÄk nÄk palÄ«gpakalpojums, piemÄram, filebeat, logstash vai fluentd, kas piegÄdÄ Å¾urnÄlus centralizÄtai uzraudzÄ«bas sistÄmai (piemÄram, Prometheus) un žurnÄlu vÄkÅ”anas sistÄmai (ELK programmatÅ«ras komplekts). TÄlÄk esoÅ”ajÄ diagrammÄ parÄdÄ«ts, kÄ mÄkoÅa lietojumprogramma darbojas saskaÅÄ ar veselÄ«bas pÄrbaudes modeli un augstas novÄrojamÄ«bas principu.
KÄ piemÄrot veselÄ«bas pÄrbaudes modeli Kubernetes?
IzÅemot no kastes, k8s uzrauga podiÅu statusu, izmantojot vienu no kontrolleriem (
MÅ«su piemÄrÄ k8s to dara funkcionalitÄtes pÄrbaude. Å Äda veida verifikÄcijÄ kubelet nepÄrtraukti pÄrbauda procesa stÄvokli konteinerÄ. Kad viÅÅ” sapratÄ«s, ka process ir apstÄjies, viÅÅ” to atsÄks. Ja kļūdu var novÄrst, vienkÄrÅ”i restartÄjot lietojumprogrammu, un programma ir paredzÄta, lai izslÄgtu jebkuru kļūdu, procesa stÄvokļa pÄrbaude ir viss, kas jums nepiecieÅ”ams, lai ievÄrotu NOP un veselÄ«bas pÄrbaudes modeli. VienÄ«gi žÄl, ka ne visas kļūdas tiek novÄrstas ar restartÄÅ”anu. Å ajÄ gadÄ«jumÄ k8s piedÄvÄ 2 dziļÄkus veidus, kÄ identificÄt podziÅas:
LivenessProbe
LaikÄ dzÄ«vÄ«guma zonde kubelet veic 3 veidu pÄrbaudes: ne tikai nosaka, vai pods darbojas, bet arÄ« vai tas ir gatavs saÅemt pieprasÄ«jumus un adekvÄti atbildÄt uz tiem:
- Iestatiet HTTP pieprasÄ«jumu podam. AtbildÄ ir jÄietver HTTP atbildes kods diapazonÄ no 200 lÄ«dz 399. TÄdÄjÄdi kodi 5xx un 4xx norÄda, ka podÄ ir problÄmas, lai gan process darbojas.
- Lai pÄrbaudÄ«tu apvidus ar pakalpojumiem, kas nav HTTP pakalpojumi (piemÄram, Postfix pasta serveri), ir jÄizveido TCP savienojums.
- Izpildiet patvaļīgu komandu podam (iekÅ”Äji). PÄrbaude tiek uzskatÄ«ta par veiksmÄ«gu, ja komandas pabeigÅ”anas kods ir 0.
PiemÄrs, kÄ tas darbojas. NÄkamajÄ pod definÄ«cijÄ ir NodeJS lietojumprogramma, kas HTTP pieprasÄ«jumos rada kļūdu 500. Lai pÄrliecinÄtos, ka konteiners tiek restartÄts, saÅemot Å”Ädu kļūdu, mÄs izmantojam 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
Tas neatŔķiras no jebkuras citas pod definÄ«cijas, taÄu mÄs pievienojam objektu .spec.containers.livenessProbe
. Parametrs httpGet
pieÅem ceļu, uz kuru tiek nosÅ«tÄ«ts HTTP GET pieprasÄ«jums (mÅ«su piemÄrÄ tas ir /
, bet kaujas scenÄrijos var bÅ«t kaut kas lÄ«dzÄ«gs /api/v1/status
). VÄl viens dzÄ«vÄ«gumsProbe pieÅem parametru initialDelaySeconds
, kas uzdod verifikÄcijas darbÄ«bai gaidÄ«t noteiktu sekunžu skaitu. Aizkave ir nepiecieÅ”ama, jo konteineram ir nepiecieÅ”ams laiks, lai palaistu, un pÄc restartÄÅ”anas tas kÄdu laiku nebÅ«s pieejams.
Lai lietotu Ŕo iestatījumu klasterim, izmantojiet:
kubectl apply -f pod.yaml
PÄc dažÄm sekundÄm varat pÄrbaudÄ«t pÄksts saturu, izmantojot Å”Ädu komandu:
kubectl describe pods node500
Izvades beigÄs atrodiet
KÄ redzat, livenessProbe ierosinÄja HTTP GET pieprasÄ«jumu, konteiners Ä£enerÄja kļūdu 500 (tas ir tas, kam tas bija ieprogrammÄts), un kubelet to restartÄja.
Ja vÄlaties uzzinÄt, kÄ tika ieprogrammÄta lietojumprogramma NideJS, Å”eit ir izmantotie faili app.js un Dockerfile:
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" ]
Ir svarÄ«gi atzÄ«mÄt Å”o: livenessProbe restartÄs konteineru tikai tad, ja tas neizdosies. Ja restartÄÅ”ana neizlabo kļūdu, kas neļauj konteineram darboties, kubelet nevarÄs veikt darbÄ«bas, lai novÄrstu problÄmu.
gatavības zonde
ReadinessProbe darbojas lÄ«dzÄ«gi kÄ livenessProbes (GET pieprasÄ«jumi, TCP sakari un komandu izpilde), izÅemot traucÄjummeklÄÅ”anas darbÄ«bas. Konteiners, kurÄ tiek konstatÄta kļūme, netiek restartÄts, bet ir izolÄts no ienÄkoÅ”Äs trafika. IedomÄjieties, ka viens no konteineriem veic daudz aprÄÄ·inu vai ir pakļauts lielai slodzei, kÄ rezultÄtÄ palielinÄs reakcijas laiks. LivenessProbe gadÄ«jumÄ tiek aktivizÄta atbildes pieejamÄ«bas pÄrbaude (izmantojot timeoutSeconds pÄrbaudes parametru), pÄc kuras kubelet restartÄ konteineru. PÄc palaiÅ”anas konteiners sÄk veikt resursietilpÄ«gus uzdevumus un tiek restartÄts vÄlreiz. Tas var bÅ«t ļoti svarÄ«gi lietojumprogrammÄm, kurÄm nepiecieÅ”ams reakcijas Ätrums. PiemÄram, automaŔīna, atrodoties ceļÄ, gaida atbildi no servera, atbilde tiek aizkavÄta - un automaŔīna nonÄk avÄrijÄ.
UzrakstÄ«sim redinessProbe definÄ«ciju, kas iestatÄ«s GET pieprasÄ«juma atbildes laiku ne vairÄk kÄ divas sekundes, un lietojumprogramma atbildÄs uz GET pieprasÄ«jumu pÄc 5 sekundÄm. Pod.yaml failam vajadzÄtu izskatÄ«ties Å”Ädi:
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
Izvietosim podi ar kubectl:
kubectl apply -f pod.yaml
PagaidÄ«sim dažas sekundes un tad redzÄsim, kÄ darbojÄs ReadinessProbe:
kubectl describe pods nodedelayed
Izvades beigÄs var redzÄt, ka daži notikumi ir lÄ«dzÄ«gi
KÄ redzat, kubectl nerestartÄja podziÅu, kad pÄrbaudes laiks pÄrsniedza 2 sekundes. TÄ vietÄ viÅÅ” atcÄla pieprasÄ«jumu. IenÄkoÅ”ie sakari tiek novirzÄ«ti uz citiem, strÄdÄjoÅ”iem podiem.
Å emiet vÄrÄ, ka tagad, kad pods ir izlÄdÄts, kubectl atkÄrtoti novirza pieprasÄ«jumus uz to: atbildes uz GET pieprasÄ«jumiem vairs netiek aizkavÄtas.
SalÄ«dzinÄjumam zemÄk ir modificÄtais fails 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
Pirms mÄkoÅa lietojumprogrammu parÄdÄ«Å”anÄs žurnÄli bija galvenais lÄ«dzeklis lietojumprogrammu darbÄ«bas pÄrraudzÄ«bai un pÄrbaudei. TomÄr nebija nekÄdu lÄ«dzekļu, lai veiktu korektÄ«vus pasÄkumus. ŽurnÄli ir noderÄ«gi arÄ« Å”odien, tie ir jÄsavÄc un jÄnosÅ«ta uz žurnÄlu savÄkÅ”anas sistÄmu, lai analizÄtu ÄrkÄrtas situÄcijas un pieÅemtu lÄmumus. [To visu varÄja izdarÄ«t bez mÄkoÅa aplikÄcijÄm, piemÄram, izmantojot monit, bet ar k8s kļuva daudz vienkÄrÅ”Äk :) ā redaktora piezÄ«me. ]
MÅ«sdienÄs korekcijas ir jÄveic gandrÄ«z reÄllaikÄ, tÄpÄc pieteikumiem vairs nav jÄbÅ«t melnajÄm kastÄm. NÄ, tiem ir jÄparÄda galapunkti, kas ļauj pÄrraudzÄ«bas sistÄmÄm veikt vaicÄjumus un apkopot vÄrtÄ«gus datus par procesu stÄvokli, lai vajadzÄ«bas gadÄ«jumÄ tÄs varÄtu nekavÄjoties reaÄ£Ät. To sauc par veiktspÄjas pÄrbaudes dizaina modeli, kas atbilst augstas novÄrojamÄ«bas principam (HOP).
Kubernetes pÄc noklusÄjuma piedÄvÄ 2 veidu veselÄ«bas pÄrbaudes: readynessProbe un livenessProbe. Abi izmanto viena veida pÄrbaudes (HTTP GET pieprasÄ«jumi, TCP sakari un komandu izpilde). ViÅi atŔķiras ar to, kÄdus lÄmumus viÅi pieÅem, reaÄ£Äjot uz problÄmÄm pÄkstÄ«s. livenessProbe restartÄ konteineru, cerot, ka kļūda vairs neatkÄrtosies, un readinessProbe izolÄ podziÅu no ienÄkoÅ”Äs trafika, lÄ«dz tiek novÄrsts problÄmas cÄlonis.
PareizÄ lietojumprogrammas izstrÄdÄ jÄiekļauj abi pÄrbaudes veidi un jÄnodroÅ”ina, lai tie savÄktu pietiekami daudz datu, jo Ä«paÅ”i, ja tiek izdarÄ«ts izÅÄmums. Tam vajadzÄtu arÄ« parÄdÄ«t nepiecieÅ”amos API galapunktus, kas nodroÅ”ina uzraudzÄ«bas sistÄmai (Prometheus) svarÄ«gus veselÄ«bas rÄdÄ«tÄjus.
Avots: www.habr.com