MĂ€rkus tĂ”lke kohta.: See artikkel kuulub vabalt kĂ€ttesaadavate projektimaterjalide hulka , mis Ă”petavad Kubernetesega töötamist ettevĂ”tte ja individuaalsete administraatorite jaoks. Siin jagab projekti juht Daniele Polencic selget juhendit, milliseid samme tuleks astuda, kui K8s-klastris kĂ€ivitatud rakendustes tekivad ĂŒldised probleemid.

TL;DR: siin on skeem, mis aitab teil Kuberneteses deploymenti tÔrkeotsingul:
Vigade leidmise ja parandamise plokkskeem klastris. Originaalis (inglise keeles) on see saadaval ja .
Rakenduse kÀivitamisel Kuberneteses on tavaliselt kolm komponenti, mis tuleb mÀÀratleda:
- Deployment â see on retsept rakenduse koopiate, nn pod'ide, loomiseks;
- Teenused â sisemine koormuse tasandaja, mis jagab liiklust pod'ide vahel;
- Ingress â kirjeldus, kuidas liiklus vĂ€lisest maailmast Service'isse jĂ”uab.
Siin on lĂŒhike graafiline kokkuvĂ”te:
1) Kuberneteses saavad rakendused liiklust vĂ€lisest maailmast lĂ€bi kahe tĂŒĂŒpi koormuse tasandajate: sisemiste ja vĂ€listest.

2) Sisemise koormuse tasandaja nimetatakse Service'iks, vÀlist nimetatakse Ingress'iks.

3) Deployment loob pod'id ja jÀlgib neid (need ei tohi olla kÀsitsi loodud).

Oletame, et soovite juurutada lihtsat rakendust nagu Tere maailm. YAML-konfigureerimine selle jaoks nÀeb vÀlja jÀrgmine:
apiVersion: apps/v1
kind: Deployment # <<<
metadata:
name: my-deployment
labels:
track: canary
spec:
selector:
matchLabels:
any-name: my-app
template:
metadata:
labels:
any-name: my-app
spec:
containers:
- name: cont1
image: learnk8s/app:1.0.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service # <<<
metadata:
name: my-service
spec:
ports:
- port: 80
targetPort: 8080
selector:
name: app
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress # <<<
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- backend:
serviceName: app
servicePort: 80
path: /MÀÀratlemine on ĂŒsna pikk ja komponente on lihtne omavahel segi ajada.
NĂ€iteks:
- Millal tuleks kasutada porti 80 ja millal porti 8080?
- Kas peaks iga teenuse jaoks looma uue pordi, et nad ei konflikti?</
- Kas sildid on olulised? Kas nad peavad olema igal pool samad?
Enne tĂ”rkeotsingule keskendumist tuletame meelde, kuidas kolm komponenti ĂŒksteisega seotud on. Alustame Deploymentist ja Service'ist.
Deployment'i ja Service'i seos
Teid ĂŒllatab, kuid Deploymentâid ja Serviceâid ei ole omavahel seotud. Selle asemel osutab Service otse Pod'idele, mööda Deployment'i.
Seega meid huvitab, kuidas on seotud Pod'id ja Service'id. Meeles tuleb pidada kolme asja:
- Valija (
selector) Service'il peab vastama vĂ€hemalt ĂŒhele Pod'i mĂ€rgisele. -
targetPortpeab vastamacontainerPortpod'i sees oleva konteineri. -
portService'i port vĂ”ib olla ĂŒkskĂ”ik milline. Erinevad teenused vĂ”ivad kasutada sama porti, kuna neil on erinevad IP-aadressid.
JĂ€rgmine skeem nĂ€itab kĂ”ike ĂŒlaltoodut graafiliselt:
1) Oletame, et teenus suunab liiklust mingisse pod'i:

2) Pod'i loomisel tuleb mÀÀrata containerPort iga konteineri jaoks pod'ides:

