خدمات Kubernetes - المفاهيم الأساسية

2 دقيقة

المشروع projet11-kubernetes-services · النظرية المفيدة قبل الممارسة (أو أثناءها).

لماذا خدمة؟

الـ Pod زائل: يمكن حذفه وإعادة إنشائه ونقله إلى عقدة أخرى — وعنوان IP يتغيّر. إذن مستحيل ترميز IP لـ Pod «ثابتاً في الشفرة».

تحل الخدمة هذه المشكلة: توفّر عنواناً مستقراً (IP + اسم DNS) وتوزّع الحركة تلقائياً نحو مجموعة الـ Pods المطابقة لـ مُنتقي الوسوم.

الرابط خدمة → Pods ليس عنوان IP ثابتاً: هو مُنتقي وسوم. يصون Kubernetes وحده قائمة الـ Pods المطابقة (Endpoints).


الأنواع الثلاثة الرئيسية

1. ClusterIP (الافتراضي)

  • عنوان IP داخلي للعنقود، غير قابل للوصول من الخارج.
  • يخدم التواصل بين الـ Pods (مثلاً تستدعي الواجهة الخلفية).
  • أساس اكتشاف الخدمات: قابل للوصول باسم DNS (http://demo-clusterip).

2. NodePort

  • يفتح منفذاً ثابتاً على كل عقدة (النطاق 30000–32767).
  • وصول خارجي بسيط: http://<ip-du-noeud>:<nodePort> (هنا http://localhost:30082).
  • عملي في التطوير/المحلي؛ نادراً ما يُعرض كما هو في الإنتاج.

3. LoadBalancer

  • يطلب عنوان IP خارجياً من البنية التحتية.
  • في السحابة (AWS/GCP/Azure): يوفّر موزّع حمل حقيقياً.
  • مع Docker Desktop: يصير EXTERNAL-IP localhost (http://localhost:8090).

جدول مقارنة

النوعالنطاقالوصولحالة استخدام نموذجية
ClusterIPداخلياسم DNS داخليقاعدة بيانات، واجهة داخلية، تواصل Pod↔Pod
NodePortخارجيlocalhost:<30000-32767>عرض / تطوير محلي
LoadBalancerخارجيIP عام (localhost محلياً)خدمة عامة في إنتاج سحابي

يوجد أيضاً ExternalName (اسم مستعار DNS نحو خدمة خارجية) وIngress (توجيه HTTP/HTTPS باسم نطاق، يُرى لاحقاً) — خارج هذا المشروع.


اكتشاف الخدمات (DNS داخلي)

يشغّل Kubernetes CoreDNS في العنقود. تتلقى كل خدمة اسم DNS:

<nom-du-service>                       # من النطاق نفسه
<nom-du-service>.<namespace>           # من نطاق آخر
<nom-du-service>.<namespace>.svc.cluster.local   # الاسم الكامل (FQDN)

هكذا، من أي Pod في النطاق نفسه:

bash
curl http://demo-clusterip            # يحله CoreDNS -> IP الخدمة -> Pod

الخدمة و Endpoints

  • تعرّف الخدمة ماذا يُعرض (عبر المُنتقي).
  • Endpoints هي القائمة الفعلية لـ IP:port للـ Pods المطابقة، تُحدَّث تلقائياً بواسطة Kubernetes.
bash
kubectl get endpoints demo-clusterip   # يعرض عناوين IP للـ Pods خلف الخدمة
  • إن لم يطابق أي Pod المُنتقي ← Endpoints فارغة ← تجيب الخدمة «لا خلفية» (اتصال مرفوض).
  • هذا الخطأ رقم 1: وسم لـ Pod لا يطابق مُنتقي الخدمة.

للتذكير

  • الخدمة = عنوان مستقر + توزيع حمل + مُنتقي وسوم.
  • ClusterIP (داخلي، DNS)، NodePort (منفذ العقدة)، LoadBalancer (IP خارجي).
  • يتم اكتشاف الخدمات باسم DNS بفضل CoreDNS.
  • تربط Endpoints الخدمة ديناميكياً بـ Podsها.

دورة من إعداد د. هيثم رحومة — تطوير ونشر حلول البيانات