المستوى: مبتدئ
لو الـ pod بتاعك راجع 200 OK على /health بس المستخدم بيشوف 502 Bad Gateway، Kubernetes مش غلطان. هو بيسأل سؤال غلط في الوقت الغلط. الفرق بين Liveness و Readiness Probes هو اللي بيحدد إذا تطبيقك هيتعافى لوحده ولا هيقعد ساعتين Down في إنتاج.
Liveness و Readiness Probes: نوعين فحص بيحلوا مشكلتين مختلفتين
المشكلة باختصار
Kubernetes بيدير آلاف الـ containers، ومحتاج طريقة يفرق بيها بين سؤالين مختلفين تمامًا: هل التطبيق ده عايش؟ وهل هو جاهز يستقبل ترافيك؟ خلط السؤالين هو السبب الأول لـ false restarts و cascading failures في الإنتاج. لما تستخدم نوع probe في غير محله، انت بتحوّل مشكلة بسيطة في dependency خارجي لـ outage كامل على مستوى الـ cluster.
مثال للمبتدئ: الكاشير الجديد
تخيّل عندك سوبر ماركت وفيه كاشير اتعيّن النهاردة. Liveness Probe هو المدير اللي بيمر كل ساعة ويسأل: "الكاشير لسه عايش؟ بيتنفس؟". لو الإجابة لأ، المدير بيستدعي إسعاف ويعيّن واحد جديد مكانه.
Readiness Probe بيسأل سؤال تاني خالص: "الكاشير اتدرّب على نظام الفواتير؟ يعرف يتعامل مع الزبون؟". لو الإجابة لأ، المدير ميقولش "خد إسعاف"، هو بس بيعمل حاجة واحدة: يحط لافتة "كاشير مش جاهز، روحوا للمكنة التانية". الكاشير عايش، ومش هيموت، بس مفيش زباين عليه دلوقتي.
في Kubernetes نفس الكلام بالظبط. Liveness فشل = اقتل الـ container وأعد تشغيله. Readiness فشل = شيل الـ pod من الـ Service load balancer بس خليه شغّال.
التعريف العلمي الدقيق
طبقًا لتوثيق Kubernetes الرسمي، فيه ثلاث probes:
- Liveness Probe: بيقرر امتى الـ kubelet يقتل الـ container ويعيد تشغيله. مفيد لما التطبيق يدخل في deadlock أو infinite loop وبيرد على الـ HTTP بس مش بيشتغل فعلًا.
- Readiness Probe: بيقرر امتى الـ Service يبعت ترافيك للـ pod. لو فشل، الـ pod يتشال من الـ Endpoints بس مييتش — أول ما يرجع جاهز، الترافيك يعود.
- Startup Probe: لتطبيقات بتاخد وقت طويل تشتغل (Spring Boot مثلًا). بيعطّل Liveness و Readiness لحد ما الـ Startup يخلص، عشان متقتلش الـ container قبل ما يكمّل التحميل.
كود YAML شغّال على Kubernetes 1.30
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: api:v1.4
ports:
- containerPort: 8080
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
periodSeconds: 10
livenessProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
periodSeconds: 5
failureThreshold: 2