Nā hana maikaʻi loa no nā pahu Kubernetes: Nānā Ola

Nā hana maikaʻi loa no nā pahu Kubernetes: Nānā Ola

Aku; DR

  • No ka hoʻokō ʻana i ka nānā kiʻekiʻe o nā ipu a me nā microservices, ʻaʻole lawa nā lāʻau a me nā metric mua.
  • No ka hoʻihoʻi wikiwiki a me ka hoʻonui ʻana i ke kūpaʻa, pono nā noi e hoʻopili i ka High Observability Principle (HOP).
  • Ma ka pae noi, koi ʻo NOP: ka hoʻopaʻa inoa kūpono, ka nānā pono ʻana, ka nānā pono ʻana, a me ka hoʻokō / hoʻololi ʻana.
  • E hoʻohana i nā māka ma ke ʻano he mea o NOR ReadinessProbe и livenessProbe Kubernetes.

He aha ke ʻano hōʻoia olakino?

I ka hoʻolālā ʻana i kahi noi koʻikoʻi a loaʻa loa, he mea nui e noʻonoʻo e pili ana i kahi ʻano e like me ka hoʻomanawanui hewa. Manaʻo ʻia kahi palapala noi he hoʻomanawanui hewa inā hoʻi koke mai ka hāʻule ʻole. Hoʻohana ʻia kahi noi kapua maʻamau i kahi hoʻolālā microservices - kahi e waiho ʻia ai kēlā me kēia ʻāpana i kahi pahu ʻokoʻa. A i mea e hōʻoia i ka loaʻa ʻana o ka noi ma k8s i ka wā e hoʻolālā ai ʻoe i kahi puʻupuʻu, pono ʻoe e hahai i kekahi mau hiʻohiʻona. Aia ma waena o lākou ka Palapala Hōʻoia Ola. E wehewehe i ke ʻano o ke kamaʻilio ʻana o ka noi iā k8s i ke olakino. ʻAʻole kēia wale ka ʻike e pili ana i ka holo ʻana o ka pod, akā e pili ana i ka loaʻa ʻana a me ka pane ʻana i nā noi. ʻOi aku ka ʻike o nā Kubernetes e pili ana i ke olakino o ka pod, ʻoi aku ka maikaʻi o nā hoʻoholo ʻana e pili ana i ka hoʻokele kaʻa a me ke kaupaona ʻana. No laila, ʻae ka High Observability Principle i ka noi e pane i nā noi i kahi manawa kūpono.

Kuʻuna ʻIke Kiʻekiʻe (HOP)

ʻO ke kumu o ka nānā kiʻekiʻe kekahi o nā loina no ka hoʻolālā ʻana i nā noi containerized. Ma kahi hoʻolālā microservices, ʻaʻole mālama nā lawelawe i ka hana ʻana o kā lākou noi (a pololei hoʻi), akā ʻo ka mea nui ke ʻano o ka loaʻa ʻana o nā pane mai nā lawelawe e loaʻa ana. No ka laʻana, no ka hōʻoia ʻana i kahi mea hoʻohana, hoʻouna kekahi pahu i kahi noi HTTP i kekahi, e manaʻo ana i kahi pane ma kekahi ʻano - ʻo ia wale nō. Hiki iā PythonJS ke hana i ka noi, a hiki iā Python Flask ke pane. ʻO nā pahu e like me nā pahu ʻeleʻele me nā mea huna i kekahi i kekahi. Eia nō naʻe, koi ke kumu NOP i kēlā me kēia lawelawe e hōʻike i kekahi mau wahi hopena API e hōʻike ana i kona olakino, a me kona mākaukau a me ke kūlana hoʻomanawanui hewa. Noi aku ʻo Kubernetes i kēia mau hōʻailona no ka noʻonoʻo ʻana i nā ʻanuʻu aʻe no ke ala ala a me ke kaulike ʻana.

Hoʻopaʻa ʻia kahi palapala noi kapua i hoʻolālā maikaʻi ʻia i kāna mau hanana nui me ka hoʻohana ʻana i nā kahawai I/O maʻamau STDERR a me STDOUT. E hele mai ana kahi lawelawe kōkua, no ka laʻana filebeat, logstash a fluentd, e hāʻawi ana i nā lāʻau i kahi ʻōnaehana nānā kikowaena (e laʻa ʻo Prometheus) a me kahi ʻōnaehana hōʻiliʻili lāʻau (ELK software suite). Hōʻike ke kiʻikuhi ma lalo i ke ʻano o ka hana ʻana o ke ao e like me ka Health Test Pattern a me ka High Observability Principle.

Nā hana maikaʻi loa no nā pahu Kubernetes: Nānā Ola

Pehea e hoʻopili ai i ke ʻano hōʻoia olakino ma Kubernetes?

Ma waho o ka pahu, nānā nā k8s i ke kūlana o nā pods me ka hoʻohana ʻana i kekahi o nā mea hoʻokele (Nā hana, Nā Hoʻopiʻi, ʻO DaemonSets, Nā Mokuʻāina etc., etc.). I ka ʻike ʻana ua hāʻule ka pod no kekahi kumu, hoʻāʻo ka mea hoʻoponopono e hoʻomaka hou a neʻe paha i kahi node ʻē aʻe. Eia naʻe, hiki i kahi pod ke hōʻike i ke ala a holo, akā ʻaʻole ia e hana. E hāʻawi i kahi laʻana: hoʻohana kāu noi iā Apache ma ke ʻano he kikowaena pūnaewele, ua hoʻokomo ʻoe i ka ʻāpana ma nā pods o ka pūpū. Ma muli o ka hewa ʻole o ka hoʻonohonoho ʻana o ka waihona, pane nā noi āpau i ka palapala me ke code 500 (hewa kikowaena kikowaena). I ka nānā ʻana i ka hāʻawi ʻana, ʻo ka nānā ʻana i ke kūlana o nā pods e hāʻawi i kahi hopena kūleʻa, akā ʻokoʻa ka manaʻo o nā mea kūʻai aku. E wehewehe mākou i kēia kūlana makemake ʻole penei:

Nā hana maikaʻi loa no nā pahu Kubernetes: Nānā Ola

I kā mākou laʻana, hana ʻo k8s nānā hana. Ma kēia ʻano hōʻoia, nānā mau ka kubelet i ke kūlana o ke kaʻina hana i loko o ka ipu. Ke hoʻomaopopo ʻo ia ua pau ke kaʻina hana, e hoʻomaka hou ʻo ia. Inā hiki ke hoʻoholo ʻia ka hewa ma ka hoʻomaka hou ʻana i ka noi, a ua hoʻolālā ʻia ka papahana e pani i kekahi hewa, a laila ʻo ke kaʻina hana nānā olakino wale nō e pono ai ʻoe e hahai i ka NOP a me ka Health Test Pattern. ʻO ka mea minamina wale nō ʻaʻole i pau nā hewa a pau ma ka hoʻomaka hou ʻana. I kēia hihia, hāʻawi ʻo k8s i 2 mau ala hohonu e ʻike ai i nā pilikia me ka pod: livenessProbe и ReadinessProbe.

LivenessProbe

Ma ka livenessProbe Hana ʻo kubelet i nā ʻano loiloi 3: ʻaʻole wale e hoʻoholo inā e holo ana ka pod, akā inā mākaukau paha ia e loaʻa a pane pono i nā noi:

  • E hoʻonohonoho i kahi noi HTTP i ka pod. Pono e loaʻa i ka pane kahi helu pane HTTP ma ka laulā mai 200 a 399. No laila, nā code 5xx a me 4xx e hōʻike ana he pilikia ka pod, ʻoiai ke holo nei ke kaʻina hana.
  • No ka hoʻāʻo ʻana i nā pods me nā lawelawe HTTP ʻole (no ka laʻana, ke kikowaena leka uila Postfix), pono ʻoe e hoʻokumu i kahi pilina TCP.
  • E hoʻokō i kahi kauoha kūʻokoʻa no kahi pod (i loko). Manaʻo ʻia ka holomua inā he 0 ke code hoʻopau kauoha.

He laʻana o kēia hana. ʻO ka wehewehe pod aʻe he noi NodeJS e hoʻolei ana i kahi hewa 500 ma nā noi HTTP. No ka hōʻoia ʻana e hoʻomaka hou ka pahu i ka wā e loaʻa ai kēlā hewa, hoʻohana mākou i ke ʻano 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

ʻAʻole ʻokoʻa kēia me nā wehewehe pod ʻē aʻe, akā ke hoʻohui nei mākou i kahi mea .spec.containers.livenessProbe... Parameter httpGet ʻae i ke ala i hoʻouna ʻia ai ka noi HTTP GET (i kā mākou hiʻohiʻona ʻo kēia /, akā i nā hiʻohiʻona hakakā aia kekahi mea like /api/v1/status). ʻAe kekahi livenessProbe i kahi ʻāpana initialDelaySeconds, e aʻo i ka hana hōʻoia e kali i kahi helu o nā kekona. Pono ka lohi no ka mea e pono ana ka pahu e hoʻomaka, a i ka wā e hoʻomaka hou ai, ʻaʻole loaʻa ia no kekahi manawa.

No ka hoʻohana ʻana i kēia hoʻonohonoho i kahi hui, e hoʻohana:

kubectl apply -f pod.yaml

Ma hope o kekahi mau kekona, hiki iā ʻoe ke nānā i nā mea o ka pod me ka hoʻohana ʻana i kēia kauoha:

kubectl describe pods node500

I ka pau ana o ka puka ana, huli ʻo ia ka mea.

E like me kāu e ʻike ai, ua hoʻomaka ʻo livenessProbe i kahi noi HTTP GET, ua hana ka pahu i kahi hewa 500 (ʻo ia ka mea i hoʻolālā ʻia e hana), a hoʻomaka hou ka kubelet.

Inā ʻoe e noʻonoʻo pehea i hoʻolālā ʻia ai ka noi NideJS, eia ka app.js a me Dockerfile i hoʻohana ʻia:

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

He mea nui e hoʻomaopopo i kēia: e hoʻomaka hou ʻo livenessProbe i ka pahu inā hāʻule. Inā ʻaʻole hoʻoponopono ka hoʻomaka hou i ka hewa e pale ana i ka holo ʻana o ka pahu, ʻaʻole hiki i ke kubelet ke hana i ka hoʻoponopono ʻana i ka pilikia.

ReadinessProbe

Hana like ʻo readinessProbe me livenessProbes (noi GET, kamaʻilio TCP a me ka hoʻokō kauoha), koe wale no nā hana hoʻoponopono. ʻAʻole i hoʻomaka hou ʻia ka pahu kahi i ʻike ʻia ai ka hemahema, akā kaʻawale ʻia mai nā kaʻa komo. E noʻonoʻo ʻoe e hana ana kekahi o nā ipu i nā helu he nui a i ʻole ma lalo o ka ukana kaumaha, e hoʻonui ana i nā manawa pane. I ka hihia o livenessProbe, hoʻomaka ka nānā ʻana i ka loaʻa o ka pane (ma o ka timeoutSeconds check parameter), a laila hoʻomaka ka kubelet i ka ipu. Ke hoʻomaka, hoʻomaka ka pahu e hana i nā hana koʻikoʻi waiwai a hoʻomaka hou. He mea koʻikoʻi kēia no nā noi e pono ai ka wikiwiki o ka pane. Eia kekahi laʻana, ke kali nei kahi kaʻa ma ke alanui i ka pane mai ka server, ua lohi ka pane - a komo ke kaʻa i kahi pōʻino.

