kubectl apply من قبل لكن لم يبني Helm Chart بنفسه.
لو عندك 4 microservices على Kubernetes وكل واحد بينزل على 3 بيئات (dev، staging، production)، يبقى عندك 36 ملف YAML شبه متطابقين بتعدّلهم بـ Find & Replace. Helm بيقلّب الـ 36 ملف لـ 4 templates و 3 ملفات values بس، فبتنزّل وقت الـ deploy من 18 دقيقة لـ 40 ثانية، وبتشيل أكتر من 90% من أخطاء النسخ واللصق.
ليه Helm مش رفاهية لو عندك أكتر من 3 services على Kubernetes
المشكلة مش إن YAML صعب. المشكلة إن نفس الـ YAML بيتكرر مع تغيير حرف أو رقم. image: myapp:1.4.2 في dev، image: myapp:1.4.0 في prod، replicas: 1 هنا، replicas: 4 هناك. وكل تعديل بسيط بيخلّيك تفتح 12 ملف وتعدّل في كل واحد.
المشكلة باختصار
فريق صغير من 6 مهندسين بيدير 4 services على Kubernetes كان بيقضي 18 دقيقة في كل deploy على staging. السبب مش الـ cluster بطيء — السبب إن الـ YAML بيتكتب يدوياً، وفي 11% من الـ deploys بيحصل typo بيكسر شيء (نقطة ناقصة في indentation، أو مرجع secret غلط).
الافتراض هنا إنك بتنشر تطبيقك على Kubernetes ≥ 1.27 وعندك أكتر من service واحد. لو عندك service واحد بيتنشر مرة في الأسبوع، Helm overkill — هترجعله في قسم "متى لا تستخدم Helm".
مثال للمبتدئ: مكتب طباعة الكروت الشخصية
تخيّل مكتب بيطبع كروت شخصية لشركة فيها 200 موظف. الطريقة الغبية: تطبع 200 كرت كل واحد من الصفر. الطريقة الذكية: تعمل قالب واحد فيه فراغات للاسم والوظيفة والتليفون، وقاعدة بيانات فيها الـ 200 صف. القالب + البيانات = 200 كرت بضغطة واحدة.
Helm نفس الفكرة بالظبط. القالب (template) هو ملف YAML فيه فراغات، والقيم (values) هي الملف اللي بيملا الفراغات دي. التطبيق بياخد الاتنين، وبيطلّع YAML نهائي جاهز للـ kubectl apply.
التعريف العلمي بدقة
Helm هو package manager لـ Kubernetes (زي npm لـ Node أو apt لـ Ubuntu). الوحدة الأساسية فيه اسمها Chart، وهي مجلد فيه:
Chart.yaml: metadata (الاسم، الإصدار، الوصف).values.yaml: القيم الافتراضية.templates/: ملفات YAML مكتوبة بصيغة Go template engine ({{ .Values.image }}).
لما تشغّل helm install، الأداة بتاخد الـ templates، تستبدل المتغيرات بالقيم من values.yaml (أو من ملف بديل تختاره أنت)، تتأكد إن الناتج YAML سليم، وبعدين تبعته للـ Kubernetes API. الناتج النهائي بيسمى Release ولكل release اسم وإصدار، فبتقدر تعمل rollback لأي إصدار سابق بأمر واحد.