تخطَّ إلى المحتوى

Pods

بنهاية هذا الدرس ستعرف كيف تنشئ Pod، تفحص حالته، تقرأ logs، تدخل إلى container، وتفهم لماذا لا نعتمد على Pod وحده في Production.

Pod هو أصغر وحدة تشغيل في Kubernetes. غالبا يحتوي container واحد، وأحيانا يحتوي أكثر من container لو كانوا يحتاجون نفس الشبكة ونفس التخزين المؤقت.

لو عندك تطبيق API بسيط، فإن Kubernetes يشغله داخل Pod. لو مات هذا Pod، Deployment ينشئ Pod جديد. ولو تغير اسم Pod، Service يظل يعطيك عنوان ثابت للتطبيق.

flowchart LR
U[User] --> S[Service]
S --> P1[Pod api-1]
S --> P2[Pod api-2]
D[Deployment] --> P1
D --> P2

أنشئ ملف pod.yaml:

apiVersion: v1
kind: Pod
metadata:
name: hello-pod
namespace: default
labels:
app: hello
tier: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- name: http
containerPort: 80
resources:
requests:
cpu: "50m"
memory: "64Mi"
limits:
cpu: "250m"
memory: "128Mi"

شرح سريع:

الجزءالمعنى
apiVersionإصدار API المستخدم لهذا النوع من الموارد
kindنوع المورد، هنا Pod
metadata.nameاسم Pod داخل namespace
labelsعلامات تساعد Service و commands على اختيار Pod
containersقائمة containers التي تعمل داخل Pod
resourcesأقل موارد مطلوبة وحد أقصى مسموح
Terminal window
kubectl apply -f pod.yaml
kubectl get pods -l app=hello
kubectl describe pod hello-pod
kubectl logs hello-pod
kubectl exec -it hello-pod -- sh

Expected output:

pod/hello-pod created
NAME READY STATUS RESTARTS AGE
hello-pod 1/1 Running 0 10s

لو دخلت إلى container، اختبر Nginx:

Terminal window
wget -qO- http://127.0.0.1
exit

Expected output مختصر:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
الحالةالمعنىأول أمر للتشخيص
Pendingscheduler لم يجد Node مناسب أو image pull لم يبدأkubectl describe pod hello-pod
RunningPod يعملkubectl logs hello-pod
CrashLoopBackOffcontainer يبدأ ثم يقع مراراkubectl logs hello-pod --previous
ImagePullBackOffKubernetes لا يستطيع سحب imagekubectl describe pod hello-pod
ContainerCreatingruntime يجهز container أو volumekubectl describe pod hello-pod
الخطأالسبب المحتملالحل
ImagePullBackOffاسم image خطأ أو registry يحتاج صلاحياتصحح image أو أضف imagePullSecrets
CrashLoopBackOffالأمر داخل container يفشلاقرأ logs --previous وعدل command أو config
Pod لا يستقبل trafficلا يوجد Service أو label selector غير مطابقراجع labels والـ Service selector
Pod يظل Pendingresources requests أكبر من المتاحقلل requests أو أضف Node

Lab: تشغيل وفحص أول Pod

المستوى: مبتدئ الوقت: 30 دقيقة الأدوات: kubectl

الهدف: إنشاء Pod من Nginx، فحص حالته، قراءة logs، ثم تنظيف الموارد.

  • Cluster محلي يعمل، مثل kind أو minikube.
  • kubectl get nodes يرجع Node واحد على الأقل بحالة Ready.
  1. احفظ YAML السابق في ملف pod.yaml.
  2. طبق الملف:
Terminal window
kubectl apply -f pod.yaml
  1. راقب الحالة:
Terminal window
kubectl get pod hello-pod -w
  1. افتح نافذة terminal أخرى ونفذ:
Terminal window
kubectl describe pod hello-pod
kubectl logs hello-pod
kubectl exec -it hello-pod -- sh
  1. من داخل container:
Terminal window
wget -qO- http://127.0.0.1 | head
exit
NAME READY STATUS RESTARTS AGE
hello-pod 1/1 Running 0 20s
Terminal window
kubectl delete -f pod.yaml
kubectl get pods -l app=hello

Expected output:

No resources found in default namespace.

الربط بالمشروع النهائي

Section titled “الربط بالمشروع النهائي”

في Project 1 ستشغل Nginx، لكنك لن تستخدم Pod مباشر. ستستخدم Deployment لأن هدفنا ليس فقط تشغيل container، بل تشغيل تطبيق يمكن تحديثه واستعادته.