البيان - المشروع: أول خطوات مع Kubernetes (Pods و Deployments و Services)

3 دقيقة

تدريب عملي · الوحدة 07 — Kubernetes: المفاهيم الأساسية · المستوى مبتدئ → متوسط

حاول أولاً وحدك! أنجز المشروع بهذا البيان وحده. التصحيح (بيانات YAML معلَّقة + أوامر kubectl) في README.md، مطوي. لا تفتحه إلا بعد المحاولة.


لا حاجة إلى minikube!

لا شيء إضافياً تثبّته: يحتوي Docker Desktop عنقود Kubernetes مدمج.

  1. افتح Docker Desktop → Settings (⚙️) → Kubernetes.
  2. علّم « Enable Kubernetes »، انقر Apply & Restart، وانتظر حتى يصير المؤشر أخضر.
  3. تحقّق في طرفية:
    powershell
    kubectl get nodes
    يجب أن ترى عقدة docker-desktop بالحالة Ready.

(بدائل ممكنة: minikube start أو kind create cluster. يعمل المشروع أيضاً، مع تحميل الصورة — انظر 02-COMMANDES.md.)


الهدف

نشر تطبيق ويب صغير على Kubernetes في عدة نسخ (Pods)، وعرضه عبر خدمة، ثم ممارسة إيماءات اليومي: توسيع، تحديث تدريجي، تراجع وإصلاح تلقائي.


النتيجة المتوقعة

عند إعادة تحميل الصفحة، يتغيّر اسم الـ Pod الذي يجيب: دليل أن الخدمة توزّع الحمل بين الـ Pods.


العمل المطلوب

الجزء 1 — بناء الصورة

  1. استعد تطبيق الويب من الوحدة 06 (أو اكتب تطبيقاً يعرض على / hostname الخاص به = اسم الـ Pod).
  2. ابنِ الصورة محلياً وسمّها demo-k8s:1.0.

الجزء 2 — الـ Deployment (الـ Pods)

  1. اكتب بيان Deployment بـ 3 نسخ، ووسوم متسقة (app: demo-web) ومسبار (readinessProbe / livenessProbe) على /health.
  2. طبّقه، ثم اسرد وافحص Podsك (kubectl get pods، kubectl describe pod ...، kubectl logs ...).

الجزء 3 — الخدمة (العرض + التوزيع)

  1. اكتب Service من النوع NodePort (المنفذ 30080) يشير إلى الـ Pods عبر مُنتقي الوسوم.
  2. افتح http://localhost:30080 وأعد التحميل: تحقّق أن اسم الـ Pod يتغيّر.

الجزء 4 — الضبط (ConfigMap + متغيرات بيئة)

  1. أنشئ ConfigMap يحتوي APP_TITLE و APP_VERSION و BG_COLOR، واحقنه في الـ Pods (envFrom).
  2. غيّر BG_COLOR، أعد تطبيق ConfigMap، أعد تشغيل الـ Pods (kubectl rollout restart) وراقب اللون الجديد.

الجزء 5 — إيماءات اليومي

  1. التوسيع: انتقل إلى 5 نسخ (kubectl scale) ثم عد إلى 3.
  2. تحديث تدريجي: غيّر APP_VERSION، طبّق، وتابع النشر التدريجي (kubectl rollout status).
  3. تراجع: عد إلى الإصدار السابق (kubectl rollout undo).
  4. إصلاح تلقائي: احذف Podاً يدوياً (kubectl delete pod ...) ولاحظ أن Kubernetes يعيد إنشاء واحد وحده.

أسئلة للتفكير

  • ما الفرق بين Pod و ReplicaSet و Deployment؟
  • لماذا نمر عبر خدمة بدل الاتصال بـ Pod مباشرة عبر IP؟
  • ما فائدة مُنتقي الوسوم بين الخدمة والـ Pods؟
  • لماذا فصل الضبط (ConfigMap) عن الشفرة (صورة Docker)؟
  • ماذا يفعل Kubernetes عندما يتعطل Pod؟ وأثناء تحديث تدريجي؟

المخرجات

  • المجلد app/ (الشفرة + Dockerfile) والمجلد k8s/ (configmap.yaml، deployment.yaml، service.yaml).
  • لقطة تُظهر اسمَي Pod مختلفين على الأقل في المتصفح (أو عبر curl).
  • مخرجات kubectl get pods تُظهر 3/3 Pods بالحالة Running.
  • لقطة من kubectl rollout status أثناء تحديث تدريجي.

معايير النجاح

المعيارالمتوقع
صورة مبنيةdemo-k8s:1.0 متاحة للعنقود
Deployment3 Pods Running، مسابير سليمة
الخدمةالصفحة متاحة على localhost:30080، يتغيّر اسم الـ Pod
ConfigMapتغيير BG_COLOR ظاهر بعد إعادة التطبيق
دورة الحياةتوسيع وتحديث تدريجي وتراجع وإصلاح تلقائي مُثبتة

معلّق؟ يحتوي README.md على التصحيح الكامل (بيانات معلَّقة + أوامر)، وتسرد مذكرة الأوامر كل kubectl مفيد — للرجوع إليها بعد المحاولة.