ProHoster > Blog > Uprava > Vizualni vodnik za odpravljanje težav s Kubernetesom
Vizualni vodnik za odpravljanje težav s Kubernetesom
Opomba. prevod: Ta članek je del gradiva projekta, objavljenega v javnosti learnk8s, usposabljanje podjetij in posameznih skrbnikov za delo s Kubernetesom. V njem Daniele Polencic, vodja projekta, deli vizualna navodila o tem, kaj storiti v primeru splošnih težav z aplikacijami, ki se izvajajo v gruči K8s.
TL;DR: tukaj je diagram, ki vam bo v pomoč pri odpravljanju napak pri uvajanju v Kubernetes:
Diagram poteka za iskanje in odpravljanje napak v gruči. Izvirnik (v angleščini) je na voljo na PDF и kot slika.
Pri uvajanju aplikacije v Kubernetes morate običajno definirati tri komponente:
Deployment - to je nekakšen recept za ustvarjanje kopij aplikacije, imenovanih pods;
Service — notranji izravnalnik obremenitve, ki porazdeli promet med sklopi;
Vstop — opis, kako bo promet prišel iz zunanjega sveta do storitve.
Tukaj je kratek grafični povzetek:
1) V Kubernetesu aplikacije prejemajo promet iz zunanjega sveta prek dveh ravni izravnalnikov obremenitve: notranje in zunanje.
2) Notranji izravnalnik se imenuje Service, zunanji pa Ingress.
3) Razmestitev ustvari pode in jih nadzira (niso ustvarjeni ročno).
Recimo, da želite razmestiti preprosto aplikacijo a la Pozdravljen, svet. Konfiguracija YAML zanj bo videti takole:
Kaj pa etiketa track: canary na vrhu razdelka Razmestitev? Bi se moralo ujemati?
Ta oznaka je specifična za uvajanje in je storitev ne uporablja za usmerjanje prometa. Z drugimi besedami, lahko ga odstranite ali mu dodelite drugo vrednost.
Kaj pa selektor matchLabels?
Vedno se mora ujemati z oznakami Poda, saj ga Deployment uporablja za sledenje podom.
Predpostavimo, da ste pravilno uredili. Kako jih preveriti?
Oznako stroka lahko preverite z naslednjim ukazom:
kubectl get pods --show-labels
Ali, če pods pripadajo več aplikacijam:
kubectl get pods --selector any-name=my-app --show-labels
kjer je any-name=my-app je oznaka any-name: my-app.
So ostale še kakšne težave?
Lahko se povežete s podom! Če želite to narediti, morate uporabiti ukaz port-forward v kubectl. Omogoča vam povezavo s storitvijo in preverjanje povezave.
service/<service name> — ime storitve; v našem primeru je my-service;
3000 so vrata, ki jih je treba odpreti v računalniku;
80 - vrata, navedena v polju port storitev.
Če je bila povezava vzpostavljena, so nastavitve pravilne.
Če povezava ne uspe, je težava z oznakami ali pa se vrata ne ujemajo.
Razmerje med storitvijo in vstopom
Naslednji korak pri zagotavljanju dostopa do aplikacije je nastavitev Ingressa. Ingress mora vedeti, kako najti storitev, nato poiskati pode in usmeriti promet nanje. Ingress najde zahtevano storitev po imenu in odprtih vratih.
V opisu Ingress in Service se morata ujemati dva parametra:
servicePort v Ingress se mora ujemati s parametrom port v službi;
serviceName v Ingress se mora ujemati s poljem name v službi.
Naslednji diagram povzema povezave vrat:
1) Kot že veste, storitev posluša določenega port:
2) Ingress ima imenovan parameter servicePort:
3) Ta parameter (servicePort) se morajo vedno ujemati port v definiciji storitve:
4) Če so v storitvi podana vrata 80, je to potrebno servicePort je bilo tudi enako 80:
V praksi morate biti pozorni na naslednje vrstice:
Zdaj vsakič, ko pošljete zahtevo na vrata 3000 na vašem računalniku, bo ta posredovana na vrata 80 sklopa s krmilnikom Ingress. Z odhodom na http://localhost:3000, bi morali videti stran, ki jo ustvari aplikacija.
Povzetek pristanišč
Spomnimo se še enkrat, katera vrata in oznake se morajo ujemati:
Izbirnik v definiciji storitve se mora ujemati z oznako sklopa;
targetPort v definiciji Storitev se mora ujemati containerPort posoda v stroku;
port v definiciji Storitev je lahko karkoli. Različne storitve lahko uporabljajo ista vrata, ker imajo različne naslove IP;
servicePort Vhod se mora ujemati port v definiciji storitve;
Ime storitve se mora ujemati s poljem serviceName v Ingressu.
Na žalost ni dovolj vedeti, kako pravilno strukturirati konfiguracijo YAML.
Kaj se zgodi, ko gre kaj narobe?
Strok se morda ne bo zagnal ali pa se bo zrušil.
3 koraki za diagnosticiranje težav z aplikacijami v Kubernetesu
Preden začnete odpravljati napake pri uvajanju, morate dobro razumeti, kako deluje Kubernetes.
Ker ima vsaka aplikacija, prenesena v K8s, tri komponente, jih je treba odpravljati v določenem vrstnem redu, začenši od samega dna.
Najprej se morate prepričati, da stroki delujejo, nato ...
Preverite, ali storitev dobavlja promet enotam, nato pa ...
Preverite, ali je Ingress pravilno konfiguriran.
Vizualna predstavitev:
1) Težave bi morali začeti iskati od samega dna. Najprej preverite, ali imajo sklopi statuse Ready и Running:
2) Če so stroki pripravljeni (Ready), morate ugotoviti, ali storitev porazdeljuje promet med sklopi:
3) Končno morate analizirati povezavo med storitvijo in Ingressom:
1. Diagnostika strokov
V večini primerov je težava povezana s strokom. Prepričajte se, da so stroki navedeni kot Ready и Running. To lahko preverite z ukazom:
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
V zgornjem izhodu ukaza je zadnji pod naveden kot Running и Ready, vendar to ne velja za druga dva.
Kako razumeti, kaj je šlo narobe?
Obstajajo štirje uporabni ukazi za diagnosticiranje podov:
kubectl logs <имя pod'а> omogoča pridobivanje hlodov iz posod v pod;
kubectl describe pod <имя pod'а> omogoča ogled seznama dogodkov, povezanih s podom;
kubectl get pod <имя pod'а> omogoča pridobitev konfiguracije YAML za pod, shranjeno v Kubernetesu;
kubectl exec -ti <имя pod'а> bash omogoča zagon interaktivne ukazne lupine v enem od vsebnikov pod
Katerega izbrati?
Dejstvo je, da univerzalnega ukaza ni. Uporabiti je treba kombinacijo teh.
Tipične težave s podom
Obstajata dve glavni vrsti napak pod: napake ob zagonu in napake med izvajanjem.
Napake pri zagonu:
ImagePullBackoff
ImageInspectError
ErrImagePull
ErrImageNeverPull
RegistryUnavailable
InvalidImageName
Napake med izvajanjem:
CrashLoopBackOff
RunContainerError
KillContainerError
VerifyNonRootError
RunInitContainerError
CreatePodSandboxError
ConfigPodSandboxError
KillPodSandboxError
SetupNetworkError
TeardownNetworkError
Nekatere napake so pogostejše od drugih. Tukaj je nekaj najpogostejših napak in kako jih odpraviti.
ImagePullBackOff
Ta napaka se pojavi, ko Kubernetes ne more pridobiti slike za enega od vsebnikov pod. Tukaj so trije najpogostejši razlogi za to:
Ime slike ni pravilno - na primer, v njem ste naredili napako ali pa slika ne obstaja;
Za sliko je bila določena neobstoječa oznaka;
Slika je shranjena v zasebnem registru in Kubernetes nima dovoljenja za dostop do nje.
Prva dva razloga je enostavno odpraviti - samo popravite ime slike in oznako. V primeru slednjega morate v Secret vnesti poverilnice za zaprti register in v pods dodati povezave do njega. V dokumentaciji Kubernetes obstaja primer kako je to mogoče storiti.
Crash Loop Back Off
Kubenetes vrže napako CrashLoopBackOff, če se vsebnik ne more zagnati. To se običajno zgodi, ko:
Morate poskusiti priti do dnevnikov iz zabojnika, da ugotovite razlog za njegovo okvaro. Če je težko dostopati do dnevnikov, ker se vsebnik prehitro znova zažene, lahko uporabite naslednji ukaz:
kubectl logs <pod-name> --previous
Prikazuje sporočila o napakah iz prejšnje inkarnacije vsebnika.
RunContainerError
Ta napaka se pojavi, ko se vsebnik ne zažene. Ustreza trenutku pred zagonom aplikacije. Običajno je posledica nepravilnih nastavitev, na primer:
poskus priklopa neobstoječega nosilca, kot je ConfigMap ali Secrets;
poskus namestitve nosilca samo za branje kot branje-pisanje.
Ekipa je zelo primerna za analizo takšnih napak kubectl describe pod <pod-name>.
Stroki so v stanju čakanja
Ko je enkrat ustvarjen, pod ostane v stanju Pending.
Zakaj se to dogaja?
Tu so možni razlogi (predvidevam, da razporejevalnik deluje dobro):
Grozd nima dovolj virov, kot sta procesorska moč in pomnilnik, za zagon sklopa.
Objekt je nameščen v ustreznem imenskem prostoru ResourceQuota in ustvarjanje sklopa bo povzročilo, da bo imenski prostor presegel kvoto.
Pod je vezan na čakanje PersistentVolumeClaim.
V tem primeru je priporočljivo uporabiti ukaz kubectl describe in preverite razdelek Events:
kubectl describe pod <pod name>
V primeru napak, povezanih z ResourceQuotas, je priporočljivo, da si ogledate dnevnike gruče z ukazom
kubectl get events --sort-by=.metadata.creationTimestamp
Stroki niso pripravljeni
Če je pod naveden kot Running, vendar ni v stanju Ready, pomeni preverjanje njegove pripravljenosti (sonda pripravljenosti) ne uspe.
Ko se to zgodi, se enota ne poveže s storitvijo in do nje ne teče promet. Neuspeh preizkusa pripravljenosti je posledica težav v aplikaciji. V tem primeru morate za iskanje napake analizirati razdelek Events v izhodu ukaza kubectl describe.
2. Servisna diagnostika
Če so stroki navedeni kot Running и Ready, vendar še vedno ni odgovora aplikacije, preverite nastavitve storitve.
Storitve so odgovorne za usmerjanje prometa do podov glede na njihove oznake. Zato morate najprej preveriti, koliko podov deluje s storitvijo. Če želite to narediti, lahko preverite končne točke v storitvi:
kubectl describe service <service-name> | grep Endpoints
Končna točka je par vrednosti obrazca <IP-адрес:порт>, in vsaj en tak par mora biti prisoten v izhodu (to pomeni, da vsaj en pod deluje s storitvijo).
Če razdelek Endpoins prazno, možni sta dve možnosti:
ni podov s pravilno oznako (namig: preverite, ali je imenski prostor pravilno izbran);
Pri servisnih oznakah v izbirniku je napaka.
Če vidite seznam končnih točk, vendar še vedno ne morete dostopati do aplikacije, je verjetno krivec napaka v targetPort v opisu storitve.
Kako preveriti delovanje storitve?
Ne glede na vrsto storitve lahko uporabite ukaz kubectl port-forward za povezavo z njim:
To pomeni, da krmilnik Ingress najverjetneje ni pravilno konfiguriran. Ker je krmilnik Ingress komponenta tretje osebe v gruči, obstajajo različne metode odpravljanja napak, odvisno od njegove vrste.
Toda preden se zatečete k uporabi posebnih orodij za konfiguracijo Ingressa, lahko naredite nekaj zelo preprostega. Ingress uporablja serviceName и servicePort za povezavo s storitvijo. Preveriti morate, ali so pravilno konfigurirani. To lahko storite z ukazom:
kubectl describe ingress <ingress-name>
Če stolpec Backend prazno, obstaja velika verjetnost konfiguracijske napake. Če so ozadja na mestu, vendar aplikacija še vedno ni dostopna, je težava morda povezana z:
Nastavitve dostopnosti Ingress iz javnega interneta;
nastavitve dostopnosti gruče iz javnega interneta.
Težave z infrastrukturo lahko prepoznate tako, da se neposredno povežete z Ingress podom. Če želite to narediti, najprej poiščite pod Ingress Controller (lahko je v drugem imenskem prostoru):
Zdaj bodo vse zahteve na vrata 3000 v računalniku preusmerjene na vrata 80 sklopa.
Ali zdaj deluje?
Če ja, potem je problem v infrastrukturi. Treba je natančno ugotoviti, kako je promet usmerjen v gručo.
Če ne, potem je težava v krmilniku Ingress.
Če krmilnika Ingress ne morete omogočiti, da deluje, ga boste morali odpraviti.
Obstaja veliko vrst krmilnikov Ingress. Najbolj priljubljeni so Nginx, HAProxy, Traefik itd. (za več informacij o obstoječih rešitvah glejte naš pregled — pribl. prev.) Oglejte si vodnik za odpravljanje težav v ustrezni dokumentaciji krmilnika. Zaradi Ingress Nginx je najbolj priljubljen krmilnik Ingress, smo v članek vključili nekaj nasvetov za reševanje težav, povezanih z njim.
Odpravljanje napak krmilnika Ingress Nginx
Projekt Ingress-nginx ima uradnika vtičnik za kubectl. Ekipa kubectl ingress-nginx se lahko uporablja za:
Upoštevajte, da boste v nekaterih primerih morda morali podati pravilen imenski prostor za krmilnik Ingress z uporabo zastavice --namespace <name>.
Povzetek
Odpravljanje težav s Kubernetesom je lahko izziv, če ne veste, kje začeti. Težave se morate vedno lotiti od spodaj navzgor: začnite s podi, nato pa nadaljujte s storitvijo in Ingressom. Tehnike odpravljanja napak, opisane v tem članku, je mogoče uporabiti za druge predmete, kot so: