External Secrets و Secret Rotation
الهدف من الدرس
Section titled “الهدف من الدرس”ستتعلم لماذا لا نضع secrets في Git كنص صريح، وكيف تعمل أدوات مثل External Secrets Operator لنسخ السر من مزود خارجي إلى Kubernetes Secret.
الفكرة ببساطة
Section titled “الفكرة ببساطة”Kubernetes Secret ليس مدير أسرار كامل. هو object داخل cluster. في Production غالبا يكون المصدر الحقيقي في AWS Secrets Manager أو Vault أو Azure Key Vault، ثم يقوم operator بعمل sync.
flowchart LR SM[External Secret Store] --> ESO[External Secrets Operator] ESO --> KS[Kubernetes Secret] KS --> P[Pod env أو volume]YAML مختصر
Section titled “YAML مختصر”secret-store.yaml:
apiVersion: external-secrets.io/v1beta1kind: SecretStoremetadata: name: demo-storespec: provider: fake: data: - key: /demo/database/password value: "change-me"external-secret.yaml:
apiVersion: external-secrets.io/v1beta1kind: ExternalSecretmetadata: name: database-passwordspec: refreshInterval: 1h secretStoreRef: name: demo-store kind: SecretStore target: name: database-password creationPolicy: Owner data: - secretKey: password remoteRef: key: /demo/database/passwordRotation checklist
Section titled “Rotation checklist”| خطوة | الهدف |
|---|---|
| أضف secret جديد في store | لا تكسر النسخة الحالية |
| حدّث التطبيق لقراءة القيمة الجديدة | env يحتاج restart غالبا |
| نفذ rollout | Pods تقرأ secret الجديد |
| راقب الأخطاء | تأكد أن الاتصال يعمل |
| احذف السر القديم | أغلق نافذة الخطر |
Lab: قراءة Secret متزامن
الهدف: فهم كيف يظهر ExternalSecret كـ Kubernetes Secret واختبار قيمته.
Prerequisites
Section titled “Prerequisites”- External Secrets Operator مثبت إذا أردت تنفيذ المثال فعليا.
kubectl apply -f secret-store.yamlkubectl apply -f external-secret.yamlkubectl get externalsecretkubectl get secret database-passwordkubectl get secret database-password -o jsonpath='{.data.password}' | base64 -dExpected output
Section titled “Expected output”change-meCleanup
Section titled “Cleanup”kubectl delete -f external-secret.yamlkubectl delete -f secret-store.yamlأخطاء شائعة
Section titled “أخطاء شائعة”| الخطأ | الحل |
|---|---|
| تخزين Secret YAML في Git | استخدم External Secrets أو Sealed Secrets |
| تغيير Secret بدون rollout | أعد تشغيل Pods التي تقرأه كـ env |
| صلاحيات store واسعة | استخدم least privilege |