שימוש באופרטור External Secrets

בדף הזה מוסבר איך להשתמש ב-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.com
    • iamcredentials.googleapis.com
  • ודאו שכלי שורת הפקודה הבאים מותקנים:

    • הגרסה האחרונה של Google Cloud CLI, שכוללת את gcloud, כלי שורת הפקודה לאינטראקציה עם Google Cloud.
    • kubectl

    אם אתם משתמשים ב-Cloud Shell כסביבת המעטפת שלכם לאינטראקציה עםGoogle Cloud, הכלים האלה מותקנים בשבילכם.

  • מוודאים שאתחלתם את ה-CLI של gcloud לשימוש בפרויקט.

  • מפעילים איחוד שירותי אימות הזהויות של עומסי העבודה באשכול. מאגר הזהויות של עומסי העבודה זמין באופן אוטומטי, והפורמט שלו הוא PROJECT_ID..

  • מתקינים את 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:

  1. מגדירים את יחסי האמון בין האשכול לבין Google Cloud על ידי ביצוע ההוראות במאמר אימות באשכול Workload Identity.
  2. מקצים את התפקיד Secret Manager Secret Accessor ‏(roles/secretmanager.secretAccessor) בסוד לחשבון השירות של Kubernetes שבו משתמש External Secrets Operator:

    gcloud secrets add-iam-policy-binding SECRET_NAME \
        --project=PROJECT_ID \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID./subject/ns/OPERATOR_NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
        --role="roles/secretmanager.secretAccessor" \
        --condition=None
    

    מחליפים את הערכים הבאים:

    • ‫SECRET_NAME: השם של הסוד ב-Secret Manager
    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
    • ‫PROJECT_NUMBER: המספר Google Cloudהמספרי של הפרויקט
    • ‫OPERATOR_NAMESPACE: מרחב השמות שבו התקנתם את האופרטור
    • ‫KUBERNETES_SERVICEACCOUNT: השם של חשבון השירות של Kubernetes שבו משתמש האופרטור
  3. מגדירים את ה-Pod של External Secrets Operator כך שישתמש באיחוד זהויות של עומסי עבודה (WIF) ומספקים את קובץ התצורה של פרטי הכניסה ל-Pod של האופרטור לפי ההוראות שבקטע הגדרת עומס העבודה.

יצירת משאבי ESO לסנכרון סודות

אחרי שמגדירים אימות, אפשר ליצור משאבי External Secrets Operator כדי לסנכרן סודות.

יצירת SecretStore

SecretStore מציין איך לגשת למערכת החיצונית לניהול סודות. אפשר ליצור משאבי SecretStore באותו מרחב שמות כמו External Secrets Operator או במרחבי שמות של אפליקציות. מידע נוסף זמין במאמר בנושא SecretStore במאמרי העזרה של Kubernetes.

  1. יוצרים קובץ בשם 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
  2. משתמשים בפקודה kubectl apply כדי להחיל את המניפסט:

    kubectl apply -f secret-store.yaml
    

יצירת ClusterSecretStore

‫ClusterSecretStore הוא משאב בהיקף האשכול שמשאבי ExternalSecret יכולים להשתמש בו בכל מרחב שמות. מידע נוסף זמין במאמר בנושא ClusterSecretStore במאמרי העזרה של Kubernetes.

  1. יוצרים קובץ בשם 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 שבו מאוחסנים הסודות.

  2. החלת המניפסט:

    kubectl apply -f cluster-secret-store.yaml
    

יצירת ExternalSecret

ExternalSecret מגדיר אילו נתונים לאחזר ולאן לאחסן אותם באשכול. יצירת משאבי ExternalSecret במרחב השמות שבו קבוצות ה-Pod של האפליקציה צורכות את סוד Kubernetes שנוצר. מידע נוסף זמין במאמר ExternalSecret במאמרי העזרה של Kubernetes.

  1. יוצרים קובץ בשם 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 שייווצר על ידי ESO.
    • ‫K8S_SECRET_KEY: המפתח בנתוני הסוד של Kubernetes.
    • ‫SECRET_NAME: השם של הסוד ב- Google Cloud Secret Manager.

    אם אתם משתמשים ב-ClusterSecretStore, צריך להגדיר את kind: ClusterSecretStore ולעדכן את name ב-secretStoreRef.

  2. החלת המניפסט:

    kubectl apply -f external-secret.yaml
    

סנכרון של כמה מפתחות מסוד JSON

אם הסוד שלכם ב-Secret Manager מכיל מחרוזת JSON, אתם יכולים לחלץ את כל המפתחות כרשומות נפרדות בסוד של Kubernetes.

  1. יוצרים קובץ בשם 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
    
  2. החלת המניפסט:

    kubectl apply -f external-secret-json.yaml
    

כל צמד מפתח-ערך בסוד ה-JSON ממופה לצמד מפתח-ערך בסוד Kubernetes שמתקבל.

פתרון בעיות

אם הסודות לא מסתנכרנים, אפשר לנסות את השלבים הבאים לפתרון בעיות:

  1. משתמשים בפקודה kubectl get כדי לבדוק את הסטטוס של המשאב ExternalSecret:

    kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yaml
    

    בודקים את הקטע status אם יש הודעות שגיאה או תנאים שלא מתקיימים.

  2. משתמשים בפקודה kubectl logs כדי לבדוק את היומנים של ה-Pod של בקר External Secrets Operator:

    kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACE
    
  3. צריך לוודא שלחשבון השירות של Kubernetes שבו נעשה שימוש באופרטור יש את התפקיד Secret Manager Secret Accessor ‏(roles/secretmanager.secretAccessor), ושהתכונה איחוד זהויות של עומסי עבודה (WIF) מוגדרת בצורה נכונה ב-Pod של האופרטור. מידע נוסף זמין במאמר איחוד שירותי אימות הזהות של עומסי עבודה באשכול.

המאמרים הבאים