Kubernetes وتنسيق الحاويات
إتقان استكشاف أخطاء Kubernetes
4 دقيقة للقراءة
مهارات استكشاف الأخطاء هي ما يستخدمه المقابلون لتحديد المرشحين الكبار. دعنا نتقن النهج المنظم.
إطار استكشاف الأخطاء
1. اجمع المعلومات
kubectl describe, logs, events
2. حدد الطبقة
التطبيق → Pod → العقدة → الكلستر
3. شكّل فرضية
بناءً على رسائل الأخطاء والأعراض
4. اختبر وتحقق
أصلح → اختبر → وثّق
استكشاف أخطاء Pod
حالات Pod وماذا تعني
| الحالة | الأسباب الشائعة | الخطوات الأولى |
|---|---|---|
| Pending | لا موارد، affinity، PVC | kubectl describe pod |
| ImagePullBackOff | صورة خاطئة، مصادقة، سجل | تحقق من اسم الصورة، الأسرار |
| CrashLoopBackOff | التطبيق يتعطل عند البدء | kubectl logs, kubectl logs --previous |
| OOMKilled | تجاوز الذاكرة | زد الحدود أو أصلح التسرب |
| Evicted | ضغط موارد العقدة | تحقق من موارد العقدة |
أوامر التصحيح
# الحالة الأساسية
kubectl get pod <name> -o wide
# معلومات مفصلة
kubectl describe pod <name>
# السجلات الحالية
kubectl logs <name> -c <container>
# سجلات الحاوية السابقة (بعد التعطل)
kubectl logs <name> --previous
# تتبع السجلات
kubectl logs -f <name>
# جميع الحاويات في pod
kubectl logs <name> --all-containers
# التنفيذ في الحاوية
kubectl exec -it <name> -- /bin/sh
# للصور distroless
kubectl debug -it <name> --image=busybox --target=<container>
الغوص العميق في CrashLoopBackOff
# الخطوة 1: تحقق من الحالة الحالية
kubectl describe pod <name> | grep -A10 "State:"
# الخطوة 2: تحقق من كود الخروج
kubectl describe pod <name> | grep "Exit Code"
# Exit 1: خطأ التطبيق
# Exit 137: OOMKilled (128 + 9 SIGKILL)
# Exit 143: SIGTERM (128 + 15)
# الخطوة 3: تحقق من السجلات السابقة
kubectl logs <name> --previous
# الخطوة 4: تحقق من الأحداث
kubectl get events --field-selector involvedObject.name=<name>
# الخطوة 5: تصحيح الحاوية
kubectl run debug --rm -it --image=busybox -- /bin/sh
استكشاف أخطاء العقدة
شروط العقدة
# تحقق من حالة العقدة
kubectl get nodes
# معلومات العقدة المفصلة
kubectl describe node <name>
# الشروط الرئيسية للتحقق:
# Ready - العقدة سليمة
# MemoryPressure - نفاد الذاكرة
# DiskPressure - نفاد القرص
# PIDPressure - الكثير من العمليات
# NetworkUnavailable - الشبكة غير مُعدة
العقدة Not Ready
# الخطوة 1: تحقق من kubelet
ssh node1 "systemctl status kubelet"
ssh node1 "journalctl -u kubelet --since '5 minutes ago'"
# الخطوة 2: تحقق من وقت تشغيل الحاوية
ssh node1 "systemctl status containerd"
ssh node1 "crictl ps"
# الخطوة 3: تحقق من الموارد
ssh node1 "free -h && df -h"
# الخطوة 4: تحقق من الشبكة
ssh node1 "ping -c3 <control-plane-ip>"
استكشاف أخطاء Service والشبكات
Service لا تعمل
# الخطوة 1: تحقق من وجود service ولديها endpoints
kubectl get svc <name>
kubectl get endpoints <name>
# الخطوة 2: تحقق إذا كانت pods تطابق selector
kubectl get pods -l <selector-labels>
# الخطوة 3: اختبر من داخل الكلستر
kubectl run test --rm -it --image=busybox -- wget -qO- http://<service>:<port>
# الخطوة 4: تحقق من kube-proxy
kubectl logs -n kube-system -l k8s-app=kube-proxy
# الخطوة 5: تحقق من DNS
kubectl run test --rm -it --image=busybox -- nslookup <service>
مشاكل DNS
# تحقق من pods CoreDNS
kubectl get pods -n kube-system -l k8s-app=kube-dns
# تحقق من سجلات CoreDNS
kubectl logs -n kube-system -l k8s-app=kube-dns
# اختبر حل DNS
kubectl run test --rm -it --image=busybox -- nslookup kubernetes.default
# تحقق من /etc/resolv.conf في pod
kubectl exec <pod> -- cat /etc/resolv.conf
استكشاف أخطاء التخزين
PVC Pending
# تحقق من حالة PVC
kubectl get pvc
kubectl describe pvc <name>
# المشاكل الشائعة:
# - لا يوجد StorageClass مطابق
# - تخزين غير كافٍ
# - عدم تطابق وضع الوصول
# - Node affinity مع التخزين
# تحقق من storage class
kubectl get sc
# تحقق من توفر PV
kubectl get pv
سيناريوهات المقابلة
س: "Pods تعمل لكن المستخدمين يبلغون عن أخطاء 502. كيف تحقق؟"
# 1. تحقق إذا كانت pods جاهزة
kubectl get pods -l app=web
# انظر عمود READY: يجب أن يكون 1/1
# 2. تحقق من readiness probe
kubectl describe pod <name> | grep -A5 "Readiness"
# 3. تحقق من endpoints الـ service
kubectl get endpoints web-service
# Endpoints فارغة = لا pods جاهزة
# 4. تحقق من ingress
kubectl describe ingress web-ingress
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
# 5. اختبر مباشرة
kubectl port-forward pod/<name> 8080:8080
curl localhost:8080
س: "طرح deployment عالق. ماذا تفعل؟"
# تحقق من حالة الطرح
kubectl rollout status deployment/<name>
# انظر أحداث deployment
kubectl describe deployment <name>
# تحقق من replicasets
kubectl get rs -l app=<name>
# المشاكل الشائعة:
# - Pods الجديدة تفشل في readiness
# - تجاوز حصة الموارد
# - PodDisruptionBudget يحظر
# تراجع إذا لزم
kubectl rollout undo deployment/<name>
# أو لمراجعة محددة
kubectl rollout undo deployment/<name> --to-revision=2
س: "الكلستر يعمل ببطء. كيف تحدد الاختناق؟"
# 1. تحقق من control plane
kubectl get componentstatuses # مُهمل لكن يعمل أحياناً
kubectl get pods -n kube-system
# 2. تحقق من زمن استجابة API server
kubectl get --raw /metrics | grep apiserver_request_duration
# 3. تحقق من etcd
kubectl exec -n kube-system etcd-master -- etcdctl endpoint status
# 4. تحقق من موارد العقدة
kubectl top nodes
kubectl top pods --all-namespaces | sort -k3 -rn | head
# 5. تحقق من ضغط الموارد
kubectl get nodes -o custom-columns=NAME:.metadata.name,MEMORY:.status.conditions[?(@.type==\"MemoryPressure\")].status
لقد أتقنت Kubernetes! الوحدة التالية: المراقبة والملاحظة والاستجابة للحوادث—مهارات الإنتاج التي تُعرّف SRE. :::