E kākau kākou i kahi wehewehe redinessProbe e hoʻonoho i ka manawa pane noi GET i ʻoi aku ma mua o ʻelua kekona, a e pane ka palapala noi i ke noi GET ma hope o 5 kekona. Penei ke ano o ka waihona pod.yaml:

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

E hoʻolālā i kahi pod me kubectl:

kubectl apply -f pod.yaml

E kali kāua i ʻelua mau kekona a laila e ʻike i ka hana ʻana o ka readyProbe:

kubectl describe pods nodedelayed

Ma ka hopena o ka hoʻopuka hiki iā ʻoe ke ʻike ua like kekahi o nā hanana keia.

E like me kāu e ʻike ai, ʻaʻole i hoʻomaka hou ʻo kubectl i ka pod i ka wā i ʻoi aku ai ka manawa nānā ma mua o 2 kekona. Akā, ua kāpae ʻo ia i ka noi. Hoʻouna hou ʻia nā kamaʻilio e hiki mai ana i nā pods hana ʻē aʻe.

E hoʻomaopopo i kēia manawa ua hoʻokuʻu ʻia ka pod, noi hou nā ala kubectl iā ia: ʻaʻole lohi hou nā pane i nā noi GET.

No ka hoʻohālikelike, aia ma lalo ka faila app.js i hoʻololi ʻia:

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')
})

Aku; DR
Ma mua o ka hiki ʻana mai o nā noi ao, ʻo nā lāʻau ka mea nui o ka nānā ʻana a me ka nānā ʻana i ke olakino noi. Akā naʻe, ʻaʻohe ala e hana ai i nā hana hoʻoponopono. Pono mau nā lāʻau i kēia lā; pono e hōʻiliʻili a hoʻouna ʻia i kahi ʻōnaehana hōʻiliʻili lāʻau no ka nānā ʻana i nā kūlana pilikia a me ka hoʻoholo ʻana. [Hiki ke hana i kēia me ka ʻole o nā noi kapua e hoʻohana ana i ka monit, no ka laʻana, akā me k8s ua maʻalahi loa ia :) - memo a ka mea hoʻoponopono. ]

I kēia lā, pono e hana ʻia ka hoʻoponopono ʻana i ka manawa maoli, no laila ʻaʻole pono nā noi i nā pahu ʻeleʻele. ʻAʻole, pono lākou e hōʻike i nā hopena e hiki ai i nā ʻōnaehana nānā ke nīnau a hōʻiliʻili i nā ʻikepili waiwai e pili ana i ke kūlana o nā kaʻina hana i hiki iā lākou ke pane koke inā pono. Kapa ʻia kēia ʻo ka Performance Test Design Pattern, e hahai ana i ka High Observability Principle (HOP).

Hāʻawi ʻo Kubernetes i ʻelua ʻano o ka nānā olakino ma ka paʻamau: readinessProbe a me livenessProbe. Hoʻohana nā ʻelua i nā ʻano loiloi like (noi HTTP GET, nā kamaʻilio TCP a me ka hoʻokō kauoha). ʻOkoʻa lākou i nā hoʻoholo a lākou e pane ai i nā pilikia i loko o nā pods. Hoʻomaka hou ʻo livenessProbe i ka pahu me ka manaʻolana ʻaʻole e hana hou ka hewa, a hoʻokaʻawale ʻo ReadinessProbe i ka pod mai nā kaʻa komo a hiki i ka hoʻoholo ʻana i ke kumu o ka pilikia.

Pono ka hoʻolālā noi kūpono e komo i nā ʻano ʻelua o ka nānā ʻana a hōʻoia i ka hōʻiliʻili ʻana i ka ʻikepili lawa, ʻoi aku ka nui o ka wā i hoʻolei ʻia kahi ʻokoʻa. Pono e hōʻike i nā helu hope API pono e hāʻawi i ka ʻōnaehana nānā (Prometheus) me nā metric olakino koʻikoʻi.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka