انتقل إلى المحتوى الرئيسي

الفصل 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