3) Teenuse loomisel tuleb nĂ€idata port ja targetPort. Kuid millise kaudu toimub ĂŒhendus konteineriga?

4) A lÀbi targetPort. See peab vastama containerPort.

5) Oletame, et konteineris on avatud port 3000. Siis peab vÀÀrtus targetPort olema sama.

YAML-failis peavad mÀrgid ja ports / targetPort vastama:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
labels:
track: canary
spec:
selector:
matchLabels:
any-name: my-app
template:
metadata:
labels: # <<<
any-name: my-app # <<<
spec:
containers:
- name: cont1
image: learnk8s/app:1.0.0
ports:
- containerPort: 8080 # <<<
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- port: 80
targetPort: 8080 # <<<
selector: # <<<
any-name: my-app # <<< Aga kuidas on lood mĂ€rgisega track: canary Deployment'i jaotuse ĂŒlaosas? Kas see peab vastama?
See mÀrgis kuulub rakendusele ega ole teenuse poolt liikluse suunamiseks kasutusel. TeisisÔnu, selle saab eemaldada vÔi mÀÀrata sellele muu vÀÀrtus.
A kuidas on sellega, et valija matchLabels?
see peab alati vastama Pod'i mÀrkidele, kuna seda kasutab Deployment pod'ide jÀlgimiseks.
Oletame, et olete teinud Ôiged muudatused. Kuidas neid kontrollida?
Pod'i mÀrke saab kontrollida jÀrgmise kÀsklusega:
kubectl get pods --show-labelsVÔi, kui pod'id kuuluvad mitmesse rakendusse:
kubectl get pods --selector any-name=my-app --show-labels Kus any-name=my-app â see on mĂ€rk any-name: my-app.
Ăkski probleem ei ole jÀÀnud?
Sa saad ĂŒhenduda pod'iga! Selle jaoks tuleb kasutada kĂ€sku port-forward kubectl'is. See vĂ”imaldab ĂŒhenduda teenusega ja kontrollida ĂŒhendust.
kubectl port-forward service/<teenuse nimi> 3000:80Siin:
-
service/<teenuse nimi>â teenuse nimi; meie puhul on seemy-service; - 3000 â port, mis tuleb arvutis avada;
- 80 â port, mis on mĂ€rgitud valdkonnas
portteenusele.
Kui ĂŒhendus Ă”nnestus, siis on sĂ€tted Ă”iged.
Kui ĂŒhendust ei Ă”nnestu luua, siis on probleem siltide vĂ”i portide vastavuses.
Teenuse ja Ingressi vaheline ĂŒhendus
JÀrgmine samm rakenduse juurdepÀÀsu tagamisel on Ingressi seadistamine. Ingress peab teadma, kuidas leida teenust, siis leida podid ja suunata liiklus nende poole. Ingress leiab vajaliku teenuse nime ja avatud pordi kaudu.
Ingressi ja Teenuse kirjelduse juures peavad olema ĂŒhesugused kaks parameetrit:
-
servicePortIngressis peab vastama parameetrileportTeenuses; -
serviceNameIngressis peab vastama vÀljalenimiTeenuses.
JĂ€rgmine skeem kogub portide ĂŒhendamise kokku:
1) Nagu juba teate, kuulab Teenus mingit port:

2) Ingressil on parameeter, mida nimetatakse servicePort:

3) See parameeter (servicePort) peab alati vastama port Teenuse mÀÀratlemisel:

4) Kui Teenuses on mÀÀratud port 80, siis on vajalik, et servicePort ka oleks 80:

