كل ما تعلّمته في هذه الوحدة — القوالب، والمساعدات المُسمّاة، والتبعيات، والهوكات، والإصدارات — يتقاطع هنا في لحظة التطبيق الفعلي. ستبني Helm chart بجودة إنتاجية حقيقية لخدمة ويب من العالم الواقعي: واجهة API خلفية مدعومة بـ Redis، مع ملفات قيم لكل بيئة، وهوك لتهجير قاعدة البيانات، ومسبار جاهزية، وPodDisruptionBudget، وRBAC. بنهاية هذا الدرس ستملك chart قادراً على الانضمام مباشرة إلى أي pipeline في GitHub Actions وشحنه إلى أي كلاستر Kubernetes دون تعديل.
التطبيق هو taskflow-api: خدمة REST عديمة الحالة مبنية بـ Node.js تقرأ من Redis (مُدار خارجياً — AWS ElastiCache في staging/prod، وsubchart في بيئة التطوير). يحتاج إلى: Deployment، وService، وIngress، وConfigMap، وSecret، وServiceAccount، وPodDisruptionBudget، وHPA. كل حقل يختلف بين البيئات مكشوف كقيمة في الـ chart.
الخطوة الأولى — السقالة وChart.yaml
ابدأ من السقالة الرسمية، ثم حرّر Chart.yaml فوراً لتُعلن البيانات الوصفية الحقيقية وقيد إصدار Kubernetes وتبعية Redis كـ subchart:
helm create taskflow-api
cd taskflow-api
# حذف ملفات النموذج التي سنستبدلها بالكامل
rm -rf templates/* values.yaml charts/
mkdir charts
حرّر Chart.yaml:
apiVersion: v2
name: taskflow-api
description: TaskFlow REST API — stateless Node.js service
type: application
version: 0.1.0 # إصدار الـ chart — ارفعه مع كل تغيير في الـ chart
appVersion: "1.0.0" # وسم صورة التطبيق — يُحدَّث بواسطة CI
kubeVersion: ">=1.28.0"
maintainers:
- name: platform-team
email: platform@example.com
dependencies:
- name: redis
version: "19.x.x"
repository: "oci://registry-1.docker.io/bitnamicharts"
condition: redis.enabled # معطَّل في staging/prod (نستخدم ElastiCache)
إصدار الـ Chart مقابل appVersion: يتتبّع version الـ chart نفسه — تغييرات القوالب، قيم جديدة، كائنات مضافة. يتتبّع appVersion إصدار صورة Docker للتطبيق. في CI تُحدّث appVersion مع كل push للصورة؛ أما version فقط حين تتغيّر بنية الـ chart. افصل بينهما تماماً. تُطبّق فرق المنصات في Google وSpotify هذا الفصل بجعل pipeline البناء يستبدل appVersion فقط، بينما يُرفع version عبر PR منفصل لمستودع الـ chart.
الخطوة الثانية — ملف values.yaml الرئيسي
كل معامل يتغيّر بين البيئات يُودَع هنا مع افتراضيات آمنة وبسيطة (نسخة واحدة، موارد صغيرة — مناسبة للتطوير، تُلغى في staging/prod). وثّق كل مفتاح بتعليق؛ هذا الملف هو الواجهة العامة لـ chart الخاص بك.
حاسبة الـ ConfigMap: يُجبر تعليق checksum/config على إعادة تشغيل متدرجة كلما تغيّر الـ ConfigMap. بدونه، سيتجاهل helm upgrade الذي يُحدّث قيمة إعداد فقط إعادة تشغيل الـ Pods — وتستمر في العمل بإعداد قديم. هذا السطر الواحد، الذي يستخدمه كل Helm chart رئيسي في المنظومة (cert-manager، Prometheus، ingress-nginx)، يمنع فئة كاملة من حوادث "لماذا لم يسرِ مفعول تغيير الإعداد؟".
لا تستخدم --set لأكثر من قيمة أو قيمتين عدديتين في الإنتاج. بدلاً من ذلك، احتفظ بملف قيم لكل بيئة في مجلد deploy/ منفصل. يحمل values.yaml الأساسي الافتراضيات الآمنة للتطوير؛ تُعيد ملفات البيئة تعريف ما يختلف فقط:
يوفّر values.yaml الأساسي افتراضيات آمنة لبيئة التطوير؛ تُعيد ملفات البيئة تعريف ما يختلف فقط — يدمج محرّك Helm كليهما بعمق لإنتاج الـ Manifests المُصيَّرة النهائية.
الخطوة الخامسة — هوك تهجير ما قبل الترقية
يجب أن تُنفَّذ تهجيرات قاعدة البيانات قبل أن تُشغَّل الـ Pods الجديدة. يُعدّ هوك Job من نوع pre-upgrade في Helm النمط المعياري لذلك:
مزلق إنتاجي — hook-delete-policy: أضف دائماً hook-delete-policy: before-hook-creation,hook-succeeded. بدون hook-succeeded، تتراكم Jobs التهجير القديمة في الـ namespace بعد كل نشر. بدون before-hook-creation، يُعيق Job فاشل الترقية التالية لأن Kubernetes يرفض إنشاء Job بنفس الاسم. يُضيف لاحقة Release.Revision اسماً فريداً لكل Job مع كل مراجعة، مما يمنحك كائناً جديداً في كل مرة بينما تُنظّف سياسة الحذف تلقائياً ما نجح.
الخطوة السادسة — التثبيت والتحقق في جميع البيئات
استخدم helm template محلياً أولاً — دون الحاجة لأي وصول إلى الكلاستر — للتحقق من أن كل ملف بيئة يُصيّر بالضبط ما تتوقعه. هذه خطوة إلزامية قبل أن يشحن أي pipeline CI أي chart:
قارن قبل أن تنشر: ثبّت إضافة helm-diff (helm plugin install https://github.com/databus23/helm-diff) ونفّذ helm diff upgrade taskflow-prod . --values deploy/values-prod.yaml قبل كل ترقية إنتاجية. تطبع فروقاً مُلوّنة لما سيتغيّر في الكلاستر — فحص أمان لا غنى عنه، وهو ممارسة معيارية في كل نشر إنتاجي في شركات كـ Datadog وStripe وGitHub.
يُرسّخ هذا الـ chart ستة أشهر من الخبرة الإنتاجية المكتسبة بشقّ الأنفس في وحدة قابلة للنشر: يمنع انجراف الإعدادات بين البيئات، ويُطبّق سياقات الأمان افتراضياً، ويتعامل مع عمليات النشر دون توقّف بفضل PDB واستراتيجية التحديث المتدرج، ويُنفّذ التهجيرات بصورة ذرية قبل انتقال حركة المرور، ويمنحك تتبّعاً كاملاً للتغييرات عبر سجلّ إصدارات Helm. كل نمط هنا — تعليق الـ checksum، والـ PDB الشرطي، ومسار تعليق IRSA، وملفات قيم كل بيئة — يعكس بالضبط كيف تُعبّئ فرق المنصات الناضجة التطبيقات على نطاق كبرى التقنية.
نستخدم ملفات تعريف الارتباط لتشغيل هذا الموقع وتحليل الزيارات وعرض إعلانات مخصّصة. يمكنك قبول كل ملفات تعريف الارتباط أو رفض غير الأساسية منها.
سياسة الخصوصية