Blue-Green Deployment: انشر نسخة جديدة بدون ثانية توقف واحدة
هذا المقال موجَّه لمستوى: متوسط. لو بتعمل deploy وانت قلقان إن المستخدمين يشوفوا أخطاء وقت النشر، النمط ده بيخليك تطرح النسخة الجديدة وترجع منها في ثوانٍ لو حصل خطأ.
الخلاصة الأول: مع Blue-Green بتشغّل نسختين متطابقتين من التطبيق، وبتحوّل الترافيك بينهم في خطوة واحدة. المكسب المباشر: نشر بدون downtime، وتراجع (rollback) في ثوانٍ بدل دقائق.
المشكلة باختصار
في النشر التقليدي (rolling أو استبدال مباشر) انت بتلمس البيئة اللي المستخدمين شغّالين عليها دلوقتي. الـ pods القديمة بتموت والجديدة بتقوم، وفي اللحظة دي بتظهر أخطاء 502 و503 لجزء من الطلبات. ولو النسخة الجديدة طلعت فيها باج، الرجوع للنسخة القديمة معناه إعادة بناء ونشر تاني بياخد دقائق — ودقيقة توقف في وقت الذروة معناها طلبات وفلوس ضايعة.
يعني إيه Blue-Green بالظبط
تخيّل مسرح فيه ستارتين: زرقا وخضرا. الجمهور دلوقتي بيتفرّج على المشهد اللي ورا الستارة الزرقا. ورا الكواليس، انت بتجهّز المشهد الجديد كامل ورا الستارة الخضرا وتتأكد إنه تمام من غير ما الجمهور ياخد باله. لما يجهز، بتفتح الخضرا وتقفل الزرقا في لحظة واحدة. لو المشهد الجديد فيه غلط، بترجع تفتح الزرقا فورًا. ده بالظبط اللي بيحصل في Blue-Green.
علميًا: انت بتشغّل بيئتين إنتاجيتين متطابقتين. واحدة (Blue) حيّة وبتستقبل كل الترافيك، والتانية (Green) خاملة. بتنشر الإصدار الجديد على Green، تختبره وهو معزول عن المستخدمين، وبعدين تحوّل موازن الأحمال أو الراوتر من Blue لـ Green. بتفضل Blue شغّالة كما هي عشان تكون تراجعًا فوريًا لو لزم الأمر.
التطبيق العملي: التبديل في Kubernetes
في Kubernetes فيه أنظف طريقة للتبديل: الـ Service بيختار الـ pods بالـ label. بتخلّي الإصدارين شغّالين بنفس الـ app بس بـ version مختلف، وبتبدّل قيمة version في الـ selector. الخطوات:
- اعمل Service بيشاور على
version: blue(النسخة الحيّة). - انشر Deployment جديد بـ
version: greenجنب القديم. - اختبر green داخليًا من غير ما تحوّل ترافيك المستخدمين.
- بدّل الـ selector لـ green — التحويل بيحصل في ثوانٍ.
- لو حصلت مشكلة، رجّع الـ selector لـ blue فورًا.
# web-service.yaml — الـ Service هو "الراوتر" اللي بيوجّه الترافيك
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
version: blue # بدّلها لـ green وقت التبديل
ports:
- port: 80
targetPort: 8080