Tavaolukorras tuleks tÀhelepanu pöörata jÀrgmistele ridadele:
apiVersion: v1
kind: Service
metadata:
name: my-service # <<<
spec:
ports:
- port: 80 # <<<
targetPort: 8080
selector:
any-name: my-app
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- backend:
serviceName: my-service # <<<
servicePort: 80 # <<<
path: /Kuidas kontrollida, kas Ingress töötab?
Saate kasutada meetodit kubectl port-forward, kuid teenuse asemel peate ĂŒhenduse looma Ingressi kontrolleriga.
Esialgu peate vÀlja selgitama podi nime, kus on Ingressi kontroller:
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS
kube-system coredns-5644d7b6d9-jn7cq 1/1 Running
kube-system etcd-minikube 1/1 Running
kube-system kube-apiserver-minikube 1/1 Running
kube-system kube-controller-manager-minikube 1/1 Running
kube-system kube-proxy-zvf2h 1/1 Running
kube-system kube-scheduler-minikube 1/1 Running
kube-system nginx-ingress-controller-6fc5bcc 1/1 Running Leidke Ingressi pod (see vÔib kuuluda teise nimekasti) ja kÀivitage kÀsk describe, et teada saada portide numbrid:
kubectl describe pod nginx-ingress-controller-6fc5bcc
--namespace kube-system
| grep Ports
Ports: 80/TCP, 443/TCP, 18080/TCPLĂ”puks, ĂŒhendage podiga:
kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-systemIga kord, kui saadate pĂ€ringu sadamale 3000 arvutis, suunatakse see Ingressi kontrolleri podâi sadamale 80. Kui navigeerite , peaksite nĂ€gema rakenduse loodud lehte.
KokkuvÔte portidest
Vaatame veel kord, millised sadamad ja sildid peaksid sobima:
- Teenuse mÀÀratlemine peab vastama podi sildile;
-
targetPortTeenuse mÀÀratlemine peab vastamacontainerPortpodâi sees oleva konteineri mÀÀratlemisega; -
portTeenuste mÀÀratlemine vÔib olla mis tahes. Erinevad teenused vÔivad kasutada sama porti, kuna neil on erinevad IP-aadressid; -
servicePortIngress peab olema samaportteenuste mÀÀratlemises; - Teenuse nimi peab vastama vÀljal
serviceNameIngressis.
Kahjuks ei piisa ainult YAML-konfiguratsiooni korrektse struktuuri tundmisest.
Mis juhtub, kui midagi lÀheb valesti?
VÔib-olla ei kÀivitu pod vÔi see kukub kokku.
3 sammu Kubernetesis rakenduste tÔrkeotsimiseks
Enne, kui alustate juurutamise tÔrkeotsingut, on vajalik omada head arusaamist sellest, kuidas Kubernetes töötab.
Kuna igas K8s rakenduses on kolm komponenti, tuleks nende tÔrkeotsingut teha kindlas jÀrjekorras, alustades kÔige madalamast.
- Esmalt peate veenduma, et podid töötavad, seejĂ€relâŠ
- Kontrollima, kas teenus suunab liiklust podideni, ja seejĂ€relâŠ
- Kontrollima, kas Ingress on Ôigesti seadistatud.
Visuaalne esitus:
1) Probleemide otsing tuleks alustada kÔige madalamast. KÔigepealt kontrollige, et podid on staatusega Valmis ja KÀimas:

2) Kui podid on valmis (Valmis), peate vÀlja selgitama, kas teenus jaotab liiklust podide vahel:

3) LĂ”puks tuleb analĂŒĂŒsida teenuse ja Ingressi vahelist seost:

