Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

Համար. թարգմանություն.: Ացոլագիրն ընդգրկված է հանրայնորեն հասանելի նյութերի ծրագրի մասում learnk8s, Kubernetes-ի վրա աշխատելու ուսուցում միջոցառումների և անհատ մասնագետների համար։ Դանում Դանիել Պոլենչիչը, նախագծի ղեկավարն, ներկայացնում է ցուցողական հրահանգ, թե ինչպիսի քայլեր պետք է ձեռնարկվեն ընդհանուր բնույթի խնդիրների դեպքում, որոնք կարող են առաջանալ K8s ֆոնդում ընթացող հավելվածների հետ:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

TL;DR: Here's a diagram that will help you debug deployment in Kubernetes:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

Դիագրամ խնդիրների և թերությունների հայտնաբերման համար խմբակներում։ Հայտնի գծագրում (անգլերեն) այն հասանելի է PDF և ժամանակագրություն.

Kubernetes-ում հավելվածը սովորաբար անհրաժեշտ է երեք բաղադրիչներ սահմանել՝

  • Deployment — սա հավելվածի օրինակների ստեղծման բաղադրատոմս է, որոնք կոչվում են pod’եր;
  • Service — ներքին բեռնվածքի հավասարակշռող մարդ, որը տարածում է տրաֆիկը pod’երի գծով;
  • Ingress — նկարագրություն, թե ինչպես տրաֆիկը կհասնի Service-ին արտաքին աշխարհից:

Ահա համառոտ գրաֆիկական ամփոփում՝

1) Kubernetes-ում հավելվածները արտաքին աշխարհից ստանում են տրաֆիկ երկու բեռնավորողների շերտերով. ներքին և արտաքին:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

2) Ներքին բեռնային հավասարակշռիչը կոչվում է Service, արտաքին՝ Ingress:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

3) Deployment-ը ստեղծում է pod’եր և հետևում նրանց (դրանք չեն ստեղծվում ձեռքով):

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

Համաձայնենք, որ ցանկանում եք տեղադրել պարզ հավելված, ինչպիսին է Hello World։ Յամլ-կոնֆիգուրացիան կ выглядеть следующим образом:

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: /

Թևայունը բավական երկար է, և հեշտ է շփոթվել, թե ինչպես են բաղադրիչները միմյանց կապվում:

Օրինակ՝

  • Երբ պետք է օգտագործել 80 պորտը, իսկ երբ 8080-ը:
  • Պետք է արդյոք նոր պորտ ստեղծել յուրաքանչյուր ծառայության համար, որպեսզի Ամերիկա-Ավստրլիայան ազգությունները չհանդիպեն:
  • Թվում են թե ում է երեխաների պետի ուրախությունները։ Պետք է արդյոք նրանք ակոր ժամանակ քանի էլ այլ եղանակ մյան մաղսվող ամենուր?

առաջին հերթին կենտրոնանանք սարայում, որպեսզի գիտակցենք, թե ինչպես են դասընթացն ու ծառայությունը կապված դրվում միմյանց հետ:

Դասընթացի և ծառայության կապն

Դուք զարմացնի, բայց դասընթացները և ծառայությունները որևէ կերպ չեն կապված։ Իսկապես, Service-ը ուղղակիևս ցուցադրում է Pod’երին обходы-բեսա:

Այսպիսով, մեզ հետաքրքրում է, թե Pod’եր և Service’եր միմյանց հետ ինչպես են կապված։ Հիշեք երեք բան՝

  1. Սելեկտորը (selector) Service-ում պետք է համընկնի գոնե մեկ Pod-ի լեյբլի հետ:
  2. targetPort պետք է համընկնում containerPort Pod-ի ներսում:
  3. port Service կարող է լինել ցանկացած։ Տարբեր ծառայություններ կարող են օգտագործել նույն պորտը, քանի որ նրանց տարբեր IP հասցեներ կան:

Հաջորդը պատկերը ներկայացնում է վերոնշյալ ամեն ինչը գրաֆիկական ձևի համաձայն:

1) فرض کنید سرویس ترافیک را به یک pod هدایت می‌کند:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

2) هنگام ایجاد pod، لازم است containerPort برای هر کانتینر در pod ها:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

3) هنگام ایجاد سرویس لازم است مشخص کنید port և targetPort. اما ارتباط به کدام یک از آن‌ها با کانتینر انجام می‌شود؟

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

