שימוש באופרטור 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.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:

  1. מגדירים את יחסי האמון בין האשכול לבין Google Cloud על ידי ביצוע ההוראות במאמר אימות אשכול Workload Identity.
  2. מוודאים שלחשבון השירות של Google שבו משתמש External Secrets Operator יש את התפקיד Secret Manager Secret Accessor ‏(roles/secretmanager.secretAccessor) בסודות שרוצים לגשת אליהם.
  3. מגדירים את ה-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
  4. מספקים את קובץ התצורה של פרטי הכניסה ל-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 Secret שייווצר על ידי 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 כדי לבדוק את היומנים של פוד בקר External Secrets Operator:

    kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACE
    
  3. מוודאים שחשבון השירות ב-Kubernetes שבו משתמש האופרטור כולל את ההערה הנכונה עם כתובת האימייל בחשבון Google. מידע נוסף זמין במאמר איחוד שירותי אימות הזהות של עומסי עבודה באשכול.

  4. מוודאים שלחשבון השירות של Google יש את ההרשאות הנדרשות ושהגדרת איחוד שירותי אימות הזהות של עומסי עבודה בוצעה בצורה תקינה. מידע נוסף זמין במאמר איחוד שירותי אימות הזהות של עומסי עבודה באשכול.

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