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

المختبر 5.4 - تدوير الأسرار

الأهداف​

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

  • فهم عملية تدوير الأسرار
  • إنشاء أسرار جديدة
  • تحديث النشر باستخدام الأسرار الجديدة
  • حذف الأسرار القديمة
  • تنفيذ تدوير بدون انقطاع

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

  • عنقود Kubernetes وظيفية
  • تكوين kubectl
  • فهم الأسرار والنشر

التمرين 1: تدوير أساسي​

الخطوة 1: إنشاء السر الأولي​

kubectl create secret generic db-secret-v1 \
--from-literal=password=old-password-123

الخطوة 2: إنشاء نشر​

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

apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: busybox:1.35
command: ["sh", "-c", "echo 'Password: $DB_PASSWORD' && sleep 3600"]
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v1
key: password

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

kubectl apply -f deployment-v1.yaml
kubectl get pods -l app=myapp

التمرين 2: إنشاء سر جديد​

إنشاء السر v2​

kubectl create secret generic db-secret-v2 \
--from-literal=password=new-password-456

التحقق​

kubectl get secrets
kubectl describe secret db-secret-v2

التمرين 3: تحديث النشر​

تحديث المرجع​

kubectl set env deployment/app-deployment \
DB_PASSWORD=$(kubectl get secret db-secret-v2 -o jsonpath='{.data.password}' | base64 -d)

أو قم بتعديل ملف YAML:

env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v2 # تم التغيير من v1 إلى v2
key: password

ثم:

kubectl apply -f deployment-v1.yaml

التحقق من إعادة التشغيل​

kubectl get pods -l app=myapp -w
kubectl rollout status deployment/app-deployment

التمرين 4: التدوير مع التحديث المتداول​

إنشاء نشر مع تحديث متداول​

قم بتعديل النشر لاستخدام السر الجديد وإجبار تحديث متداول:

# الطريقة 1: تعديل السر المشار إليه
kubectl patch deployment app-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"app","env":[{"name":"DB_PASSWORD","valueFrom":{"secretKeyRef":{"name":"db-secret-v2","key":"password"}}}]}]}}}}'

# الطريقة 2: التعليق لإجبار إعادة التشغيل
kubectl patch deployment app-deployment -p '{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"'$(date +%Y-%m-%dT%H:%M:%S%z)'"}}}}}'

التحقق​

kubectl get pods -l app=myapp
kubectl logs <pod-name> | grep Password

التمرين 5: التدوير الآلي باستخدام سكربت​

إنشاء سكربت للتدوير​

قم بإنشاء rotate-secret.sh:

#!/bin/bash

SECRET_NAME=$1
NEW_SECRET_NAME=$2
DEPLOYMENT_NAME=$3
ENV_VAR_NAME=$4

# إنشاء السر الجديد (يجب إنشاؤه يدويًا مسبقًا)
# kubectl create secret generic $NEW_SECRET_NAME --from-literal=password=<new-password>

# تحديث النشر
kubectl set env deployment/$DEPLOYMENT_NAME \
$ENV_VAR_NAME=$(kubectl get secret $NEW_SECRET_NAME -o jsonpath='{.data.password}' | base64 -d)

# انتظار التحديث
kubectl rollout status deployment/$DEPLOYMENT_NAME

echo "تم الانتهاء من التدوير. احذف السر القديم: kubectl delete secret $SECRET_NAME"

استخدام السكربت​

chmod +x rotate-secret.sh
./rotate-secret.sh db-secret-v1 db-secret-v2 app-deployment DB_PASSWORD

التمرين 6: التدوير باستخدام حاوية التهيئة​

إنشاء نشر باستخدام حاوية التهيئة​

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

apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment-init
spec:
replicas: 3
selector:
matchLabels:
app: myapp-init
template:
metadata:
labels:
app: myapp-init
spec:
initContainers:
- name: secret-validator
image: busybox:1.35
command: ["sh", "-c", "test -n \"$DB_PASSWORD\" && echo 'Secret valid'"]
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v2
key: password
containers:
- name: app
image: busybox:1.35
command: ["sh", "-c", "echo 'Password: $DB_PASSWORD' && sleep 3600"]
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret-v2
key: password

التمرين 7: التحقق بعد التدوير​

التحقق من البودات​

# عرض جميع البودات
kubectl get pods -l app=myapp

# التحقق من السجلات
kubectl logs <pod-name> | grep Password

# التحقق من متغيرات البيئة
kubectl exec <pod-name> -- env | grep DB_PASSWORD

التحقق من الأسرار​

# عرض الأسرار
kubectl get secrets | grep db-secret

# التحقق من أن السر القديم لم يعد مستخدمًا
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].env[*].valueFrom.secretKeyRef.name}' | grep -o db-secret-v1

التنظيف​

# حذف النشر
kubectl delete deployment app-deployment app-deployment-init

# حذف الأسرار القديمة (بعد التحقق)
kubectl delete secret db-secret-v1

# الاحتفاظ بـ db-secret-v2 للمرجع

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

  1. لماذا من المهم التحقق من أن جميع البودات تستخدم السر الجديد قبل حذف القديم؟
  2. كيف يمكنك أتمتة تدوير الأسرار؟
  3. ما هي أفضل استراتيجية للتدوير بدون انقطاع؟
  4. كيف تدير تدوير الأسرار لـ StatefulSets؟

تحدي إضافي​

قم بإنشاء CronJob يتحقق تلقائيًا من عمر الأسرار وينبه إذا لم يتم تدوير السر لأكثر من 90 يومًا.


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