4) از طریق targetPort. باید با containerPort.

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

5) فرض کنید که در کانتینر پورتی به شماره 3000 باز است. در این صورت مقدار targetPort باید یکسان باشد.

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

در فایل YAML، برچسب‌ها و ports / targetPort باید یکسان باشند:

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  # <<<

اما درباره برچسب track: canary در بالای بخش Deployment چی؟ آیا باید یکسان باشد؟

این برچسب مربوط به استقرار است و توسط سرویس برای مسیریابی ترافیک استفاده نمی‌شود. به عبارت دیگر، می‌توان آن را حذف کرد یا ارزش دیگری به آن اختصاص داد.

و اما درباره انتخاب‌گر matchLabels?

او همیشه باید با برچسب‌های Pod یکسان باشد، زیرا توسط Deployment برای نظارت بر pod ها استفاده می‌شود.

فرض کنید اصلاحات درستی انجام داده‌اید. چگونه می‌توانید آن‌ها را بررسی کنید؟

برای بررسی برچسب‌های pod ها می‌توان از دستور زیر استفاده کرد:

kubectl get pods --show-labels

یا اگر pod ها متعلق به چندین برنامه هستند:

kubectl get pods --selector any-name=my-app --show-labels

Որտեղ any-name=my-app — این یک برچسب است any-name: my-app.

آیا هنوز مشکل دارید؟

می‌توانید به pod متصل شوید! برای این کار باید از دستور استفاده کنید port-forward در kubectl. این امکان را فراهم می‌کند که به سرویس متصل شده و اتصال را بررسی کنید.

kubectl port-forward service/<service name> 3000:80

در اینجا:

  • service/<service name> — نام سرویس؛ در این مورد این است my-service;
  • 3000 — پورتی که باید بر روی کامپیوتر باز شود؛
  • 80 — پورتی که در فیلد port سرویس مشخص شده است.

اگر اتصال برقرار شد، یعنی تنظیمات صحیح هستند.

اگر نتوانید اتصال برقرار کنید، یعنی مشکل در برچسب‌ها یا عدم تطابق در پورت‌ها وجود دارد.

پیوند بین Service و Ingress

مرحله بعدی در تأمین دسترسی به برنامه، تنظیم Ingress است. Ingress باید بداند چگونه سرویس را پیدا کند، سپس pod ها را بیابد و ترافیک را به آن‌ها هدایت کند. Ingress با استفاده از نام و پورت باز به سرویس مورد نظر می‌رسد.

در توضیحات Ingress و Service باید دو پارامتر یکسان باشند:

  1. servicePort در Ingress باید با پارامتر port در Service یکسان باشد;
  2. serviceName در Ingress باید با فیلد name در Service یکسان باشد.

نقشه زیر خلاصه‌ای از اتصال پورت‌ها را ارائه می‌دهد:

1) همانطور که می‌دانید، Service به نوعی گوش می‌دهد port:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

2) Ingress پارامتری به نام دارد servicePort:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

3) این پارامتر (servicePort) همیشه باید با port در تعریف Service یکسان باشد:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

4) اگر در Service پورتی برابر با 80 تعیین شود، باید servicePort همچنین برابر با 80 باشد:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

در عمل باید به خطوط زیر توجه کرد:

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: \/

Ինչպես ստուգել, թե Ingress-ը գործում է:

Կարող եք օգտվել մեթոդով kubectl port-forward, բայց ծառայության փոխարեն պետք է միանալ Ingress կոնտրոլերին:

Ավ primero необходимо узнать pod-ի անունը, որը կապված է Ingress կոնտրոլերին:

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

Գտեք Ingress-ի pod-ը (այն կարող է պատկանալ մեկ այլ անվան տարածքին) և կատարեք հրամանը նկարագրել, որպեսզի իմանաք պորտերի համարները:

kubectl describe pod nginx-ingress-controller-6fc5bcc 
--namespace kube-system 
 | grep Ports
Ports:         80\/TCP, 443\/TCP, 18080\/TCP

Ի վերջո, միացեք pod-ին:

kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-system

Հիմա յուրաքանչյուր անգամ, երբ դուք փողեք հարցում 3000 պորտում ձեր համակարգչի վրա, այն կուղղորդվի 80 պորտին Ingress կոնտրոլի pod-ում: Շարժվելով դեպի http://localhost:3000, դուք պետք է տեսնեք էջը, որը ստեղծվել է ծրագրով:

