البيان - المشروع 11: خدمات Kubernetes (ClusterIP و NodePort و LoadBalancer)

3 دقيقة

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

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


المتطلبات السابقة

  • عنقود Kubernetes في Docker Desktop مفعَّل (النوع Kubeadm) — انظر المشروع 10.
  • الصورة demo-k8s:1.0 مبنية مسبقاً (وإلا: docker build -t demo-k8s:1.0 ./app).

الهدف

فهم فائدة الخدمة وإتقان الأنواع الثلاثة الرئيسية:

  • ClusterIP — وصول داخلي إلى العنقود + اكتشاف خدمات باسم DNS؛
  • NodePort — وصول خارجي عبر منفذ الآلة؛
  • LoadBalancer — وصول خارجي عبر IP «عام» (localhost مع Docker Desktop).

كل ذلك فوق Deployment واحد: دفعة Pods واحدة، ثلاث طرق لعرضها.


المشكلة المطلوب حلها

الـ Pods زائلة: تولد وتموت وتغيّر IP. إذن لا يمكن الاعتماد على IP لـ Pod. يلزم عنوان مستقر يوزّع الحركة نحو الـ Pods الصحيحة: هذا دور الخدمة، التي تجد Podsها بفضل الوسوم.


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

الجزء 1 — الـ Deployment (الـ Pods المطلوب عرضها)

  1. انشر تطبيقاً في 3 نسخ يعرض اسم الـ Pod (أعد استخدام demo-k8s:1.0).
  2. أعطِ الـ Pods وسماً واضحاً (مثلاً app: demo-back).

الجزء 2 — ClusterIP + اكتشاف الخدمات

  1. أنشئ خدمة ClusterIP باسم demo-clusterip (المنفذ 80 → 5000).
  2. أثبت الاكتشاف عبر DNS: شغّل Pod عميل مؤقت واستدعِ الخدمة باسمها:
    curl http://demo-clusterip
  3. أعد التحميل عدة مرات ولاحظ أن اسم الـ Pod يتغيّر (توزيع حمل داخلي).

الجزء 3 — NodePort (وصول خارجي)

  1. أنشئ خدمة NodePort باسم demo-nodeport (nodePort 30082).
  2. افتح http://localhost:30082 من متصفحك.

الجزء 4 — LoadBalancer (وصول خارجي «سحابي»)

  1. أنشئ خدمة LoadBalancer باسم demo-lb (المنفذ 8090).
  2. تحقّق من EXTERNAL-IP (kubectl get svc) وافتح http://localhost:8090.

الجزء 5 — المراقبة والفهم

  1. اسرد الخدمات (kubectl get svc) وحدّد: TYPE، CLUSTER-IP، EXTERNAL-IP، PORT(S).
  2. انظر إلى Endpoints (kubectl get endpoints demo-clusterip): هذه عناوين IP للـ Pods خلف الخدمة.
  3. غيّر وسماً لـ Pod (أو للمُنتقي) ولاحظ أنه يخرج من Endpoints.

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

  • لماذا لا يمكن ببساطة استخدام IP لـ Pod؟
  • أي نوع خدمة لـ: (أ) قاعدة بيانات داخلية، (ب) موقع ويب عام في تطوير محلي، (ج) واجهة عامة في إنتاج سحابي؟
  • كيف يجد Pod خدمة أخرى باسمها؟ (دور CoreDNS)
  • ماذا تحتوي قائمة Endpoints لخدمة، ومن يحدّثها؟
  • ماذا يحدث إن لم يطابق أي Pod مُنتقي الخدمة؟

المخرجات

  • k8s/deployment.yaml والخدمات الثلاث (service-clusterip.yaml، service-nodeport.yaml، service-loadbalancer.yaml).
  • لقطة من kubectl get svc تُظهر الأنواع الثلاثة.
  • لقطة لاكتشاف DNS (curl http://demo-clusterip من Pod عميل) بـ اسمَي Pod مختلفين.
  • لقطة من kubectl get endpoints demo-clusterip.

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

المعيارالمتوقع
ClusterIPقابل للوصول باسم DNS من Pod آخر
NodePortقابل للوصول على http://localhost:30082
LoadBalancerEXTERNAL-IP = localhost، قابل للوصول على http://localhost:8090
التوزيعيتغيّر اسم الـ Pod بين طلبين
Endpointsتظهر عناوين IP للـ Pods الثلاثة خلف الخدمة

معلّق؟ يحتوي README.md على التصحيح الكامل، والمفاهيم مفصَّلة في 01-CONCEPTS-SERVICES.md، ويسرد 02-COMMANDES.md كل kubectl مفيد — للرجوع إليها بعد المحاولة.