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

اختبار

الوحدة 4: Kubernetes وتنسيق الحاويات

خذ الاختبار