MĂ€rk. tĂ”lge.: See artikkel kuulub vabalt kergesti kĂ€ttesaadavate materjalide kogusse, , mis Ă”petab Kubernetesega töötamist ettevĂ”tte ja isiklike administraatorite jaoks. Selles jagab Daniele Polencic, projekti juht, visuaalset juhendit selle kohta, milliseid samme tuleks astuda, kui tekib ĂŒldise iseloomuga probleeme K8s klastris kĂ€ivitatud rakendustega.

TL;DR: siin on Skeem, mis aitab teil Kuberneteses rakenduste juurutamist siluda:
Vigade leidmise ja parandamise vooskeem klastris. Originaalis (inglise keeles) on see saadaval ja .
Rakenduse juurutamise ajal Kuberneteses tuleb tavaliselt mÀÀratleda kolm komponenti:
- Deployment â see on retsept rakenduse koopiate, mida nimetatakse pod'ideks, loomiseks;
- Teenused â sisemine koormuse tasandaja, mis jagab liiklust pod'ide vahel;
- Ingress â kirjeldus selle kohta, kuidas liiklus jĂ”uab vĂ€lismaailmast teenuseni.
Siin on lĂŒhike graafiline kokkuvĂ”te:
1) Kuberneteses saavad rakendused liiklust vÀlismaailmast kahe koormuse tasandaja kihi kaudu: sisemine ja vÀline.

2) Sisemine koormuse tasandaja nimetatakse Teenuseks, vĂ€line â Ingress.

3) Juhtimine loob pod'id ja jÀlgib neid (need ei vÀljastata kÀsitsi).

Oletame, et soovite kÀivitada lihtsa rakenduse nagu Hello World. Selle YAML-konfigureerimine 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 lihtne on segadusse minna selles, kuidas komponendid omavahel seondub.
NĂ€iteks:
- Millal tuleks kasutada porti 80 ja millal 8080?
- Kas iga teenuse jaoks tuleks luua uus port, et vÀltida konflikte?
- Kas siltide nimed on olulised? Kas need peaksid olema kÔikjal samad?
Enne silumise keskendumist meenutame, kuidas kolm komponenti omavahel seondub. Alustame Deploymentâist ja Serviceâist.
Deploymentâi ja Serviceâi seos
Te ĂŒllatute, kuid Deploymentâid ja Serviceâid ei ole omavahel seotud. Selle asemel osutab Service otse Podâidele, mööda Deploymentâi.
Seega huvitab meid, kuidas Pods ja Service'id omavahel seotud on. Tuleb meeles pidada kolme asja:
- Valija (
selector) peavad Service'il vastama vĂ€hemalt ĂŒhele Pod'i sildile. -
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 diagramm esindab kÔike eespoolt graafiliselt:
1) Kujutame ette, et teenus suunab liikluse mingisse pod'i:

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

3) Teenuse loomisel tuleb mÀÀrata port ja targetPort. Aga mille kaudu toimub ĂŒhendus konteineriga?

4) A kaudu. targetPortSee peab olema sama, containerPort.

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

