Flagger: progressive delivery بدل rolling update الأعمى
المشكلة باختصار
الـ rolling update العادي في Kubernetes بيحوّل الترافيك بالكامل بمجرد ما الـ pod يبقى ready. لو في bug بيظهر تحت ضغط حقيقي بس، هتكتشفه وأنت بتستقبل 100% من المستخدمين على النسخة المعطوبة. الـ rollback اليدوي بياخد في المتوسط 6 إلى 12 دقيقة من ساعة ما حد يلاحظ لحد ما الـ kubectl rollout undo يخلّص.
Flagger بيحل ده بطريقة اسمها progressive delivery. يدخّل 5% من الترافيك على النسخة الجديدة، يسأل Prometheus كل دقيقة عن success rate وlatency، لو الأرقام تمام يزوّد لـ 10% بعدين 20% وهكذا. لو وقع تحت الـ threshold، يرجّع الترافيك للـ primary تلقائيًا في أقل من دقيقة.
الفكرة بمثال بسيط قبل التعريف العلمي
تخيّل مطعم فتح صنف جديد. المدير مش هياخد كل الطلبات وهو شكّاك في الطبق. هيجرّبه على أول 5 طلبات، يشوف ردود الفعل، لو كويسة يعرضه على 10 طاولات، وبعدين 20. لو أي طاولة شكت من الطعم، يوقف تقديم الطبق ويرجّع القديم لباقي المطعم.
ده بالظبط اللي Flagger بيعمله. بالتفاصيل:
- Canary Resource: ملف YAML بيقول لـ Flagger إزاي يدير الـ rollout. هو الأساس اللي كل حاجة بتتبني عليه.
- Success rate: نسبة الطلبات اللي رجعت HTTP 2xx/3xx من إجمالي الطلبات. مثلًا لو 99 طلب من 100 نجحوا، success rate = 99%.
- P99 latency: أبطأ 1% من الطلبات بتاخد كام ثانية. لو P99 = 500ms، يعني 99% من المستخدمين خدمتهم وصلت في أقل من نص ثانية.
- Primary vs Canary: Primary هو الـ deployment الحالي اللي شغال. Canary هو النسخة الجديدة اللي لسه بتتجرب.
- Step Weight: كل كام دقيقة يزيد كام % من الترافيك للـ canary.
إعداد عملي خطوة بخطوة
الافتراض إن عندك كلاستر Kubernetes و Istio أو Linkerd شغالين، وPrometheus موجود. لو مش مستخدم service mesh، Flagger بيدعم NGINX Ingress بنفس الفكرة تقريبًا.
- ثبّت Flagger operator على الكلاستر عبر Helm.
- اربطه بـ Prometheus عشان يقدر يسأل عن metrics.
- اكتب Canary resource يحدد الـ thresholds و الـ steps.
- كل push جديد للصورة هيبدأ الـ canary أوتوماتيكيًا، بدون تدخل من أحد.
helm repo add flagger https://flagger.app
helm install flagger flagger/flagger \
--namespace flagger-system \
--create-namespace \
--set meshProvider=istio \
--set metricsServer=http://prometheus.istio-system:9090