Kubernetes Probes بالعربي: امنع الـ Restarts الكاذبة
مستوى القارئ: متوسط
هتخرج من المقال ده بإعداد Kubernetes probes عملي يقلل الـ restarts الكاذبة، ويفصل بين مشكلة البداية ومشكلة استقبال الترافيك ومشكلة التعليق الحقيقي.
المشكلة باختصار
الطريقة الشائعة الغلط إنك تحط endpoint واحد اسمه /health وتستخدمه في livenessProbe وreadinessProbe بنفس القيم. الطريقة دي بتفشل لما التطبيق يتأخر في الـ warmup أو لما قاعدة البيانات تبقى بطيئة 20 ثانية. Kubernetes يفتكر إن التطبيق مات، فيعمل restart، والـ restart يزود الضغط بدل ما يحله.
الافتراض هنا إن عندك خدمة HTTP داخل Kubernetes، بتحتاج 60 إلى 180 ثانية أحيانًا عشان تعمل migration خفيفة أو تسخن cache. لو عندك 10 replicas وكل replica بيتقتل مرتين أثناء النشر، أنت ضيعت تقريبًا 20 دورة startup بدون سبب.
افصل بين الثلاث إشارات
ركز في الفرق. startupProbe بتقول: هل التطبيق خلص بداية؟ لو فشلت، Kubernetes ينتظر ولا يشغل liveness لسه. readinessProbe بتقول: هل الـ Pod جاهز يستقبل traffic؟ لو فشلت، الـ Pod يخرج من Service endpoints لكنه يفضل شغال. livenessProbe بتقول: هل التطبيق علق لدرجة إن restart هو القرار الصحيح؟ لو فشلت مرات متتالية، kubelet يعمل restart للحاوية.
مثال بسيط: مطعم لسه بيفتح. startupProbe معناها: هل المطبخ اتجهز؟ readinessProbe معناها: هل نستقبل طلبات دلوقتي؟ livenessProbe معناها: هل العامل الرئيسي اختفى تمامًا ولازم نعيد تشغيل الشيفت؟ نفس المثال بعد كده يتحول تقنيًا: البداية غير الجاهزية، والجاهزية غير الحياة.
إعداد عملي قابل للنسخ
أفضل طريقة إنك تستخدم endpoints منفصلة. /livez لا يفحص قاعدة البيانات. يفحص إن process شغال ومش deadlocked. /readyz يفحص الاتصالات المهمة لاستقبال request حقيقي، زي DB pool أو queue. وstartupProbe يدي التطبيق مساحة بداية محسوبة.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: ghcr.io/example/api:1.8.0
ports:
- containerPort: 8080
startupProbe:
httpGet:
path: /livez
port: 8080
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 2
readinessProbe:
httpGet:
path: /readyz
port: 8080
periodSeconds: 5
failureThreshold: 3
timeoutSeconds: 2
livenessProbe:
httpGet:
path: /livez
port: 8080
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 2