الفصل 5.1 - ConfigMaps
أهداف التعلم
في نهاية هذا الفصل، ستكون قادرًا على:
- فهم ما هو ConfigMap ولماذا يتم استخدامه
- إنشاء ConfigMaps بطرق مختلفة
- استخدام ConfigMaps في الـ Pods الخاصة بك
- فصل التكوين عن كود التطبيق
- تطبيق أفضل الممارسات لـ ConfigMaps
مقدمة
في تطوير التطبيقات، يتغير التكوين غالبًا حسب البيئة (التطوير، التدريج، الإنتاج). تضمين التكوين في الكود أو في صور Docker ليس ممارسة جيدة.
تسمح ConfigMaps بفصل التكوين عن كود التطبيق.
ما هو ConfigMap؟
ConfigMap هو كائن Kubernetes يخزن بيانات التكوين غير الحساسة في شكل أزواج مفتاح-قيمة. يمكن استخدام هذه البيانات من قبل الـ Pods كمتغيرات بيئية، أو كوسائط للأوامر، أو كملفات تكوين.
لماذا استخدام ConfigMaps؟
مشاكل بدون ConfigMaps
مشاكل:
- تكوين مضمّن في الكود
- الحاجة إلى إعادة بناء الصورة لتغيير التكوين
- صعوبة إدارة البيئات المختلفة
- عدم وجود فصل بين الاهتمامات
فوائد مع ConfigMaps
فوائد:
- تكوين منفصل عن الكود
- لا حاجة لإعادة بناء الصورة
- سهل إدارة عدة بيئات
- قابل لإعادة الاستخدام بين عدة Pods
إنشاء ConfigMaps
الطريقة 1: من القيم الحرفية
kubectl create configmap app-config \
--from-literal=database_url=postgresql://localhost:5432/mydb \
--from-literal=log_level=info \
--from-literal=max_connections=100
الطريقة 2: من ملف
إنشاء ملف config.properties:
database_url=postgresql://localhost:5432/mydb
log_level=info
max_connections=100
kubectl create configmap app-config --from-file=config.properties
الطريقة 3: من ملف YAML
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
data:
database_url: "postgresql://localhost:5432/mydb"
log_level: "info"
max_connections: "100"
# ملف كامل
application.properties: |
server.port=8080
server.host=0.0.0.0
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
الاستخدام في الـ Pods
الطريقة 1: متغيرات بيئية (مفتاح واحد)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config
key: database_url
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log_level
الطريقة 2: جميع المفاتيح (envFrom)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
envFrom:
- configMapRef:
name: app-config
النتيجة: جميع مفاتيح ConfigMap تصبح متغيرات بيئية.
الطريقة 3: كحجم (ملفات)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: config
mountPath: /etc/config
readOnly: true
volumes:
- name: config
configMap:
name: app-config
النتيجة: كل مفتاح يصبح ملفًا في /etc/config/ مع القيمة كمحتوى.
مثال كامل
الخطوة 1: إنشاء ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: webapp-config
data:
# متغيرات بسيطة
APP_NAME: "My Web Application"
APP_VERSION: "1.0.0"
ENVIRONMENT: "production"
# ملف تكوين
nginx.conf: |
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
index index.html;
}
الخطوة 2: الاستخدام في نشر
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nginx:1.20
env:
- name: APP_NAME
valueFrom:
configMapKeyRef:
name: webapp-config
key: APP_NAME
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: webapp-config
key: ENVIRONMENT
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: nginx-config
configMap:
name: webapp-config
items:
- key: nginx.conf
path: default.conf
حالات الاستخدام
1. تكوين التطبيق
apiVersion: v1
kind: ConfigMap
metadata:
name: app-settings
data:
database_host: "db.example.com"
database_port: "5432"
cache_ttl: "3600"
feature_flags: "feature1,feature2"
2. ملفات التكوين
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
}
3. سكربتات
apiVersion: v1
kind: ConfigMap
metadata:
name: init-scripts
data:
init.sh: |
#!/bin/bash
echo "Initializing application..."
/app/setup.sh
exec /app/start.sh
أفضل الممارسات
1. التنظيم حسب البيئة
إنشاء ConfigMaps منفصلة لكل بيئة:
# تطوير
kubectl create configmap app-config-dev --from-file=config-dev.properties
# إنتاج
kubectl create configmap app-config-prod --from-file=config-prod.properties
2. إدارة الإصدارات
استخدام التسميات لإدارة الإصدارات:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
labels:
version: v1
environment: production
data:
# ...
3. عدم تخزين البيانات الحساسة
لا تضع أبدًا في ConfigMap:
- كلمات المرور
- رموز API
- مفاتيح خاصة
- شهادات
استخدم Secrets بدلاً من ذلك.
أوامر مفيدة
عرض ConfigMap
kubectl get configmap app-config
kubectl describe configmap app-config
kubectl get configmap app-config -o yaml
تعديل ConfigMap
kubectl edit configmap app-config
ملاحظة: الـ Pods الحالية لن ترى التغييرات فورًا. يجب إعادة تشغيلها.
حذف ConfigMap
kubectl delete configmap app-config
القيود
الحجم الأقصى
- 1 ميجابايت لكل إدخال في ConfigMap
- إجمالي محدود بواسطة etcd (عادةً ~1.5 ميجابايت لكل كائن)
التحديث
- المتغيرات البيئية: لا تتغير بدون إعادة تشغيل Pod
- الأحجام: يتم تحديثها بشكل دوري (تأخير بضع ثوانٍ)
ملخص
في هذا الفصل، تعلمت:
ConfigMap: كائن Kubernetes لتخزين التكوين غير الحساس
الإنشاء: kubectl create، YAML، من ملفات
الاستخدام: متغيرات بيئية (env/envFrom) أو أحجام
الفوائد: فصل التكوين عن الكود، المرونة، القابلية لإعادة الاستخدام
أفضل الممارسات: التنظيم حسب البيئة، إدارة الإصدارات، عدم وجود أسرار
القيود: الحجم الأقصى، التحديث يتطلب إعادة تشغيل للمتغيرات البيئية
الخطوات التالية
الفصل 5.2: Secrets - إدارة البيانات الحساسة
مختبر 5.1: إنشاء واستخدام ConfigMaps
تم إنشاء الفصل في: ديسمبر 2024