Kyverno بالعربي: امنع أخطاء Kubernetes قبل الـ Deploy
هتعرف هنا إزاي تمنع خطأ شائع في Kubernetes قبل ما يدخل الكلاستر: container من غير resource limits. النتيجة العملية: أعطال أقل، مراجعات أسرع، وقرار أوضح بين Audit وEnforce.
مستوى القارئ: متوسط. الافتراض إنك بتستخدم Kubernetes بالفعل، وعندك فريق بينشر YAML أو Helm charts على بيئات staging وproduction.
المشكلة باختصار
الطريقة الشائعة إن الفريق يراجع ملفات Kubernetes يدويًا في pull request. الطريقة دي بتفشل لما عدد الخدمات يزيد، أو لما chart جاهز من طرف ثالث يدخل من غير مراجعة كافية. اللي بيحصل فعلاً إن deployment صغير من غير memory limit يشتغل عادي، وبعد يوم ضغط يزاحم خدمات تانية على نفس node.
لو عندك 40 microservice وكل واحدة بتعمل deploy مرتين في الأسبوع، فأنت قدام 80 فرصة أسبوعيًا لخطأ config بسيط. حتى لو المراجعة اليدوية بتاخد 5 دقائق لكل PR، ده حوالي 6 ساعات ونصف شهريًا على فحص قابل للأتمتة.
الفكرة: Policy-as-Code بدل المراجعة اليدوية
Kyverno هو admission controller لكلاستر Kubernetes. بمعنى بسيط: أي object جديد، مثل Pod أو Deployment، يعدي على بوابة فحص قبل ما Kubernetes يقبله. لو الـ object مخالف للسياسة، Kyverno يرفضه أو يسجل مخالفة حسب الوضع اللي اخترته.
مثال قريب: عندك باب شركة عليه موظف أمن. الموظف مش بيصلح الكارت، لكنه يقرر هل الكارت صالح للدخول أم لا. Kyverno يعمل نفس الشيء مع YAML. هو لا يكتب architecture بدل الفريق، لكنه يمنع config واضح إنه خطر.
علميًا، Kyverno يستخدم سياسات declarative داخل Kubernetes، ويدعم validation وmutation وgeneration. في validation تحديدًا، تقدر تختار Audit لتسجيل المخالفة فقط، أو Enforce لمنع الإنشاء أو التحديث المخالف. هذا مذكور في توثيق Kyverno الرسمي لقواعد التحقق.
مثال عملي: امنع Pods بدون memory وCPU limits
ركز في السياسة دي. هي تمنع أي Pod في namespaces محددة لو container مفيهوش requests وlimits للـ CPU والذاكرة. ابدأ بها على staging بوضع Audit لمدة أسبوع، وبعدها حوّلها إلى Enforce لو عدد المخالفات بقى مفهوم.
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-container-resources
spec:
validationFailureAction: Audit
background: true
rules:
- name: require-requests-and-limits
match:
any:
- resources:
kinds:
- Pod
namespaces:
- staging
- production
validate:
message: "كل container لازم يحتوي على CPU/memory requests وlimits."
pattern:
spec:
containers:
- name: "*"
resources:
requests:
cpu: "?*"
memory: "?*"
limits:
cpu: "?*"
memory: "?*"