PiezÄ«me. tulk.: Å is raksts ir daļa no publiskajÄ domÄnÄ publicÄtajiem projekta materiÄliem mÄcÄ«ties8s, apmÄcÄ«t uzÅÄmumus un individuÄlos administratorus darbam ar Kubernetes. TajÄ Daniele Polencic, projektu vadÄ«tÄja, dalÄs ar vizuÄliem norÄdÄ«jumiem par to, kÄdas darbÄ«bas jÄveic, ja rodas vispÄrÄjas problÄmas ar lietojumprogrammÄm, kas darbojas K8s klasterÄ«.
TL;DR: Å”eit ir diagramma, kas palÄ«dzÄs atkļūdot izvietoÅ”anu Kubernetes:
BlokshÄma kļūdu atraÅ”anai un laboÅ”anai klasterÄ«. OriÄ£inÄls (angļu valodÄ) ir pieejams vietnÄ PDF Šø kÄ attÄls.
Izvietojot lietojumprogrammu Kubernetes, parasti ir jÄdefinÄ trÄ«s komponenti:
IzvietoÅ”anas - Ŕī ir sava veida recepte, lai izveidotu lietojumprogrammas kopijas, ko sauc par pÄkstÄ«m;
Serviss ā iekÅ”Äjais slodzes balansÄtÄjs, kas sadala trafiku starp podiem;
IekļūŔana ā apraksts par to, kÄ satiksme no Ärpasaules nonÄks PakalpojumÄ.
Å eit ir Ätrs grafisks kopsavilkums:
1) ProgrammÄ Kubernetes lietojumprogrammas saÅem trafiku no Ärpasaules, izmantojot divus slodzes balansÄtÄju slÄÅus: iekÅ”Äjo un ÄrÄjo.
2) IekÅ”Äjo balansÄtÄju sauc par Service, ÄrÄjo sauc par Ingress.
3) IzvietoÅ”ana rada podi un uzrauga tos (tie netiek izveidoti manuÄli).
PieÅemsim, ka vÄlaties izvietot vienkÄrÅ”u lietojumprogrammu a la Sveiki World. TÄ YAML konfigurÄcija izskatÄ«sies Å”Ädi:
Kas par etiÄ·eti track: canary sadaļas IzvietoÅ”ana augÅ”pusÄ? Vai tam jÄsakrÄ«t?
Å is apzÄ«mÄjums ir specifisks izvietoÅ”anai, un pakalpojums to neizmanto satiksmes marÅ”rutÄÅ”anai. Citiem vÄrdiem sakot, to var noÅemt vai pieŔķirt citu vÄrtÄ«bu.
Kas par atlasÄ«tÄju matchLabels?
Tam vienmÄr jÄatbilst Pod etiÄ·etÄm, jo to izmanto izvietoÅ”ana, lai izsekotu podi.
PieÅemsim, ka esat veicis pareizos labojumus. KÄ tos pÄrbaudÄ«t?
Varat pÄrbaudÄ«t apavu etiÄ·eti ar Å”Ädu komandu:
kubectl get pods --show-labels
Vai arÄ«, ja podi pieder vairÄkÄm lietojumprogrammÄm:
kubectl get pods --selector any-name=my-app --show-labels
Kur any-name=my-app ir etiÄ·ete any-name: my-app.
Vai ir palikuÅ”as kÄdas grÅ«tÄ«bas?
Var pieslÄgties podam! Lai to izdarÄ«tu, jums ir jÄizmanto komanda port-forward in kubectl. Tas ļauj izveidot savienojumu ar pakalpojumu un pÄrbaudÄ«t savienojumu.
service/<service name> ā pakalpojuma nosaukums; mÅ«su gadÄ«jumÄ tÄ ir my-service;
3000 ir ports, kas ir jÄatver datorÄ;
80 - laukÄ norÄdÄ«tais ports port serviss.
Ja savienojums tika izveidots, iestatījumi ir pareizi.
Ja savienojums neizdodas, ir problÄma ar etiÄ·etÄm vai porti nesakrÄ«t.
Attiecības starp Service un Ingress
NÄkamais solis, lai nodroÅ”inÄtu piekļuvi lietojumprogrammai, ir Ingress iestatÄ«Å”ana. Ingress ir jÄzina, kÄ atrast pakalpojumu, pÄc tam atrast podi un novirzÄ«t trafiku uz tiem. Ingress atrod vajadzÄ«go pakalpojumu pÄc nosaukuma un atvÄrtÄ porta.
Ingress un Service aprakstÄ ir jÄsakrÄ«t diviem parametriem:
servicePort in Ingress ir jÄatbilst parametram port PakalpojumÄ;
serviceName Ingress ir jÄatbilst laukam name PakalpojumÄ.
Å ajÄ diagrammÄ ir apkopoti portu savienojumi:
1) KÄ jÅ«s jau zinÄt, Serviss ieklausÄs noteiktÄ port:
2) Ingress ir parametrs, ko sauc servicePort:
3) Å is parametrs (servicePort) vienmÄr jÄsakrÄ«t port pakalpojuma definÄ«cijÄ:
4) Ja Service ir norÄdÄ«ts ports 80, tad tas ir nepiecieÅ”ams servicePort arÄ« bija vienÄds ar 80:
Tagad katru reizi, kad nosÅ«tÄt pieprasÄ«jumu uz datora 3000. portu, tas tiks pÄrsÅ«tÄ«ts uz podziÅas 80. portu ar Ingress kontrolleri. Dodoties uz http://localhost:3000, jums vajadzÄtu redzÄt lietojumprogrammas Ä£enerÄto lapu.
Ostu kopsavilkums
VÄlreiz atcerÄsimies, kuriem portiem un etiÄ·etÄm ir jÄatbilst:
Pakalpojuma definÄ«cijas atlasÄ«tÄjam ir jÄatbilst aplikuma etiÄ·etei;
targetPort definÄ«cijÄ Pakalpojumam ir jÄatbilst containerPort konteiners pÄksts iekÅ”pusÄ;
port definÄ«cijÄ Pakalpojums var bÅ«t jebkas. DažÄdi pakalpojumi var izmantot vienu un to paÅ”u portu, jo tiem ir atŔķirÄ«gas IP adreses;
servicePort IekļūŔanai ir jÄsakrÄ«t port pakalpojuma definÄ«cijÄ;
Pakalpojuma nosaukumam ir jÄatbilst laukam serviceName in Ingress.
DiemžÄl nepietiek tikai zinÄt, kÄ pareizi strukturÄt YAML konfigurÄciju.
Kas notiek, kad lietas noiet greizi?
PÄksts var nedarboties vai avarÄt.
3 soļi, lai diagnosticÄtu lietojumprogrammas problÄmas pakalpojumÄ Kubernetes
Pirms sÄkat izvietoÅ”anas atkļūdoÅ”anu, jums ir labi jÄizprot, kÄ darbojas Kubernetes.
TÄ kÄ katrai K8s lejupielÄdÄtajai lietojumprogrammai ir trÄ«s komponenti, tie ir jÄatkļūdo noteiktÄ secÄ«bÄ, sÄkot no paÅ”as apakÅ”as.
Vispirms jÄpÄrliecinÄs, vai pÄkstis darbojas, tad...
PÄrbaudiet, vai pakalpojums nodroÅ”ina trafiku uz podiem, un pÄc tam...
PÄrbaudiet, vai Ingress ir pareizi konfigurÄts.
VizuÄls attÄlojums:
1) Jums vajadzÄtu sÄkt meklÄt problÄmas no paÅ”as apakÅ”as. Vispirms pÄrbaudiet, vai pÄkstÄ«m ir statusi Ready Šø Running:
2) Ja pÄkstis ir gatavas (Ready), jums vajadzÄtu noskaidrot, vai pakalpojums sadala trafiku starp aplikÄcijÄm:
3) Visbeidzot, jums jÄanalizÄ saikne starp pakalpojumu un Ingress:
1. PÄkÅ”u diagnostika
VairumÄ gadÄ«jumu problÄma ir saistÄ«ta ar pÄksti. PÄrliecinieties, vai pÄkstis ir norÄdÄ«tas kÄ Ready Šø Running. To var pÄrbaudÄ«t, izmantojot komandu:
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
IepriekÅ” esoÅ”ajÄ komandas izvadÄ pÄdÄjais pods ir norÄdÄ«ts kÄ Running Šø ReadytomÄr tas neattiecas uz pÄrÄjiem diviem.
KÄ saprast, kas nogÄja greizi?
Ir Äetras noderÄ«gas komandas, lai diagnosticÄtu pÄkstis:
kubectl logs <ŠøŠ¼Ń pod'Š°> ļauj izvilkt baļķus no konteineriem podÄ;
kubectl describe pod <ŠøŠ¼Ń pod'Š°> ļauj skatÄ«t ar podziÅu saistÄ«to notikumu sarakstu;
kubectl get pod <ŠøŠ¼Ń pod'Š°> ļauj iegÅ«t Kubernetes saglabÄtÄ podziÅa YAML konfigurÄciju;
kubectl exec -ti <ŠøŠ¼Ń pod'Š°> bash ļauj palaist interaktÄ«vu komandu apvalku vienÄ no pod konteineriem
Kuru izvÄlÄties?
Fakts ir tÄds, ka nav universÄlas komandas. JÄizmanto to kombinÄcija.
Tipiskas podziÅas problÄmas
Ir divi galvenie aplikÄcijas kļūdu veidi: startÄÅ”anas kļūdas un izpildlaika kļūdas.
StartÄÅ”anas kļūdas:
ImagePullBackoff
ImageInspectError
ErrImagePull
ErrImageNeverPull
RegistryUnavailable
InvalidImageName
Izpildlaika kļūdas:
CrashLoopBackOff
RunContainerError
KillContainerError
VerifyNonRootError
RunInitContainerError
CreatePodSandboxError
ConfigPodSandboxError
KillPodSandboxError
SetupNetworkError
TeardownNetworkError
Dažas kļūdas ir biežÄkas nekÄ citas. Å eit ir dažas no visbiežÄk sastopamajÄm kļūdÄm un to novÄrÅ”anas metodes.
ImagePullBackOff
Å Ä« kļūda rodas, ja Kubernetes nevar iegÅ«t attÄlu vienam no pod konteineriem. Å eit ir trÄ«s visbiežÄk sastopamie iemesli:
AttÄla nosaukums ir nepareizs ā piemÄram, jÅ«s tajÄ esat kļūdÄ«jies vai attÄls neeksistÄ;
AttÄlam tika norÄdÄ«ts neesoÅ”s tags;
AttÄls tiek glabÄts privÄtÄ reÄ£istrÄ, un Kubernetes nav atļaujas tam piekļūt.
Pirmos divus iemeslus ir viegli novÄrst ā vienkÄrÅ”i izlabojiet attÄla nosaukumu un atzÄ«mi. PÄdÄjÄ gadÄ«jumÄ jums ir jÄievada slÄgtÄ reÄ£istra akreditÄcijas dati sadaÄ¼Ä Secret un jÄpievieno saites uz to podiÅos. Kubernetes dokumentÄcijÄ ir piemÄrs kÄ to var izdarÄ«t.
Crash Loop Back Off
Kubenetes iemet kļūdu CrashLoopBackOff, ja konteineru nevar palaist. Tas parasti notiek, ja:
LietojumprogrammÄ ir kļūda, kas neļauj to palaist;
PÄrÄk daudz reižu dzÄ«vÄ«guma tests ir izgÄzies.
Lai noskaidrotu tÄ neveiksmes iemeslu, jums jÄmÄÄ£ina nokļūt pie žurnÄliem no konteinera. Ja ir grÅ«ti piekļūt žurnÄliem, jo āākonteiners tiek restartÄts pÄrÄk Ätri, varat izmantot Å”Ädu komandu:
kubectl logs <pod-name> --previous
Tas parÄda kļūdu ziÅojumus no iepriekÅ”ÄjÄ konteinera iemiesojuma.
RunContainerError
Å Ä« kļūda rodas, ja konteineru neizdodas palaist. Tas atbilst brÄ«dim pirms lietojumprogrammas palaiÅ”anas. To parasti izraisa nepareizi iestatÄ«jumi, piemÄram:
mÄÄ£inÄjums pievienot neesoÅ”u sÄjumu, piemÄram, ConfigMap vai Secrets;
mÄÄ£inÄjums montÄt tikai lasÄmu sÄjumu kÄ lasÄmu un rakstÄmu.
Komanda ir labi piemÄrota Å”Ädu kļūdu analÄ«zei kubectl describe pod <pod-name>.
PÄksti atrodas gaidÄ«Å”anas stÄvoklÄ«
PÄc izveides pÄksts paliek stÄvoklÄ« Pending.
KÄpÄc tas notiek?
Å eit ir iespÄjamie iemesli (es pieÅemu, ka plÄnotÄjs darbojas labi):
Klasterim nav pietiekami daudz resursu, piemÄram, apstrÄdes jaudas un atmiÅas, lai palaistu podziÅu.
Objekts ir instalÄts attiecÄ«gajÄ nosaukumu telpÄ ResourceQuota un izveidojot aplikumu, nosaukumvieta pÄrsniegs kvotu.
AplikÄcija ir saistÄ«ta ar statusu Gaida PersistentVolumeClaim.
Å ajÄ gadÄ«jumÄ ieteicams izmantot komandu kubectl describe un pÄrbaudiet sadaļu Events:
kubectl describe pod <pod name>
Kļūdu gadÄ«jumÄ, kas saistÄ«tas ar ResourceQuotas, ieteicams skatÄ«t klasteru žurnÄlus, izmantojot komandu
kubectl get events --sort-by=.metadata.creationTimestamp
PÄkstis nav gatavas
Ja pods ir norÄdÄ«ts kÄ Running, bet nav stÄvoklÄ« Ready, nozÄ«mÄ pÄrbaudÄ«t tÄ gatavÄ«bu (gatavÄ«bas zonde) neizdodas.
Ja tas notiek, pods nepievienojas pakalpojumam un uz to neplÅ«st satiksme. GatavÄ«bas pÄrbaudes kļūmi izraisa problÄmas lietojumprogrammÄ. Å ajÄ gadÄ«jumÄ, lai atrastu kļūdu, jums ir jÄanalizÄ sadaļa Events komandas izvadÄ kubectl describe.
2. Servisa diagnostika
Ja pÄkstis ir norÄdÄ«tas kÄ Running Šø Ready, taÄu no lietojumprogrammas joprojÄm nav atbildes, jums jÄpÄrbauda pakalpojuma iestatÄ«jumi.
Pakalpojumi ir atbildÄ«gi par trafika novirzÄ«Å”anu uz podiem atkarÄ«bÄ no to etiÄ·etÄm. TÄpÄc pirmÄ lieta, kas jums jÄdara, ir pÄrbaudÄ«t, cik daudz podi darbojas ar pakalpojumu. Lai to izdarÄ«tu, pakalpojumÄ varat pÄrbaudÄ«t galapunktus:
kubectl describe service <service-name> | grep Endpoints
Galapunkts ir formas vÄrtÄ«bu pÄris <IP-Š°Š“ŃŠµŃ:ŠæŠ¾ŃŃ>, un izvadÄ ir jÄbÅ«t vismaz vienam Å”Ädam pÄrim (tas ir, vismaz viens pods darbojas ar pakalpojumu).
Ja sadaļa Endpoins tukÅ”s, ir iespÄjamas divas iespÄjas:
nav nevienas pÄkstis ar pareizo etiÄ·eti (padoms: pÄrbaudiet, vai nosaukumvieta ir atlasÄ«ta pareizi);
AtlasÄ«tÄjÄ pakalpojumu etiÄ·etÄs ir kļūda.
Ja redzat galapunktu sarakstu, bet joprojÄm nevarat piekļūt lietojumprogrammai, iespÄjams, vaininieks ir kļūda targetPort pakalpojuma aprakstÄ.
KÄ pÄrbaudÄ«t pakalpojuma funkcionalitÄti?
Neatkarīgi no pakalpojuma veida varat izmantot komandu kubectl port-forward lai izveidotu savienojumu ar to:
pakalpojums veiksmīgi sadala trafiku starp podiem.
TomÄr jÅ«s joprojÄm nevarat sasniegt lietotni.
Tas nozÄ«mÄ, ka Ingress kontrolleris, visticamÄk, nav pareizi konfigurÄts. TÄ kÄ Ingress kontrolleris ir klastera treÅ”Äs puses komponents, atkarÄ«bÄ no tÄ veida ir dažÄdas atkļūdoÅ”anas metodes.
Bet, pirms izmantojat Ä«paÅ”us rÄ«kus Ingress konfigurÄÅ”anai, varat izdarÄ«t kaut ko ļoti vienkÄrÅ”u. Ingress lietojumi serviceName Šø servicePort lai izveidotu savienojumu ar pakalpojumu. Jums jÄpÄrbauda, āāāāvai tie ir pareizi konfigurÄti. To var izdarÄ«t, izmantojot komandu:
kubectl describe ingress <ingress-name>
Ja kolonna Backend tukÅ”s, pastÄv liela konfigurÄcijas kļūdas iespÄjamÄ«ba. Ja aizmugursistÄmas ir izveidotas, bet lietojumprogramma joprojÄm nav pieejama, problÄma var bÅ«t saistÄ«ta ar:
Piekļuves pieejamÄ«bas iestatÄ«jumi no publiskÄ interneta;
klasteru pieejamÄ«bas iestatÄ«jumi no publiskÄ interneta.
JÅ«s varat noteikt problÄmas ar infrastruktÅ«ru, izveidojot tieÅ”u savienojumu ar Ingress pod. Lai to izdarÄ«tu, vispirms atrodiet ieejas kontrollera podziÅu (tas var bÅ«t citÄ nosaukumvietÄ):
Tagad visi datora 3000. porta pieprasÄ«jumi tiks novirzÄ«ti uz podziÅas 80. portu.
Vai tas tagad darbojas?
Ja jÄ, tad problÄma ir infrastruktÅ«rÄ. Ir precÄ«zi jÄnoskaidro, kÄ satiksme tiek novirzÄ«ta uz klasteri.
Ja nÄ, tad problÄma ir Ingress kontrollerÄ«.
Ja nevarat panÄkt, lai Ingress kontrolieris darbotos, jums tas bÅ«s jÄatkļūdo.
Ir daudz dažÄdu Ingress kontrolieru. PopulÄrÄkie ir Nginx, HAProxy, Traefik utt. (lai iegÅ«tu plaÅ”Äku informÄciju par esoÅ”ajiem risinÄjumiem, sk mÅ«su pÄrskats ā apm. tulk.) Skatiet traucÄjummeklÄÅ”anas rokasgrÄmatu attiecÄ«gÄ kontrollera dokumentÄcijÄ. TÄpÄc ka Ingress Nginx ir vispopulÄrÄkais Ingress kontrolieris, rakstÄ esam iekļÄvuÅ”i dažus padomus ar to saistÄ«to problÄmu risinÄÅ”anai.
Ingress Nginx kontrollera atkļūdoŔana
Ingress-nginx projektam ir amatpersona kubectl spraudnis. Komanda kubectl ingress-nginx var izmantot:
Å emiet vÄrÄ, ka dažos gadÄ«jumos, izmantojot karodziÅu, var bÅ«t nepiecieÅ”ams norÄdÄ«t pareizo Ingress kontrollera nosaukumvietu --namespace <name>.
Kopsavilkums
Kubernetes problÄmu novÄrÅ”ana var bÅ«t sarežģīta, ja nezinÄt, ar ko sÄkt. ProblÄmai vienmÄr vajadzÄtu pievÄrsties no apakÅ”as uz augÅ”u: sÄciet ar podiem un pÄc tam pÄrejiet uz pakalpojumu un Ingress. Å ajÄ rakstÄ aprakstÄ«tÄs atkļūdoÅ”anas metodes var izmantot citiem objektiem, piemÄram: