במדריך הזה מוסבר איך להגדיר את אימות הזהויות של עומסי עבודה ב-GKE ב-AWS כדי לשלוט בגישה של עומסי עבודה למשאבי GCP. הוא כולל דוגמה לאופן הגישה למשאבי Google Cloud האשכול באמצעות הזהות.
למידע על שימוש בזהויות של עומסי עבודה עם חשבונות AWS IAM כדי לשלוט בגישה למשאבי AWS, אפשר לעיין במאמר שימוש בזהויות של עומסי עבודה עם AWS.
סקירה כללית
Workload Identity משתמש בהרשאות IAM כדי לשלוט בגישה למשאבים ב-Google Cloud . Google Cloud באמצעות זהויות של עומסי עבודה, אפשר להקצות תפקידי IAM שונים לכל עומס עבודה. השליטה המפורטת הזו בהרשאות מאפשרת לכם לפעול בהתאם לעיקרון של הרשאות מינימליות. בלי Workload Identity, צריך להקצות תפקידי IAM לצמתים של GKE ב-AWS, וכך לתת לכל עומסי העבודה בצמתים האלה את אותן הרשאות כמו לצומת עצמו. Google Cloud
דרישות מוקדמות
יוצרים אשכול משתמשים עם Kubernetes בגרסה v1.20 ואילך.
אם ה-VPC שלכם ב-AWS משתמש ב-proxy או בחומת אש, צריך להוסיף את כתובות ה-URL הבאות לרשימת ההיתרים:
securetoken.googleapis.comiamcredentials.googleapis.comsts.googleapis.com
בספריית
anthos-aws, משתמשים ב-anthos-gkeכדי להחליף הקשר לאשכול המשתמשים. מחליפים את CLUSTER_NAME בשם אשכול המשתמש.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
מפעילים את ארבעת השירותים החדשים שנדרשים לתכונה הזו באמצעות הפקודות הבאות:
gcloud services enable securetoken.googleapis.com gcloud services enable iam.googleapis.com gcloud services enable iamcredentials.googleapis.com gcloud services enable sts.googleapis.com
הרכבת השמות של מאגר הזהויות של עומסי העבודה והספק
בכל פרויקט נוצר באופן אוטומטי מאגר מנוהל של זהויות של עומסי עבודה, עם שם בתבנית PROJECT_ID.svc.id.goog. Google Cloud באופן דומה,
Google Cloud יוצר ספק זהויות שהשם שלו פועל לפי התבנית
https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID.
מידע נוסף על מאגרי זהויות של עומסי עבודה זמין במאמר רכיבים עם תמיכה ב-Fleet.
צריך ליצור את השמות האלה ממזהה הפרויקט וממזהה החברות, כמו שמוצג כאן:
export PROJECT_ID=USER_PROJECT_NAME
export CLUSTER_MEMBERSHIP_ID=PROJECT_MEMBERSHIP_NAME
export IDP="https://gkehub.googleapis.com/projects/${PROJECT_ID}/locations/global/memberships/${CLUSTER_MEMBERSHIP_ID}"
export WI_POOL="${PROJECT_ID}.svc.id.goog"
מחליפים את מה שכתוב בשדות הבאים:
- USER_PROJECT_NAME עם שם הפרויקט שהמשתמש בחר
- PROJECT_MEMBERSHIP_NAME עם שם החברות באשכול
יצירת קשירת מדיניות IAM
יוצרים קישור למדיניות כדי לאפשר לחשבון שירות של Kubernetes (KSA) להתחזות לחשבון שירות של Google Cloud (GSA).
export K8S_NAMESPACE=KUBERNETES_NAMESPACE
export KSA_NAME=KUBERNETES_SA_NAME
export GCP_SA_EMAIL="WORKLOAD_IDENTITY_TEST@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud iam service-accounts add-iam-policy-binding \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:$WI_POOL[$K8S_NAMESPACE/$KSA_NAME]" $GCP_SA_EMAIL
מחליפים את מה שכתוב בשדות הבאים:
- KUBERNETES_NAMESPACE עם מרחב השמות של Kubernetes שבו מוגדר חשבון השירות של Kubernetes
- WORKLOAD_IDENTITY_TEST בשם של עומס העבודה לבחירתכם
- KUBERNETES_SA_NAME בשם של חשבון השירות של Kubernetes שמצורף לאפליקציה
יצירת מפת תצורה של SDK
מריצים את סקריפט המעטפת שבהמשך כדי לאחסן את פרטי הזהויות של עומסי העבודה ב-ConfigMap. כש-Pod מבצע mount של ConfigMap, Google Cloud CLI יכול לקרוא את פרטי הזהות של עומס העבודה.
cat << EOF > cfmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
namespace: ${K8S_NAMESPACE}
name: my-cloudsdk-config
data:
config: |
{
"type": "external_account",
"audience": "identitynamespace:${WI_POOL}:${IDP}",
"service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SA_EMAIL}: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"
}
}
EOF
env HTTPS_PROXY=http://localhost:8118 \
kubectl apply -f cfmap.yaml
יצירת חשבון שירות ב-Kubernetes
יוצרים KSA באשכול המשתמש עם אותו שם ומרחב שמות שבהם השתמשתם בכריכת IAM.
cat << EOF > k8s-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: ${KSA_NAME}
namespace: ${K8S_NAMESPACE}
EOF
env HTTPS_PROXY=http://localhost:8118 \
kubectl apply -f k8s-service-account.yaml
יצירת Pod
בשלב הבא, יוצרים Pod עם הקרנת אסימון של חשבון השירות ועם ConfigMap שנוצר בשלב הקודם.
יוצרים את קובץ ה-YAML של ה-Pod לדוגמה.
cat << EOF > sample-pod.yaml apiVersion: v1 kind: Pod metadata: name: sample-pod namespace: ${K8S_NAMESPACE} spec: serviceAccountName: ${KSA_NAME} containers: - command: - /bin/bash - -c - while :; do echo '.'; sleep 500 ; done image: google/cloud-sdk name: cloud-sdk env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: ${WI_POOL} expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json" EOFמחילים את קובץ ה-YAML של ה-Pod על האשכול.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f sample-pod.yaml
שימוש ב-Workload Identity Google Cloud
גרסאות SDK נתמכות
כדי להשתמש בתכונה Google Cloud workload identity, צריך ליצור את הקוד באמצעות SDK שתומך בה. רשימה של גרסאות SDK שתומכות ב-Google Cloud Workload Identity זמינה במאמר Fleet Workload Identity.
קוד לדוגמה לשימוש ב-Workload Identity
בקטע הזה מופיעה דוגמה לקוד Python שמשתמש ב Google Cloud זהויות של עומסי עבודה. חשבון השירות בדוגמה הזו משתמש בזהות עם הרשאות 'אדמין של Cloud Storage' כדי להציג רשימה של כל הקטגוריות של Cloud Storage בפרויקט Google Cloud .
מריצים מעטפת בתוך ה-Pod.
env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it sample-pod -- bash
מריצים סקריפט כדי לראות את קטגוריות האחסון של הפרויקט.
# execute these commands inside the Pod pip install --upgrade google-cloud-storage cat << EOF > sample-list-bucket.py from google.cloud import storage storage_client = storage.Client() buckets = storage_client.list_buckets() for bucket in buckets: print(bucket.name) EOF env GOOGLE_CLOUD_PROJECT=USER_PROJECT_NAME \ python3 sample-list-bucket.py
מחליפים את USER_PROJECT_NAME בפרויקט שלכם ב- Google Cloud .
לקבלת מידע נוסף
- Fleet Workload Identity
- איחוד שירותי אימות הזהות של עומסי עבודה
- איך ניגשים למשאבים מספק זהויות מסוג OIDC (אשכולות Kubernetes הם ספקי זהויות מסוג OIDC)
- שימוש ב-Workload Identity עם AWS