Պորտերի ամփոփում

Եղենք ևս մեկ անգամ, թե哪些 порты и лейблы должны совпадать:

  1. Service-ի սահմանման մէջ նշված սելեկտոր պետք է համընկնի pod-ի լեյբլի հետ:
  2. targetPort Service սահմանման մեջ պետք է համընկնի containerPort pod-ի ներսում գտնվող կոնտեյների հետ:
  3. port Service սահմանման մեջ կարող է լինել ցանկացած. Տարբեր ծառայություններ կարող են օգտագործել նույն պորտը, քանի որ նրանք ունեն տարբեր IP հասցեներ:
  4. servicePort Ingress-ի լեյբլը պետք է համընկնի port Service սահմանման մեջ:
  5. Ծառայության անվանումը պետք է համընկնի serviceName Ingress-ում:

Ափսոս, հարկավոր չէ իմանալ, թե ինչպես պետք է ճիշտ կառուցել YAML կոնֆիգուրացիան:

Այո, ի՞նչ է տեղի ունենում, երբ ինչ-որ բան երթի:

Հնարավոր է, pod-ը չի մեկնարկվում կամ կանգնում է:

3 քայլ ասերության համար Kubernetes-ում:

Մինչ Debugging-ին ուղղվելը, պետք է լավ պատկերացում ունենալ Kubernetes-ի կերպով:

Քանի որ յուրաքանչյուր թվով K8s ծրագրի մեջ ունենում է երեք բաղադրիչ, պետք է Debugging-ը անցկացնել որոշակի հերթականությամբ, սկսելով ամենացածրից:

  1. Առաջինը պետք է համոզվել, որ pod-երը գործում են, ապա…
  2. Ստուգեք, թե առաքե՞լ է ծառայությունը տրաֆիկը pod-երին, ապա…
  3. Ստուգեք, թե արդյոք Ingress-ն ճիշտ ձևավորված է:

Վիզուալ ներկայացում:

1) Ասարության խնդիրների որոնումը սկսելու է ամենացածրից: Նախ ստուգեք, որ pod-երը կարգավորված են որպես Հնկը և Running:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

2) Եթե pod-երը պատրաստ են (Հնկը), դուք պետք է պարզեք, թե արդյոք ծառայությունը տարածում է տրաֆիկը pod-երի միջև:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

3) Եվ վերջապես պետք է վերլուծել ծառայության և Ingress-ի միջև կապը:

Kubernetes-ում սխալների ախտորոշման տեսողական ուղեցույց

1. Pod-երի ախտորոշում

Ադրբեջական մեծամասնության պատճառով խնդիրները կապված են pod-ի հետ: Համոզվեք, որ pod-երը կապված են Հնկը և Running. Ստուգեք սա կարող եք հրամանի օգնությամբ:

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

Այս հրամանի արդյունքում վերջին pod-ը նշված է որպես Running և Հնկը, բայց մյուս երկուսը դա չեն:

Ինչպե՞ս հասկանալ, որ ինչ-որ բան սխալ է:

Հինգ օգտակար հրամաններ կան pod-ների ախտորոշման համար:

  1. kubectl logs թույլ է տալիս ստանալ կոնտեյներների լոգերը pod-ում;
  2. kubectl describe pod թողնում է դիտարկել pod-ի հետ կապված իրադարձությունների ցանկը;
  3. kubectl get pod թույլ է տալիս ստանալ YAML-ի կոնֆիգուրացիան pod-ի համար, որը պահպանված է Kubernetes-ում;
  4. kubectl exec -ti bash թույլ է տալիս ակտիվ հրամանների պաշարել մեկ կոնտեյնումներում pod-ի;

Որորը խոշորներից ընտրել:

Պայմանն այն է, որ չկա համընդհանուր հրաման: Պետք է օգտագործել դրանց համադրությունը:

Տիպիկ pod-ների խնդիրներ

Կան երկու հիմնական սխալների տեսակներ pod-ների համար՝ մեկնարկի ժամանակ (startup) սխալներ և գործառնության (runtime) ժամանակ սխալներ:

Մեկնարկի սխալներ:

  • ImagePullBackoff
  • ImageInspectError
  • ErrImagePull
  • ErrImageNeverPull
  • RegistryUnavailable
  • InvalidImageName

Գործառնության սխալներ:

  • CrashLoopBackOff
  • RunContainerError
  • KillContainerError
  • VerifyNonRootError
  • RunInitContainerError
  • CreatePodSandboxError
  • ConfigPodSandboxError
  • KillPodSandboxError
  • SetupNetworkError
  • TeardownNetworkError

Ոմանք սխալներն ավելի հաճախ են հանդիպում, քան մյուսները: Օրավիրդից հետևում են մի քանի տարածված սխալներ և դրանց լուծումները:

ImagePullBackOff

Այս սխալը առաջանում է, երբ Kubernetes-ը չի կարողանում ստանալ պատկերներ pod-ի կոնտեյների համար: Ահա այս երեք ամենատարածված պատճառները:

  1. Պատկերի անունը սխալ նշված է՝ օրինակ, դուք թույլ եք տվել սխալի կամ պատկեր չկա;
  2. Պատկերի համար չի նշված ոչ հաջողակում պարունակություն;
  3. Պատկերները պահվում են փակ ռեգիստրում, և Kubernetes-ը չունի կայսերական իրավունք նրա մուտքեն:

Առաջին երկու պատճառները հեշտ է լուծել՝ պարզապես պետք է ուղղել պատկերների անունը և չեմպիոնները: Վերջին դեպքում անհրաժեշտ է կատարել փակ ռեգիստրի հաշվին գաղտնիություն, և ավելացնել այն pod-ների մեջ: Kubernetes-ի փաստաթղթերում ունի օրինակ այդպիսի գործողության մասին:

CrashLoopBackOff

Kubernetes-ը ընդգծում է սխալ CrashLoopBackOff, եթե կոնտեյերն ի վիճակի չէ սկսել: Հաճախ դա է տեղի ունենում, երբ:

  1. Դիմումը ունի սխալ, որը թույլ չի տալիս սկսել այն;
  2. Կոնտեյեր չի կարգավորված ճիշտ;
  3. Liveness-ի փորձը անդառնալիորեն սխալ է, շատ անգամ:

Պետք է փորձել ծանոթանալ կոնտեյների լոգերին, որպեսզի պարզել դրա անհաջողության պատճառը: Եթե դժվար է մուտք գործել log-երին, քանի որ կոնտեյերը շատ արագ վերագործարկվում է, կարող եք օգտագործել հետևյալ հրամանը:

kubectl logs  --previous

Այն տալիս է նախորդ վերին սարքումներից սխալ հաղորդագրություններ:

RunContainerError

Այս սխալը առաջանում է, երբ կոնտեյերն ի վիճակի չէ սկսել: Դա տեղի է ունենում առաջ ծրագրի ստանալու ժամանակ: Հաճախ դա պայմանավորված է սխալ կարգավորմամբ, օրինակ:

  • չե ունի գոյություն չունեցող վարձակալությամբ մոնտաժ պային, օրինակ՝ ConfigMap կամ Secrets;
  • փորձում է «քաղվածքային» տեսակի ծավալը ձեռնարկված դարձնել «գրելու»։

Ամիսների նման սխալների վերլուծության համար լավ է օգտագործել команда kubectl նկարագրել pod <pod-հชื่อ>.

Pod-ները գտնվում են սպասման վիճակում

Ստեղծումից հետո pod-ը մնում է վիճակում Pending.

Ինչու է այսպիսի բան տեղի ունենում:

Բաղրամասները (ես մեկնաբանում եմ այն, որ ժամանակացոյցը գործում է լիարժեք):

  1. Վրաստանում անբավարար ռեսուրսներ են, ինչպիսիք են հաշվիչ ուժն ու հիշողությունը, որպեսզի շարունակվեն pod-ը:
  2. Համապատասխան անուն տարածքում տեղադրված է առարկա ResourceQuota և pod-ի ստեղծումը կհանգեցնի անուն տարածքի շեմից դուրս գալու։
  3. Pod-ը կապված է սպասման վիճակում PersistentVolumeClaim.

Այս դեպքում խորհուրդ ենք տալիս օգտագործել comando kubectl նկարագրել և ստուգել բաժինը Իրավիճակներ:

kubectl նկարագրել pod <pod անուն>

Սխալների դեպքում, որոնք կապված են ResourceQuotas, խորհուրդ է տրվում դիտել զանգվածի տեղեկությունները командով

