نوٹ. ترجمہ: یہ مضمون عوامی ڈومین میں شائع ہونے والے پروجیکٹ مواد کا حصہ ہے۔ , تربیتی کمپنیوں اور انفرادی منتظمین کو Kubernetes کے ساتھ کام کرنے کے لیے۔ اس میں، ڈینیئل پولینسک، پروجیکٹ مینیجر، بصری ہدایات شیئر کرتے ہیں کہ K8s کلسٹر پر چلنے والی ایپلی کیشنز کے ساتھ عام مسائل کی صورت میں کیا اقدامات کیے جائیں۔

TL;DR: یہاں ایک خاکہ ہے جو آپ کو کبرنیٹس میں ڈیبگ تعیناتی میں مدد کرے گا۔
کلسٹر میں غلطیوں کو تلاش کرنے اور ٹھیک کرنے کے لیے فلو چارٹ۔ اصل (انگریزی میں) پر دستیاب ہے۔ и .
Kubernetes پر ایپلیکیشن تعینات کرتے وقت، عام طور پر تین اجزاء ہوتے ہیں جن کی آپ کو وضاحت کرنے کی ضرورت ہوتی ہے:
- تعیناتی - یہ ایپلی کیشن کی کاپیاں بنانے کا ایک قسم کا نسخہ ہے، جسے پوڈ کہتے ہیں۔
- سروس - اندرونی بوجھ بیلنسر جو پھلیوں کے درمیان ٹریفک کو تقسیم کرتا ہے۔
- لاگ ان - بیرونی دنیا سے سروس تک ٹریفک کیسے آئے گا اس کی تفصیل۔
یہاں ایک فوری گرافیکل خلاصہ ہے:
1) Kubernetes میں، ایپلی کیشنز لوڈ بیلنسرز کی دو تہوں کے ذریعے بیرونی دنیا سے ٹریفک وصول کرتی ہیں: اندرونی اور بیرونی۔

2) اندرونی توازن کو سروس کہا جاتا ہے، بیرونی کو Ingress کہا جاتا ہے۔

3) تعیناتی پوڈ بناتی ہے اور ان کی نگرانی کرتی ہے (وہ دستی طور پر نہیں بنائے جاتے ہیں)۔

ہم کہتے ہیں کہ آپ ایک سادہ ایپلیکیشن a la کو تعینات کرنا چاہتے ہیں۔ ہیلو ورلڈ. اس کے لیے 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: /تعریف کافی لمبی ہے اور یہ الجھن میں پڑنا آسان ہے کہ اجزاء کا ایک دوسرے سے کیا تعلق ہے۔
مثال کے طور پر:
- آپ کو پورٹ 80 کب استعمال کرنا چاہیے اور 8080 کب استعمال کرنا چاہیے؟
- کیا مجھے ہر سروس کے لیے ایک نیا پورٹ بنانا چاہیے تاکہ وہ تنازعہ نہ کریں؟
- کیا لیبل کے نام اہم ہیں؟ کیا انہیں ہر جگہ ایک جیسا ہونا چاہیے؟
ڈیبگنگ پر توجہ مرکوز کرنے سے پہلے، آئیے یاد رکھیں کہ تینوں اجزاء ایک دوسرے سے کیسے متعلق ہیں۔ آئیے تعیناتی اور سروس کے ساتھ شروع کرتے ہیں۔
تعیناتی اور سروس کے درمیان تعلق
آپ حیران ہوں گے، لیکن تعیناتیاں اور خدمات کسی بھی طرح سے منسلک نہیں ہیں۔ اس کے بجائے، سروس تعیناتی کو نظرانداز کرتے ہوئے براہ راست پوڈز کی طرف اشارہ کرتی ہے۔
اس طرح، ہم اس بات میں دلچسپی رکھتے ہیں کہ پوڈس اور سروسز کا ایک دوسرے سے کیا تعلق ہے۔ تین چیزیں یاد رکھیں:
- سلیکٹر (
selectorسروس کے لیے کم از کم ایک پوڈ لیبل سے مماثل ہونا چاہیے۔ -
targetPortملنا چاہئےcontainerPortپوڈ کے اندر کنٹینر. -
portخدمت کچھ بھی ہو سکتی ہے۔ مختلف سروسز ایک ہی پورٹ استعمال کر سکتی ہیں کیونکہ ان کے مختلف IP پتے ہیں۔
مندرجہ ذیل خاکہ گرافیکل شکل میں مندرجہ بالا سبھی کی نمائندگی کرتا ہے:
1) تصور کریں کہ سروس ٹریفک کو کسی خاص پوڈ کی طرف لے جاتی ہے:

2) پوڈ بناتے وقت، آپ کو ضرور بتانا چاہیے۔ containerPort پھلیوں میں ہر کنٹینر کے لئے:

3) سروس بناتے وقت، آپ کو بتانا ضروری ہے۔ port и targetPort. لیکن کنٹینر سے جڑنے کے لیے کون سا استعمال ہوتا ہے؟

4) کے ذریعے targetPort. یہ میچ ہونا چاہئے containerPort.

5) مان لیں کہ پورٹ 3000 کنٹینر میں کھلا ہے۔ پھر ویلیو targetPort ایک ہی ہونا چاہئے.

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?
یہ ہمیشہ پوڈ کے لیبلز سے مماثل ہونا چاہیے۔چونکہ یہ تعیناتی کے ذریعے پوڈس کو ٹریک کرنے کے لیے استعمال کیا جاتا ہے۔
آئیے فرض کریں کہ آپ نے درست ترامیم کی ہیں۔ انہیں کیسے چیک کریں؟
آپ پوڈ لیبل کو درج ذیل کمانڈ سے چیک کر سکتے ہیں۔
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 کو ترتیب دینے سے متعلق ہے۔ Ingress کو یہ جاننے کی ضرورت ہے کہ سروس کیسے تلاش کی جائے، پھر پوڈز تلاش کریں اور ان پر براہ راست ٹریفک کریں۔ Ingress نام اور کھلی بندرگاہ کے ذریعہ مطلوبہ خدمت تلاش کرتا ہے۔
Ingress اور Service کی تفصیل میں دو پیرامیٹرز کا مماثل ہونا ضروری ہے:
-
servicePortIngress میں پیرامیٹر سے مماثل ہونا ضروری ہے۔portسروس میں؛ -
serviceNameIngress میدان سے مماثل ہونا ضروری ہےnameسروس میں.
درج ذیل خاکہ پورٹ کنکشن کا خلاصہ کرتا ہے:
1) جیسا کہ آپ پہلے ہی جانتے ہیں، سروس ایک خاص بات سنتی ہے۔ port:

2) Ingress نامی ایک پیرامیٹر ہے۔ servicePort:

3) یہ پیرامیٹر (servicePort) ہمیشہ مماثل ہونا چاہئے۔ port سروس کی تعریف میں:

4) اگر سروس میں پورٹ 80 کی وضاحت کی گئی ہے، تو یہ ضروری ہے۔ servicePort 80 کے برابر بھی تھا:

عملی طور پر، آپ کو مندرجہ ذیل لائنوں پر توجہ دینے کی ضرورت ہے:
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 کنٹرولر سے جڑنے کی ضرورت ہے۔
پہلے آپ کو 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 پر بھیج دیا جائے گا۔ کے پاس جا کر ، آپ کو درخواست کے ذریعہ تیار کردہ صفحہ دیکھنا چاہئے۔
بندرگاہوں کا خلاصہ
آئیے ایک بار پھر یاد رکھیں کہ کن بندرگاہوں اور لیبلز کا مماثل ہونا ضروری ہے:
- سروس کی تعریف میں سلیکٹر کا پوڈ کے لیبل سے مماثل ہونا چاہیے۔
-
targetPortتعریف میں سروس کا مماثل ہونا ضروری ہے۔containerPortپھلی کے اندر کنٹینر؛ -
portتعریف میں سروس کچھ بھی ہو سکتی ہے۔ مختلف سروسز ایک ہی پورٹ استعمال کر سکتی ہیں کیونکہ ان کے مختلف IP پتے ہیں۔ -
servicePortداخل ہونا ضروری ہے۔portسروس کی تعریف میں؛ - سروس کا نام فیلڈ سے مماثل ہونا چاہیے۔
serviceNameداخلے میں
بدقسمتی سے، یہ جاننا کافی نہیں ہے کہ YAML کنفیگریشن کو صحیح طریقے سے کیسے بنایا جائے۔
جب چیزیں غلط ہوجاتی ہیں تو کیا ہوتا ہے؟
پھلی شروع نہیں ہوسکتی ہے یا یہ گر سکتی ہے۔
Kubernetes میں درخواست کے مسائل کی تشخیص کے لیے 3 اقدامات
اپنی تعیناتی کو ڈیبگ کرنا شروع کرنے سے پہلے، آپ کو یہ اچھی طرح سمجھنا ہوگا کہ Kubernetes کیسے کام کرتا ہے۔
چونکہ K8s میں ڈاؤن لوڈ کی گئی ہر ایپلیکیشن میں تین اجزاء ہوتے ہیں، اس لیے انہیں ایک خاص ترتیب میں ڈیبگ کیا جانا چاہیے، بالکل نیچے سے شروع ہو کر۔
- پہلے آپ کو یہ یقینی بنانا ہوگا کہ پوڈ کام کر رہے ہیں، پھر...
- چیک کریں کہ آیا سروس پوڈز کو ٹریفک فراہم کرتی ہے، اور پھر...
- چیک کریں کہ آیا داخلے کو صحیح طریقے سے ترتیب دیا گیا ہے۔
بصری نمائندگی:
1) آپ کو نیچے سے مسائل کی تلاش شروع کرنی چاہیے۔ سب سے پہلے چیک کریں کہ پوڈ کے سٹیٹس ہیں۔ Ready и Running:

2) اگر پھلیاں تیار ہیں (Ready)، آپ کو یہ معلوم کرنا چاہیے کہ آیا سروس pods کے درمیان ٹریفک کو تقسیم کرتی ہے:

3) آخر میں، آپ کو خدمت اور داخلے کے درمیان تعلق کا تجزیہ کرنے کی ضرورت ہے:

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تاہم، یہ دوسرے دو کے لیے ایسا نہیں ہے۔
کیسے سمجھیں کہ کیا غلط ہوا؟
پوڈ کی تشخیص کے لیے چار مفید حکم ہیں:
-
kubectl logs <имя pod'а>آپ کو پوڈ میں کنٹینرز سے لاگز نکالنے کی اجازت دیتا ہے؛ -
kubectl describe pod <имя pod'а>آپ کو پوڈ سے وابستہ واقعات کی فہرست دیکھنے کی اجازت دیتا ہے۔ -
kubectl get pod <имя pod'а>آپ کو Kubernetes میں ذخیرہ شدہ پوڈ کی YAML کنفیگریشن حاصل کرنے کی اجازت دیتا ہے۔ -
kubectl exec -ti <имя pod'а> bashآپ کو پوڈ کنٹینرز میں سے ایک میں ایک انٹرایکٹو کمانڈ شیل لانچ کرنے کی اجازت دیتا ہے۔
آپ کو کون سا انتخاب کرنا چاہئے؟
حقیقت یہ ہے کہ کوئی عالمگیر حکم نہیں ہے۔ ان کا ایک مجموعہ استعمال کیا جانا چاہئے.
عام پھلی کے مسائل
پوڈ کی غلطیوں کی دو اہم قسمیں ہیں: اسٹارٹ اپ کی غلطیاں اور رن ٹائم کی غلطیاں۔
آغاز کی خرابیاں:
-
ImagePullBackoff -
ImageInspectError -
ErrImagePull -
ErrImageNeverPull -
RegistryUnavailable -
InvalidImageName
رن ٹائم کی خرابیاں:
-
CrashLoopBackOff -
RunContainerError -
KillContainerError -
VerifyNonRootError -
RunInitContainerError -
CreatePodSandboxError -
ConfigPodSandboxError -
KillPodSandboxError -
SetupNetworkError -
TeardownNetworkError
کچھ غلطیاں دوسروں سے زیادہ عام ہیں۔ یہاں کچھ سب سے عام غلطیاں ہیں اور انہیں کیسے ٹھیک کیا جائے۔
امیج پل بیک آف
یہ خرابی اس وقت ظاہر ہوتی ہے جب Kubernetes پوڈ کنٹینرز میں سے ایک کے لیے تصویر حاصل کرنے سے قاصر ہوتا ہے۔ یہاں اس کی تین سب سے عام وجوہات ہیں:
- تصویر کا نام غلط ہے - مثال کے طور پر، آپ نے اس میں غلطی کی ہے، یا تصویر موجود نہیں ہے؛
- تصویر کے لیے ایک غیر موجود ٹیگ متعین کیا گیا تھا۔
- تصویر نجی رجسٹری میں محفوظ ہے اور Kubernetes کو اس تک رسائی کی اجازت نہیں ہے۔
پہلی دو وجوہات کو ختم کرنا آسان ہے - صرف تصویر کا نام اور ٹیگ درست کریں۔ مؤخر الذکر کی صورت میں، آپ کو سیکریٹ میں بند رجسٹری کے لیے اسناد داخل کرنے اور پوڈز میں اس کے لنکس شامل کرنے کی ضرورت ہے۔ Kubernetes دستاویزات میں یہ کیسے کیا جا سکتا ہے.
کریش لوپ بیک آف
Kubenetes ایک غلطی پھینکتا ہے۔ CrashLoopBackOff، اگر کنٹینر شروع نہیں ہوسکتا ہے۔ یہ عام طور پر ہوتا ہے جب:
- ایپلی کیشن میں ایک بگ ہے جو اسے شروع ہونے سے روکتا ہے۔
- کنٹینر ;
- Liveness ٹیسٹ بہت بار ناکام ہو چکا ہے۔
اس کی ناکامی کی وجہ جاننے کے لیے آپ کو کنٹینر سے لاگز تک پہنچنے کی کوشش کرنی چاہیے۔ اگر لاگز تک رسائی مشکل ہے کیونکہ کنٹینر بہت تیزی سے دوبارہ شروع ہوتا ہے، تو آپ درج ذیل کمانڈ استعمال کر سکتے ہیں:
kubectl logs <pod-name> --previousیہ کنٹینر کے پچھلے اوتار سے غلطی کے پیغامات دکھاتا ہے۔
RunContainerError
یہ خرابی اس وقت ہوتی ہے جب کنٹینر شروع ہونے میں ناکام ہوجاتا ہے۔ یہ ایپلیکیشن لانچ ہونے سے پہلے کے لمحے سے مطابقت رکھتا ہے۔ یہ عام طور پر غلط ترتیبات کی وجہ سے ہوتا ہے، مثال کے طور پر:
- غیر موجود والیوم کو ماؤنٹ کرنے کی کوشش کرنا جیسے ConfigMap یا Secrets؛
- صرف پڑھنے کے حجم کو پڑھنے لکھنے کے طور پر ماؤنٹ کرنے کی کوشش۔
ٹیم ایسی غلطیوں کا تجزیہ کرنے کے لیے موزوں ہے۔ kubectl describe pod <pod-name>.
پوڈز زیر التواء حالت میں ہیں۔
ایک بار بننے کے بعد، پھلی حالت میں رہتی ہے۔ Pending.
ایسا کیوں ہوتا ہے؟
یہاں ممکنہ وجوہات ہیں (میں فرض کر رہا ہوں کہ شیڈولر ٹھیک کام کر رہا ہے):
- پوڈ کو چلانے کے لیے کلسٹر کے پاس اتنے وسائل نہیں ہیں، جیسے پروسیسنگ پاور اور میموری۔
- آبجیکٹ مناسب نام کی جگہ پر انسٹال ہے۔
ResourceQuotaاور پوڈ بنانے سے نام کی جگہ کوٹہ سے آگے بڑھ جائے گی۔ - 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 خالی، دو اختیارات ممکن ہیں:
- صحیح لیبل کے ساتھ کوئی پوڈ نہیں ہے (اشارہ: چیک کریں کہ آیا نام کی جگہ صحیح طریقے سے منتخب ہوئی ہے)؛
- سلیکٹر میں سروس لیبلز میں ایک خرابی ہے۔
اگر آپ کو اختتامی پوائنٹس کی فہرست نظر آتی ہے لیکن پھر بھی آپ ایپلی کیشن تک رسائی حاصل نہیں کر سکتے ہیں، تو ممکنہ طور پر مجرم ایک بگ ہے targetPort سروس کی تفصیل میں۔
سروس کی فعالیت کو کیسے چیک کریں؟
سروس کی قسم سے قطع نظر، آپ کمانڈ استعمال کر سکتے ہیں۔ kubectl port-forward اس سے جڑنے کے لیے:
kubectl port-forward service/<service-name> 3000:80یہاں:
-
<service-name>- سروس کا نام؛ - 3000 وہ پورٹ ہے جسے آپ کمپیوٹر پر کھولتے ہیں۔
- 80 - سروس سائیڈ پر پورٹ۔
3. داخلی تشخیص
اگر آپ نے یہ اب تک پڑھا ہے تو:
- pods کے طور پر درج ہیں
RunningиReady; - سروس کامیابی سے ٹریفک کو پوڈز میں تقسیم کرتی ہے۔
تاہم، آپ اب بھی ایپ تک نہیں پہنچ سکتے۔
اس کا مطلب یہ ہے کہ Ingress کنٹرولر زیادہ تر ممکنہ طور پر صحیح طریقے سے ترتیب نہیں دیا گیا ہے۔ چونکہ Ingress کنٹرولر کلسٹر میں فریق ثالث کا جزو ہے، اس لیے اس کی قسم کے لحاظ سے ڈیبگنگ کے مختلف طریقے ہیں۔
لیکن اس سے پہلے کہ آپ Ingress کو ترتیب دینے کے لیے خصوصی ٹولز کا سہارا لیں، آپ کچھ بہت آسان کر سکتے ہیں۔ Ingress استعمال کرتا ہے serviceName и servicePort سروس سے منسلک کرنے کے لئے. آپ کو یہ چیک کرنے کی ضرورت ہے کہ آیا وہ صحیح طریقے سے تشکیل شدہ ہیں۔ آپ کمانڈ کا استعمال کرتے ہوئے یہ کر سکتے ہیں:
kubectl describe ingress <ingress-name> اگر کالم Backend خالی، ترتیب کی خرابی کا زیادہ امکان ہے۔ اگر بیک اینڈ اپنی جگہ پر ہیں، لیکن ایپلیکیشن ابھی تک قابل رسائی نہیں ہے، تو پھر مسئلہ اس سے متعلق ہو سکتا ہے:
- عوامی انٹرنیٹ سے رسائی کی ترتیبات میں داخل ہونا؛
- عوامی انٹرنیٹ سے کلسٹر رسائی کی ترتیبات۔
آپ انگریس پوڈ سے براہ راست جڑ کر انفراسٹرکچر کے مسائل کی نشاندہی کر سکتے ہیں۔ ایسا کرنے کے لیے، پہلے 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 کنٹرولر کو کام کرنے کے لیے حاصل نہیں کر سکتے ہیں، تو آپ کو اسے ڈیبگ کرنا پڑے گا۔
Ingress کنٹرولرز کی بہت سی قسمیں ہیں۔ سب سے زیادہ مقبول ہیں Nginx، HAProxy، Traefik، وغیرہ۔ (موجودہ حل کے بارے میں مزید معلومات کے لیے، دیکھیں - تقریبا. ترجمہ) آپ کو متعلقہ کنٹرولر دستاویزات میں ٹربل شوٹنگ گائیڈ سے رجوع کرنا چاہیے۔ کیونکہ سب سے زیادہ مقبول Ingress کنٹرولر ہے، ہم نے اس سے متعلق مسائل کو حل کرنے کے لیے مضمون میں کچھ نکات شامل کیے ہیں۔
Ingress Nginx کنٹرولر کو ڈیبگ کرنا
Ingress-nginx پروجیکٹ کا ایک اہلکار ہے۔ . ٹیم kubectl ingress-nginx کے لئے استعمال کیا جا سکتا ہے:
- لاگز، بیک اینڈ، سرٹیفکیٹ وغیرہ کا تجزیہ؛
- داخلے سے کنکشن؛
- موجودہ ترتیب کا مطالعہ.
درج ذیل تین احکامات اس میں آپ کی مدد کریں گے۔
-
kubectl ingress-nginx lint--.چیکnginx.conf; -
kubectl ingress-nginx backend- پسدید کو دریافت کرتا ہے (کی طرحkubectl describe ingress <ingress-name>); -
kubectl ingress-nginx logs- نوشتہ جات کو چیک کرتا ہے۔
نوٹ کریں کہ کچھ معاملات میں آپ کو جھنڈے کا استعمال کرتے ہوئے Ingress کنٹرولر کے لیے صحیح نام کی جگہ بتانے کی ضرورت پڑ سکتی ہے۔ --namespace <name>.
خلاصہ
اگر آپ نہیں جانتے ہیں کہ کہاں سے شروع کرنا ہے تو Kubernetes کا ازالہ کرنا مشکل ہو سکتا ہے۔ آپ کو ہمیشہ نیچے سے اوپر والے طریقے سے مسئلہ سے رجوع کرنا چاہیے: پوڈز سے شروع کریں، اور پھر سروس اور انگریس پر جائیں۔ اس مضمون میں بیان کردہ ڈیبگنگ تکنیکوں کو دیگر اشیاء پر لاگو کیا جا سکتا ہے، جیسے:
- بیکار نوکریاں اور کرون جابس؛
- اسٹیٹفول سیٹس اور ڈیمون سیٹس۔
میں اظہار تشکر کرتا ہوں۔ , и قیمتی تبصرے اور اضافے کے لیے۔
مترجم سے PS
ہمارے بلاگ پر بھی پڑھیں:
- «؛ "
- «؛ "
- «؛ "
- «'.
ماخذ: www.habr.com
