He alakaʻi ʻike no ka hoʻoponopono ʻana i nā Kubernetes
Nānā. unuhi.: ʻO kēia ʻatikala kahi ʻāpana o nā mea papahana i paʻi ʻia ma ka waihona lehulehu learnk8s, nā hui hoʻomaʻamaʻa a me nā luna hoʻomalu e hana pū me Kubernetes. I loko o ia mea, hōʻike ʻo Daniele Polencic, ka luna o ka papahana, i nā ʻōlelo aʻoaʻo e pili ana i nā ala e hana ai i nā pilikia maʻamau me nā noi e holo ana ma ka hui K8s.
TL; DR: eia kahi kiʻi e kōkua iā ʻoe i ka debug deployment ma Kubernetes:
Kaʻahele no ka ʻimi ʻana a me ka hoʻoponopono ʻana i nā hewa i loko o kahi pūʻulu. Loaʻa ka palapala kumu (ma ka ʻōlelo Pelekania) ma PDF и e like me ke kiʻi.
Ke kau ʻana i kahi noi iā Kubernetes, ʻekolu mau ʻāpana āu e pono ai e wehewehe:
kuhikuhi i ka hana - he ʻano mea ʻai kēia no ka hana ʻana i nā kope o ka noi, i kapa ʻia ʻo pods;
Service - ka mea kaulike o loko e puʻunaue ana i nā kaʻa ma waena o nā pods;
Pau - ka wehewehe ʻana i ka loaʻa ʻana o ke kaʻa mai ka honua waho i ka Service.
Eia kahi hōʻuluʻulu kiʻi wikiwiki:
1) Ma Kubernetes, loaʻa i nā noi ke kaʻa mai ka honua i waho ma o ʻelua papa o nā mea kaulike ukana: loko a me waho.
2) Ua kapa ʻia ka mea kaulike kūloko ʻo Service, ʻo ka mea waho i kapa ʻia ʻo Ingress.
3) Hoʻokumu ka Deployment i nā pods a nānā iā lākou (ʻaʻole hana lima ʻia lākou).
E ʻōlelo mākou makemake ʻoe e kau i kahi noi maʻalahi a la Aloha kākou honua. ʻO ka hoʻonohonoho YAML no ia e like me kēia:
He lōʻihi loa ka wehewehe a he maʻalahi ka huikau e pili ana i ka pili ʻana o nā ʻāpana i kekahi i kekahi.
Eia kekahi laʻana:
I ka manawa hea ʻoe e hoʻohana ai i ka port 80 a i ka manawa hea ʻoe e hoʻohana ai i ka 8080?
Pono wau e hana i kahi awa hou no kēlā me kēia lawelawe i ʻole lākou e hakakā?
He mea nui anei ka lepili inoa? Pono anei lākou e like ma nā wahi a pau?
Ma mua o ka nānā ʻana i ka debugging, e hoʻomanaʻo kākou i ka pili ʻana o nā ʻāpana ʻekolu i kekahi i kekahi. E hoʻomaka kākou me ka Hoʻohana a me ka lawelawe.
Ka pilina ma waena o ka hoʻolālā a me ka lawelawe
E kāhāhā ʻoe, akā ʻaʻole pili ʻo Deployment a me Service. Akā, kuhikuhi pololei ʻo Service i nā Pods, e kāpae ana i ka Deployment.
No laila, makemake mākou i ka pili ʻana o Pods a me nā lawelawe i kekahi i kekahi. ʻEkolu mau mea e hoʻomanaʻo ai:
Mea koho (selector) no ka lawelawe pono e like me hoʻokahi lepili Pod.
targetPort pono e kūlike containerPort pahu i loko o ka Pod.
port Hiki ke lawelawe i kekahi mea. Hiki i nā lawelawe like ʻole ke hoʻohana i ka awa hoʻokahi no ka mea he ʻokoʻa ko lākou mau IP address.
Hōʻike ka paʻi kiʻi i nā mea a pau i luna ma ke ʻano kiʻi.
1) E noʻonoʻo e alakaʻi ana ka lawelawe i ke kaʻa i kekahi pod:
2) I ka hana ʻana i kahi pod, pono ʻoe e kuhikuhi containerPort no kēlā me kēia pahu i nā pods:
3) I ka hana ʻana i kahi lawelawe, pono ʻoe e kuhikuhi port и targetPort. Akā ʻo wai ka mea i hoʻohana ʻia e hoʻopili ai i ka ipu?
4) Via targetPort. Pono e kūlike containerPort.
5) E ʻōlelo kākou ua wehe ʻia ke awa 3000 i loko o ka pahu targetPort pono e like.
Ma ka faila YAML, nā lepili a me ports / targetPort pono e like me:
Pehea e pili ana i ka lepili track: canary ma luna o ka ʻāpana Hoʻolaha? Pono anei e kūlike?
ʻO kēia lepili he hoʻolaha kikoʻī a ʻaʻole hoʻohana ʻia e ka lawelawe e ala i nā kaʻa. I nā huaʻōlelo ʻē aʻe, hiki ke wehe ʻia a hāʻawi ʻia i kahi waiwai ʻē aʻe.
Pehea ka mea koho matchLabels?
Pono e kūlike me nā lepili o Pod, no ka mea, hoʻohana ʻia ia e Deployment e nānā i nā pods.
E manaʻo mākou ua hana ʻoe i nā hoʻoponopono pololei. Pehea e nānā ai iā lākou?
Hiki iā ʻoe ke nānā i ka lepili pod me kēia kauoha:
kubectl get pods --show-labels
A i ʻole, inā pili nā pods i kekahi mau noi:
kubectl get pods --selector any-name=my-app --show-labels
'Ahea any-name=my-app he lepili any-name: my-app.
Aia kekahi mau pilikia i koe?
Hiki iā ʻoe ke hoʻohui i ka pod! No ka hana ʻana i kēia pono ʻoe e hoʻohana i ke kauoha port-forward i kubectl. Hiki iāʻoe ke hoʻohui i ka lawelawe a nānā i ka pilina.
service/<service name> - inoa lawelawe; i ko makou hihia my-service;
ʻO 3000 ke awa e pono e wehe ʻia ma ke kamepiula;
80 - awa i kuhikuhi ʻia ma ke kahua port lawelawe.
Inā hoʻokumu ʻia ka pilina, a laila pololei nā hoʻonohonoho.
Inā hāʻule ka pilina, aia ka pilikia me nā lepili a ʻaʻole like nā awa.
Ka pilina ma waena o Service a me Ingress
ʻO ka hana aʻe i ka hāʻawi ʻana i ke komo i ka noi e pili ana i ka hoʻonohonoho ʻana iā Ingress. Pono ʻo Ingress e ʻike pehea e ʻike ai i kahi lawelawe, a laila e ʻimi i nā pods a kuhikuhi pololei i ke kaʻa iā lākou. ʻIke ʻo Ingress i ka lawelawe i koi ʻia ma ka inoa a me ka puka wehe.
I ka wehewehe ʻana o Ingress a me Service pono ʻelua mau ʻāpana:
servicePort ma Ingress pono e hoʻohālikelike i ka ʻāpana port i ka lawelawe;
serviceName ma Ingress pono e like me ke kahua name ma ka lawelawe.
Hōʻuluʻulu ke kiʻikuhi i nā pili awa:
1) E like me kāu i ʻike ai, hoʻolohe ʻo Service i kekahi port:
2) Loaʻa iā Ingress kahi ʻāpana i kapa ʻia servicePort:
3) ʻO kēia ʻāpana (servicePort) pono e kūlike mau port ma ka wehewehe Service:
4) Inā hōʻike ʻia ka port 80 i ka Service, a laila pono ia servicePort ua like pū me 80:
I ka hoʻomaʻamaʻa, pono ʻoe e hoʻolohe i nā laina aʻe:
I kēia manawa i kēlā me kēia manawa āu e hoʻouna ai i kahi noi i ke awa 3000 ma kāu kamepiula, e hoʻouna ʻia ia i ka port 80 o ka pod me ka mea hoʻokele Ingress. Ma ka hele ana i http://localhost:3000, pono ʻoe e ʻike i ka ʻaoʻao i hana ʻia e ka noi.
Hōʻuluʻulu o nā awa
E hoʻomanaʻo hou kākou i nā awa a me nā lepili e pono ai ke kūlike:
Pono ka mea koho i ka wehewehe Service me ka lepili o ka pod;
targetPort ma ka wehewehe ʻana Pono e kūlike ka lawelawe containerPort pahu i loko o kahi pahu;
port i ka wehewehe Service hiki i kekahi mea. Hiki i nā lawelawe like ʻole ke hoʻohana i ka awa hoʻokahi no ka mea he ʻokoʻa ko lākou mau IP address;
servicePort Pono e kūlike ka Ingress port ma ka wehewehe o ka Service;
Pono ka inoa lawelawe me ke kahua serviceName ma Ingress.
ʻO ka mea pōʻino, ʻaʻole lawa ka ʻike pehea e hoʻonohonoho pono ai i kahi hoʻonohonoho YAML.
He aha ka hopena ke hele hewa nā mea?
ʻAʻole hoʻomaka ka pod a hāʻule paha.
3 Nā ʻanuʻu e ʻike i nā pilikia noi ma Kubernetes
Ma mua o kou hoʻomaka ʻana e hoʻopau i kāu hoʻolālā, pono ʻoe e hoʻomaopopo maikaʻi i ka hana ʻana o Kubernetes.
No ka mea he ʻekolu mau ʻāpana kēlā me kēia noi i hoʻoiho ʻia ma K8s, pono lākou e hoʻopau ʻia i kahi kauoha, e hoʻomaka ana mai lalo.
Pono mua ʻoe e hōʻoia i ka hana ʻana o nā pods, a laila ...
E nānā inā hāʻawi ka lawelawe i nā kaʻa i nā pods, a laila...
E nānā inā ua hoʻonohonoho pono ʻia ʻo Ingress.
Hōʻike ʻike maka:
1) Pono ʻoe e hoʻomaka e ʻimi i nā pilikia mai lalo. E nānā mua inā loaʻa i nā pods nā kūlana Ready и Running:
2) Inā mākaukau nā ʻōpala (Ready), pono ʻoe e ʻike inā hāʻawi ka lawelawe i nā kaʻa ma waena o nā pods:
3) ʻO ka hope, pono ʻoe e nānā i ka pilina ma waena o ka lawelawe a me ka Ingress:
1. Nā diagnostics o nā pods
I ka nui o nā hihia pili i ka pod. E hōʻoia i ka papa inoa o nā pods Ready и Running. Hiki iā ʻoe ke nānā i kēia me ke kauoha:
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
Ma ka puka kauoha ma luna, ua helu ʻia ka pod hope loa Running и Ready, akā naʻe,ʻaʻole kēia ka hihia no nā mea'ē aʻeʻelua.
Pehea e maopopo ai ka hewa?
ʻEhā mau kauoha kūpono no ka ʻike ʻana i nā pods:
kubectl logs <имя pod'а> hiki iā ʻoe ke unuhi i nā lāʻau mai nā pahu i loko o kahi pod;
kubectl describe pod <имя pod'а> hiki iā ʻoe ke nānā i kahi papa inoa o nā hanana e pili ana i ka pod;
kubectl get pod <имя pod'а> hiki iā ʻoe ke kiʻi i ka hoʻonohonoho YAML o kahi pod i mālama ʻia ma Kubernetes;
kubectl exec -ti <имя pod'а> bash hiki iā ʻoe ke hoʻomaka i kahi pūpū kauoha interactive i loko o kekahi o nā pahu pod
ʻO wai kāu e koho ai?
ʻO ka ʻoiaʻiʻo ʻaʻohe kauoha āpau. Pono e hoʻohana i kahi hui o kēia mau mea.
Nā pilikia pod maʻamau
ʻElua ʻano nui o nā hewa pod: nā hewa hoʻomaka a me nā hewa runtime.
Nā hewa hoʻomaka:
ImagePullBackoff
ImageInspectError
ErrImagePull
ErrImageNeverPull
RegistryUnavailable
InvalidImageName
Nā hewa manawa holo:
CrashLoopBackOff
RunContainerError
KillContainerError
VerifyNonRootError
RunInitContainerError
CreatePodSandboxError
ConfigPodSandboxError
KillPodSandboxError
SetupNetworkError
TeardownNetworkError
ʻOi aku ka maʻamau o kekahi mau hewa ma mua o nā mea ʻē aʻe. Eia kekahi o nā hewa maʻamau a pehea e hoʻoponopono ai.
ImagePullBackOff
Loaʻa kēia hewa ke loaʻa ʻole iā Kubernetes kahi kiʻi no kekahi o nā pahu pod. Eia nā kumu maʻamau ʻekolu o kēia:
ʻAʻole pololei ka inoa o ke kiʻi - no ka laʻana, ua hana hewa ʻoe i loko, a i ʻole ke kiʻi ʻole;
Ua kuhikuhi ʻia kahi hōʻailona ʻole no ke kiʻi;
Mālama ʻia ke kiʻi ma kahi papa inoa pilikino a ʻaʻohe ʻae iā Kubernetes.
ʻO nā kumu mua ʻelua he maʻalahi ke hoʻopau - hoʻoponopono wale i ka inoa kiʻi a me ka inoa. I ka hihia o ka hope, pono ʻoe e hoʻokomo i nā hōʻoia no ka hoʻopaʻa inoa paʻa ma Secret a hoʻohui i nā loulou iā ia i loko o nā pods. Ma ka palapala Kubernetes he laʻana pehea e hana ai.
Hoʻopaʻa i hope
Kiola ʻo Kubenetes i kahi hewa CrashLoopBackOff, inā ʻaʻole hiki ke hoʻomaka ka pahu. Hana pinepine kēia i ka wā:
Aia ka hewa i loko o ka palapala noi e pale ai i ka hoʻokuʻu ʻana;
Pono ʻoe e hoʻāʻo e kiʻi i nā lāʻau mai ka pahu e ʻike i ke kumu o kona hemahema. Inā paʻakikī ke komo i nā lāʻau no ka mea e hoʻomaka koke ka pahu, hiki iā ʻoe ke hoʻohana i kēia kauoha:
kubectl logs <pod-name> --previous
Hōʻike ia i nā memo hewa mai ka incarnation mua o ka ipu.
RunContainerError
Loaʻa kēia hewa ke hoʻomaka ka pahu. Ua like ia me ka manawa ma mua o ka hoʻomaka ʻana o ka noi. Ma muli o nā hoʻonohonoho hewa ʻole, no ka laʻana:
ke hoʻāʻo nei e kau i kahi leo i loaʻa ʻole e like me ConfigMap a i ʻole Secrets;
he ho'āʻo e kau i ka leo heluhelu-wale e like me ka heluhelu-kākau.
Ua kūpono ka hui no ka nānā ʻana i ia mau hewa kubectl describe pod <pod-name>.
Aia nā Pods i ka moku'āina e kali ana
Ke hana ʻia, noho ka pod i ka mokuʻāina Pending.
No ke aha la keia?
Eia nā kumu kūpono (Ke manaʻo nei au e hana maikaʻi ana ka mea hoʻonohonoho):
ʻAʻole lawa nā kumu waiwai o ka hui, e like me ka mana hana a me ka hoʻomanaʻo, e holo i ka pod.
Hoʻokomo ʻia ka mea i ka inoa inoa kūpono ResourceQuota a ʻo ka hana ʻana i kahi pod e hele ai ka namespace ma mua o ka quota.
Hoʻopili ʻia ʻo Pod i ke kali ʻana PersistentVolumeClaim.
I kēia hihia, pono e hoʻohana i ke kauoha kubectl describe a nānā i ka ʻāpana Events:
kubectl describe pod <pod name>
Ina he hewa e pili ana i ResourceQuotas, makemake ʻia e nānā i nā lāʻau cluster me ka hoʻohana ʻana i ke kauoha
kubectl get events --sort-by=.metadata.creationTimestamp
ʻAʻole Mākaukau nā Pods
Inā helu ʻia ka pod e like me Running, ʻaʻole naʻe ma kahi mokuʻāina Ready, 'o ia ho'i ka nānā 'ana i kona mākaukau (mākaukau hoʻonaʻauao) hāʻule.
Ke hana ʻia kēia, ʻaʻole pili ka pod i ka lawelawe a ʻaʻohe holo kaʻa i laila. ʻO ka hemahema o ka hoʻāʻo mākaukau ma muli o nā pilikia i ka noi. I kēia hihia, e ʻike i ka hewa, pono ʻoe e nānā i ka ʻāpana Events ma ka puka kauoha kubectl describe.
2. Nā diagnostics lawelawe
Inā helu ʻia nā pods e like me Running и Ready, akā ʻaʻohe pane mai ka noi, pono ʻoe e nānā i nā hoʻonohonoho lawelawe.
ʻO nā lawelawe ke kuleana no ka hoʻokele ʻana i nā kaʻa i nā pods ma muli o kā lākou lepili. No laila, ʻo ka mea mua āu e hana ai e nānā i ka nui o nā pods e hana me ka lawelawe. No ka hana ʻana i kēia, hiki iā ʻoe ke nānā i nā helu hope o ka lawelawe:
kubectl describe service <service-name> | grep Endpoints
ʻO Endpoint kahi mau waiwai o ke ʻano <IP-адрес:порт>, a ma ka li'ili'i loa o ho'okahi o ia mau pai e pono ke komo i loko o ka pukana ('o ia ho'i, ma ka li'ili'i loa e hana pū me ka lawelawe).
Ina pauku Endpoins nele, ʻelua mau koho:
ʻaʻohe pods me ka lepili pololei (hint: nānā inā koho pololei ʻia ka inoa);
Aia kekahi hewa i nā lepili lawelawe ma ka mea koho.
Inā ʻike ʻoe i kahi papa inoa o nā helu hope akā ʻaʻole hiki ke komo i ka noi, a laila ʻo ka mea hewa paha he bug i loko targetPort ma ka wehewehe lawelawe.
Pehea e nānā ai i ka hana o ka lawelawe?
Ma waho o ke ʻano o ka lawelawe, hiki iā ʻoe ke hoʻohana i ke kauoha kubectl port-forward e hoʻohui iā ia:
ke hāʻawi maikaʻi nei ka lawelawe i nā kaʻa ma waena o nā pods.
Akā naʻe, ʻaʻole hiki iā ʻoe ke hiki i ka app.
ʻO ia hoʻi, ʻaʻole i hoʻonohonoho pono ʻia ka mea hoʻokele Ingress. No ka mea ʻo ka mea hoʻoponopono Ingress he ʻāpana ʻaoʻao ʻekolu i loko o ka pūʻulu, aia nā ʻano debugging ʻokoʻa e pili ana i kona ʻano.
Akā ma mua o kou hoʻohana ʻana i nā mea hana kūikawā e hoʻonohonoho iā Ingress, hiki iā ʻoe ke hana i kahi mea maʻalahi loa. Hoʻohana ʻo Ingress serviceName и servicePort e hoʻohui i ka lawelawe. Pono ʻoe e nānā inā ua hoʻonohonoho pono ʻia lākou. Hiki iā ʻoe ke hana i kēia me ke kauoha:
kubectl describe ingress <ingress-name>
Ina kolamu Backend nele, aia ka nui o ka hewa hoʻonohonoho. Inā paʻa nā ʻaoʻao hope, akā ʻaʻole hiki ke loaʻa ka noi, a laila pili paha ka pilikia i:
Nā hoʻonohonoho hiki ke komo mai ka pūnaewele lehulehu;
nā hoʻonohonoho hoʻonohonoho hoʻokomo pūʻulu mai ka pūnaewele lehulehu.
Hiki iā ʻoe ke ʻike i nā pilikia me ka ʻōnaehana ma ka hoʻopili pololei ʻana i ka pod Ingress. No ka hana ʻana i kēia, e ʻimi mua i ka pod Ingress Controller (ma kahi inoa inoa ʻē aʻe):
I kēia manawa, e hoʻihoʻi ʻia nā noi āpau i ka port 3000 ma ke kamepiula i ke awa 80 o ka pod.
Ke hana nei ia i kēia manawa?
Inā ʻae, aia ka pilikia i ka ʻōnaehana. Pono pono e ʻike i ke ʻano o ka holo ʻana o ke kaʻa i ka hui.
Inā ʻaʻole, a laila aia ka pilikia me ka mea hoʻokele Ingress.
Inā ʻaʻole hiki iā ʻoe ke hoʻohana i ka mea hoʻokele Ingress, pono ʻoe e hoʻopau iā ia.
Nui nā ʻano o nā mea hoʻokele Ingress. ʻO ka mea kaulana loa ʻo Nginx, HAProxy, Traefik, etc. (no ka ʻike hou aku e pili ana i nā hoʻonā e kū nei, ʻike kā mākou loiloi - kokoke. unuhi.) Pono ʻoe e nānā i ke alakaʻi hoʻoponopono pilikia ma ka palapala hoʻoponopono pili. No ka mea ʻO Ingress Nginx ʻO ia ka mea hoʻoponopono Ingress kaulana loa, ua hoʻokomo mākou i kekahi mau ʻōlelo aʻoaʻo i ka ʻatikala e hoʻoponopono i nā pilikia e pili ana iā ia.
Hoʻopau i ka mea hoʻokele Ingress Nginx
Loaʻa i ka papahana Ingress-nginx kahi luna plugin no kubectl. Hui kubectl ingress-nginx hiki ke hoʻohana no:
ka nānā ʻana i nā lāʻau, nā hope, nā palapala hōʻoia, a pēlā aku;
nā pilina me Ingress;
e aʻo ana i ka hoʻonohonoho o kēia manawa.
Na nā kauoha ʻekolu e kōkua iā ʻoe me kēia:
kubectl ingress-nginx lint - nānā nginx.conf;
kubectl ingress-nginx backend - ʻimi i ka hope (e like me kubectl describe ingress <ingress-name>);
kubectl ingress-nginx logs - nānā i nā lāʻau.
E hoʻomaopopo i kekahi mau manawa pono ʻoe e kuhikuhi i ka inoa inoa kūpono no ka mea hoʻokele Ingress e hoʻohana ana i ka hae --namespace <name>.
Hōʻuluʻulu
Hiki ke paʻakikī ka hoʻoponopono ʻana i nā Kubernetes inā ʻaʻole ʻoe ʻike i kahi e hoʻomaka ai. Pono ʻoe e hoʻokokoke mau i ka pilikia mai lalo i luna: hoʻomaka me nā pods, a laila neʻe i ka lawelawe a me Ingress. Hiki ke hoʻohana ʻia nā ʻenehana debugging i wehewehe ʻia ma kēia ʻatikala i nā mea ʻē aʻe, e like me: