Kubernetes وGitOps في التعافي من الكوارث
Kubernetes وGitOps في التعافي من الكوارث
عندما تنقطع منطقة بالكامل، السؤال ليس ما إذا كانت كتلتك Kubernetes قادرة على الإصلاح الذاتي — فهذا موجود منذ سنوات. السؤال هو ما إذا كنت قادرًا على إعادة بناء مستوى التحكم بالكامل، مع جميع مشغّليه، وجميع أحمال العمل ذات النطاق، وجميع بياناته ذات الحالة، وجميع سياسات الشبكة في منطقة مختلفة ضمن نافذة RTO الخاصة بك، مع الثقة الكاملة بأن النتيجة مطابقة لما فشل للتو. هذا السؤال يُجاب عليه قبل الحادثة لا أثناءها — من خلال جودة ممارسة GitOps واستراتيجية النسخ الاحتياطي لأحمال العمل ذات الحالة.
kubectl apply أو في حالة إصدار Helm المحفوظة داخل الكتلة، فلا يمكنك إعادة إنشائها بشكل موثوق في مكان آخر. مستودع Git هو مصدر الحقيقة الوحيد؛ والكتلة هي انعكاس وقت التشغيل لتلك الحقيقة. تعامل مع المستودع كبنية تحتية وليس توثيقًا.
إعادة بناء كتلة من Git
يحتوي مستودع GitOps المنظم جيدًا على كل ما هو مطلوب لتشغيل كتلة من الصفر: بيانات bootstrap الخاصة بـ Flux أو ArgoCD، وإصدارات Helm لمكونات المنصة (cert-manager، external-dns، ingress-nginx، Prometheus stack، Velero)، وتراكبات Kustomize لكل بيئة، وجميع أحمال عمل التطبيقات. إجراء الاسترداد حتمي وقابل للاختبار.
في Google وStripe، مستودع GitOps هو تعريف الكتلة الموثوق. أي انحراف مكتشف بين حالة Git والحالة الحية يُعامَل كحادثة إنتاجية من قبل وحدة التحكم في المطابقة. هذا الانضباط هو ما يجعل التعافي من الكوارث قابلًا للتطبيق: يمكنك توفير كتلة فارغة في منطقة التعافي والسماح لوحدة تحكم GitOps بضبطها على الحالة المطلوبة دون أي خطوات يدوية سوى تشغيل وحدة التحكم نفسها.
تفصيلان مهمان على نطاق الإنتاج. أولًا، يجب أن يُشفّر مسارك في المستودع هوية الكتلة (clusters/prod-us-east-1) حتى يتفرع نفس المستودع إلى تعريفات متعددة للكتلة دون تعارض. ثانيًا، لا يجب أن تكون الأسرار في Git بنص عادي — استخدم Sealed Secrets أو SOPS مع age/GPG. في سيناريو التعافي، يجب أن يكون مفتاح وحدة التحكم sealed-secrets أو مفتاح SOPS متاحًا في الكتلة الجديدة قبل أن يتمكن Flux من فك تشفير أسرار التطبيق. خزّن ذلك المفتاح في KMS السحابي (AWS KMS، GCP KMS) واجعل عملية التشغيل تسترده عبر دور IAM — وليس في رأس شخص أو جدول بيانات.
kind أو كتلة سحابية حقيقية يوفرها Terraform، يتم تشغيلها بـ Flux، والتحقق من تقاربها، ثم إتلافها. السكريبت الذي يفعل هذا هو دليل التعافي لطبقة الكتلة. إذا استغرق التقارب أكثر من 15 دقيقة، حدد الاختناق — عادةً ما يكون سحب Helm chart بطيئًا أو سحب صورة من سجل يتطلب بيانات اعتماد غير موجودة بعد.
Velero: النسخ الاحتياطي والاستعادة لموارد Kubernetes والأحجام
Velero (المعروف سابقًا بـ Heptio Ark) هو المعيار الفعلي للنسخ الاحتياطي والاستعادة في Kubernetes. يُسلسل كائنات الكتلة — Deployments، Services، ConfigMaps، PVCs، CRDs، RBAC — إلى تخزين الكائنات (S3، GCS، Azure Blob)، ويلتقط اختياريًا لقطات للأحجام الدائمة عبر CSI snapshot hooks أو مكونات إضافية لأحجام الموفر. في الكتل التي تحتوي على مئات من النطاقات، فلاتر الجدول والتضمين/الاستبعاد في Velero هي ما يُبقي حجم النسخ الاحتياطي ووقت الاستعادة قابلًا للإدارة.
في الكتل الإنتاجية الكبيرة في شركات مثل Shopify أو Cloudflare، تعمل نسخ Velero الاحتياطية على نطاقات مجمعة حسب مستوى الأولوية. نطاقات الفئة الأولى (المدفوعات، المصادقة، APIs الأساسية) تأخذ نسخًا احتياطية كل ساعة؛ الفئة الثانية (التحليلات، مهام الدُفعات) تأخذ نسخًا يومية. يُتحقق من SLO الاستعادة ربع سنوي عبر تدريبات استعادة فعلية في كتلة تجهيز — وليس بالاعتماد على وجود ملف النسخ الاحتياطي.
استعادة الحالة: الجزء الصعب
أحمال العمل عديمة الحالة في Kubernetes قابلة للاسترداد بسهولة عبر GitOps — pod spec وConfigMap وService وHPA: كلها في Git. التحدي يكمن في أحمال العمل ذات الحالة: قواعد البيانات وقوائم انتظار الرسائل وأي حجم يحتوي على بيانات غير مُكررة بالفعل إلى منطقة التعافي بواسطة مستوى البيانات نفسه.
تتبع الصناعة ثلاثة أنماط، واختيارها يعتمد على RPO الخاص بك:
- فعّال-سلبي مع نسخ Velero للحجم. يلتقط Velero لقطات PVCs بشكل ساعي إلى S3 مع نسخ عبر المناطق. عند التعطل، يستعيد Velero أحدث لقطة في كتلة التعافي. RPO مرتبط بتكرار اللقطات — عادةً ساعة واحدة. يناسب الأحمال التي ساعة من فقدان البيانات مقبولة فيها (معالجة الدُفعات، التحليلات). وقت الاستعادة لحجم 500 جيجابايت عبر النسخ الاحتياطي على مستوى نظام الملفات (restic/kopia) هو 20-40 دقيقة.
- النسخ على مستوى التطبيق مع Velero لاستعادة التكوين فقط. Postgres Logical Replication أو MySQL GTID replication أو Kafka MirrorMaker 2 يحافظ على مزامنة مستمرة للبيانات مع منطقة التعافي. Velero يأخذ نسخًا احتياطية فقط لكائنات Kubernetes (Deployment، Service، Secret، ConfigMap)، وليس الحجم. عند التعطل، استعد كائنات Kubernetes من Velero، ثم ارفع مستوى الاستنساخ الجاهز. RPO يقترب من الصفر؛ وقت الاستعادة بالدقائق. هذا ما تفعله Stripe وما شابهها للبيانات المالية.
- HA بإدارة المشغّل (Patroni، Vitess، CockroachDB). يدير مشغّل قاعدة البيانات النسخ والنصاب وانتخاب القائد عبر المناطق بشكل أصلي. لا يلزم نسخ Velero الاحتياطي للحجم — يرفع المشغّل مستوى أقرب استنساخ سليم. Velero لا يزال يأخذ نسخًا للـ CRDs وحالة المشغّل حتى يمكن إعادة إنشاء تكوين المشغّل نفسه في سيناريو التشغيل البارد.
backup.velero.io/backup-volumes-excludes والخطافات قبل/بعد عبر تعليقات توضيحية للـ pod — استخدمها.
التحقق من جاهزية التعافي
مستودع GitOps وجداول Velero ضرورية لكنها غير كافية. الشيء الوحيد الذي يتحقق من جاهزية التعافي هو استعادة ناجحة. تُجري Netflix تمارين "Chaos Kong" ربع سنوية تُخلي فيها منطقة توافر AWS بأكملها. في Google، تغطي اختبارات DiRT حالات الفشل على مستوى المنطقة الكاملة. لمعظم المؤسسات، تدريب استعادة شهري في كتلة مؤقتة — للتحقق من تقارب جميع Deployments، وإعادة جميع PVCs، واجتياز فحوصات صحة التطبيق — هو الحد الأدنى المقبول. أتمتته بسكريبت يُشغّل velero restore create، ويستطلع حتى الاكتمال، ويُشغّل اختبارات دخان، ثم يتلف الكتلة. خزّن النجاح/الفشل في نظام إدارة الحوادث كدليل على جاهزية التعافي.
flux get all -A ولاحظ متى ينتقل آخر HelmRelease إلى Ready=True. إذا تجاوز ذلك الوقت 15 دقيقة، فمخططات Helm الخاصة بمنصتك ثقيلة جدًا أو سحب الصورة بطيء جدًا. اسحب الصور الحرجة مسبقًا إلى ذاكرة تخزين مؤقت إقليمية في ECR/Artifact Registry — تحافظ كثير من الفرق على "كتلة DR دافئة" في مجموعة عقدة في وضع السبات لإزالة عقوبة التشغيل البارد كليًا.