مستوى المقال: مبتدئ
لو الـ deploy الجديد بيرجّع 503 لكل اللي بيدخلوا أول 28 ثانية بعد كل release، Kubernetes مش غلطان. هو بيوجّه الترافيك لـ Pods لسه ما اتصلتش بقاعدة البيانات، لأنك ما عرّفتش الـ Probes اللي بتقوله إمتى الـ Pod جاهز فعلاً.
Probes في Kubernetes: 8 أسطر YAML بتفرق بين downtime يومي و uptime نظيف
المشكلة باختصار
Kubernetes افتراضيًا بيعتبر الـ Pod جاهز للترافيك بمجرّد ما الـ container يبدأ. ده معناه إن الطلبات بتدخل قبل ما الـ database connection pool يخلص، قبل ما الـ in-memory cache يتعمر، وقبل ما الـ migrations تنتهي. النتيجة المباشرة: 5xx errors لكل اللي بيدخل في أول 30 ثانية بعد كل deploy.
المشكلة التانية أصعب في الكشف: لو الـ container هنج بسبب deadlock في الـ thread pool، Kubernetes مش هيلاحظ. هو بيشوف إن الـ process لسه شغّال — وده كل حاجة بيهمّه افتراضيًا. الـ Pod هيفضل في الـ Service endpoints، والترافيك هيدخل عليه، والمستخدم هيستنّى لحد ما الطلب يـ timeout.
مثال يخلّي الفكرة واضحة: مستشفى بدون موظف استقبال
تخيّل مستشفى فيه دكتور شاطر، لكن مفيش موظف استقبال. أول ما الدكتور يفتح بابه الصبح، الناس بتدخل عليه وهو لسه بيلبس المريول وبيعدّ الأدوات. شوية مرضى بيلاقوه مش جاهز، بيتنرفزوا، ويمشوا. ده اللي بيحصل مع Pod من غير Readiness Probe — الترافيك بيوصل قبل ما التطبيق يبقى مستعد.
تاني سيناريو: الدكتور وقع مغمى عليه ومحدش لاحظ. الناس بتفضل تدخل، تقعد قدامه، تكلّمه — وهو فاقد الوعي. بعد ساعتين، حد بياخد باله. ده اللي بيحصل مع Pod من غير Liveness Probe — كل حاجة من برّا شكلها تمام، لكن جوّا فيه deadlock أو memory leak، والـ container محتاج restart.
الـ Probes ببساطة هي موظفة الاستقبال: بتسأل الدكتور كل شوية "هل أنت جاهز؟" و"هل أنت لسه واعي؟" — وعلى الإجابات بتتحكّم في باب المستشفى وفي قرار استدعاء الإسعاف.
التعريف العلمي للـ 3 Probes
طبقًا لتوثيق Kubernetes الرسمي (Configure Liveness, Readiness and Startup Probes)، الـ kubelet بينفّذ 3 أنواع من الفحوصات الدورية للـ container:
- Liveness Probe — هل الـ container لسه شغّال زي ما يلزم؟ لو الإجابة لا، الـ kubelet بيعمل restart للـ container تلقائيًا.
- Readiness Probe — هل الـ container جاهز يستقبل ترافيك؟ لو الإجابة لا، الـ Service controller بيشيل عنوان الـ Pod من قائمة الـ Endpoints، فالـ kube-proxy بيوقف يبعتله ترافيك. الـ container نفسه ما بيتعملوش restart — هو بس بيتشال من الـ load balancer لحد ما يبقى جاهز تاني.
- Startup Probe — هل التطبيق خلّص الإقلاع؟ بيوقّف تنفيذ الـ Liveness والـ Readiness بالكامل لحد ما ينجح. ده مهم جدًا للتطبيقات اللي بتاخد دقيقة أو أكتر تقوم (Java Spring Boot، .NET، تطبيقات بـ ML models كبيرة).
كل probe ممكن يكون httpGet (الأكتر استخدامًا) أو tcpSocket (تشيك على البورت بس) أو (يشغّل أمر جوّا الـ container). الافتراض إنك بتستخدم HTTP طول ما تطبيقك HTTP server.