שימוש בזהויות של עומסי עבודה עם Google Cloud

Workload Identity מאפשרת להקצות זהויות והרשאות שונות ומפורטות לכל אפליקציה באשכול. הדרך המומלצת לאפליקציות שפועלות ב-GKE ב-AWS לגשת לשירותיGoogle Cloud היא באמצעות Workload Identity. מידע נוסף זמין במאמר זהות עומס עבודה.

במאמר הזה מוסבר איך להשתמש ב-Workload Identity כדי להתחבר לGoogle Cloud שירותים מעומסי העבודה.

הגדרת Google Cloud חשבון שירות

בקטע הזה יוצרים חשבון שירות (GSA) עם הרשאות מוגבלות לגישה לשירותים של Google Cloud . Google Cloud

קבלת מאגר הזהויות של עומסי העבודה והספק

כדי להגדיר Workload Identity, צריך לדעת את הערכים של ה-URI של ספק הזהויות של האשכול ושל מאגרי הזהויות של עומסי העבודה.

  1. קובעים את מאגר הזהויות של עומסי העבודה עבור האשכול:

    לכל אשכול GKE יש ספק זהויות שנוצר במאגר הזהויות של עומסי העבודה PROJECT_ID.svc.id.goog. כדי לקבל את השם של מאגר הזהויות של האשכול, משתמשים ב-Google Cloud CLI:

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.workloadPool)'
    

    מחליפים את מה שכתוב בשדות הבאים:

    • CLUSTER_NAME בשם של האשכול.
    • GOOGLE_CLOUD_LOCATION עם שם המיקום שמנהל את האשכול Google Cloud

    הפלט כולל את השם של מאגר הזהויות של האשכול. שומרים את הערך הזה. תצטרכו אותו בהמשך.

  2. קובעים את ספק הזהויות של האשכול.

    כדי למצוא את השם של ספק הזהויות של האשכול, משתמשים ב-Google Cloud CLI:

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.identityProvider)'
    

    מחליפים את מה שכתוב בשדות הבאים:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    הפלט כולל את השם של ספק הזהויות של האשכול. שומרים את הערך הזה. תצטרכו אותו בהמשך.

יצירה של Google Cloud חשבון שירות

כדי ליצור Google Cloud חשבון שירות (GSA), לתת לו הרשאות ולהוסיף קישור למדיניות IAM ל-GSA, מבצעים את השלבים הבאים:

  1. יוצרים את חשבון ה-GSA באמצעות Google Cloud CLI:

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

    מחליפים את מה שכתוב בשדות הבאים:

    • GSA_NAME: השם של חשבון השירות של האפליקציה.
    • PROJECT_ID: הפרויקט של GSA ב- Google Cloud .
  2. מוסיפים קישור IAM כדי לאפשר ל-GSA לגשת לשירותים.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role IAM_ROLE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • GSA_NAME: השם של חשבון השירות של Google לאפליקציה
    • PROJECT_ID: מזהה הפרויקט של GSA
    • IAM_ROLE: תפקיד ה-IAM שרוצים להקצות ל-GSA

    בדוגמה הזו נשתמש בתפקיד roles/compute.viewer, שמאפשר גישת קריאה בלבד לשירותי מחשוב:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. נותנים הרשאות לחשבון השירות של Kubernetes ‏(KSA) להתחזות לחשבון השירות של Google ‏(GSA). כדי לעשות את זה, מוסיפים קישור למדיניות IAM עם התפקיד roles/iam.workloadIdentityUser:

    gcloud iam service-accounts add-iam-policy-binding GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        --role roles/iam.workloadIdentityUser
    

    מחליפים את מה שכתוב בשדות הבאים:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE: מרחב השמות של Kubernetes עבור האפליקציה
    • KSA_NAME: ה-KSA שבו יש להשתמש באפליקציה

פריסת אפליקציה לדוגמה

בקטע הזה נסביר איך פורסים אפליקציה לדוגמה שמשתמשת ב-API של Compute Engine. כדי להשתמש בדוגמה הזו, צריך להקצות לחשבון השירות את תפקיד ה-IAM ‏roles/compute.viewer. כדי לפרוס את האפליקציה לדוגמה, פועלים לפי השלבים הבאים:

  1. מעתיקים את המניפסט הבא לקובץ בשם workload-identity-sample.yaml:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cloud-sdk-config
      namespace: NAMESPACE
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: cloud-sdk-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: cloud-sdk
        image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest
        command:
        - /bin/bash
        - -c
        - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done'
        env:
        - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
          value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        - name: CLOUDSDK_CORE_PROJECT
          value: PROJECT_ID
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 86400
              path: token
          - configMap:
              name: cloud-sdk-config
              optional: false
              items:
              - key: config
                path: google-application-credentials.json
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER בשם של ספק הזהויות של האשכול.
  2. החלת המניפסט על האשכול

    kubectl apply -f workload-identity-sample.yaml
    
  3. מוודאים שהאפליקציה לדוגמה פועלת, בודקים את היומנים של ה-Pod:

    kubectl logs -f cloud-sdk-example -n NAMESPACE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • NAMESPACE

    אם ל-Pod יש גישה ל-Google Cloud Compute API, יוצג פלט שדומה לזה:

    NAME           REGION       STATUS  NEXT_MAINTENANCE  TURNDOWN_DATE
    us-central1-c  us-central1  UP
    us-central1-a  us-central1  UP
    us-central1-f  us-central1  UP
    us-central1-b  us-central1  UP
    

סידור וארגון

  1. מחיקת האפליקציה לדוגמה

    kubectl delete -f manifest.yaml
    
  2. הסרת הקישור של מדיניות IAM מחשבון השירות של Google Cloud

    gcloud iam service-accounts remove-iam-policy-binding \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        roles/iam.workloadIdentityUser
    

    מחליפים את מה שכתוב בשדות הבאים:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. הסרת הקישור של מדיניות ה-IAM מהפרויקט

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    

    מחליפים את מה שכתוב בשדות הבאים:

    • GSA_NAME
    • PROJECT_ID
  4. מחיקה של חשבון השירות ב-Google Cloud

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    מחליפים את מה שכתוב בשדות הבאים:

    • GSA_NAME
    • PROJECT_ID

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