YAML-failis peavad sildid ja ports / targetPort olema ĂŒhilduvad:
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 # <<<# Kuidas on lood sildiga track: canary Deployment sektsiooni ĂŒlaosas? Kas see peaks olema sama?
See silt kuulub juurutamisele ja seda ei kasutata teenuse jaoks liikluse suunamiseks. TeisisÔnu, selle vÔib eemaldada vÔi anda sellele teise vÀÀrtuse.
Aga kuidas on selektoriga matchLabels?
See peab alati olema sama nagu Pod'i sildid, kuna seda kasutatakse juurutamise poolt pod'ide jÀlgimiseks.
Oletame, et olete teinud Ôiged muudatused. Kuidas neid kontrollida?
Pod'i silte saab kontrollida jÀrgmise kÀsuga:
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 silt any-name: my-app.
Kas on veel probleeme?
Saate pod'iga ĂŒhendust vĂ”tta! Selleks peate kasutama kĂ€sku port-forward kubectl. See vĂ”imaldab ĂŒhendust vĂ”tta teenusega ja kontrollida ĂŒhendust.
kubectl port-forward service/ 3000:80Siin:
-
service/â teenus nime; meie puhul on seemy-service; - 3000 â port, mida tuleb arvutis avada;
- 80 â port, mis on mÀÀratud
portteenuses.
Kui ĂŒhendus on loodud, on seaded Ă”iged.
Kui ĂŒhendust ei Ă”nnestu luua, siis on probleem siltides vĂ”i portide kokkulangevuses.
Teenuse ja Ingressi vaheline seos
JĂ€rgmine samm rakenduse juurdepÀÀsu tagamisel hĂ”lmab Ingressi seadistamist. Ingress peab teadma, kuidas teenust leida, seejĂ€rel leidma podâid ja suunama nende suunas liiklust. Ingress leiab Ă”ige teenuse nime ja avatud porta jĂ€rgi.
Ingressi ja Teenuse kirjelduses peavad olema kaks vastavust:
-
servicePortIngressis peab vastama sellele parameetrileportTeenuses; -
serviceNameIngressis peab olema kooskÔlasnameTeenuses.
JĂ€rgmine skeem toob kokku portsede ĂŒhendamise:
1) Nagu juba teate, Teenus kuulab mingit port:

2) Ingressil on parameeter, mida nimetatakse servicePort:

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

4) Kui Teenuses on mÀÀratud port 80, siis peab servicePort olema samuti 80:

Praktikas tuleb 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?
Saab kasutada meetodit kubectl port-forward, kuid teenuse asemel tuleb ĂŒhenduda Ingressi kontrolleriga.
Esiteks tuleb leida Ingressi kontrolleri pod'i nimi:
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 Leia Ingressi pod (see vÔib kuuluda teise nimede ruumi) ja kÀivita 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 ĂŒhendu pod'iga:
kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-systemNĂŒĂŒd, iga kord, kui saadad pĂ€ringu pordile 3000 arvutis, suunatakse see Ingressi kontrolleri pod'i pordile 80. Minge aadressile , peate nĂ€gema rakenduse poolt loodud lehte.
Sadamate ĂŒlevaade
Kordame veel kord, millised sadamad ja sildid peaksid olema ĂŒhtivad:
- Teenuse mÀÀratluses olev selektor peab olema ĂŒhtiv podi sildiga;
-
targetPortteenuse mÀÀratluses peab olema ĂŒhtivcontainerPortpodis oleva konteineri; -
portteenuse mÀÀratluses vÔib olla mistahes. Erinevad teenused vÔivad kasutada sama sadamat, kuna neil on erinevad IP-aadressid; -
servicePortIngressi peab olema ĂŒhtivportteenuse mÀÀratlusega; - Teenuse nimi peab olema ĂŒhtiv
serviceNameIngressis.
Kahjuks ei piisa sellest, et teate, kuidas Ôigesti YAML-konfiguratsiooni struktureerida.
Mis juhtub, kui midagi lÀheb valesti?
VÔib-olla pod ei kÀivitu vÔi see kukub Àra.
3 sammu rakenduste tÔrkeotsingu jaoks Kuberneteses
K before debugging the deployment, it is essential to have a good understanding of how Kubernetes works.
Kuna igas K8s rakenduses on kolm komponenti, tuleb neid tÔrkeotsingul kÀsitleda kindlas jÀrjekorras, alustades altpoolt.
- Esmalt tuleb veenduda, et podid töötavad, seejÀrel...
- Kontrollige, kas teenus toimetab liikluse podidele, ja siis...
- Kontrolli, kas Ingress on Ôigesti seadistatud.
Visuaalne ĂŒlevaade:
1) Probleemide leidmist tuleks alustada alt. Esiteks kontrolli, et podâid oleksid staatustes Valmis ja Running:

