هذا المقال يتطلب مستوى مبتدئ.
Liveness و Readiness Probes في Kubernetes: ليه pod بتاعك بيتعاد إنشاؤه بدون سبب واضح
لو الـ pod بتاعك بيتعاد إنشاؤه كل دقيقتين والـ logs نظيفة من أي error، المشكلة مش في كودك. Kubernetes بيقتله عمدًا لأن Liveness Probe قال إنه "ميت" حتى لو هو في الحقيقة شغّال تمام. خلال 7 دقايق هتفهم الفرق بين Liveness و Readiness، وهتشوف YAML شغّال يمنع الكارثة دي وينزّل عدد إعادة التشغيل غير الضروري من 12 لـ 0.6 في الأسبوع.
المشكلة باختصار
Kubernetes ما بيعرفش لوحده إن التطبيق صحي. هو بيشوف إن الـ container شغّال (الـ process موجود) لكن مش بيقدر يميّز بين تطبيق Node.js رد على HTTP request في 50 مللي ثانية، وتطبيق تاني عالق في deadlock من نص ساعة. الحل اسمه Probes — أسئلة دورية بيبعتها الـ kubelet للـ container ليتأكد إنه حي ومستعد للترافيك.
المشكلة بتبدأ لما المطوّر يكتب probe غلط، فيدخل التطبيق في restart loop أبدي، أو يخفي pod مكسور لمدة ساعة قبل ما حد ياخد باله.
تخيّل المخبز قبل ما ندخل في التعريف العلمي
تخيّل مخبز فيه فرّان شغّال طول اليوم. كل ساعة المالك بيدخل ويسأل سؤالين مختلفين تمامًا:
- "إنت لسه واعي؟" — لو الفرّان مردش، المالك بيستبدله بفرّان جديد فورًا. ده بالظبط شغل Liveness Probe.
- "إنت جاهز تستلم طلبات النهارده؟" — لو الفرّان قال "لسه بسخّن الفرن"، المالك بيوقف توجيه الزباين له لحد ما يخلص، بس مش بيطرده. ده Readiness Probe.
الفكرة بسيطة: Liveness بيحدد لو الـ container يستحق يموت ويرجع. Readiness بيحدد لو يستحق ياخد ترافيك دلوقتي. الفرق بين الاتنين بيفرق فرق كبير في سلوك الـ cluster.
التعريف العلمي الدقيق
حسب توثيق Kubernetes الرسمي (Pod Lifecycle documentation)، فيه ثلاث أنواع من الـ Probes:
- Liveness Probe: فحص دوري بيقرر هل الـ container يحتاج إعادة تشغيل. لو فشل عدد محدد من المحاولات (
failureThreshold)، الـ kubelet بيقتل الـ container، والـ Pod restart policy بيقرر هل يعاد تشغيله. - Readiness Probe: فحص دوري بيقرر هل الـ container جاهز يستقبل ترافيك. لو فشل، الـ Pod بيتشال من قائمة الـ Endpoints الخاصة بالـ Service، فالترافيك ما بيوصلوش، لكن الـ container ما بيتقتلش.
- Startup Probe: (مضافة في Kubernetes 1.16) للتطبيقات بطيئة الإقلاع زي Java Spring Boot. بتعطّل الـ Liveness و Readiness لحد ما تنجح أول مرة.
كل Probe بتدعم 4 طرق فحص: httpGet (الأشيع)، tcpSocket، exec (تشغيل أمر داخل الـ container)، و grpc (أحدث، من 1.24).