Athugið. þýð.: Þessi grein er hluti af verkefnaefninu sem gefið er út á almenningi læra8s, þjálfun fyrirtækja og einstakra stjórnenda til að vinna með Kubernetes. Þar deilir Daniele Polencic, verkefnastjóri, sjónrænum leiðbeiningum um hvaða skref eigi að taka ef upp koma almenn vandamál með forrit sem keyra á K8s klasanum.
TL;DR: hér er skýringarmynd sem mun hjálpa þér að kemba uppsetningu í Kubernetes:
Flæðirit til að finna og laga villur í klasa. Frumritið (á ensku) er fáanlegt á PDF и sem mynd.
Þegar forrit er sett í Kubernetes eru venjulega þrír þættir sem þú þarft að skilgreina:
dreifing - þetta er eins konar uppskrift að því að búa til afrit af forriti, sem kallast belg;
þjónusta - innri álagsjafnari sem dreifir umferð á milli belg;
Innstreymi — lýsing á því hvernig umferð mun berast frá umheiminum til þjónustunnar.
Hér er fljótleg myndræn samantekt:
1) Í Kubernetes fá forrit umferð frá umheiminum í gegnum tvö lög af álagsjafnara: innri og ytri.
2) Innri jafnvægisstillirinn heitir Þjónusta, sá ytri heitir Ingress.
3) Dreifing býr til belg og fylgist með þeim (þeir eru ekki búnir til handvirkt).
Segjum að þú viljir nota einfalt forrit a la Halló heimur. YAML stillingin fyrir það mun líta svona út:
Hvað með merkimiðann track: canary efst í Deployment hlutanum? Ætti það að passa?
Þetta merki er dreifingarsértækt og er ekki notað af þjónustunni til að beina umferð. Með öðrum orðum, það er hægt að fjarlægja það eða úthluta öðru gildi.
Hvað með veljarann matchLabels?
Það verður alltaf að passa við merki Podsins, þar sem það er notað af Deployment til að rekja belg.
Gerum ráð fyrir að þú hafir gert réttar breytingar. Hvernig á að athuga þá?
Þú getur athugað belgmerkið með eftirfarandi skipun:
kubectl get pods --show-labels
Eða, ef fræbelgur tilheyra nokkrum forritum:
kubectl get pods --selector any-name=my-app --show-labels
Hvar any-name=my-app er merki any-name: my-app.
Eru einhverjir erfiðleikar eftir?
Þú getur tengst pod! Til að gera þetta þarftu að nota skipunina port-forward í kubectl. Það gerir þér kleift að tengjast þjónustunni og athuga tenginguna.
service/<service name> — nafn þjónustu; í okkar tilviki er það my-service;
3000 er portið sem þarf að opna á tölvunni;
80 - höfn tilgreind í reitnum port þjónusta.
Ef tengingunni var komið á, þá eru stillingarnar réttar.
Ef tengingin mistekst er vandamál með merkin eða tengin passa ekki saman.
Tengsl þjónustu og Ingress
Næsta skref í að veita aðgang að forritinu tengist uppsetningu Ingress. Ingress þarf að vita hvernig á að finna þjónustu, finna síðan belg og beina umferð til þeirra. Ingress finnur nauðsynlega þjónustu með nafni og opinni höfn.
Í lýsingunni á Ingress og Service verða tvær breytur að passa:
servicePort í Ingress verður að passa við færibreytuna port í þjónustu;
serviceName í Ingress verður að passa við völlinn name í þjónustu.
Eftirfarandi skýringarmynd dregur saman hafnartengingarnar:
1) Eins og þú veist nú þegar hlustar Þjónusta á ákveðinn port:
2) Ingress hefur færibreytu sem kallast servicePort:
3) Þessi breytu (servicePort) verður alltaf að passa port í þjónustuskilgreiningunni:
4) Ef port 80 er tilgreint í Þjónusta, þá er nauðsynlegt að servicePort var líka jafnt og 80:
Í reynd þarftu að borga eftirtekt til eftirfarandi línur:
Nú í hvert skipti sem þú sendir beiðni til port 3000 á tölvunni þinni, verður það áframsend á port 80 á belgnum með Ingress stjórnandi. Með því að fara til http://localhost:3000, þú ættir að sjá síðuna sem forritið býr til.
Yfirlit yfir hafnir
Við skulum enn og aftur muna hvaða tengi og merki verða að passa:
Valinn í þjónustuskilgreiningunni verður að passa við merki belgsins;
targetPort í skilgreiningunni Þjónusta verður að passa containerPort ílát inni í belgnum;
port í skilgreiningunni Þjónusta getur verið hvað sem er. Mismunandi þjónustur geta notað sömu tengið vegna þess að þær hafa mismunandi IP tölur;
servicePort Ingress verður að passa port í skilgreiningunni á þjónustu;
Þjónustuheitið verður að passa við reitinn serviceName í Ingress.
Því miður er ekki nóg að vita hvernig á að skipuleggja YAML uppsetningu á réttan hátt.
Hvað gerist þegar hlutirnir fara úrskeiðis?
Hugsanlegt er að hólfið ræsist ekki eða það getur hrunið.
3 skref til að greina forritavandamál í Kubernetes
Áður en þú byrjar að kemba uppsetningu þína þarftu að hafa góðan skilning á því hvernig Kubernetes virkar.
Þar sem hvert forrit sem er hlaðið niður í K8s hefur þrjá hluti, ætti að kemba þá í ákveðinni röð, byrjað alveg frá botninum.
Fyrst þarftu að ganga úr skugga um að belgirnir virki, síðan...
Athugaðu hvort þjónustan veitir umferð til belganna og þá...
Athugaðu hvort Ingress sé rétt stillt.
Sjónræn framsetning:
1) Þú ættir að byrja að leita að vandamálum alveg frá botni. Athugaðu fyrst hvort belg hafi stöður Ready и Running:
2) Ef fræbelgirnir eru tilbúnir (Ready), ættir þú að komast að því hvort þjónustan dreifir umferð á milli belg:
3) Að lokum þarftu að greina tengslin milli þjónustunnar og Ingress:
1. Greining á belgjum
Í flestum tilfellum er vandamálið tengt belgnum. Gakktu úr skugga um að belgirnir séu skráðir sem Ready и Running. Þú getur athugað þetta með því að nota skipunina:
kubectl get pods
NAME READY STATUS RESTARTS AGE
app1 0/1 ImagePullBackOff 0 47h
app2 0/1 Error 0 47h
app3-76f9fcd46b-xbv4k 1/1 Running 1 47h
Í skipunarúttakinu hér að ofan er síðasta belgurinn skráður sem Running и Readyþetta á hins vegar ekki við um hina tvo.
Hvernig á að skilja hvað fór úrskeiðis?
Það eru fjórar gagnlegar skipanir til að greina belg:
kubectl logs <имя pod'а> gerir þér kleift að draga logs úr ílátum í belg;
kubectl describe pod <имя pod'а> gerir þér kleift að skoða lista yfir atburði sem tengjast belgnum;
kubectl get pod <имя pod'а> gerir þér kleift að fá YAML stillingar á belg sem er geymdur í Kubernetes;
kubectl exec -ti <имя pod'а> bash gerir þér kleift að ræsa gagnvirka stjórnskel í einu af belgílátunum
Hvorn ættir þú að velja?
Staðreyndin er sú að það er engin algild skipun. Sambland af þessu ætti að nota.
Dæmigert pod vandamál
Það eru tvær megingerðir af pod-villum: ræsingarvillur og afturkreistingarvillur.
Ræsingarvillur:
ImagePullBackoff
ImageInspectError
ErrImagePull
ErrImageNeverPull
RegistryUnavailable
InvalidImageName
Runtime villur:
CrashLoopBackOff
RunContainerError
KillContainerError
VerifyNonRootError
RunInitContainerError
CreatePodSandboxError
ConfigPodSandboxError
KillPodSandboxError
SetupNetworkError
TeardownNetworkError
Sumar villur eru algengari en aðrar. Hér eru nokkrar af algengustu villunum og hvernig á að laga þær.
ImagePullBackOff
Þessi villa birtist þegar Kubernetes getur ekki fengið mynd fyrir einn af belgílátunum. Hér eru þrjár algengustu ástæðurnar fyrir þessu:
Nafn myndarinnar er rangt - þú gerðir til dæmis mistök í henni eða myndin er ekki til;
Merki sem ekki var til var tilgreint fyrir myndina;
Myndin er geymd í einkaskrá og Kubernetes hefur ekki aðgang að henni.
Auðvelt er að útrýma fyrstu tveimur ástæðunum - leiðréttu bara nafn myndarinnar og merkið. Þegar um hið síðarnefnda er að ræða þarftu að slá inn skilríki fyrir lokaða skráninguna í Secret og bæta við tenglum við hana í belg. Í Kubernetes skjölunum það er dæmi hvernig er hægt að gera þetta.
Crash Loop Back Off
Kubenetes kastar villu CrashLoopBackOff, ef ílátið getur ekki ræst. Þetta gerist venjulega þegar:
Það er villa í forritinu sem kemur í veg fyrir að það ræsist;
Þú verður að reyna að komast að annálunum úr ílátinu til að komast að ástæðunni fyrir bilun hans. Ef það er erfitt að nálgast annálana vegna þess að gámurinn endurræsir sig of fljótt geturðu notað eftirfarandi skipun:
kubectl logs <pod-name> --previous
Það sýnir villuboð frá fyrri holdgun ílátsins.
RunContainerError
Þessi villa kemur upp þegar ekki tekst að ræsa ílátið. Það samsvarar augnablikinu áður en forritið er ræst. Það stafar venjulega af röngum stillingum, til dæmis:
að reyna að tengja hljóðstyrk sem ekki er til eins og ConfigMap eða Secrets;
tilraun til að tengja skrifvarið bindi sem lesa-skrifa.
Liðið er vel til þess fallið að greina slíkar villur kubectl describe pod <pod-name>.
Bækur eru í biðstöðu
Þegar belgurinn er búinn til er hann áfram í ríkinu Pending.
Hvers vegna er þetta að gerast?
Hér eru mögulegar ástæður (ég geri ráð fyrir að tímaáætlunin virki vel):
Klasinn hefur ekki nægjanlegt fjármagn, svo sem vinnsluorku og minni, til að keyra hólfið.
Hluturinn er settur upp í viðeigandi nafnrými ResourceQuota og að búa til pod mun valda því að nafnrýmið fer út fyrir kvótann.
Pod er bundið í bið PersistentVolumeClaim.
Í þessu tilviki er mælt með því að nota skipunina kubectl describe og athugaðu kaflann Events:
kubectl describe pod <pod name>
Ef um villur er að ræða sem tengjast ResourceQuotas, er mælt með því að skoða klasaskrárnar með því að nota skipunina
kubectl get events --sort-by=.metadata.creationTimestamp
Pods eru ekki tilbúnir
Ef fræbelgur er skráður sem Running, en er ekki í ástandi Ready, þýðir að athuga viðbúnað þess (viðbúnaðarrannsókn) mistekst.
Þegar þetta gerist tengist podinn ekki þjónustunni og engin umferð rennur til hans. Bilun í viðbúnaðarprófinu stafar af vandamálum í forritinu. Í þessu tilviki, til að finna villuna, þarftu að greina hlutann Events í skipunarúttakinu kubectl describe.
2. Þjónustugreining
Ef fræbelgir eru skráðir sem Running и Ready, en það er enn ekkert svar frá forritinu, þú ættir að athuga þjónustustillingarnar.
Þjónusta er ábyrg fyrir því að beina umferð til fræbelgs eftir merkjum þeirra. Þess vegna er það fyrsta sem þú þarft að gera að athuga hversu margir belg vinna með þjónustunni. Til að gera þetta geturðu athugað endapunktana í þjónustunni:
kubectl describe service <service-name> | grep Endpoints
Endapunktur er par af gildum formsins <IP-адрес:порт>, og að minnsta kosti eitt slíkt par verður að vera til staðar í úttakinu (þ.e. að minnsta kosti einn pod vinnur með þjónustunni).
Ef kafla Endpoins tómt, tveir valkostir eru mögulegir:
það eru engir belg með réttu merki (vísbending: athugaðu hvort nafnrýmið sé rétt valið);
Það er villa í þjónustumerkingum í veljaranum.
Ef þú sérð lista yfir endapunkta en hefur samt ekki aðgang að forritinu, þá er líklegur sökudólgur galla í targetPort í þjónustulýsingu.
Hvernig á að athuga virkni þjónustunnar?
Óháð tegund þjónustu geturðu notað skipunina kubectl port-forward til að tengjast því:
Þetta þýðir að Ingress stjórnandi er líklega ekki rétt stilltur. Þar sem Ingress stjórnandi er þriðja aðila íhlutur í þyrpingunni eru mismunandi villuleitaraðferðir eftir tegund hans.
En áður en þú grípur til þess að nota sérstök verkfæri til að stilla Ingress geturðu gert eitthvað mjög einfalt. Ingress notar serviceName и servicePort til að tengjast þjónustunni. Þú þarft að athuga hvort þau séu rétt stillt. Þú getur gert þetta með því að nota skipunina:
kubectl describe ingress <ingress-name>
Ef dálkur Backend tóm, það eru miklar líkur á stillingarvillu. Ef bakendarnir eru til staðar, en forritið er enn ekki aðgengilegt, gæti vandamálið tengst:
Inngangur aðgengisstillingar frá almenna internetinu;
klasaaðgengisstillingar frá almenna internetinu.
Þú getur greint vandamál með innviðina með því að tengjast beint við Ingress pod. Til að gera þetta, finndu fyrst Ingress Controller pod (það gæti verið í öðru nafnrými):
Nú verður öllum beiðnum um port 3000 á tölvunni vísað á port 80 á pod.
Virkar það núna?
Ef já, þá er vandamálið með innviðina. Nauðsynlegt er að komast að því nákvæmlega hvernig umferð er beint að klasanum.
Ef ekki, þá er vandamálið með Ingress stjórnanda.
Ef þú getur ekki fengið Ingress stjórnandi til að virka þarftu að kemba hann.
Það eru margar tegundir af Ingress stýringar. Vinsælast eru Nginx, HAProxy, Traefik o.fl. (fyrir frekari upplýsingar um núverandi lausnir, sjá umfjöllun okkar - ca. þýðing.) Þú ættir að vísa til bilanaleitarleiðbeininganna í viðeigandi skjölum stjórnanda. Vegna þess að Ingress Nginx er vinsælasti Ingress stjórnandi, við höfum sett inn nokkur ráð í greininni til að leysa vandamál sem tengjast honum.
Villuleit í Ingress Nginx stjórnanda
Ingress-nginx verkefnið hefur embættismann viðbót fyrir kubectl. Lið kubectl ingress-nginx hægt að nota fyrir:
greining á annálum, bakenda, vottorðum osfrv.;
tengingar við Ingress;
að rannsaka núverandi uppsetningu.
Eftirfarandi þrjár skipanir munu hjálpa þér með þetta:
Athugaðu að í sumum tilfellum gætir þú þurft að tilgreina rétt nafnrými fyrir Ingress stjórnandi með því að nota fánann --namespace <name>.
Yfirlit
Úrræðaleit Kubernetes getur verið krefjandi ef þú veist ekki hvar þú átt að byrja. Þú ættir alltaf að nálgast vandamálið á botn-upp hátt: Byrjaðu með fræbelg og farðu síðan yfir í þjónustuna og Ingress. Villuleitaraðferðirnar sem lýst er í þessari grein er hægt að beita á aðra hluti, svo sem: