בדף הזה מוסבר איך להשתמש ב-External Secrets Operator (ESO) כדי לסנכרן סודות מ-Secret Manager עם אשכולות של Google Distributed Cloud במודל מחובר.
External Secrets Operator הוא אופרטור קוד פתוח של Kubernetes שמבצע אינטגרציה של מערכות חיצוניות לניהול סודות. האופרטור קורא מידע מ-API חיצוניים ומזריק את הערכים באופן אוטומטי לסוד של Kubernetes.
דרישות מוקדמות
לפני שמשתמשים ב-External Secrets Operator, צריך לבצע את הפעולות הבאות:
- יוצרים אשכול מחובר של Distributed Cloud.
- מוודאים שממשקי ה-API הבאים מופעלים בפרויקט ב- Google Cloud .
מידע על הפעלת ממשקי API זמין במאמר הפעלת שירותים:
secretmanager.googleapis.comiamcredentials.googleapis.com
ודאו שכלי שורת הפקודה הבאים מותקנים:
- הגרסה האחרונה של Google Cloud CLI, שכוללת את
gcloud, כלי שורת הפקודה לאינטראקציה עם Google Cloud. kubectl
אם אתם משתמשים ב-Cloud Shell כסביבת המעטפת שלכם לאינטראקציה עםGoogle Cloud, הכלים האלה מותקנים בשבילכם.
- הגרסה האחרונה של Google Cloud CLI, שכוללת את
מוודאים שאתחלתם את ה-CLI של gcloud לשימוש בפרויקט.
מפעילים את איחוד שירותי אימות הזהות של עומסי העבודה באשכול. מאגר הזהויות של עומסי העבודה זמין באופן אוטומטי, והפורמט שלו הוא
PROJECT_ID.svc.id.goog.מתקינים את External Secrets Operator באשכול. הוראות להתקנה מופיעות במסמכי External Secrets Operator. מומלץ להתקין את האופרטור במרחב שמות ייעודי, כמו
external-secrets. אל תתקינו אותו במרחבי שמות שמנוהלים על ידי המערכת, כמוkube-systemאוgke-system.
אשכולות מחוברים של Distributed Cloud נרשמים אוטומטית ל-Fleet בפרויקט שבו הם נוצרו.
אימות
כדי לגשת ל-Secret Manager, נדרש אימות של External Secrets Operator. Distributed Cloud Connected משתמש ב-Workload Identity Federation של Fleet כדי לאפשר לעומסי עבודה לבצע אימות ל-Google Cloud APIs.
כדי להגדיר אימות עבור External Secrets Operator:
- מגדירים את יחסי האמון בין האשכול לבין Google Cloud על ידי ביצוע ההוראות במאמר אימות אשכול Workload Identity.
- מוודאים שלחשבון השירות של Google שבו משתמש External Secrets Operator יש את התפקיד Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor) בסודות שרוצים לגשת אליהם. מגדירים את ה-Pod של External Secrets Operator לשימוש באיחוד שירותי אימות הזהות של עומסי עבודה לפי ההוראות שבקטע הגדרת עומס העבודה.
רוב הלקוחות משתמשים באיחוד שירותי אימות הזהות של עומסי עבודה לצורך אימות. כדי להגדיר את איחוד זהויות של עומסי עבודה, צריך להוסיף הערה לחשבון השירות של Kubernetes שבו משתמש האופרטור עם חשבון השירות של Google. כדי להוסיף את ההערה הזו, מריצים את הפקודה kubectl annotate:
kubectl annotate serviceaccount KSA_NAME \ --namespace OPERATOR_NAMESPACE \ iam.gke.io/gcp-service-account=GSA_EMAILאפשר גם להוסיף את ההערה ל-YAML של ServiceAccount:
apiVersion: v1 kind: ServiceAccount metadata: annotations: iam.gke.io/gcp-service-account: GSA_EMAIL name: KSA_NAME namespace: OPERATOR_NAMESPACEמחליפים את הערכים הבאים:
-
KSA_NAME: השם של Kubernetes ServiceAccount שמשמש את האופרטור -
OPERATOR_NAMESPACE: מרחב השמות שבו התקנתם את האופרטור -
GSA_EMAIL: כתובת האימייל של חשבון השירות של Google
-
מספקים את קובץ התצורה של פרטי הכניסה ל-Pod של האופרטור. מידע נוסף זמין במאמר הגדרת עומס העבודה.
יצירת משאבי ESO לסנכרון סודות
אחרי שמגדירים אימות, אפשר ליצור משאבי External Secrets Operator כדי לסנכרן סודות.
יצירת SecretStore
SecretStore מציין איך לגשת למערכת החיצונית לניהול סודות.
אפשר ליצור משאבי SecretStore באותו מרחב שמות כמו External
Secrets Operator או במרחבי שמות של אפליקציות. מידע נוסף זמין במאמר בנושא SecretStore במסמכי התיעוד של Kubernetes.
יוצרים קובץ בשם
secret-store.yamlעם התוכן הבא:apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: gcp-store namespace: NAMESPACE spec: provider: gcpsm: projectID: PROJECT_IDמחליפים את הערכים הבאים:
-
NAMESPACE: מרחב השמות שבו רוצים ליצור אתSecretStore -
PROJECT_ID: מזהה הפרויקט שבו מאוחסנים הסודות Google Cloud
-
משתמשים בפקודה kubectl apply כדי להחיל את המניפסט:
kubectl apply -f secret-store.yaml
יצירת ClusterSecretStore
ClusterSecretStore הוא משאב בהיקף האשכול שמשאבי ExternalSecret יכולים להשתמש בו בכל מרחב שמות. מידע נוסף זמין במאמר בנושא ClusterSecretStore במאמרי העזרה של Kubernetes.
יוצרים קובץ בשם
cluster-secret-store.yamlעם התוכן הבא:apiVersion: external-secrets.io/v1 kind: ClusterSecretStore metadata: name: gcp-cluster-store spec: provider: gcpsm: projectID: PROJECT_IDמחליפים את
PROJECT_IDבמזהה הפרויקט ב- Google Cloud שבו מאוחסנים הסודות.החלת המניפסט:
kubectl apply -f cluster-secret-store.yaml
יצירת ExternalSecret
ExternalSecret מגדיר אילו נתונים להביא ולאן לאחסן אותם באשכול. יוצרים משאבי ExternalSecret במרחב השמות שבו קבוצות ה-Pod של האפליקציה צורכות את סוד ה-Kubernetes שנוצר. מידע נוסף זמין במאמר ExternalSecret במאמרי העזרה של Kubernetes.
יוצרים קובץ בשם
external-secret.yamlעם התוכן הבא:apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: EXTERNAL_SECRET namespace: NAMESPACE spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: gcp-store target: name: K8S_SECRET_NAME creationPolicy: Owner data: - secretKey: K8S_SECRET_KEY remoteRef: key: SECRET_NAMEמחליפים את הערכים הבאים:
-
EXTERNAL_SECRET: השם של משאבExternalSecret. -
NAMESPACE: מרחב השמות שבו יצרתם אתSecretStore. -
K8S_SECRET_NAME: השם של ה-Kubernetes Secret שייווצר על ידי ESO. -
K8S_SECRET_KEY: המפתח בנתוני הסוד של Kubernetes. -
SECRET_NAME: השם של הסוד ב-Google Cloud Secret Manager.
אם משתמשים ב-
ClusterSecretStore, מגדירים אתkind: ClusterSecretStoreומעדכנים אתnameב-secretStoreRef.-
החלת המניפסט:
kubectl apply -f external-secret.yaml
סנכרון של כמה מפתחות מסודר בפורמט JSON
אם הסוד שלכם ב-Secret Manager מכיל מחרוזת JSON, אתם יכולים לחלץ את כל המפתחות כרשומות נפרדות בסוד של Kubernetes.
יוצרים קובץ בשם
external-secret-json.yamlעם התוכן הבא:apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: EXTERNAL_SECRET namespace: NAMESPACE spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: gcp-store target: name: K8S_SECRET_NAME creationPolicy: Owner dataFrom: - extract: key: SECRET_NAMEהחלת המניפסט:
kubectl apply -f external-secret-json.yaml
כל צמד מפתח-ערך בסוד של JSON ממופה לצמד מפתח-ערך בסוד של Kubernetes שמתקבל.
פתרון בעיות
אם הסודות לא מסתנכרנים, אפשר לנסות את השלבים הבאים לפתרון בעיות:
משתמשים בפקודה kubectl get כדי לבדוק את הסטטוס של המשאב
ExternalSecret:kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yamlבודקים את הקטע
statusאם יש הודעות שגיאה או תנאים שלא מתקיימים.משתמשים בפקודה kubectl logs כדי לבדוק את היומנים של פוד בקר External Secrets Operator:
kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACEמוודאים שחשבון השירות ב-Kubernetes שבו משתמש האופרטור כולל את ההערה הנכונה עם כתובת האימייל בחשבון Google. מידע נוסף זמין במאמר איחוד שירותי אימות הזהות של עומסי עבודה באשכול.
מוודאים שלחשבון השירות של Google יש את ההרשאות הנדרשות ושהגדרת איחוד שירותי אימות הזהות של עומסי עבודה בוצעה בצורה תקינה. מידע נוסף זמין במאמר איחוד שירותי אימות הזהות של עומסי עבודה באשכול.