1. Podide tÔrkeotsing
Enamasti on probleem seotud podiga. Veenduge, et podid oleksid tÀhistatud kui Valmis ja KÀimas. Seda saab kontrollida jÀrgmise kÀsu abil:
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 Ălaltoodud kĂ€su vĂ€ljundis on viimane pod tĂ€histatud kui KĂ€imas ja Valmis, kuid kahe teise puhul ei ole see nii.
Kuidas aru saada, mis valesti lÀks?
Podide tÔrkeotsimiseks on neli kasulikku kÀsu:
-
kubectl logsvÔimaldab vÀlja vÔtta logid podis olevatest konteineritest; -
kubectl describe podvĂ”imaldab vaadata podiga seotud sĂŒndmuste loetelu; -
kubectl get podvÔimaldab saada Kubernetesesse salvestatud pod'i YAML-konfiguratsiooni; -
kubectl exec -ti bashvĂ”imaldab kĂ€ivitada interaktiivse kĂ€surea ĂŒhes pod'i konteineris
Millist neist valida?
Tegelikult ei ole ĂŒhte universaalset kĂ€sku. Tuleb kasutada nende kombinatsiooni.
TĂŒĂŒpilised podide probleemid
On kaks peamist tĂŒĂŒpi podide vigu: kĂ€ivitusvead ja töövead.
KĂ€ivitusvead:
-
ImagePullBackoff -
ImageInspectError -
ErrImagePull -
ErrImageNeverPull -
RegistryUnavailable -
Vale Pildi Nimi
KĂ€ivitusvead:
-
CrashLoopBackOff -
KĂ€ivita Kasti Viga -
Killi Kasti Viga -
Kontrolli Juurteta Viga -
KĂ€ivita Algkasti Viga -
Loo Pod'i Sandboxi Viga -
Kegita Pod'i Sandboxi Viga -
Killi Pod'i Sandboxi Viga -
Seadista VÔrguviga -
Lahuta VÔrguviga
MÔned vead esinevad sagedamini kui teised. Siin on mÔned kÔige levinumad vead ja nende lahendused.
ImagePullBackOff
See viga ilmneb, kui Kubernetes ei suuda saada aluspinda ĂŒhe pod'i konteineri jaoks. Siin on kolm kĂ”ige levinumat pĂ”hjust:
- Vale pildi nimi on nĂ€idatud â nĂ€iteks olete teinud selles vea vĂ”i pilti ei eksisteeri;
- Kontseptsioonitoodang, mis ei eksisteeri;
- Pilt on salajases registris ja Kubernetesel ei ole Ôigusi sellele juurde pÀÀseda.
Kahte esimest pĂ”hjust on hĂ”lbus lahendada â piisab, kui parandada pildi nimi ja kontseptsioon. Viimase puhul tuleb luua salajase registri sisselogimisdokumendid ja lisada viidud need pod'idesse. Kubernetes'i dokumentatsioonis sellest, kuidas seda teha.
CrashLoopBackOff
Kubernetes kuvab vea CrashLoopBackOff, kui konteiner ei suuda kÀivituda. Tavaliselt juhtub see, kui:
- Rakenduses on viga, mis ei luba sellel kÀivituda;
- Konteiner ;
- Liveness testi ebaÔnnestumine liiga palju kordi.
On vajalik proovida saada logisid konteinerist, et vÀlja selgitada, miks see ebaÔnnestus. Kui logide saamine on keeruline, kuna konteiner kÀivitub liiga kiiresti, saab kasutada jÀrgmist kÀsku:
kubectl logs --previousSee kuvab veateateid konteineri eelmistest reinkarnatsioonidest.
KĂ€ivita Kasti Viga
See viga esineb, kui konteiner ei suuda kÀivituda. See toimub enne rakenduse kÀivitamist. Tavaliselt on selle pÔhjuseks vale seadistamine, nÀiteks:
- katse mÀlu seadistada, mis ei eksisteeri, nagu ConfigMap vÔi Secrets;
- katse mountida read-only tĂŒĂŒp kui read-write.
Delikaatsete vigade analĂŒĂŒsimiseks sobib hĂ€sti kĂ€sk kubectl describe pod.
Pod'id on olekus Pending
PÀrast pod'i loomist jÀÀb see olekusse Pending.
Miks see juhtub?
Siin on vÔimalikud pÔhjused (lÀhenen oletusele, et planeerija töötab normaalselt):
- Klastris puuduvad ressursid, nÀiteks arvutusvÔime ja mÀlu, et pod'i kÀivitada.
- Asjakohases nimedruumis on sisse seatud objekt
ResourceQuotaja pod'i loomine toob kaasa, et nimepind ĂŒletab kvota. - Pod on seotud ootel
PersistentVolumeClaim.
Sel juhul on soovitatav kasutada kĂ€sku kubectl describe ning kontrollida jaotist Ăritused:
kubectl describe pod Vigade korral, mis on seotud ResourceQuotas, on soovitatav vaadata klastrilogisid kÀsku kasutades
kubectl get events --sort-by=.metadata.creationTimestampPod'id ei ole olekus Ready
Kui pod on mÀrgitud kui KÀimas, kuid ei ole olekus Valmis, tÀhendab see, et selle valmisoleku kontrollimine (readiness probe) ei Ônnestu.
Kui see toimub, ei saa pod teenusele ĂŒhendust ja sellele ei suunata liiklust. Ready testi ebaĂ”nnestumine on tingitud rakenduse probleemidest. Sel juhul tuleb vea leidmiseks analĂŒĂŒsida jaotist Ăritused kĂ€sku andmete vĂ€ljastamise ajal kubectl describe.
2. Teenuste diagnostika
Kui pod'id on mÀrgitud kui KÀimas ja Valmis, kuid rakenduselt pole endiselt vastust, tuleb kontrollida teenuse seadeid.
Teenused tegelevad liikluse suunamisega pod'ide juurde vastavalt nende etikettidele. SeetĂ”ttu on esimene asi, mida teha â kontrollida, mitu pod'i töötavad teenusega. Selleks vĂ”ib kontrollida teenuse lĂ”pp-punkte:
kubectl describe service | grep Endpoints LĂ”pp-punkt on vÀÀrtuste paar <IP-аЎŃĐ”Ń:ĐżĐŸŃŃ>, ja vĂ€ljundis peab olema vĂ€hemalt ĂŒks selline paar (st teenusega töötab vĂ€hemalt ĂŒks pod).
Kui jaotis Endpoints on tĂŒhi, vĂ”ivad olla kaks varianti:
- pole ĂŒhtegi pod'i Ă”igete etikettidega (vihje: kontrollige, kas nimel on Ă”ige seadistuse valikud);
- teenuse etikettides on selektoris viga.
Kui nĂ€ete nimekirja lĂ”pp-punkte, kuid ei pÀÀse rakendusele ligi, on tĂ”enĂ€oliselt sĂŒĂŒdlane viga targetPort teenuse kirjelduses.
Kuidas kontrollida teenuse töökorrasolekut?
SĂ”ltumata teenuse tĂŒĂŒbist, saate kasutada kĂ€sku kubectl port-forward sellega ĂŒhenduse loomiseks:
kubectl port-forward service/ 3000:80Siin:
-
<service-name>â teenuse nimi; - 3000 â port, mille avate arvutis;
- 80 â port teenuse kĂŒljel.
3. Ingressi diagnostika
Kui olete siiani lugenud, siis:
- pod'id on mÀrgitud kui
KĂ€imasjaValmis; - teenus suunab liiklust edukalt pod'ide vahel.
Kuid te ei pÀÀse ikka rakendusele ligi.
See tĂ€hendab, et tĂ”enĂ€oliselt on Ingressi kontroller vale seade. Kuna Ingressi kontroller on klastris vĂ€line komponent, on erinevad tĂ”rkeotsingu meetodid olenevalt selle tĂŒĂŒbist.
Kuid enne kui kasutada spetsiaalseid tööriistu Ingressi seadistamiseks, on vĂ”imalik teha midagi ĂŒsna lihtsat. Ingress kasutab serviceName ja servicePort teenusele ĂŒhenduse loomiseks. Tuleb kontrollida, kas need on Ă”igesti seadistatud. Seda saab teha kĂ€suga:
kubectl describe ingress Kui veerg Backend on tĂŒhi, siis on suur tĂ”enĂ€osus, et konfiguratsioonis on viga. Kui backend'id on kohal, kuid rakendusele ligipÀÀs puudub, siis vĂ”ib probleem olla seotud:
- Ingressi kÀttesaadavuse seadistustega avalikust internetist;
- klastri kÀttesaadavuse seadistustega avalikust internetist.
Probleemide tuvastamiseks infrastruktuuris saab otse Ingressi pod'iga ĂŒhendust vĂ”tta. Selleks leidke kĂ”igepealt Ingressi kontrolleri pod (see vĂ”ib olla teises nimedega ruumis):
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS
kube-system coredns-5644d7b6d9-jn7cq 1/1 Running
kube-system etcd-minikube 1/1 Running
kube-system kube-apiserver-minikube 1/1 Running
kube-system kube-controller-manager-minikube 1/1 Running
kube-system kube-proxy-zvf2h 1/1 Running
kube-system kube-scheduler-minikube 1/1 Running
kube-system nginx-ingress-controller-6fc5bcc 1/1 Running Kasutage kÀsku describe, et seada sadam:
kubectl describe pod nginx-ingress-controller-6fc5bcc
--namespace kube-system
| grep PortsLĂ”puks, ĂŒhendage podiga:
kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-systemNĂŒĂŒd suunatakse kĂ”ik arvutisse suunatud pĂ€ringud sadamasse 3000 pod'i 80 sadamasse.
Kas see nĂŒĂŒd töötab?
- Kui jah, siis on probleem infrastruktuuris. Tuleb vÀlja selgitada, kuidas tÀpselt toimub liikluse ruteerimine klastrisse.
- Kui ei, siis on probleem Ingressi kontrolleriga.
Kui Ingressi kontrollerit ei saa töötama panna, tuleb selle tÔrkeotsingut teha.
Ingressi kontrollerite jaoks on palju erinevaid variante. KĂ”ige populaarsemad on Nginx, HAProxy, Traefik jpt. (olemasolevate lahenduste kohta vt â toimetaja mĂ€rkus) Tuleks kasutada vastava kontrolleri dokumentatsioonis tĂ”rkeotsingu juhendit. Kuna on kĂ”ige populaarsem Ingressi kontroller, oleme artiklisse lisanud mĂ”ned nĂ”uanded sellega seotud probleemide lahendamiseks.
Ingress Nginx kontrolleri tÔrkeotsing
Ingress-nginx projekt omab ametlikku KÀsku kubectl ingress-nginx vÔib kasutada jÀrgmiste jaoks:
- logide, backend'ide, sertifikaatide jne analĂŒĂŒsimiseks;
- Ingressiga ĂŒhenduse loomiseks;
- praeguse konfiguratsiooni uurimiseks.
Selleks aitavad teid jÀrgmised kolm kÀsku:
-
kubectl ingress-nginx lintâ kontrollibnginx.conf; -
kubectl ingress-nginx backendâ uurib backend'it (sarnaseltkubectl describe ingress); -
kubectl ingress-nginx logsâ kontrollib logisid.
Pange tÀhele: mÔnikord vÔib olla vajalik mÀÀrata Ingressi kontrolleri jaoks Ôige nimede ruum lipuga --namespace.
Elulookirjeldus
Kubernetesi tĂ”rkeotsing vĂ”ib osutuda keeruliseks ĂŒlesandeks, kui ei tea, kust alustada. Probleemile tuleks alati lĂ€heneda âalates alt ĂŒlesâ pĂ”himĂ”ttest: alustage pod'idest ja seejĂ€rel liikuge teenuse ja Ingress-i juurde. Artiklis kirjeldatud tĂ”rkeotsingu meetodeid saab rakendada ka teistele objektidele, nagu:
- töötavad Job'id ja CronJob'id;
- StatefulSet'id ja DaemonSet'id.
TÀnan , ja kuldsete mÀrkuste ja tÀienduste eest.
P.S. tÔlkijalt
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
