שימוש בזהויות של עומסי עבודה עם Google Cloud
Workload Identity מאפשרת להקצות זהויות והרשאות נפרדות ומפורטות לכל אפליקציה באשכול. הדרך המומלצת לאפליקציות שפועלות ב-GKE ב-Azure לגשת לשירותיGoogle Cloud היא באמצעות Workload Identity. מידע נוסף זמין במאמר זהות עומס עבודה.
במאמר הזה מוסבר איך להשתמש ב-Workload Identity כדי להתחבר לGoogle Cloud שירותים מעומסי העבודה.
הגדרת הרשאות IAM
בקטע הזה, נותנים לחשבון שירות של Kubernetes הרשאות גישה לשירותים שלGoogle Cloud באמצעות הקצאת תפקידי IAM.
קבלת מאגר הזהויות של עומסי העבודה והספק
כדי להגדיר Workload Identity, צריך לדעת את הערכים של ה-URI של ספק הזהויות של האשכול ושל מאגרי הזהויות של עומסי העבודה.
קובעים את מאגר הזהויות של עומסי העבודה עבור האשכול:
לכל אשכול GKE יש ספק זהויות שנוצר במאגר הזהויות של כוח העבודה
PROJECT_ID.svc.id.goog. כדי לקבל את השם של מאגר הזהויות של האשכול, משתמשים ב-Google Cloud CLI:gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.workloadPool)'מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAMEבשם של האשכול.-
GOOGLE_CLOUD_LOCATIONבשם המיקום שמנהל את האשכול Google Cloud
הפלט כולל את השם של מאגר הזהויות של האשכול. שומרים את הערך הזה. תצטרכו אותו בהמשך.
קובעים את ספק הזהויות של האשכול.
כדי למצוא את השם של ספק הזהויות של האשכול, משתמשים ב-Google Cloud CLI:
gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAMEGOOGLE_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. כדי לפרוס את האפליקציה לדוגמה, פועלים לפי השלבים הבאים:
מעתיקים את המניפסט הבא לקובץ בשם
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_IDNAMESPACEKUBERNETES_SERVICEACCOUNT-
IDENTITY_PROVIDERבשם של ספק הזהויות של האשכול.
החלת המניפסט על האשכול
kubectl apply -f workload-identity-sample.yamlכדי לוודא שהאפליקציה לדוגמה פועלת, בודקים את היומנים של ה-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
סידור וארגון
מחיקת האפליקציה לדוגמה
kubectl delete -f manifest.yamlהסרת הקישור של מדיניות ה-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_IDPROJECT_NUMBERNAMESPACEKUBERNETES_SERVICEACCOUNT