المختبر 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 للمرجع
أسئلة للتفكير
- لماذا من المهم التحقق من أن جميع البودات تستخدم السر الجديد قبل حذف القديم؟
- كيف يمكنك أتمتة تدوير الأسرار؟
- ما هي أفضل استراتيجية للتدوير بدون انقطاع؟
- كيف تدير تدوير الأسرار لـ StatefulSets؟
تحدي إضافي
قم بإنشاء CronJob يتحقق تلقائيًا من عمر الأسرار وينبه إذا لم يتم تدوير السر لأكثر من 90 يومًا.
تم إنشاء المختبر في: ديسمبر 2024