Workload Identity מאפשרת להקצות זהויות והרשאות שונות ומפורטות לכל אפליקציה באשכול. הדרך המומלצת לאפליקציות שפועלות ב-GKE ב-AWS לגשת לשירותיGoogle Cloud היא באמצעות Workload Identity. מידע נוסף זמין במאמר זהות עומס עבודה.
במאמר הזה מוסבר איך להשתמש ב-Workload Identity כדי להתחבר לGoogle Cloud שירותים מעומסי העבודה.
הגדרת Google Cloud חשבון שירות
בקטע הזה יוצרים חשבון שירות (GSA) עם הרשאות מוגבלות לגישה לשירותים של Google Cloud . Google Cloud
קבלת מאגר הזהויות של עומסי העבודה והספק
כדי להגדיר Workload Identity, צריך לדעת את הערכים של ה-URI של ספק הזהויות של האשכול ושל מאגרי הזהויות של עומסי העבודה.
קובעים את מאגר הזהויות של עומסי העבודה עבור האשכול:
לכל אשכול 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
הפלט כולל את השם של מאגר הזהויות של האשכול. שומרים את הערך הזה. תצטרכו אותו בהמשך.
קובעים את ספק הזהויות של האשכול.
כדי למצוא את השם של ספק הזהויות של האשכול, משתמשים ב-Google Cloud CLI:
gcloud container aws clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAMEGOOGLE_CLOUD_LOCATION
הפלט כולל את השם של ספק הזהויות של האשכול. שומרים את הערך הזה. תצטרכו אותו בהמשך.
יצירה של Google Cloud חשבון שירות
כדי ליצור Google Cloud חשבון שירות (GSA), לתת לו הרשאות ולהוסיף קישור למדיניות IAM ל-GSA, מבצעים את השלבים הבאים:
יוצרים את חשבון ה-GSA באמצעות Google Cloud CLI:
gcloud iam service-accounts create GSA_NAME --project=PROJECT_IDמחליפים את מה שכתוב בשדות הבאים:
-
GSA_NAME: השם של חשבון השירות של האפליקציה. -
PROJECT_ID: הפרויקט של GSA ב- Google Cloud .
-
מוסיפים קישור 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-
נותנים הרשאות לחשבון השירות של 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_NAMEPROJECT_ID-
NAMESPACE: מרחב השמות של Kubernetes עבור האפליקציה -
KSA_NAME: ה-KSA שבו יש להשתמש באפליקציה
פריסת אפליקציה לדוגמה
בקטע הזה נסביר איך פורסים אפליקציה לדוגמה שמשתמשת ב-API של Compute Engine. כדי להשתמש בדוגמה הזו, צריך להקצות לחשבון השירות את תפקיד ה-IAM roles/compute.viewer. כדי לפרוס את האפליקציה לדוגמה, פועלים לפי השלבים הבאים:
מעתיקים את המניפסט הבא לקובץ בשם
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_IDNAMESPACEKSA_NAMEGSA_NAME-
IDENTITY_PROVIDERבשם של ספק הזהויות של האשכול.
החלת המניפסט על האשכול
kubectl apply -f workload-identity-sample.yamlמוודאים שהאפליקציה לדוגמה פועלת, בודקים את היומנים של ה-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
סידור וארגון
מחיקת האפליקציה לדוגמה
kubectl delete -f manifest.yamlהסרת הקישור של מדיניות 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_NAMEPROJECT_IDNAMESPACEKSA_NAME
הסרת הקישור של מדיניות ה-IAM מהפרויקט
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewerמחליפים את מה שכתוב בשדות הבאים:
GSA_NAMEPROJECT_ID
מחיקה של חשבון השירות ב-Google Cloud
gcloud iam service-accounts delete \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.comמחליפים את מה שכתוב בשדות הבאים:
GSA_NAMEPROJECT_ID