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

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

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

הגדרת הרשאות IAM

בקטע הזה, נותנים לחשבון שירות של Kubernetes הרשאות גישה לשירותים שלGoogle Cloud באמצעות הקצאת תפקידי IAM.

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

כדי להגדיר 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

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

הקצאת תפקידי IAM לחשבון שירות של Kubernetes

מקצים את תפקיד ה-IAM בפרויקט ל-KubernetesServiceAccount:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
    --role=IAM_ROLE \
    --condition=None

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

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • ‫PROJECT_NUMBER: מספר הפרויקט ב- Google Cloud
  • ‫NAMESPACE: מרחב השמות של Kubernetes עבור האפליקציה
  • ‫KUBERNETES_SERVICEACCOUNT: חשבון השירות של Kubernetes שבו האפליקציה תשתמש
  • ‫IAM_ROLE: תפקיד ה-IAM שרוצים להקצות ל-Kubernetes ServiceAccount

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

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
    --role=roles/compute.viewer \
    --condition=None

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

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

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

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KUBERNETES_SERVICEACCOUNT
      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",
          "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: KUBERNETES_SERVICEACCOUNT
      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
    • KUBERNETES_SERVICEACCOUNT
    • ‫IDENTITY_PROVIDER בשם של ספק הזהויות של האשכול.
  2. החלת המניפסט על האשכול

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

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

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

    • NAMESPACE

    אם הפוד מצליח לגשת ל-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 מהפרויקט

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
        --role=roles/compute.viewer \
        --condition=None
    

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

    • PROJECT_ID
    • PROJECT_NUMBER
    • NAMESPACE
    • KUBERNETES_SERVICEACCOUNT

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