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

المختبر 5.3 - حقن التكوين في الـ Pods

الأهداف​

في نهاية هذا المختبر، ستكون قادرًا على:

  • حقن ConfigMaps كمتغيرات بيئية
  • تركيب ConfigMaps كأحجام
  • استخدام Secrets بطريقة آمنة
  • فهم الفروقات بين env وvolumes

المتطلبات الأساسية​

  • عنقود Kubernetes وظيفية
  • تكوين kubectl
  • فهم ConfigMaps وSecrets

التمرين 1: متغيرات البيئة من ConfigMap​

الخطوة 1: إنشاء ConfigMap​

kubectl create configmap app-config \
--from-literal=database_url=postgresql://localhost:5432/mydb \
--from-literal=log_level=info \
--from-literal=max_connections=100

الخطوة 2: إنشاء Pod مع env​

قم بإنشاء ملف pod-env.yaml:

apiVersion: v1
kind: Pod
metadata:
name: app-pod-env
spec:
containers:
- name: app
image: busybox:1.35
command: ["sh", "-c", "env | grep -E 'DATABASE|LOG|MAX' && sleep 3600"]
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config
key: database_url
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log_level
- name: MAX_CONNECTIONS
valueFrom:
configMapKeyRef:
name: app-config
key: max_connections

الخطوة 3: النشر والتحقق​

kubectl apply -f pod-env.yaml
kubectl logs app-pod-env

التمرين 2: envFrom لجميع المفاتيح​

إنشاء Pod مع envFrom​

قم بإنشاء pod-envfrom.yaml:

apiVersion: v1
kind: Pod
metadata:
name: app-pod-envfrom
spec:
containers:
- name: app
image: busybox:1.35
command: ["sh", "-c", "env | grep -E 'database|log|max' && sleep 3600"]
envFrom:
- configMapRef:
name: app-config

النشر والتحقق​

kubectl apply -f pod-envfrom.yaml
kubectl logs app-pod-envfrom

التمرين 3: ConfigMap كحجم​

إنشاء ConfigMap مع ملف​

cat > nginx.conf <<EOF
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
}
EOF

kubectl create configmap nginx-config --from-file=nginx.conf

إنشاء Pod مع حجم​

قم بإنشاء pod-volume.yaml:

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.20
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: config
configMap:
name: nginx-config

النشر والتحقق​

kubectl apply -f pod-volume.yaml
kubectl exec nginx-pod -- cat /etc/nginx/conf.d/nginx.conf

التمرين 4: Secrets كمتغيرات بيئية​

إنشاء Secret​

kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secret123

إنشاء Pod مع Secret​

قم بإنشاء pod-secret-env.yaml:

apiVersion: v1
kind: Pod
metadata:
name: app-pod-secret
spec:
containers:
- name: app
image: busybox:1.35
command: ["sh", "-c", "echo 'DB_USER: $DB_USERNAME' && echo 'DB_PASS: $DB_PASSWORD' && sleep 3600"]
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password

النشر والتحقق​

kubectl apply -f pod-secret-env.yaml
kubectl logs app-pod-secret

التمرين 5: Secrets كحجم​

إنشاء Pod مع حجم Secret​

قم بإنشاء pod-secret-volume.yaml:

apiVersion: v1
kind: Pod
metadata:
name: app-pod-secret-vol
spec:
containers:
- name: app
image: busybox:1.35
command: ["sh", "-c", "ls -la /etc/secrets && cat /etc/secrets/username && sleep 3600"]
volumeMounts:
- name: secrets
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secrets
secret:
secretName: db-secret
defaultMode: 0400

النشر والتحقق​

kubectl apply -f pod-secret-volume.yaml
kubectl logs app-pod-secret-vol

التمرين 6: التكوين الكامل​

إنشاء ConfigMap وSecret​

kubectl create configmap app-config \
--from-literal=app_name=MyApp \
--from-literal=environment=production

kubectl create secret generic app-secret \
--from-literal=api_key=secret-api-key-123

إنشاء نشر كامل​

قم بإنشاء deployment-complete.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: nginx:1.20
env:
- name: APP_NAME
valueFrom:
configMapKeyRef:
name: app-config
key: app_name
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: app-config
key: environment
- name: API_KEY
valueFrom:
secretKeyRef:
name: app-secret
key: api_key
volumeMounts:
- name: config
mountPath: /etc/config
readOnly: true
volumes:
- name: config
configMap:
name: app-config

النشر والتحقق​

kubectl apply -f deployment-complete.yaml
kubectl get pods -l app=myapp
kubectl exec <pod-name> -- env | grep -E 'APP|ENV|API'

التنظيف​

kubectl delete pod app-pod-env app-pod-envfrom nginx-pod app-pod-secret app-pod-secret-vol
kubectl delete deployment app-deployment
kubectl delete configmap app-config nginx-config
kubectl delete secret db-secret app-secret

أسئلة للتفكير​

  1. ما الفرق بين env وenvFrom؟
  2. متى تستخدم حجم ConfigMap مقابل المتغيرات البيئية؟
  3. لماذا تستخدم readOnly: true لأحجام secrets؟
  4. كيف تؤثر تغييرات ConfigMap على الـ Pods الموجودة؟

تم إنشاء المختبر في: ديسمبر 2024