المستوى: متوسط. المقال ده موجّه لأي حد شغّال على Kubernetes وعنده تطبيق فعلي بيتنشر. لو انت لسه مبتدئ، فيه مثال بسيط جوّه هيوصّلك الفكرة قبل ما ندخل في التفاصيل التقنية.
لو الـ Pod بتاعك بيدخل في حلقة restart بلا سبب واضح، أو بياخد ترافيك وهو لسه بيقلّع فبيرمي أخطاء 502، المشكلة في الغالب مش في كودك. انت مظبطتش الفرق بين الـ liveness و الـ readiness probe. المقال ده بيخلّيك تظبطهم صح في أقل من عشر دقايق.
الفرق بين Liveness و Readiness Probes في Kubernetes
المشكلة باختصار
Kubernetes مش بيعرف حالة تطبيقك من جوّه. هو بيشوف إن الحاوية شغّالة، بس مش عارف هل التطبيق جاهز يستقبل طلبات ولا لسه بيحمّل الإعدادات ويفتح اتصال قاعدة البيانات. عشان يعرف، بيسأل الـ Pod أسئلة صغيرة كل شوية. الأسئلة دي اسمها probes.
لو ما ظبطتهاش، بيحصل واحد من سيناريوهين: إما التطبيق ياخد ترافيك قبل ما يجهز فيرمي 502 لأول مستخدمين، أو الـ probe تكون صارمة زيادة فتقتل Pod سليم وتدخله في restart loop.
مثال يقرّب الصورة (للمبتدئ)
تخيّل مطعم فيه موظف استقبال بيقف على الباب. هو بيعمل حاجتين مختلفتين تمامًا:
- بيتطمّن إن الطباخ لسه واقف وشغّال. لو الطباخ وقع مغمي عليه، الموظف بيطلب طباخ بديل. ده الـ liveness: هل هو حي؟ لو لأ، استبدله (restart).
- بيتطمّن إن المطبخ خلّص تجهيز وجاهز يستقبل أوردرات. طول ما لسه بيسخّن، الموظف بيقول للزباين استنّوا شوية بدل ما يدخّلهم على مطبخ مش جاهز. ده الـ readiness: هل هو جاهز يخدم؟ لو لأ، متبعتش ليه ترافيك دلوقتي.
الطباخ ممكن يكون حي (liveness = نجح) لكن لسه مش جاهز (readiness = فشل). دي بالظبط الحالة اللي بتحصل وقت إقلاع التطبيق. لو خلطت بين السؤالين، هتاخد قرار غلط.
الفرق العلمي بين الـ Probes الثلاثة
الـ kubelet هو اللي بينفّذ الـ probes على كل Pod. عندك ثلاثة أنواع، كل واحد ليه نتيجة مختلفة عند الفشل:
- livenessProbe: بتسأل «هل الحاوية لسه سليمة؟». لو فشلت عدد مرات =
failureThreshold، الـ kubelet بيقتل الحاوية ويعيد تشغيلها. - readinessProbe: بتسأل «هل التطبيق جاهز يستقبل طلبات؟». لو فشلت، الـ Pod بيتشال من قائمة الـ endpoints بتاعة الـ Service، فمفيش ترافيك بيوصله — لكنه ما بيتقتلش، بيفضل شغّال.
- startupProbe: بتقول لـ Kubernetes «استنّى التطبيق يخلّص إقلاع الأول». طول ما هي شغّالة، الـ liveness و الـ readiness بيتأجّلوا. مفيدة للتطبيقات البطيئة في الإقلاع (JVM مثلًا) عشان ما تتقتلش وهي لسه بتحمّل.
الخلاصة: الـ liveness بيعالج التطبيق المعلّق، والـ readiness بيعالج التطبيق اللي لسه مش جاهز. الاتنين مش نفس الشيء، ولو حطّيت نفس الـ endpoint للاتنين هتوقع نفسك في مشكلة هنشرحها تحت.
إزّاي تظبطهم صح (الكود)
ده إعداد كامل قابل للنسخ. لاحظ إن الـ liveness و الـ readiness بيشاوروا على مسارين مختلفين: