ProHoster > Blog > Ma'muriyat > Kubernetes muammolarini bartaraf etish bo'yicha vizual qo'llanma
Kubernetes muammolarini bartaraf etish bo'yicha vizual qo'llanma
Eslatma. tarjima.: Ushbu maqola jamoat mulkida chop etilgan loyiha materiallarining bir qismidir Learnk8s, kompaniyalar va individual ma'murlarni Kubernetes bilan ishlashga o'rgatadi. Unda loyiha menejeri Daniele Polensic K8s klasterida ishlaydigan ilovalar bilan umumiy muammolar yuzaga kelganda qanday choralar ko‘rish kerakligi haqida vizual ko‘rsatmalar bilan bo‘lishdi.
TL; DR: bu erda sizga Kubernetes-da joylashtirishni tuzatishga yordam beradigan diagramma mavjud:
Klasterdagi xatolarni topish va tuzatish uchun oqim diagrammasi. Asl nusxasi (ingliz tilida) quyidagi manzilda mavjud PDF и rasm sifatida.
Kubernetes-ga ilovani o'rnatishda odatda uchta komponentni aniqlashingiz kerak:
Tarqatish - bu pods deb nomlangan ilova nusxalarini yaratish uchun retseptning bir turi;
xizmat — traffikni podalar orasida taqsimlovchi ichki yuk balanslagichi;
Kirish — trafik tashqi dunyodan Xizmatga qanday etib borishi tavsifi.
Bu erda tezkor grafik xulosa:
1) Kubernetes-da ilovalar tashqi dunyodan trafikni ikki qatlamli yuk balansi orqali qabul qiladi: ichki va tashqi.
2) Ichki balanslashtirgich Xizmat deb ataladi, tashqisi esa Ingress deb ataladi.
3) Deployment podkastlarni yaratadi va ularni nazorat qiladi (ular qo'lda yaratilmaydi).
Aytaylik, siz oddiy dasturni ishga tushirmoqchisiz Salom Dunyo. Buning uchun YAML konfiguratsiyasi quyidagicha ko'rinadi:
Ta'rif juda uzun va komponentlarning bir-biriga qanday bog'liqligi haqida chalkashib ketish oson.
Masalan:
80-portdan qachon va qachon 8080-dan foydalanish kerak?
Ular bir-biriga zid kelmasligi uchun har bir xizmat uchun yangi port yaratishim kerakmi?
Yorliq nomlari muhimmi? Ular hamma joyda bir xil bo'lishi kerakmi?
Nosozliklarni tuzatishga e'tibor qaratishdan oldin, keling, uchta komponent bir-biriga qanday bog'liqligini eslaylik. Joylashtirish va xizmatdan boshlaylik.
Joylashtirish va xizmat ko'rsatish o'rtasidagi munosabatlar
Siz hayron qolasiz, lekin Joylashtirish va Xizmat hech qanday tarzda bog'lanmagan. Buning o'rniga, Xizmat joylashtirishni chetlab o'tib, to'g'ridan-to'g'ri podlarga ishora qiladi.
Shunday qilib, biz podlar va xizmatlarning bir-biri bilan qanday bog'liqligi bilan qiziqamiz. Esda tutish kerak bo'lgan uchta narsa:
Selektor (selector) Xizmat kamida bitta Pod yorlig'iga mos kelishi kerak.
targetPort mos kelishi kerak containerPort Pod ichidagi konteyner.
port Xizmat har qanday bo'lishi mumkin. Turli xil xizmatlar bir xil portdan foydalanishi mumkin, chunki ular turli IP manzillarga ega.
Quyidagi diagramma yuqorida aytilganlarning barchasini grafik shaklda aks ettiradi:
1) Tasavvur qiling-a, xizmat trafikni ma'lum bir podkastga yo'naltiradi:
2) Podni yaratishda siz belgilashingiz kerak containerPort podalardagi har bir konteyner uchun:
3) Xizmatni yaratishda siz ko'rsatishingiz kerak port и targetPort. Lekin qaysi biri konteynerga ulanish uchun ishlatiladi?
4) orqali targetPort. U mos kelishi kerak containerPort.
5) Konteynerda 3000 port ochiq deylik.Unda qiymat targetPort bir xil bo'lishi kerak.
YAML faylida teglar va ports / targetPort mos kelishi kerak:
Yorliq haqida nima deyish mumkin? track: canary Joylashtirish bo'limining yuqori qismida? Bu mos kelishi kerakmi?
Bu yorliq tarqatish uchun xos boʻlib, xizmat tomonidan trafikni yoʻnaltirish uchun foydalanilmaydi. Boshqacha qilib aytganda, uni olib tashlash yoki boshqa qiymat belgilash mumkin.
Selektor haqida nima deyish mumkin? matchLabels?
U har doim Pod yorliqlariga mos kelishi kerak, chunki u Deployment tomonidan podlarni kuzatish uchun ishlatiladi.
Faraz qilaylik, siz to'g'ri tahrir qildingiz. Ularni qanday tekshirish mumkin?
Pod yorlig'ini quyidagi buyruq bilan tekshirishingiz mumkin:
kubectl get pods --show-labels
Yoki, agar podlar bir nechta ilovalarga tegishli bo'lsa:
kubectl get pods --selector any-name=my-app --show-labels
Qaerda any-name=my-app yorliq hisoblanadi any-name: my-app.
Hech qanday qiyinchiliklar qoldimi?
Podga ulanishingiz mumkin! Buning uchun siz buyruqni ishlatishingiz kerak port-forward kubectl ichida. Bu sizga xizmatga ulanish va ulanishni tekshirish imkonini beradi.
service/<service name> - xizmat nomi; bizning holatlarimizda shunday my-service;
3000 - kompyuterda ochilishi kerak bo'lgan port;
80 - maydonda ko'rsatilgan port port xizmat.
Agar ulanish o'rnatilgan bo'lsa, unda sozlamalar to'g'ri.
Agar ulanish muvaffaqiyatsiz bo'lsa, teglar bilan muammo bor yoki portlar mos kelmaydi.
Xizmat va kirish o'rtasidagi munosabat
Ilovaga kirishni ta'minlashning keyingi bosqichi kirishni sozlashni o'z ichiga oladi. Kirish xizmatni qanday topishni bilishi, keyin podslarni topishi va ularga trafikni yo'naltirishi kerak. Ingress kerakli xizmatni nomi va ochiq port bo'yicha topadi.
Ingress va Service tavsifida ikkita parametr mos kelishi kerak:
servicePort Ingress parametriga mos kelishi kerak port Xizmatda;
serviceName Ingressda maydonga mos kelishi kerak name Xizmatda.
Quyidagi diagramma port ulanishlarini umumlashtiradi:
1) Siz allaqachon bilganingizdek, Xizmat ma'lum bir narsani tinglaydi port:
2) Ingress deb nomlangan parametrga ega servicePort:
3) bu parametr (servicePort) har doim mos kelishi kerak port Xizmat ta'rifida:
4) Xizmatda 80-port ko'rsatilgan bo'lsa, bu kerak servicePort ham 80 ga teng edi:
Amalda siz quyidagi qatorlarga e'tibor berishingiz kerak:
Endi siz har safar kompyuteringizdagi 3000-portga so'rov yuborganingizda, u Ingress kontrolleri bilan podning 80-portiga yo'naltiriladi. ga borish orqali http://localhost:3000, siz ilova tomonidan yaratilgan sahifani ko'rishingiz kerak.
Portlar haqida qisqacha ma'lumot
Qaysi portlar va teglar mos kelishi kerakligini yana bir bor eslaylik:
Xizmat ta'rifidagi selektor pod yorlig'iga mos kelishi kerak;
targetPort ta'rifda Xizmat mos kelishi kerak containerPort pod ichidagi idish;
port ta'rifda Xizmat har qanday bo'lishi mumkin. Turli xizmatlar bir xil portdan foydalanishi mumkin, chunki ular turli IP manzillarga ega;
servicePort Kirish mos kelishi kerak port Xizmat ta'rifida;
Xizmat nomi maydonga mos kelishi kerak serviceName Ingressda.
Afsuski, YAML konfiguratsiyasini qanday qilib to'g'ri tuzishni bilishning o'zi etarli emas.
Ishlar noto'g'ri ketsa nima bo'ladi?
Pod ishga tushmasligi yoki ishdan chiqishi mumkin.
Kubernetes-da dastur muammolarini aniqlash uchun 3 qadam
Joylashtirishni tuzatishni boshlashdan oldin, siz Kubernetes qanday ishlashini yaxshi tushunishingiz kerak.
K8s-da yuklab olingan har bir dastur uchta komponentdan iborat bo'lganligi sababli, ularni eng pastdan boshlab ma'lum bir tartibda tuzatish kerak.
Avval podkastlar ishlayotganiga ishonch hosil qilishingiz kerak, keyin...
Xizmat podkastlarga trafik yetkazib berishini tekshiring va keyin...
Ingress to'g'ri sozlanganligini tekshiring.
Vizual taqdimot:
1) Muammolarni eng pastdan qidirishni boshlashingiz kerak. Avval podkastlarning statuslari borligini tekshiring Ready и Running:
2) Agar podalar tayyor bo'lsa (Ready), siz xizmat podkastlar o'rtasida trafikni taqsimlaydimi yoki yo'qligini bilib olishingiz kerak:
3) Va nihoyat, siz xizmat va kirish o'rtasidagi aloqani tahlil qilishingiz kerak:
1. Po‘choqlarning diagnostikasi
Ko'p hollarda muammo podkast bilan bog'liq. Podkalar ro'yxatga kiritilganligiga ishonch hosil qiling Ready и Running. Buni buyruq yordamida tekshirishingiz mumkin:
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
Yuqoridagi buyruq chiqishida oxirgi pod kabi ro'yxatga olingan Running и Ready, ammo, bu qolgan ikkitasi uchun emas.
Nima noto'g'ri bo'lganini qanday tushunish mumkin?
Podkalarni diagnostika qilish uchun to'rtta foydali buyruq mavjud:
kubectl logs <имя pod'а> poddagi konteynerlardan jurnallarni chiqarish imkonini beradi;
kubectl describe pod <имя pod'а> pod bilan bog'liq voqealar ro'yxatini ko'rish imkonini beradi;
kubectl get pod <имя pod'а> Kubernetes-da saqlangan podning YAML konfiguratsiyasini olish imkonini beradi;
kubectl exec -ti <имя pod'а> bash pod konteynerlaridan birida interaktiv buyruq qobig'ini ishga tushirish imkonini beradi
Qaysi birini tanlash kerak?
Gap shundaki, universal buyruq yo'q. Bularning kombinatsiyasidan foydalanish kerak.
Odatda podkastlar muammolari
Pod xatolarining ikkita asosiy turi mavjud: ishga tushirish xatolari va ish vaqti xatolari.
Ishga tushirish xatolari:
ImagePullBackoff
ImageInspectError
ErrImagePull
ErrImageNeverPull
RegistryUnavailable
InvalidImageName
Ishlash vaqtidagi xatolar:
CrashLoopBackOff
RunContainerError
KillContainerError
VerifyNonRootError
RunInitContainerError
CreatePodSandboxError
ConfigPodSandboxError
KillPodSandboxError
SetupNetworkError
TeardownNetworkError
Ba'zi xatolar boshqalarga qaraganda tez-tez uchraydi. Bu erda eng keng tarqalgan xatolar va ularni tuzatish usullari keltirilgan.
ImagePullBackOff
Bu xato, Kubernetes pod konteynerlaridan biri uchun tasvirni ololmaganida yuzaga keladi. Buning eng keng tarqalgan uchta sababi:
Rasm nomi noto'g'ri - masalan, siz unda xato qildingiz yoki rasm mavjud emas;
Rasm uchun mavjud bo'lmagan teg belgilandi;
Rasm shaxsiy registrda saqlanadi va Kubernetes unga kirish uchun ruxsatga ega emas.
Birinchi ikkita sababni yo'q qilish oson - shunchaki rasm nomi va tegini to'g'rilang. Ikkinchisi bo'lsa, maxfiy ro'yxatga olish kitobi uchun hisob ma'lumotlarini kiritishingiz va unga havolalarni qo'shishingiz kerak. Kubernetes hujjatlarida misol bor buni qanday qilish mumkin.
Crash Loop Back Off
Kubenetes xatoga yo'l qo'ydi CrashLoopBackOff, agar konteyner ishga tushmasa. Bu odatda quyidagi hollarda sodir bo'ladi:
Ilovada uni ishga tushirishga to'sqinlik qiladigan xatolik mavjud;
Jonlilik testi juda ko'p marta muvaffaqiyatsiz tugadi.
Muvaffaqiyatsizligi sababini bilish uchun konteynerdan jurnallarga kirishga harakat qilishingiz kerak. Agar konteyner juda tez qayta ishga tushirilganligi sababli jurnallarga kirish qiyin bo'lsa, siz quyidagi buyruqdan foydalanishingiz mumkin:
kubectl logs <pod-name> --previous
U konteynerning oldingi mujassamlanishidagi xato xabarlarini ko'rsatadi.
RunContainer Error
Ushbu xato konteyner ishga tushirilmaganda paydo bo'ladi. Bu dastur ishga tushirilgunga qadar bo'lgan vaqtga to'g'ri keladi. Odatda noto'g'ri sozlamalar tufayli yuzaga keladi, masalan:
ConfigMap yoki Secrets kabi mavjud bo'lmagan jildni o'rnatishga urinish;
faqat o'qish uchun hajmni o'qish-yozish sifatida o'rnatishga urinish.
Jamoa bunday xatolarni tahlil qilish uchun juda mos keladi kubectl describe pod <pod-name>.
Podlar kutilayotgan holatda
Yaratilgandan so'ng, pod holatida qoladi Pending.
Nima uchun bu sodir bo'ladi?
Mana mumkin bo'lgan sabablar (men rejalashtiruvchi yaxshi ishlayapti deb o'ylayman):
Klasterda podani ishga tushirish uchun ishlov berish quvvati va xotira kabi resurslar yetarli emas.
Ob'ekt tegishli nomlar maydoniga o'rnatiladi ResourceQuota va pod yaratish nomlar maydonining kvotadan tashqariga chiqishiga olib keladi.
Pod Kutilmoqda PersistentVolumeClaim.
Bunday holda, buyruqni ishlatish tavsiya etiladi kubectl describe va bo'limni tekshiring Events:
kubectl describe pod <pod name>
bilan bog'liq xatolar bo'lsa ResourceQuotas, buyruq yordamida klaster jurnallarini ko'rish tavsiya etiladi
kubectl get events --sort-by=.metadata.creationTimestamp
Podlar tayyor emas
Agar pod ro'yxatda bo'lsa Running, lekin holatda emas Ready, tayyorligini tekshirishni bildiradi (tayyorlik tekshiruvi) muvaffaqiyatsiz.
Bu sodir bo'lganda, pod xizmatga ulanmaydi va unga hech qanday trafik oqmaydi. Tayyorlik testining muvaffaqiyatsizligi dasturdagi muammolar tufayli yuzaga keladi. Bunday holda, xatoni topish uchun siz bo'limni tahlil qilishingiz kerak Events buyruq chiqishida kubectl describe.
2. Xizmat diagnostikasi
Agar podlar ro'yxatga kiritilgan bo'lsa Running и Ready, lekin ilovadan hali ham javob yo'q, siz xizmat sozlamalarini tekshirishingiz kerak.
Xizmatlar yorliqlariga qarab trafigi podlarga yo'naltirish uchun javobgardir. Shuning uchun, siz qilishingiz kerak bo'lgan birinchi narsa - bu xizmat bilan qancha pods ishlashini tekshirish. Buning uchun xizmatdagi so'nggi nuqtalarni tekshirishingiz mumkin:
kubectl describe service <service-name> | grep Endpoints
Yakuniy nuqta - bu shaklning juft qiymatlari <IP-адрес:порт>, va chiqishda kamida bitta bunday juftlik mavjud bo'lishi kerak (ya'ni kamida bitta pod xizmat bilan ishlaydi).
Agar bo'lim Endpoins bo'sh, ikkita variant mumkin:
to'g'ri yorliqli podalar yo'q (maslahat: nomlar maydoni to'g'ri tanlanganligini tekshiring);
Selektordagi xizmat yorliqlarida xatolik bor.
Agar siz so'nggi nuqtalar ro'yxatini ko'rsangiz, lekin hali ham dasturga kira olmasangiz, ehtimol aybdor xatolikdir targetPort xizmat tavsifida.
Xizmatning funksionalligini qanday tekshirish mumkin?
Xizmat turidan qat'i nazar, siz buyruqdan foydalanishingiz mumkin kubectl port-forward unga ulanish uchun:
podalar sifatida ro'yxatga olingan Running и Ready;
xizmat podlar o'rtasida trafikni muvaffaqiyatli taqsimlaydi.
Biroq, siz hali ham ilovaga kira olmaysiz.
Bu shuni anglatadiki, Ingress boshqaruvchisi to'g'ri sozlanmagan. Ingress boshqaruvchisi klasterdagi uchinchi tomon komponenti bo'lganligi sababli, uning turiga qarab turli xil nosozliklarni tuzatish usullari mavjud.
Ammo Ingressni sozlash uchun maxsus vositalardan foydalanishga murojaat qilishdan oldin, siz juda oddiy narsani qilishingiz mumkin. Kirish foydalanadi serviceName и servicePort xizmatga ulanish uchun. Ularning to'g'ri sozlanganligini tekshirishingiz kerak. Buni buyruq yordamida amalga oshirishingiz mumkin:
kubectl describe ingress <ingress-name>
Agar ustun Backend bo'sh, konfiguratsiya xatosi ehtimoli yuqori. Agar orqa panellar joyida bo'lsa-da, lekin dastur hali ham mavjud bo'lmasa, muammo quyidagilar bilan bog'liq bo'lishi mumkin:
Umumiy Internetdan kirish imkoniyati sozlamalariga kirish;
umumiy Internetdan klasterga kirish sozlamalari.
Ingress podiga to'g'ridan-to'g'ri ulanish orqali infratuzilma bilan bog'liq muammolarni aniqlashingiz mumkin. Buni amalga oshirish uchun avval Ingress Controller podni toping (u boshqa nom maydonida bo'lishi mumkin):
Endi kompyuterdagi 3000 portiga barcha so'rovlar podning 80 portiga yo'naltiriladi.
Hozir ishlaydimi?
Ha bo'lsa, muammo infratuzilmada. Klasterga trafik qanday yo'naltirilganligini aniq aniqlash kerak.
Agar yo'q bo'lsa, muammo Ingress boshqaruvchisida.
Agar siz Ingress boshqaruvchisini ishga tushira olmasangiz, uni disk raskadrovka qilishingiz kerak bo'ladi.
Ingress kontrollerlarining ko'p navlari mavjud. Eng mashhurlari Nginx, HAProxy, Traefik va boshqalar. (mavjud echimlar haqida qo'shimcha ma'lumot olish uchun qarang bizning sharhimiz - taxminan. tarjima.) Tegishli tekshirgich hujjatlaridagi muammolarni bartaraf etish bo'yicha qo'llanmaga murojaat qilishingiz kerak. Chunki Nginx-ga kirish eng mashhur Ingress tekshiruvi bo'lib, biz maqolaga u bilan bog'liq muammolarni hal qilish uchun ba'zi maslahatlarni kiritdik.
Ingress Nginx kontrolleridagi nosozliklarni tuzatish
Ingress-nginx loyihasi rasmiy shaxsga ega kubectl uchun plagin. Jamoa kubectl ingress-nginx quyidagilar uchun ishlatilishi mumkin
jurnallar, backendlar, sertifikatlar va boshqalarni tahlil qilish;
E'tibor bering, ba'zi hollarda siz bayroq yordamida Ingress kontroller uchun to'g'ri nom maydonini belgilashingiz kerak bo'lishi mumkin --namespace <name>.
Xulosa
Agar qaerdan boshlashni bilmasangiz, Kubernetes bilan bog'liq muammolarni bartaraf etish qiyin bo'lishi mumkin. Siz har doim muammoga pastdan yuqoriga yondashishingiz kerak: podlardan boshlang, so'ngra xizmat va kirishga o'ting. Ushbu maqolada tasvirlangan nosozliklarni tuzatish usullari boshqa ob'ektlarga nisbatan qo'llanilishi mumkin, masalan: