Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

සටහන. පරිවර්තනය.: මෙම ලිපිය පොදු වසමෙහි ප්‍රකාශයට පත් කරන ලද ව්‍යාපෘති ද්‍රව්‍යවල කොටසකි ඉගෙන ගන්න8s, Kubernetes සමඟ වැඩ කිරීමට පුහුණු සමාගම් සහ තනි පරිපාලකයින්. එහි, ව්‍යාපෘති කළමනාකරු Daniele Polencic, K8s පොකුරේ ක්‍රියාත්මක වන යෙදුම්වල සාමාන්‍ය ගැටළු වලදී ගත යුතු පියවර පිළිබඳ දෘශ්‍ය උපදෙස් බෙදා ගනී.

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

TL;DR: මෙන්න ඔබට Kubernetes හි යෙදවීම නිදොස් කිරීමට උපකාර වන රූප සටහනකි:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

පොකුරක දෝෂ සෙවීම සහ නිවැරදි කිරීම සඳහා ගැලීම් සටහන. මුල් පිටපත (ඉංග්‍රීසියෙන්) මෙහි ඇත PDF и පින්තූරයක් ලෙස.

Kubernetes වෙත යෙදුමක් යෙදවීමේදී, සාමාන්‍යයෙන් ඔබට නිර්වචනය කිරීමට අවශ්‍ය සංරචක තුනක් ඇත:

  • යෙදවීම - මෙය පොඩ්ස් ලෙස හැඳින්වෙන යෙදුමේ පිටපත් නිර්මාණය කිරීම සඳහා වූ වට්ටෝරුවකි;
  • සේවය - කරල් අතර ගමනාගමනය බෙදා හරින අභ්‍යන්තර බර සමතුලිතකය;
  • ආක්රමණය - බාහිර ලෝකයේ සිට සේවාව වෙත ගමනාගමනය ලැබෙන ආකාරය පිළිබඳ විස්තරයක්.

මෙන්න ඉක්මන් චිත්රක සාරාංශයක්:

1) Kubernetes හි, යෙදුම්වලට බාහිර ලෝකයෙන් load balancers ස්ථර දෙකක් හරහා ගමනාගමනය ලැබේ: අභ්‍යන්තර සහ බාහිර.

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

2) අභ්‍යන්තර සමතුලිතකය Service ලෙස හැඳින්වේ, බාහිර එක Ingress ලෙස හැඳින්වේ.

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

3) යෙදවීම කරල් නිර්මාණය කර ඒවා නිරීක්ෂණය කරයි (ඒවා අතින් නිර්මාණය නොවේ).

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

ඔබට සරල යෙදුමක් යෙදවීමට අවශ්‍ය යැයි සිතමු හෙලෝ වර්ල්ඩ්. එය සඳහා YAML වින්‍යාසය මේ ආකාරයෙන් පෙනෙනු ඇත:

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

නිර්වචනය තරමක් දිගු වන අතර සංරචක එකිනෙක සම්බන්ධ වන්නේ කෙසේද යන්න පිළිබඳව ව්යාකූලත්වයට පත්වීම පහසුය.

උදාහරණ වශයෙන්:

  • ඔබ port 80 භාවිතා කළ යුත්තේ කවදාද සහ 8080 භාවිතා කළ යුත්තේ කවදාද?
  • මම එක් එක් සේවාව සඳහා නව වරායක් නිර්මාණය කළ යුතුද?
  • ලේබල් නම් වැදගත්ද? ඔවුන් සෑම තැනකම එක හා සමාන විය යුතුද?

නිදොස්කරණය කෙරෙහි අවධානය යොමු කිරීමට පෙර, සංරචක තුන එකිනෙක සම්බන්ධ වන ආකාරය මතක තබා ගනිමු. අපි යෙදවීම සහ සේවාව සමඟ ආරම්භ කරමු.

යෙදවීම සහ සේවය අතර සම්බන්ධය

ඔබ පුදුමයට පත් වනු ඇත, නමුත් යෙදවීම සහ සේවාව කිසිදු ආකාරයකින් සම්බන්ධ නොවේ. ඒ වෙනුවට, සේවා යෙදවීම මග හරිමින් Pods වෙත කෙලින්ම යොමු කරයි.

මේ අනුව, Pods සහ Services එකිනෙකට සම්බන්ධ වන්නේ කෙසේද යන්න පිළිබඳව අපි උනන්දු වෙමු. මතක තබා ගත යුතු කරුණු තුනක්:

  1. තේරීම්selector) සේවාව සඳහා අවම වශයෙන් එක් Pod ලේබලයක්වත් ගැළපිය යුතුය.
  2. targetPort ගැලපිය යුතුයි containerPort Pod එක ඇතුලේ කන්ටේනරය.
  3. port සේවාව ඕනෑම දෙයක් විය හැකිය. විවිධ සේවාවන්ට විවිධ IP ලිපින ඇති නිසා එකම වරාය භාවිතා කළ හැක.

පහත රූප සටහන ඉහත සියල්ල චිත්‍රක ආකාරයෙන් නිරූපණය කරයි:

1) සේවාව යම් පොඩ් එකකට ගමනාගමනය යොමු කරන බව සිතන්න:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

2) පොඩ් එකක් නිර්මාණය කිරීමේදී, ඔබ විසින් නියම කළ යුතුය containerPort කරල් වල එක් එක් බහාලුම් සඳහා:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

3) සේවාවක් නිර්මාණය කිරීමේදී, ඔබ විසින් නියම කළ යුතුය port и targetPort. නමුත් කන්ටේනරයට සම්බන්ධ කිරීමට භාවිතා කරන්නේ කුමක්ද?

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

4) හරහා targetPort. එය ගැලපිය යුතුය containerPort.

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

5) අපි කියමු port 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 යෙදවීමේ කොටසේ ඉහළින්ද? එය ගැලපිය යුතුද?

මෙම ලේබලය යෙදවීමට විශේෂිත වන අතර ගමනාගමනය සඳහා සේවාව විසින් භාවිතා නොකෙරේ. වෙනත් වචන වලින් කිවහොත්, එය ඉවත් කිරීමට හෝ වෙනස් අගයක් පැවරීමට හැකිය.

තේරීම ගැන කුමක් කිව හැකිද? matchLabels?

එය සැම විටම Pod ගේ ලේබලවලට ගැළපිය යුතුය, එය Pods නිරීක්ෂණය කිරීමට යෙදවීම විසින් භාවිතා කරන බැවින්.

ඔබ නිවැරදි සංස්කරණයන් කළා යැයි සිතමු. ඒවා පරීක්ෂා කරන්නේ කෙසේද?

ඔබට පහත විධානය සමඟ පොඩ් ලේබලය පරීක්ෂා කළ හැකිය:

kubectl get pods --show-labels

නැතහොත්, කරල් යෙදුම් කිහිපයකට අයත් නම්:

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

කොහෙද? any-name=my-app ලේබලයකි any-name: my-app.

දුෂ්කරතා ඉතිරිව තිබේද?

ඔබට පොඩ් එකට සම්බන්ධ විය හැකිය! මෙය සිදු කිරීම සඳහා ඔබ විධානය භාවිතා කළ යුතුය port-forward kubectl හි. එය ඔබට සේවාවට සම්බන්ධ වීමට සහ සම්බන්ධතාවය පරීක්ෂා කිරීමට ඉඩ සලසයි.

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

මෙන්න:

  • service/<service name> - සේවා නාමය; අපගේ නඩුවේදී එය එසේ ය my-service;
  • 3000 යනු පරිගණකයේ විවෘත කළ යුතු වරායයි;
  • 80 - ක්ෂේත්රයේ නිශ්චිතව දක්වා ඇති වරාය port සේවාව.

සම්බන්ධතාවය ස්ථාපිත කර ඇත්නම්, සැකසුම් නිවැරදි වේ.

සම්බන්ධතාවය අසාර්ථක වුවහොත්, ලේබලවල ගැටලුවක් තිබේ නම් හෝ වරායන් නොගැලපේ.

සේවාව සහ ඇතුල්වීම අතර සම්බන්ධය

යෙදුමට ප්‍රවේශය ලබා දීමේ මීළඟ පියවර වන්නේ ඇතුල්වීම සැකසීමයි. ඇතුල්වීම සේවාවක් සොයා ගන්නේ කෙසේදැයි දැන ගැනීමට අවශ්‍ය වේ, පසුව කරල් සොයා ඒවා වෙත ගමනාගමනය යොමු කරන්න. Ingress විසින් නම සහ විවෘත වරාය අනුව අවශ්‍ය සේවාව සොයා ගනී.

ඇතුල්වීමේ සහ සේවා විස්තරයේ පරාමිති දෙකක් ගැලපිය යුතුය:

  1. servicePort Ingress හි පරාමිතියට ගැළපිය යුතුය port ක්රියාත්මකයි;
  2. serviceName ඇතුල්වීමේදී පිටියට ගැළපිය යුතුය name ක්රියාත්මකයි.

පහත රූප සටහන වරාය සම්බන්ධතා සාරාංශ කරයි:

1) ඔබ දැනටමත් දන්නා පරිදි, සේවාව යම් දෙයකට සවන් දෙයි port:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

2) ඇතුල්වීමේදී පරාමිතියක් ඇත servicePort:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

3) මෙම පරාමිතිය (servicePort) සෑම විටම ගැලපිය යුතුය port සේවා අර්ථ දැක්වීම තුළ:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

4) Port 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: /

ඇතුල්වීම ක්‍රියාත්මක වේද යන්න පරීක්ෂා කරන්නේ කෙසේද?

සමඟ ඔබට ක්‍රමය භාවිතා කළ හැකිය kubectl port-forward, නමුත් සේවාව වෙනුවට ඔබ 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 එක සොයාගෙන (එය වෙනත් නාම අවකාශයක තිබිය හැක) සහ විධානය ක්‍රියාත්මක කරන්න describeවරාය අංක සොයා ගැනීමට:

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

අවසාන වශයෙන්, පොඩ් එකට සම්බන්ධ කරන්න:

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

දැන් ඔබ ඔබේ පරිගණකයේ පෝට් 3000 වෙත ඉල්ලීමක් යවන සෑම අවස්ථාවකම, එය Ingress පාලකය සමඟ පොඩ් 80 පෝට් වෙත යොමු කරනු ලැබේ. වෙත යාමෙන් http://localhost:3000, ඔබ යෙදුම මගින් ජනනය කරන ලද පිටුව දැකිය යුතුය.

වරායේ සාරාංශය

කුමන වරායන් සහ ලේබල ගැලපිය යුතුද යන්න නැවත වරක් මතක තබා ගනිමු:

  1. සේවා නිර්වචනයේ ඇති තේරීම් පොඩ් ලේබලයට ගැළපිය යුතුය;
  2. targetPort නිර්වචනය තුළ සේවාව ගැලපිය යුතුය containerPort කරලක් ඇතුළත කන්ටේනරය;
  3. port අර්ථ දැක්වීමේ සේවාව ඕනෑම දෙයක් විය හැකිය. විවිධ සේවාවන්ට විවිධ IP ලිපින ඇති නිසා එකම වරාය භාවිතා කළ හැක;
  4. servicePort ඇතුල්වීම ගැලපිය යුතුය port සේවා නිර්වචනය තුළ;
  5. සේවා නාමය ක්ෂේත්‍රයට ගැළපිය යුතුය serviceName ඇතුල්වීම තුළ.

අවාසනාවකට, YAML වින්‍යාසය නිවැරදිව ව්‍යුහගත කරන්නේ කෙසේදැයි දැන ගැනීම ප්‍රමාණවත් නොවේ.

දේවල් වැරදුනොත් මොකද වෙන්නේ?

පොඩ් එක ආරම්භ නොවිය හැකිය, නැතහොත් එය කඩා වැටිය හැකිය.

Kubernetes හි යෙදුම් ගැටළු හඳුනා ගැනීමට පියවර 3

ඔබ ඔබේ යෙදවීම නිදොස් කිරීම ආරම්භ කිරීමට පෙර, Kubernetes ක්‍රියා කරන ආකාරය පිළිබඳව ඔබට හොඳ අවබෝධයක් තිබිය යුතුය.

K8s හි බාගත කර ඇති සෑම යෙදුමකටම සංරචක තුනක් ඇති බැවින්, ඒවා ඉතා පහළ සිට ආරම්භ වන නිශ්චිත අනුපිළිවෙලකට දෝෂහරණය කළ යුතුය.

  1. මුලින්ම ඔබ කරල් වැඩ කරන බවට වග බලා ගන්න, පසුව ...
  2. සේවාව කරල්වලට ගමනාගමනය සපයන්නේ දැයි පරීක්ෂා කරන්න, ඉන්පසු...
  3. ඇතුල්වීම නිවැරදිව වින්‍යාස කර ඇත්දැයි පරීක්ෂා කරන්න.

දෘශ්‍ය නිරූපණය:

1) ඔබ ඉතා පහළ සිට ගැටළු සෙවීම ආරම්භ කළ යුතුය. මුලින්ම කරල් වලට තත්ත්‍වයන් තියෙනවද බලන්න Ready и Running:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

2) කරල් සූදානම් නම් (Ready), සේවාව කරල් අතර ගමනාගමනය බෙදා හරින්නේ දැයි ඔබ සොයා බැලිය යුතුය:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

3) අවසාන වශයෙන්, ඔබ සේවාව සහ ඇතුල්වීම අතර සම්බන්ධතාවය විශ්ලේෂණය කළ යුතුය:

Kubernetes දෝශ නිරාකරණය සඳහා දෘශ්‍ය මාර්ගෝපදේශයක්

1. කරල් රෝග විනිශ්චය

බොහෝ අවස්ථාවන්හීදී, ගැටළුව පොඩ් සමඟ සම්බන්ධ වේ. කරල් ලෙස ලැයිස්තුගත කර ඇති බවට වග බලා ගන්න Ready и 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

ඉහත විධාන ප්‍රතිදානයේ, අවසාන පොඩ් එක ලෙස ලැයිස්තුගත කර ඇත Running и Ready, කෙසේ වෙතත්, මෙය අනෙක් දෙක සඳහා නොවේ.

වැරදුන දේ තේරුම් ගන්නේ කෙසේද?

කරල් රෝග විනිශ්චය සඳහා ප්‍රයෝජනවත් විධාන හතරක් ඇත:

  1. kubectl logs <имя pod'а> පෝඩ් එකක ඇති බහාලුම් වලින් ලඝු-සටහන් ලබා ගැනීමට ඔබට ඉඩ සලසයි;
  2. kubectl describe pod <имя pod'а> Pod එක හා සම්බන්ධ සිදුවීම් ලැයිස්තුවක් බැලීමට ඔබට ඉඩ සලසයි;
  3. kubectl get pod <имя pod'а> Kubernetes හි ගබඩා කර ඇති පොඩ් එකක YAML වින්‍යාසය ලබා ගැනීමට ඔබට ඉඩ සලසයි;
  4. kubectl exec -ti <имя pod'а> bash පොඩ් බහාලුම් වලින් එකක අන්තර්ක්‍රියාකාරී විධාන කවචයක් දියත් කිරීමට ඔබට ඉඩ සලසයි

ඔබ තෝරාගත යුත්තේ කුමන එකද?

කාරණය නම් විශ්වීය විධානයක් නොමැති බවයි. මේවායේ සංයෝජනයක් භාවිතා කළ යුතුය.

සාමාන්ය කරල් ගැටළු

පොඩ් දෝෂ වල ප්‍රධාන වර්ග දෙකක් තිබේ: ආරම්භක දෝෂ සහ ධාවන කාල දෝෂ.

ආරම්භක දෝෂ:

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

ධාවන කාල දෝෂ:

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

සමහර දෝෂ අනෙක් ඒවාට වඩා බහුලව දක්නට ලැබේ. මෙන්න වඩාත් පොදු දෝෂ කිහිපයක් සහ ඒවා නිවැරදි කරන්නේ කෙසේද.

ImagePullBackOff

Kubernetes හට පොඩ් බහාලුම් වලින් එකක් සඳහා රූපයක් ලබා ගැනීමට නොහැකි වූ විට මෙම දෝෂය සිදු වේ. මේ සඳහා වඩාත් පොදු හේතු තුන මෙන්න:

  1. රූපයේ නම වැරදියි - උදාහරණයක් ලෙස, ඔබ එහි වැරැද්දක් කර ඇත, නැතහොත් රූපය නොපවතී;
  2. රූපය සඳහා නොපවතින ටැගයක් නියම කර ඇත;
  3. රූපය පුද්ගලික ලේඛනයක ගබඩා කර ඇති අතර Kubernetes හට එයට ප්‍රවේශ වීමට අවසර නැත.

පළමු හේතු දෙක ඉවත් කිරීම පහසුය - රූපයේ නම සහ ටැගය නිවැරදි කරන්න. දෙවැන්න නම්, ඔබ රහසිගතව සංවෘත රෙජිස්ට්‍රිය සඳහා අක්තපත්‍ර ඇතුළත් කර එයට සබැඳි එකතු කළ යුතුය. කුබර්නෙට්ස් ලේඛනයේ උදාහරණයක් ඇත මෙය කළ හැක්කේ කෙසේද යන්න.

Crash Loop Back Off

Kubenetes දෝෂයක් ඇති කරයි CrashLoopBackOff, කන්ටේනරය ආරම්භ කළ නොහැකි නම්. මෙය සාමාන්යයෙන් සිදු වන්නේ:

  1. යෙදුම තුළ එය දියත් කිරීම වළක්වන දෝෂයක් ඇත;
  2. කන්ටේනර් වැරදි ලෙස වින්‍යාස කර ඇත;
  3. සජීවී පරීක්ෂණය බොහෝ වාර ගණනක් අසාර්ථක වී ඇත.

එය අසාර්ථක වීමට හේතුව සොයා ගැනීමට ඔබ බහාලුම් වලින් ලොග් වෙත යාමට උත්සාහ කළ යුතුය. කන්ටේනරය ඉතා ඉක්මනින් නැවත ආරම්භ වන නිසා ලොග් වෙත ප්‍රවේශ වීම අපහසු නම්, ඔබට පහත විධානය භාවිතා කළ හැක:

kubectl logs <pod-name> --previous

එය කන්ටේනරයේ පෙර අවතාරයේ දෝෂ පණිවිඩ පෙන්වයි.

RunContainerError

කන්ටේනරය ආරම්භ කිරීමට අසමත් වූ විට මෙම දෝෂය සිදු වේ. එය යෙදුම දියත් කිරීමට පෙර මොහොතට අනුරූප වේ. එය සාමාන්‍යයෙන් සිදුවන්නේ වැරදි සැකසුම් නිසා ය, උදාහරණයක් ලෙස:

  • ConfigMap හෝ Secrets වැනි නොපවතින පරිමාවක් සවි කිරීමට උත්සාහ කිරීම;
  • කියවීමට-ලිවීම ලෙස කියවීමට පමණක් පරිමාවක් සවි කිරීමට උත්සාහයක්.

එවැනි දෝෂ විශ්ලේෂණය කිරීම සඳහා කණ්ඩායම හොඳින් ගැලපේ kubectl describe pod <pod-name>.

කරල් පොරොත්තු තත්වයේ ඇත

නිර්මාණය කළ පසු, කරල් තත්වයේ පවතී Pending.

මෙය සිදු වන්නේ ඇයි?

විය හැකි හේතු මෙන්න (උපකල්පනය කරන්නා හොඳින් ක්‍රියාත්මක වේ යැයි මම උපකල්පනය කරමි):

  1. පොකුරට පොඩ් එක ක්‍රියාත්මක කිරීමට ප්‍රමාණවත් තරම් සම්පත්, සැකසුම් බලය සහ මතකය නැත.
  2. වස්තුව සුදුසු නාම අවකාශයේ ස්ථාපනය කර ඇත ResourceQuota සහ පොඩ් එකක් නිර්මාණය කිරීමෙන් නාම අවකාශය කෝටාවෙන් ඔබ්බට යාමට හේතු වේ.
  3. Pod Pending වලට බැඳී ඇත PersistentVolumeClaim.

මෙම අවස්ථාවේදී, විධානය භාවිතා කිරීම රෙකමදාරු කරනු ලැබේ kubectl describe සහ කොටස පරීක්ෂා කරන්න Events:

kubectl describe pod <pod name>

සම්බන්ධ දෝෂ වලදී ResourceQuotas, විධානය භාවිතයෙන් පොකුරු ලඝු-සටහන් බැලීම නිර්දේශ කෙරේ

kubectl get events --sort-by=.metadata.creationTimestamp

කරල් සූදානම් නැත

පොඩ් ලෙස ලැයිස්තුගත කර ඇත්නම් Running, නමුත් තත්වයක නොවේ Ready, යනු එහි සූදානම පරීක්ෂා කිරීමයි (සූදානම පරීක්ෂණය) අසමත් වේ.

මෙය සිදු වූ විට, පෝඩ් සේවාවට සම්බන්ධ නොවන අතර කිසිදු තදබදයක් එයට ගලා එන්නේ නැත. සූදානම පරීක්ෂා කිරීමේ අසාර්ථකත්වය යෙදුමේ ඇති ගැටළු නිසා සිදු වේ. මෙම අවස්ථාවේදී, දෝෂය සොයා ගැනීමට, ඔබ කොටස විශ්ලේෂණය කළ යුතුය Events විධාන ප්රතිදානය තුළ kubectl describe.

2. සේවා රෝග විනිශ්චය

කරල් ලෙස ලැයිස්තුගත කර ඇත්නම් Running и Ready, නමුත් තවමත් යෙදුමෙන් ප්රතිචාරයක් නොමැත, ඔබ සේවා සැකසුම් පරීක්ෂා කළ යුතුය.

ඒවායේ ලේබල මත පදනම්ව කරල් වෙත ගමනාගමනය මෙහෙයවීම සඳහා සේවා වගකිව යුතුය. එමනිසා, ඔබ කළ යුතු පළමු දෙය නම් සේවාව සමඟ පොඩ් කීයක් ක්‍රියා කරයිද යන්න පරීක්ෂා කිරීමයි. මෙය සිදු කිරීම සඳහා, ඔබට සේවාවේ අවසන් ස්ථාන පරීක්ෂා කළ හැකිය:

kubectl describe service <service-name> | grep Endpoints

අන්ත ලක්ෂ්‍යය යනු පෝරමයේ අගයන් යුගලයකි <IP-адрес:порт>, සහ අවම වශයෙන් එවැනි යුගලයක් ප්‍රතිදානයේ තිබිය යුතුය (එනම්, අවම වශයෙන් එක් පොඩ් එකක් හෝ සේවාව සමඟ ක්‍රියා කරයි).

කොටස නම් Endpoins හිස්, විකල්ප දෙකක් හැකි ය:

  1. නිවැරදි ලේබලය සහිත කරල් නොමැත (ඉඟිය: නාම අවකාශය නිවැරදිව තෝරාගෙන ඇත්දැයි පරීක්ෂා කරන්න);
  2. තේරීම්කාරකයේ සේවා ලේබලවල දෝෂයක් ඇත.

ඔබ අවසන් ලක්ෂ්‍ය ලැයිස්තුවක් දකින නමුත් තවමත් යෙදුමට ප්‍රවේශ විය නොහැකි නම්, වැරදිකරු දෝෂයක් විය හැකිය targetPort සේවා විස්තරයේ.

සේවාවේ ක්රියාකාරිත්වය පරීක්ෂා කරන්නේ කෙසේද?

සේවා වර්ගය කුමක් වුවත්, ඔබට විධානය භාවිතා කළ හැකිය kubectl port-forward එයට සම්බන්ධ වීමට:

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

මෙන්න:

  • <service-name> - සේවා නාමය;
  • 3000 යනු ඔබ පරිගණකයේ විවෘත කරන වරායයි;
  • 80 - සේවා පැත්තේ වරාය.

3. ඇතුල් වීමේ රෝග විනිශ්චය

ඔබ මෙතෙක් කියවා ඇත්නම්, එසේ නම්:

  • කරල් ලෙස ලැයිස්තුගත කර ඇත Running и Ready;
  • සේවාව කරල් අතර ගමනාගමනය සාර්ථකව බෙදා හැරේ.

කෙසේ වෙතත්, ඔබට තවමත් යෙදුම වෙත ළඟා විය නොහැක.

මෙයින් අදහස් කරන්නේ Ingress පාලකය බොහෝ විට නිවැරදිව වින්‍යාස කර නොමැති බවයි. Ingress controller යනු පොකුරේ තෙවන පාර්ශවීය සංරචකයක් වන බැවින්, එහි වර්ගය අනුව විවිධ දෝශ නිරාකරණ ක්‍රම තිබේ.

නමුත් ඔබ Ingress වින්‍යාස කිරීම සඳහා විශේෂ මෙවලම් භාවිතා කිරීමට පෙර, ඔබට ඉතා සරල දෙයක් කළ හැකිය. ඇතුල්වීම භාවිතා කරයි serviceName и servicePort සේවාවට සම්බන්ධ වීමට. ඒවා නිවැරදිව වින්‍යාස කර ඇත්දැයි ඔබ පරීක්ෂා කළ යුතුය. විධානය භාවිතයෙන් ඔබට මෙය කළ හැකිය:

kubectl describe ingress <ingress-name>

තීරුව නම් Backend හිස්, වින්‍යාස දෝෂයක ඉහළ සම්භාවිතාවක් ඇත. පසුබිම් ස්ථානගතව තිබේ නම්, නමුත් යෙදුම තවමත් ප්‍රවේශ විය නොහැකි නම්, ගැටළුව සම්බන්ධ විය හැක්කේ:

  • පොදු අන්තර්ජාලයෙන් ඇතුල්වීමේ ප්‍රවේශ්‍යතා සැකසුම්;
  • පොදු අන්තර්ජාලයෙන් පොකුරු ප්‍රවේශ්‍යතා සැකසුම්.

Ingress Pod වෙත සෘජුවම සම්බන්ධ වීමෙන් ඔබට යටිතල පහසුකම් සමඟ ගැටලු හඳුනා ගත හැක. මෙය සිදු කිරීම සඳහා, පළමුව Ingress Controller Pod එක සොයා ගන්න (එය වෙනත් නාම අවකාශයක විය හැක):

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

විධානය භාවිතා කරන්න describeවරාය සැකසීමට:

kubectl describe pod nginx-ingress-controller-6fc5bcc
--namespace kube-system 
 | grep Ports

අවසාන වශයෙන්, පොඩ් එකට සම්බන්ධ කරන්න:

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

දැන් පරිගණකයේ පෝට් 3000 සඳහා වන සියලුම ඉල්ලීම් පෝඩ් 80 වෙත හරවා යවනු ලැබේ.

දැන් ඒක වැඩද?

  • එසේ නම්, ගැටලුව ඇත්තේ යටිතල පහසුකම්වල ය. පොකුරට රථවාහන ගමන් කරන්නේ කෙසේද යන්න නිවැරදිව සොයා බැලීම අවශ්ය වේ.
  • එසේ නොවේ නම්, ගැටළුව වන්නේ ඇතුල්වීමේ පාලකයේය.

ඔබට Ingress පාලකය ක්‍රියා කිරීමට නොහැකි නම්, ඔබට එය දෝෂහරණය කිරීමට සිදුවේ.

Ingress controller වර්ග බොහොමයක් තිබේ. වඩාත්ම ජනප්රිය වන්නේ Nginx, HAProxy, Traefik, ආදිය. (පවතින විසඳුම් පිළිබඳ වැඩි විස්තර සඳහා, බලන්න අපගේ සමාලෝචනය - ආසන්න වශයෙන්. පරිවර්තනය.) ඔබ අදාල පාලක ලියකියවිලි වල දෝශ නිරාකරණ මාර්ගෝපදේශය වෙත යොමු විය යුතුය. මන්දයත් ඇතුල්වීම Nginx වඩාත්ම ජනප්‍රිය Ingress පාලකය වන අතර, එයට අදාළ ගැටළු විසඳීම සඳහා අපි ලිපියේ උපදෙස් කිහිපයක් ඇතුළත් කර ඇත්තෙමු.

Ingress Nginx පාලකය නිදොස් කිරීම

Ingress-nginx ව්‍යාපෘතියට නිලධාරියෙක් සිටී kubectl සඳහා ප්ලගිනය. කණ්ඩායම kubectl ingress-nginx සඳහා භාවිතා කළ හැක:

  • ලඝු-සටහන්, පසුපෙළ, සහතික, ආදිය විශ්ලේෂණය;
  • ඇතුල්වීම සඳහා සම්බන්ධතා;
  • වත්මන් වින්යාසය අධ්යයනය කිරීම.

පහත දැක්වෙන විධාන තුන මේ සඳහා ඔබට උපකාරී වනු ඇත:

  • kubectl ingress-nginx lint - චෙක්පත් nginx.conf;
  • kubectl ingress-nginx backend - පසුපෙළ ගවේෂණය කරයි (සමාන kubectl describe ingress <ingress-name>);
  • kubectl ingress-nginx logs - ලඝු-සටහන් පරීක්ෂා කරයි.

සමහර අවස්ථාවලදී ඔබට ධජය භාවිතා කරන ඇතුල්වීමේ පාලකය සඳහා නිවැරදි නාම අවකාශය සඳහන් කිරීමට අවශ්‍ය විය හැකි බව සලකන්න. --namespace <name>.

සාරාංශය

ඔබ ආරම්භ කළ යුත්තේ කොතැනින්දැයි නොදන්නේ නම්, Kubernetes දෝශ නිරාකරණය කිරීම අභියෝගාත්මක විය හැක. ඔබ සැමවිටම ගැටලුවට පහළ සිට ප්‍රවේශ විය යුතුය: කරල් වලින් ආරම්භ කරන්න, ඉන්පසු සේවාව සහ ඇතුල්වීම වෙත යන්න. මෙම ලිපියේ විස්තර කර ඇති දෝශ නිරාකරණ ශිල්පීය ක්‍රම වෙනත් වස්තූන් සඳහා යෙදිය හැක, එනම්:

  • idle Jobs සහ CronJobs;
  • StatefulSets සහ DaemonSets.

මම මගේ කෘතඥතාව පළ කරනවා Gergely Risko, ඩැනියෙල් වයිබෙල් и චාල්ස් ක්‍රිස්ටිරාජ් වටිනා අදහස් සහ එකතු කිරීම් සඳහා.

පරිවර්තකගෙන් PS

අපගේ බ්ලොග් අඩවියේ ද කියවන්න:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න