kubectl ստանալ իրադարձություններ --sort-by=.metadata.creationTimestamp

Pod-ները չեն գտնվում պատրաստի վիճակում

Եթե pod-ը նշված է որպես Running, բայց չի գտնվում վիճակում Հնկը, միաժամանակ այս հատվածի ստուգման (readiness probe) ոչ հաջողությամբ ավարտվում է։

Երբ այսպիսի բան տեղի է ունենում, pod-ը չի միանում ծառայությանը, և տրաֆիկը չի կարող հասնել դրան։ Readiness-ի թեստի ձախողումը պայմանավորված է ծրագրի խնդիրներով։ Այս դեպքում սխալը գտնելու համար նշված լինի Իրավիճակներ կոմանդայի վերլուծության մեջ kubectl նկարագրել.

2. Ծառայությունների ախտորոշում

Եթե pod-ները նշված են որպես Running և Հնկը, բայց ծրագրից դեռևս արձագանք չկա, պետք է ստուգել ծառայության կարգավորումները։

Ծառայությունները զբաղվում են տրաֆիկի ուղղորդման գործով pod-ներին ըստ իրենց լեյբլների։ Այսպիսով, առաջինը, որ պետք է անել, դա ստուգել, թե քանի pod-ներ աշխատում են ծառայության հետ։ Այդ նպատակով կարող եք ստուգել վերջնակետերը ծառայության մեջ՝

kubectl նկարագրել ծառայություն <ծառայություն անուն> | grep Վերջնակետեր

Վերջնակետը — դա արժեքների զույգ է <IP-հասցե:պորտ>, և արդյունքներում պետք է առկա լինի գոնե մեկ այդպիսի զույգ (այսինքն, ծառայությանը աշխատում է գոնե մեկ pod)։

Եթե բաժինը Վերջնակետեր դատարկ է, հնարավոր են երկու տարբերակ՝

  1. որտեղ չկա ոչ մի pod՝ ճիշտ լեյբլով (նվիրեց: ստուգեք, որ անուն տարածքը ճիշտ է ընտրված);
  2. ծառայության լեյբլներում կա սխալ ընտրողի։

Եթե տեսնում եք վերջնակետերի ցուցակ, բայց դեռևս չեք կարող հասնել ծրագրա, ապա ամենայն հավանականությամբ, պիտի լինի սխալը targetPort ծառայության նկարագրությունում։

Ինչպե՞ս ստուգել ծառայության աշխատանքը:

Ոչ մի Լեյբլի տեսակից կախված, կարելի է օգտագործել командա kubectl port-forward առկա լինելու համար:

kubectl port-forward service/<ծառայություն անուն> 3000:80

در اینجا:

  • <ծառայության անուն> — ծառայության անունը;
  • 3000 — պորտ, որը բացում եք ձեր համակարգչում;
  • 80 — պորտ ծառայության կողմից։

3. Ingress-ի ախտորոշում

Եթե դուք այստեղ հասնում եք, ապա:

  • pod-ները նշված են որպես Running և Հնկը;
  • ծառայությունը հաջողությամբ դարձնում է տրաֆիկը pod-ներին։

Իրականում դուք դեռևս չեք կարող «մոտենալ» ծրագրա։

Այն նշանակում է, որ հավանաբար սխալ է կարգավորված Ingress կոնտրոլերը: Որպեսզի Ingress կոնտրոլերը երրորդ կողմի բաղադրիչ է կլաստերում, առկա են տարբեր դեբուգման մեթոդներ, կախված դրա տեսակից:

Բայց նախքան Ingress-ի կարգավորումն օգնության специализирован.tools-ների դիմելը, կարող եք անել մի պարզ բան: Ingress-ը օգտագործում է serviceName և servicePort ծառայության միացման համար: Պետք է ստուգել, արդյոք դրանք ճիշտ են կարգավորված: Դա կարող եք անել՝ օգտագործելով հրամանը:

kubectl նկարագրել ingress <ingress-name>

Եթե սյունակը (բեքենդ) – սպասարկման մասը։ Լեզվի ընտրությունը, հիմնական ֆունկցիաների հավաքածուն և նախապատմական կառուցվածքը (ֆրեյմվորկը) այստեղ հիմնականում որոշվում են անձնական նախասիրություններով, բայց այնուամենայնիվ, արժե նշել քննարկման համար (հեղինակի կարծիքը լեզուների վերաբերյալ բավականին ենթադրական է, թեև անկողմնակալ նկարագրության վերաբերյալ): դուրս է, բարձր ռիսկ կա սխալի դիմաց: Եթե բեքենդները տեղակայված են, բայց դեռևս հասանելիք չկա ծրագրմանը, խնդիրը կարող է կապված լինել՝

  • Ingress-ի հասանելիության կարգավորումներից հանրային համացանցից;
  • կլաստերի հասանելիության կարգավորումներից հանրային համացանցից:

Մերձավոր միջավայրի խնդիրները պարզելու համար կարող եք անմիջականորեն միանալ Ingress կոդի պոդին: Для этого вначале գտեք Ingress կոնտրոլերի պոդը (այն կարող է գտնվել այլ անվան ոլորտում):

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

Օգտագործեք հրամանը նկարագրել, որպեսզի սահմանեք պորտը:

kubectl նկարագրել pod nginx-ingress-controller-6fc5bcc
--namespace kube-system 
 | grep Ports

Ի վերջո, միացեք pod-ին:

kubectl port-forward nginx-ingress-controller-6fc5bcc 3000:80 --namespace kube-system

Այժմ բոլոր հարցումները պորտ 3000 վրա համակարգչում կուղղվեն պորտ 80- ին պոդի:

Այն այժմ աշխատո՞ւմ է:

  • Եթե այո, ապա խնդիրը ենթակառուցվածքում է: Պետք է պարզել, թե ինչպես է իրականանում տրահիկի ուղղորդումը կլաստերում:
  • Եթե ոչ, ապա խնդիրը Ingress կոնտրոլերի հետ է:

Եթե Ingress կոնտրոլերը ստանալ չի հաջողվում, ստիպված կլինեք այն Դեբուգել:

Ingeress կոնտրոլերների շատ տեսակներ կան: Ամենատարածվածներն են Nginx, HAProxy, Traefik և այլն: (լրացուցիչ տեղեկությունների համար տես մարզման մեջ — խմբ., թարգ. Պետք է օգտագործել համապատասխան կոնտրոլերի փաստաթուղթում խնդիրների լուծման ուղեցույցը: Քանի որ Ingress Nginx նորմալ Ingress կոնտրոլերներից ամենահանրապետելին է, մենք այս հոդվածում ընդգրկել ենք մի քանի խորհուրդներ շահունակություններով:

Ingress Nginx կոնտրոլերի Դեբուգում

Ingress-nginx նախագծի պաշտոնական է kubectl-ի հավելված:Հրամանը kubectl ingress-nginx կարող է օգտագործվել՝

  • լոգերի, բեքենդների, սերտիֆիկատների և այլն վերլուծության համար;
  • Ingress-ի հետ միանալու համար;
  • ներկայիս կարգավորումը ուսումնասիրելու համար:

Քեզ կօգնեն հետևյալ երեք հրամանները:

  • kubectl ingress-nginx lint — ստուգում է nginx.conf;
  • kubectl ingress-nginx backend — ուսումնասիրում է բեքենդը (այնպես, ինչպես kubectl նկարագրել ingress <ingress-name>);
  • kubectl ingress-nginx logs — ստուգում է լոգերը:

Ուշադրություն տվեք. որոշ դեպքերում կարող է հարկավոր լինել նշել ճիշտ անվան ոլորտը Ingress կոնտրոլերի համար՝ օգտագործելով --namespace <name>.

Վերանայել

Kubernetes-ում տեսադաշտը կարող է լինել ոչ հեշտ խնդիր, եթե չգիտեք, թե որտեղից սկսել: Խնդրին միշտ պետք է մոտենալ «տվյալների վերևից» սկզբունքով. սկսեք պոդերից, այնուհետև անցեք ծառայությանը և Ingress-ին: Հոդվածում նկարագրված դեբուգման մեթոդները կարող են կիրառվել նաև այլ օբյեկտների նկատմամբ, ինչպիսիք են:

  • հակառակասաց Job-եր և CronJob-եր;
  • StatefulSet-ներ և DaemonSet-ներ։

Հայտարարում եմ շնորհակալություն Գերգելյ Ռիսկո, Դանիել Ուեյբել և Չարլզ Քրիստիրձ արժեքավոր դիտողությունների և լրացումների համար։

P.S. թարգմանչից

Նաեւ կարդացեք մեր բլոգում:

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster