
یه زمانی Debug کردن یعنی “یه بار ریستارت کن، درست میشه”…
الان تو Kubernetes؟
ریستارت میکنی، دوباره همون آش، همون کاسه… فقط با downtime بیشتر 😅
Pod چرا CrashLoopBackOff شده؟
چرا Pending مونده و بالا نمیاد؟
چرا سرویس 5xx میده ولی Podها “Running” هستن؟
چرا یه Node خاص همهچی رو خراب میکنه؟
چرا “هیچی تو log نیست” ولی کار نمیکنه؟
خب… اینجا kubectl get pods فقط در حد تابلو ورودی ساختمونه.
اصل داستان تو سهتا چیزه: logs / describe / events.
kubectl logs <pod>
kubectl logs <pod> -c <container>
kubectl logs <pod> -c <container> --previous
kubectl logs -f <pod> -c <container>
نکتهی بازار/واقعیت: خیلی وقتا “مشکل Kubernetes نیست”، مشکل اپلیکیشنه که تو startup میترکه.--previous دقیقاً همون لحظهی ترکیدن رو میده.
اگه فقط یه چیز رو حفظ کنی، اینه:
kubectl describe pod <pod>
اینجا دنبال اینا بگرد:
Status / Reason (مثلاً OOMKilled، ImagePullBackOff)
Readiness/Liveness probe (خیلی وقتا خودت با probe داری میزنیش زمین)
Node که روش schedule شده
Events پایین خروجی (طلای خالص)
برای Deployment هم:
kubectl describe deploy <name>
و ReplicaSet:
kubectl describe rs <name>
متافور ساده: get میگه “ماشین روشنه یا نه”،describe میگه “چرا چراغ چک موتور روشنه” 🚗💡
وقتی همهچی گیجکنندهست، Events کمک میکنه بفهمی آخرین حرکت چی بوده.
kubectl get events --sort-by=.metadata.creationTimestamp
(دو روش)
روش 1: از describe پایینش
kubectl describe pod <pod>
روش 2: با field selector
kubectl get events --field-selector involvedObject.name=<pod> \ --sort-by=.metadata.creationTimestamp
چیزایی که زیاد میبینی:
FailedScheduling (کمبود resource، taint/toleration، affinity…)
FailedMount (PVC/secret/configmap)
Back-off pulling image (registry/credentials/tag)
Killing (probe fail، OOM، eviction)
وقتی Pod بالا میاد ولی سرویس خرابه، میری داخلش.
kubectl exec -it <pod> -c <container> -- sh
یا اگه bash داره:
kubectl exec -it <pod> -c <container> -- bash
چکهای کلاسیک داخل container:
DNS:
nslookup <service>
شبکه/HTTP:
curl -v http://<service>:<port>/health
env vars:
printenv | sort
واقعیت تلخ ولی مهم: خیلی از imageهای production “distroless” هستن و shell ندارن.
اونجاست که میرسی به مرحلهی بعد…
وقتی container اصلی ابزار نداره (نه curl، نه sh)، یه debug container موقت میچسبونی به همون Pod.
نیاز به Kubernetes نسخه/کانفیگ مناسب داره (اکثراً الان اوکیه)، ولی اگه نداشتی، حداقل بدون مفهومش چیه
kubectl debug -it <pod> --image=busybox \ --target=<container> -- sh
یا با image قویتر:
kubectl debug -it <pod> --image=nicolaka/netshoot --target=<container>
چرا این خوبه؟
چون بدون دست زدن به image اصلی، ابزار دیباگ داری: curl, dig, tcpdump, …
kubectl get pods -o wide
کدوم Podها مشکل دارن؟
روی کدوم Node افتادن؟
kubectl describe pod <pod>
Reason چیه؟ (ImagePull? OOM? Scheduling?)
پایینش Events چی میگه؟
kubectl logs <pod> -c <container> --previous
exception؟
config missing؟
connection refused به یه dependency؟
kubectl get events --sort-by=.metadata.creationTimestamp | tail -n 30
FailedMount؟
FailedScheduling؟
probe failing؟
kubectl exec -it <pod> -c <container> -- sh
یا اگر نشد:
kubectl debug -it <pod> --image=nicolaka/netshoot --target=<container>
curl به dependencyها
nslookup سرویسها
چک env vars / config
kubectl یه “get pods machine” نیست.
یه جعبهابزار دیباگه که اگه درست استفادهاش کنی، ۵ دقیقهای از تاریکی میآی بیرون.
اگه دوست داری، تو کامنت بگو بیشتر با CrashLoop درگیری یا Pending یا Network/Ingress؟