المستوى: مبتدئ — الشرح ده مناسب لأي حد شغّل تطبيق على Kubernetes مرة واحدة على الأقل، وعارف يشغّل أمر kubectl. مش محتاج خبرة سابقة بالإعدادات.
افصل إعداداتك وأسرارك عن الكود في Kubernetes
لو حاطط كلمة سر قاعدة البيانات جوّه الكود أو جوّه صورة الحاوية، انت واقع في مشكلة أمان مش هتحسّ بيها دلوقتي. أول ما الصورة دي توصل لأي حد، السر بقى معاه للأبد. الحل اسمه ConfigMap وSecret، وهتفهمهم بالكامل في أقل من 8 دقايق، مع مثال تقدر تنسخه وتشغّله.
المشكلة باختصار
صورة الحاوية (Container Image) مفروض تبقى ثابتة. نفس الصورة تشتغل على جهازك، على بيئة الاختبار، وعلى الإنتاج. لكن الإعدادات بتتغيّر: رابط قاعدة البيانات مختلف، مستوى اللوج مختلف، وكلمة السر أكيد مختلفة. لو خبّيت الإعدادات دي جوّه الكود، هتضطر تبني صورة جديدة لكل بيئة، وهتسرّب أسرارك جوّه طبقات الصورة اللي بتفضل متخزّنة حتى بعد ما تمسحها.
الفكرة بمثال بسيط
تخيّل وصفة أكل مكتوبة في كتاب طبخ. الكتاب ده هو الكود: ثابت، مطبوع، مش بتعيد طباعته كل يوم. كمية الملح والتوابل مكتوبة على ورقة لاصقة جنب الكتاب — دي الإعدادات. عايز تزوّد الملح في بيت صاحبك؟ بتغيّر الورقة بس، مش بتعيد طباعة الكتاب كله. ده بالظبط الـ ConfigMap.
لكن فيه توابل سرّية بتاعة العيلة مقفولة في درج بمفتاح. المفتاح ده هو الـ Secret: قيمة حساسة مبتتكتبش على ورقة مكشوفة قدام أي حد، وبتتخزّن لوحدها بصلاحيات وصول محدودة. الفكرة كلها في جملة واحدة: خلّي الكتاب ثابت، وحطّ اللي بيتغيّر برّه.
التعريف الدقيق
الـ ConfigMap كائن (object) في Kubernetes بيخزّن إعدادات غير حساسة كأزواج مفتاح/قيمة، زي LOG_LEVEL أو API_URL. الـ Secret نفس الفكرة بالظبط لكن للقيم الحساسة: كلمات السر، التوكنز، ومفاتيح الـ API. الاتنين بيتحقنوا في الحاوية بطريقتين: إما متغيّرات بيئة (environment variables)، وإما ملفات مركّبة على مسار جوّه الحاوية (mounted volume).
نقطة مهمة جدًا لازم تعرفها من دلوقتي: الـ Secret مش مشفّر افتراضيًا. هو مجرد مكوّد بـ base64، واللي أي حد يقدر يفكّه في ثانية بأمر واحد. يعني الفصل بيحصل فعلًا، لكن الأمان الحقيقي محتاج خطوة زيادة هنشرحها تحت.
مثال تنفيذي تقدر تنسخه
هنعمل ConfigMap للإعدادات، Secret لكلمة السر، وبعدين نربطهم بالتطبيق في ملف الـ Deployment.
أولًا، الـ ConfigMap في ملف config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "debug"
API_URL: "https://api.example.com"