2) Kui podâid on valmis (Valmis), tuleb vĂ€lja selgitada, kas teenus suunab liiklust podâide vahel:

3) LĂ”puks tuleb analĂŒĂŒsida teenuse ja Ingressâi vahelist seost:

1. Podâide diagnostika
Enamikul juhtudel on probleem seotud podâiga. Veendu, et podâid on nimekirjas kui Valmis ja Running. Seda saab kontrollida 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 mĂ€rgitud kui Running ja Valmis, kuid kahe teiste puhul see nii ei ole.
Kuidas mÔista, et midagi on valesti?
Podâide diagnoosimiseks on neli kasulikku kĂ€sku:
-
kubectl logsloputab logid podâi konteineritest; -
kubectl describe podnĂ€itab podâiga seotud sĂŒndmuste loetelu; -
kubectl get podtagastab podâi YAML-konfiguratsiooni, mis on salvestatud Kubernetesesse; -
kubectl exec -ti bashvĂ”imaldab kĂ€ivitada interaktiivset kĂ€surealiidese ĂŒhes pod'i konteineris
Millist neist valida?
Asi on selles, et ei ole ĂŒhte universaalset kĂ€sku. Tuleb kasutada nende kombinatsiooni.
TĂŒĂŒpilised podâide probleemid
On kaks peamist podâi tĂ”rgete tĂŒĂŒpi: kĂ€ivitustĂ”rked (startup) ja tööaegsed tĂ”rked (runtime).
KÀivitustÔrked:
-
ImagePullBackoff -
ImageInspectError -
ErrImagePull -
ErrImageNeverPull -
RegistryUnavailable -
InvalidImageName
Tööaegsed tÔrked:
-
CrashLoopBackOff -
RunContainerError -
KillContainerError -
VerifyNonRootError -
RunInitContainerError -
CreatePodSandboxError -
ConfigPodSandboxError -
KillPodSandboxError -
SetupNetworkError -
TeardownNetworkError
MÔned tÔrked esinevad sagedamini kui teised. Siin on mÔned kÔige levinumad tÔrked ja nende lahendamise viisid.
ImagePullBackOff
See tĂ”rge ilmneb, kui Kubernetes ei saa podâi ĂŒhe konteineri jaoks pilti hankida. Siin on kolm kĂ”ige levinumat pĂ”hjust:
- Pildi nimi on valesti mÀÀratud â nĂ€iteks olete teinud selles vea vĂ”i pilti ei eksisteeri;
- MÀÀratud on mittesihitud pildi silt;
- Pilt on salajases repositooriumis ja Kubernetesel puuduvad Ôigused sellele juurdepÀÀsuks.
Esimese kahe probleemi lahendamine on lihtne â piisab, kui muuta pildi nime ja sildi. Viimase korral tuleb lisada sulgudele juurdepÀÀsuandmed ja viidata neile pod'ides. Kubernetes'i dokumentatsioonis kuidas seda teha.
CrashLoopBackOff
Kubernetes vÀljastab vea CrashLoopBackOff, kui konteinerit ei suudeta kÀivitada. Tavaline pÔhjus selle ekslemiseks on see, et:
- Rakenduses on viga, mis ei lase sel kÀivituda;
- Konteiner ;
- Liveness'i test nurjus liiga palju kordi.
Peate proovima logide juurde pÀÀseda konteinerist, et vÀlja selgitada selle kokkuvarisemise pÔhjus. Kui logide juurde pÀÀsemine on keeruline, kuna konteiner taaskÀivitub liiga kiiresti, saate kasutada jÀrgmist kÀsku:
kubectl logs --previousSee vÀljastab veateateid konteineri eelmisest reinkarnatsioonist.
RunContainerError
See viga ilmneb, kui konteiner ei suuda kÀivituda. See vastab hetkele enne rakenduse kÀivitamist. Tavaline pÔhjus on vale seadistus, nÀiteks:
- katse kinnitada mittesoovitud mahtu, nÀiteks ConfigMap vÔi Secrets;
- proovitakse montaaĆŸi mahuti tĂŒĂŒpi read-only kui read-write.
Sarnaste vigade analĂŒĂŒsimiseks sobib hĂ€sti kĂ€sk kubectl describe pod.
Podâid on olekus Pending
PÀrast loomist jÀÀb pod olekusse Ootel.
Miks see nii juhtub?
Siin on vÔimalikud pÔhjused (eeldan, et planeerija töötab normaalselt):
- Klastris pole piisavalt ressursse, nagu arvutusvÔime ja mÀlu, podi kÀivitamiseks.
- Seotud nimedesisest on seadistatud objekt
ResourceQuotaja podi loomine toob kaasa nimede ĂŒletamise limiidi. - Pod on seotud Pending
PersistentVolumeClaim.
Selles olukorras soovitatakse kasutada kĂ€sku kubectl describe ja kontrollida jaotust Ăritused:
kubectl describe pod Vigade korral, mis on seotud ResourceQuotas, soovitatakse vaadata klastri logisid kÀsku
kubectl get events --sort-by=.metadata.creationTimestampPodâid ei ole olekus Ready
Kui pod on mÀrgitud kui Running, kuid ei ole olekus Valmis, siis tÀhendab see, et selle valmisoleku kontroll (readiness probe) kukkub lÀbi.
Kui selline olukord tekib, ei saa pod teenusele ĂŒhendust ja sellele ei suunata liiklust. Valmiduse testimise ebaĂ”nnestumine on pĂ”hjustatud rakenduse probleemidest. Sellisel juhul tuleb vea leidmiseks analĂŒĂŒsida lĂ”iku Ăritused kĂ€skluse tulemuses kubectl describe.
2. Teenuste diagnostika
Kui pod'id on loetletud kui Running ja Valmis, kuid rakenduselt ei tule endiselt vastust, tuleks kontrollida teenuse seadeid.
Teenused tegelevad liikluse suunamisega pod'idele vastavalt nende silte. SeetĂ”ttu on esimene asi, mida tuleb teha â kontrollida, mitu pod'i teenusega töötavad. Selleks saab kontrollida teenuse lĂ”pp-punkte:
kubectl describe service | grep Endpoints LĂ”pp-punkt on vÀÀrtuste paar vormis <IP-аЎŃĐ”Ń:ĐżĐŸŃŃ>, ja vĂ€ljundis peaks olema vĂ€hemalt ĂŒks selline paar (see tĂ€hendab, et vĂ€hemalt ĂŒks pod töötab teenusega).
Kui lĂ”ik Endpoints on tĂŒhi, on kaks vĂ”imalikku varianti:
- ĂŒhtki pod'i ei ole Ă”igete siltega (vihje: kontrollige, kas nimekiri on korrektne);
- teenuse silte on selektoris vale.
Kui nĂ€ete lĂ”pp-punktide loendit, kuid ei pÀÀse siiski rakendusele, on tĂ”enĂ€oliseks sĂŒĂŒdlaseks vea esinemine targetPort teenuse kirjelduses.
Kuidas kontrollida teenuse töökorrasolekut?
SĂ”ltumata teenuse tĂŒĂŒbist on vĂ”imalik kasutada kĂ€sku kubectl port-forward ĂŒhendamiseks sellega:
kubectl port-forward service/ 3000:80Siin:
-
<service-name>â teenuse nimi; - 3000 â port, mille avate arvutis;
- 80 â port teenuse poolel.
3. Ingressi diagnostika
Kui olete siiani lugenud, siis:
- pod'id on mÀrgitud kui
RunningjaValmis; - teenus suunab liiklust pod'ide vahel edukalt.
Kuid te ei saa siiski rakendusele âjĂ”udaâ.
See tĂ€hendab, et tĂ”enĂ€oliselt on Ingressi juhitaja vale seadistusega. Kuna Ingressi juhitaja on klastris kolmas osaline komponent, sĂ”ltuvad tĂ”rkeotsingu meetodid selle tĂŒĂŒbist.
Kuid enne, kui kasutate erivahendeid Ingressi seadistamiseks, saate teha midagi vĂ€ga lihtsat. Ingress kasutab serviceName ja servicePort teenusele ĂŒhendamiseks. Peate kontrollima, kas need on Ă”igesti seadistatud. Seda saab teha kĂ€suga:
kubectl describe ingress Kui veerg Backend on tĂŒhi, on suur tĂ”enĂ€osus seadistuse viga. Kui tagakĂŒljed on olemas, kuid rakendusele pole endiselt juurdepÀÀsu, vĂ”ib probleem olla seotud:
- Ingressi kÀttesaadavuse seadistustega avalikust internetist;
- klastrite kÀttesaadavuse seadistused avalikult internetist.
Probleeme infrastruktuuriga saab tuvastada, ĂŒhendudes otse Ingressâi podâiga. Selleks leidke esmalt Ingress-kontrolleri pod (see vĂ”ib olla teises nimede 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 mÀÀrata port:
kubectl describe pod nginx-ingress-controller-6fc5bcc
--namespace kube-system
| grep PortsLĂ”puks ĂŒhendu pod'iga:
kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-systemNĂŒĂŒd suunatakse kĂ”ik 3000 pordi pĂ€ringud arvutis pod'i 80 pordile.
Kas see töötab nĂŒĂŒd?
- Kui jah, siis on probleem infrastruktuuris. Tuleb vÀlja selgitada, kuidas tÀpselt toimub liikluse suunamine klastrisse.
- Kui ei, siis on probleem Ingress-kontrolleris.
Kui Ingress-kontrollerit ei Ônnestu tööle panna, tuleb selle tÔrkeotsing lÀbi viia.
Ingress-kontrollerite variatsioone on palju. KĂ”ige populaarsemad on Nginx, HAProxy, Traefik jne. (lisateabe saamiseks vaadake â kt. tĂ”lge) Tuleb kasutada vastava kontrolleri dokumentatsioonis sisalduvat tĂ”rkeotsingu guide'i. Kuna on kĂ”ige populaarsem Ingress-kontroller, oleme pannud artiklisse mitmeid nĂ€punĂ€iteid selle seotud probleemide lahendamiseks.
Nginx Ingress kontrolleri silumise juhend
Ingress-nginx projektil on ametlik . KÀsku kubectl ingress-nginx vÔib kasutada jÀrgmiseks:
- logide, taustateenuste, sertifikaatide jne analĂŒĂŒsimiseks;
- Ingress'iga ĂŒhendamiseks;
- praeguse konfiguratsiooni uurimiseks.
Selleks aitavad teid jÀrgmised kolm kÀsku:
-
kubectl ingress-nginx lintâ kontrollibnginx.conf; -
kubectl ingress-nginx backendâ uurib taustateenust (sarnaseltkubectl describe ingress); -
kubectl ingress-nginx logsâ kontrollib logisid.
Pange tÀhele: mÔnel juhul vÔib olla vajalik mÀÀrata Ôige nimede ruum Ingress kontrolleri jaoks lipuga --namespace.
KokkuvÔte
Kubernetes'is tĂ”rkeotsing vĂ”ib osutuda keeruliseks, kui ei tea, kust alustada. Probleemi tuleks alati lĂ€heneda alt ĂŒles: alustage pod'idest ja liikuge seejĂ€rel teenuse ja Ingress'i poole. Artiklis kirjeldatud tĂ”rkeotsingu meetodeid saab rakendada ka teiste objektide, nagu:
- töötavad Job'id ja CronJob'id;
- StatefulSet'id ja DaemonSet'id.
Soovin tÀnada , ja hindamatute mÀrkuste ja tÀienduste eest.
P.S. tÔlkija mÀrkused
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
