Беҳтарин таҷрибаҳо барои контейнерҳои Kubernetes: Санҷиши саломатӣ

Беҳтарин таҷрибаҳо барои контейнерҳои Kubernetes: Санҷиши саломатӣ

ХИБ; DR

  • Барои ноил шудан ба мушоҳидаи баланди контейнерҳо ва хидматрасониҳои хурд, гузоришҳо ва ченакҳои ибтидоӣ кофӣ нестанд.
  • Барои зудтар барқароршавӣ ва баланд бардоштани устуворӣ, барномаҳо бояд Принсипи баланд мушоҳидашавандаро (HOP) истифода баранд.
  • Дар сатҳи барнома, NOP талаб мекунад: сабти дуруст, мониторинги наздик, санҷишҳои солим ва пайгирии иҷроиш/гузариш.
  • Чекҳоро ҳамчун унсури NOR истифода баред омодагӣ тафтиш и Зиндагӣ Проб Кубернетес.

Шаблони санҷиши саломатӣ чист?

Ҳангоми тарҳрезии як барномаи муҳим ва дастрас хеле муҳим аст, ки дар бораи ҷанбаи таҳаммулпазирӣ ба хатогиҳо фикр кунед. Барнома ба хатогиҳо таҳаммулпазир ҳисобида мешавад, агар он аз нокомӣ зуд барқарор шавад. Замимаи маъмулии абрӣ меъмории хидматрасонии хурдро истифода мебарад - дар он ҷо ҳар як ҷузъ дар як контейнери алоҳида ҷойгир карда мешавад. Ва барои боварӣ ҳосил кардан, ки замима дар k8s ҳангоми тарроҳии кластер хеле дастрас аст, шумо бояд намунаҳои муайянро риоя кунед. Дар байни онҳо Шаблон Санҷиши саломатӣ мебошад. Он муайян мекунад, ки чӣ гуна барнома ба k8s муошират мекунад, ки он солим аст. Ин на танҳо маълумот дар бораи он, ки pod кор мекунад, балки инчунин дар бораи он, ки он чӣ гуна дархостҳоро қабул мекунад ва ба он посух медиҳад. Чӣ қадаре ки Кубернетес дар бораи саломатии поддон донад, ҳамон қадар дар бораи масири трафик ва мувозинати сарборӣ қарорҳои оқилона қабул мекунад. Ҳамин тариқ, Принсипи баланди мушоҳидавӣ ба барнома имкон медиҳад, ки ба дархостҳо сари вақт посух диҳад.

Принсипи мушоҳидаи баланд (HOP)

Принсипи мушоҳидаи баланд яке аз онҳост Принсипҳои тарҳрезии барномаҳои контейнерӣ. Дар меъмории хидматрасонии микро, хидматҳо парво надоранд, ки дархости онҳо чӣ гуна коркард мешавад (ва дуруст аст), аммо муҳим он аст, ки онҳо аз хидматҳои қабулкунанда чӣ гуна посух мегиранд. Масалан, барои тасдиқи корбар, як контейнер дархости HTTP-ро ба дигараш мефиристад ва интизори посух дар формати муайян - ин ҳама. PythonJS инчунин метавонад дархостро коркард кунад ва Python Flask метавонад посух диҳад. Контейнерҳо ба қуттиҳои сиёҳ монанданд, ки дар байни ҳамдигар мундариҷаи пинҳон доранд. Аммо, принсипи NOP аз ҳар як хидмат талаб мекунад, ки нуқтаҳои сершумори API-ро фош кунад, ки то чӣ андоза солим будани он, инчунин омодагӣ ва ҳолати таҳаммулпазирии хатогиҳоро нишон медиҳанд. Кубернетес ин нишондиҳандаҳоро талаб мекунад, то қадамҳои минбаъдаро оид ба масир ва мувозинати сарборӣ андеша кунанд.

Барномаи абрии хуб тарҳрезишуда рӯйдодҳои асосии худро бо истифода аз ҷараёнҳои стандартии I/O STDERR ва STDOUT сабт мекунад. Баъдан хидмати ёрирасон меояд, масалан filebeat, logstash ё fluentd, ки гузоришҳоро ба системаи мутамаркази мониторинг (масалан Prometheus) ва системаи ҷамъоварии гузоришҳо (ба маҷмӯи нармафзори ELK) интиқол медиҳад. Диаграммаи зер нишон медиҳад, ки чӣ гуна барномаи абрӣ мувофиқи Намунаи санҷиши саломатӣ ва Принсипи баланди мушоҳидакорӣ кор мекунад.

Беҳтарин таҷрибаҳо барои контейнерҳои Kubernetes: Санҷиши саломатӣ

Намунаи санҷиши саломатиро дар Кубернетес чӣ гуна бояд татбиқ кард?

Аз қуттӣ, k8s ҳолати подкҳоро бо истифода аз яке аз контроллерҳо назорат мекунад (Ҷойгиркунӣ, ReplicaSets, DaemonSets, Маҷмӯаҳои давлатӣ ғайра ва ғайра). Пас аз фаҳмидани он, ки поддон бо ягон сабаб афтодааст, контроллер кӯшиш мекунад, ки онро бозоғоз кунад ё ба гиреҳи дигар интиқол диҳад. Аммо, поддон метавонад гузориш диҳад, ки он кор мекунад, аммо худаш кор намекунад. Биёед мисол меорем: барномаи шумо Apache-ро ҳамчун веб-сервер истифода мебарад, шумо компонентро дар якчанд подкастҳои кластер насб кардаед. Азбаски китобхона нодуруст танзим карда шудааст, ҳама дархостҳо ба барнома бо рамзи 500 (хатои сервери дохилӣ) ҷавоб медиҳанд. Хангоми тафтиши тахеил, санчидани холати подшоххо натичаи бомуваффакият медихад, вале харидорон дигар хел фикр мекунанд. Мо ин вазъияти номатлубро чунин тавсиф мекунем:

Беҳтарин таҷрибаҳо барои контейнерҳои Kubernetes: Санҷиши саломатӣ

Дар мисоли мо, k8s мекунад санҷиши функсия. Дар ин намуди санҷиш, кубелет ҳолати равандро дар контейнер пайваста тафтиш мекунад. Вақте ки ӯ мефаҳмад, ки ин раванд қатъ шудааст, вай онро дубора оғоз мекунад. Агар хатогиро тавассути бозоғозкунии барнома ҳал кардан мумкин бошад ва барнома барои хомӯш кардани ягон хато тарҳрезӣ шуда бошад, пас санҷиши саломатии раванд танҳо барои риоя кардани NOP ва Намунаи санҷиши саломатӣ лозим аст. Ягона таассуф дар он аст, ки на ҳама хатогиҳо бо аз нав оғоз кардан бартараф карда мешаванд. Дар ин ҳолат, k8s 2 роҳи амиқтари муайян кардани мушкилотро бо pod пешниҳод мекунад: Зиндагӣ Проб и омодагӣ тафтиш.

LivenessProbe

Дар давоми Зиндагӣ Проб kubelet 3 намуди санҷишро анҷом медиҳад: на танҳо муайян мекунад, ки поддон кор мекунад, балки инчунин барои қабул кардан ва ба таври кофӣ посух додан ба дархостҳо омода аст:

  • Дархости HTTP-ро ба pod насб кунед. Ҷавоб бояд рамзи ҷавобии HTTP-ро дар диапазони аз 200 то 399 дар бар гирад. Ҳамин тариқ, рамзҳои 5xx ва 4xx сигнал медиҳанд, ки поддон мушкилот дорад, ҳарчанд раванд иҷро мешавад.
  • Барои санҷидани pods бо хидматҳои ғайриHTTP (масалан, сервери почтаи Postfix), шумо бояд пайвасти TCP-ро барқарор кунед.
  • Фармони ихтиёриро барои pod (дохилӣ) иҷро кунед. Санҷиш бомуваффақият ҳисобида мешавад, агар рамзи анҷоми фармон 0 бошад.

Намунаи он, ки ин чӣ гуна кор мекунад. Таърифи навбатии подкаст барномаи NodeJS-ро дар бар мегирад, ки дар дархостҳои HTTP хатогии 500 мегузорад. Барои боварӣ ҳосил кардан, ки контейнер ҳангоми гирифтани чунин хато аз нав оғоз мешавад, мо параметри 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

Ин аз дигар таърифи подкастҳо фарқ надорад, аммо мо объектро илова карда истодаем .spec.containers.livenessProbe. Параметр httpGet роҳеро, ки дархости HTTP GET ба он фиристода мешавад, қабул мекунад (дар мисоли мо ин аст /, аммо дар сенарияҳои ҷанг метавонад чизе монанди он бошад /api/v1/status). Дигар livenessProbe як параметрро қабул мекунад initialDelaySeconds, ки ба амалиёти тафтиш дастур медиҳад, ки шумораи муайяни сонияҳоро интизор шавад. Таъхир лозим аст, зеро барои оғоз кардани контейнер вақт лозим аст ва ҳангоми бозоғозӣ он барои муддате дастнорас хоҳад буд.

Барои татбиқи ин танзимот ба кластер, истифода баред:

kubectl apply -f pod.yaml

Пас аз чанд сония, шумо метавонед бо истифода аз фармони зерин мундариҷаи подкро тафтиш кунед:

kubectl describe pods node500

Дар охири натиҷа, пайдо кунед ки ин.

Тавре ки шумо мебинед, livenessProbe дархости HTTP GET-ро оғоз кард, контейнер хатогии 500-ро ба вуҷуд овард (ки барои он барномарезӣ шуда буд) ва kubelet онро аз нав оғоз кард.

Агар шумо дар ҳайрат бошед, ки чӣ тавр барномаи NideJS барномарезӣ шудааст, инҳоянд app.js ва 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')
})

файли докер

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

Инро қайд кардан муҳим аст: livenessProbe контейнерро танҳо дар сурати ноком шуданаш бозоғоз мекунад. Агар бозоғозӣ хатогиеро, ки ба кор кардани контейнер халал мерасонад, ислоҳ накунад, kubelet наметавонад барои ислоҳи мушкилот амал кунад.

омодагӣ тафтиш

ReadinessProbe ба монанди livenessProbes кор мекунад (дархостҳои GET, иртиботи TCP ва иҷрои фармон), ба истиснои амалҳои бартарафсозии мушкилот. Контейнере, ки дар он нокомӣ ошкор шудааст, дубора оғоз намешавад, балки аз трафики воридотӣ ҷудо карда мешавад. Тасаввур кунед, ки яке аз контейнерҳо ҳисобҳои зиёд иҷро мекунад ё зери бори вазнин қарор дорад, ки ин боиси зиёд шудани вақти ҷавоб мегардад. Дар ҳолати livenessProbe, санҷиши дастрасии посух оғоз мешавад (тавассути параметри санҷиши timeoutSeconds), пас аз он кубелет контейнерро аз нав оғоз мекунад. Ҳангоми оғоз кардан, контейнер ба иҷрои вазифаҳои захиравӣ шурӯъ мекунад ва аз нав ба кор андохта мешавад. Ин метавонад барои барномаҳое, ки ба суръати посух ниёз доранд, муҳим бошад. Масалан, мошин ҳангоми дар роҳ мунтазири посух аз сервер аст, ҷавоб ба таъхир меафтад ва мошин ба садама дучор мешавад.

Биёед таърифи redinessProbe нависем, ки вақти вокуниши дархости GET-ро на бештар аз ду сония муқаррар мекунад ва барнома пас аз 5 сония ба дархости GET посух медиҳад. Файли 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

Биёед як pod-ро бо kubectl ҷойгир кунем:

kubectl apply -f pod.yaml

Биёед якчанд сония интизор шавем ва сипас бубинем, ки ReadinessProbe чӣ гуна кор кардааст:

kubectl describe pods nodedelayed

Дар охири баромад шумо мебинед, ки баъзе воқеаҳо ба ҳам монанданд Ҳаминаш.

Тавре ки шумо мебинед, kubectl вақте ки вақти санҷиш аз 2 сония гузашт, pod-ро бозоғоз накард. Ба ҷои ин, ӯ дархостро бекор кард. Алоқаҳои воридотӣ ба дигар қуттиҳои корӣ равона карда мешаванд.

Дар хотир доред, ки ҳоло, ки поддон бор карда шудааст, kubectl боз дархостҳоро ба он равона мекунад: ҷавобҳо ба дархостҳои GET дигар таъхир карда намешаванд.

Барои муқоиса, дар зер файли тағирёфтаи 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')
})

ХИБ; DR
Пеш аз пайдоиши барномаҳои абрӣ, гузоришҳо воситаи асосии назорат ва санҷиши саломатии барномаҳо буданд. Аммо барои дидани ягон чораи ислохй воситае набуд. Журналҳо имрӯз ҳам муфиданд; онҳо бояд ҷамъоварӣ ва ба системаи ҷамъоварии гузоришҳо барои таҳлили ҳолатҳои фавқулодда ва қабули қарорҳо фиристода шаванд. [Ҳамаи инро метавон бидуни барномаҳои абрӣ бо истифода аз monit анҷом дод, аммо бо k8s ин хеле осонтар шуд :) - қайди муҳаррир. ]

Имрӯз, ислоҳот бояд тақрибан дар вақти воқеӣ анҷом дода шавад, аз ин рӯ дигар замимаҳо набояд қуттиҳои сиёҳ бошанд. Не, онҳо бояд нуқтаҳои ниҳоиро нишон диҳанд, ки ба системаҳои мониторинг имкон медиҳанд, ки маълумоти пурарзишро дар бораи ҳолати равандҳо пурсанд ва ҷамъоварӣ кунанд, то онҳо дар ҳолати зарурӣ фавран посух диҳанд. Ин Намунаи тарҳрезии санҷиши иҷроиш номида мешавад, ки ба Принсипи баланди мушоҳидавӣ (HOP) пайравӣ мекунад.

Kubernetes ба таври нобаёнӣ ду намуди санҷиши саломатиро пешниҳод мекунад: readinessProbe ва livenessProbe. Ҳарду як намуди чекҳоро истифода мебаранд (дархостҳои HTTP GET, алоқаи TCP ва иҷрои фармон). Онҳо аз он фарқ мекунанд, ки чӣ гуна қарорҳо дар посух ба мушкилот дар pods қабул мекунанд. livenessProbe контейнерро аз нав оғоз мекунад, то ин ки хатогӣ дубора рӯй надиҳад ва readinessProbe подкастро аз трафики воридотӣ ҷудо мекунад, то сабаби мушкилот ҳал карда шавад.

Тарҳрезии дурусти барнома бояд ҳарду намуди санҷишро дар бар гирад ва боварӣ ҳосил кунад, ки онҳо маълумоти кофӣ ҷамъоварӣ мекунанд, хусусан вақте ки истисно партофта мешавад. Он инчунин бояд нуқтаҳои зарурии API-ро нишон диҳад, ки системаи мониторинг (Prometheus) -ро бо нишондиҳандаҳои муҳими саломатӣ таъмин мекунанд.

Манбаъ: will.com

Илова Эзоҳ