المستوى المطلوب: متوسط — مفترض إنك مرتاح مع kubectl والـ Deployment والـ Service، وعندك cluster تجريبي (minikube أو kind أو staging حقيقي). لو لسه ما اشتغلتش على Kubernetes في الإنتاج، ابدأ بالأساسيات أولاً قبل المقال ده.
لو الـ pod الواحد بيقع في إنتاجك كل أسبوعين، تطبيقك هيتعرّض لـ 26 حادثة فشل في السنة. Chaos Engineering بيخلّيك تكتشف نقاط الضعف دي في بيئة staging في ساعتين، بدل ما تتفاجأ بيها 3 الفجر مع تليفون من العميل. ده مش فلسفة فضفاضة؛ ده experiment محدد بـ YAML وأرقام قياس فعلية.
Chaos Engineering في Kubernetes: تكسير محسوب بدل انهيار مفاجئ
المشكلة باختصار
أغلب الأنظمة شغّالة تمام في staging لأن الـ pods كلها صحية، الـ DB متاحة، والـ network مستقرة. لكن في الإنتاج بيحصل اللي مش متوقع: الـ DNS أحياناً بيفشل لـ 4 ثواني، الـ node بياخد reboot أثناء الـ midnight maintenance، وملف لوج كبير بيملأ الـ disk فجأة. لو ما اختبرتش الفشل ده عمداً وأنت قاعد على مكتبك، أول مرة هتشوفه فيها هتكون لما الموقع يقع والـ Slack بيرن.
مثال للمبتدئ: شركة الكهربا
لما شركة الكهربا تختبر شبكة الطوارئ، هي مش بتنتظر العاصفة. هي بتفصل خط رئيسي عمداً يوم الإجازة الفجر علشان تتأكد إن الـ generator الاحتياطي بيشتغل تلقائياً والمنطقة ما تطفّيش. بدل ما تكتشف إن الـ generator مش شغّال يوم الإعصار الحقيقي، اكتشفه يوم تجربة محسوبة. Chaos Engineering هو نفس الفكرة بالظبط على السيرفرات: تفصل pod عمداً، وتقيس بالثانية إن الـ replica الاحتياطي شال الترافيك من غير ما المستخدم يحس.
التعريف العلمي
حسب principlesofchaos.org — الوثيقة اللي خرجت من فريق Netflix بعد تجربة Simian Army في 2014 — Chaos Engineering هو "تخصص يقوم على إجراء تجارب على نظام بهدف بناء الثقة في قدرته على تحمّل ظروف اضطراب في الإنتاج". الفكرة الجوهرية: بدل ما تتمنى إن النظام يتحمل، حدد فرضية مقاسة (مثلاً "الـ p99 latency هيفضل تحت 300ms حتى لو وقع 30% من الـ pods")، شغّل experiment، اقيس النتيجة، وعدّل الكود لو الفرضية فشلت. الفرضية بدون قياس مش experiment، دي مجرد تمنّي.
تركيب Chaos Mesh وتشغيل أول Experiment
Chaos Mesh أداة CNCF Sandbox مفتوحة المصدر، بتدير experiments على Kubernetes كـ CRDs. التركيب على cluster تجريبي بأمر Helm واحد:
helm repo add chaos-mesh https://charts.chaos-mesh.org
kubectl create ns chaos-mesh
helm install chaos-mesh chaos-mesh/chaos-mesh \
-n chaos-mesh --version 2.6.3 \
--set chaosDaemon.runtime=containerd \
--set chaosDaemon.socketPath=/run/containerd/containerd.sockبعد كده، عرّف experiment يقتل 30% من الـ pods في namespace اسمه staging كل 5 دقائق: