במאמר הזה מוסבר איך להפעיל את Workload Identity ב-Apigee Hybrid.
סקירה כללית
Workload Identity היא דרך לאפליקציות שפועלות ב-GKE (Google Kubernetes Engine) לגשת לשירותי Google Cloud. סקירות כלליות על Workload Identity:
חשבון שירות ב-Google Cloud IAM הוא זהות שאפליקציה יכולה להשתמש בה כדי לשלוח בקשות ל-Google APIs. חשבונות השירות האלה נקראים GSA (חשבונות שירות של Google) במסמך. מידע נוסף על חשבונות שירות זמין במאמר חשבונות שירות.
בנוסף, ב-Kubernetes יש גם את המושג של חשבונות שירות. חשבון שירות מספק זהות לתהליכים שפועלים ב-Pod. חשבונות שירות ב-Kubernetes הם משאבים ב-Kubernetes, ואילו חשבונות שירות ב-Google הם ספציפיים ל-Google Cloud. מידע על חשבונות שירות של Kubernetes זמין במאמר הגדרת חשבונות שירות לקבוצות Pod במסמכי העזרה של Kubernetes.
ב-Apigee hybrid מגרסה 1.4 ואילך, מערכת Apigee יוצרת חשבון שירות ב-Kubernetes לכל סוג של רכיב ומשתמשת בו. הפעלת Workload Identity מאפשרת לרכיבי ה-hybrid ליצור אינטראקציה עם חשבונות השירות ב-Kubernetes.
דרישות מוקדמות
לפני שמפעילים את Workload Identity ב-Apigee hybrid, צריך להפעיל את Workload Identity באשכול GKE שבו פועל Apigee.
אם פעלתם לפי ההוראות ל-Anthos Service Mesh (ASM), Workload Identity כבר מופעל באשכול.
כדי לוודא ש-Workload Identity מופעל, מריצים את הפקודה הבאה:
gcloud container clusters describe $CLUSTER_NAME
הפלט צריך לכלול משהו כזה:
… … status: RUNNING subnetwork: default workloadIdentityConfig: workloadPool: PROJECT_ID.svc.id.goog
כשמריצים את Apigee hybrid ב-GKE, הדרך המקובלת היא ליצור ולהוריד מפתחות פרטיים (קובצי .json) לכל אחד מחשבונות השירות. כשמשתמשים ב-Workload Identity, אין צורך להוריד מפתחות פרטיים של חשבונות שירות ולהוסיף אותם לאשכולות GKE.
הפעלת Workload Identity ב-Apigee Hybrid
כדי להתחיל, פועלים לפי ההוראות במאמר הכנה להפעלת Workload Identity כדי לעדכן את מאגרי הצמתים ולאתחל את המשתנים לפני שמפעילים את Workload Identity.
לאחר מכן, פועלים לפי אחד מהקטעים הבאים, בהתאם לשלבים שמבצעים:- מפעילים את Workload Identity להתקנה חדשה. פועלים לפי ההוראות האלה להתקנה חדשה של Apigee hybrid או אם עדיין לא התקנתם את ASM בהתקנה ההיברידית.
- שדרוג התקנה לשימוש ב-Workload Identity פועלים לפי ההוראות האלה כדי להפעיל את Workload Identity בהתקנה קיימת של Apigee Hybrid.
הכנות להפעלת Workload Identity
לפני שמתחילים בתהליך ההתקנה, פועלים לפי השלבים שבקטע הזה.
הפעלת משתנים
מאתחלים (או מאמתים) את המשתנים הבאים:
export PROJECT_ID=my-project-idexport ORG_NAME=$PROJECT_IDexport ENV_NAME=my-environment-nameexport NAMESPACE=apigee #the namespace where apigee is installed
מגדירים את הפרויקט לפרויקט שרוצים לשנות:
gcloud config set project $PROJECT_ID
עדכון מאגרי צמתים
מוודאים ש-Workload Identity מופעל לכל מאגר צמתים באמצעות הפקודה הבאה:
gcloud container node-pools update $NODE_POOL_NAME \ --cluster=$CLUSTER_NAME \ --workload-metadata=GKE_METADATA
הפעלה של Workload Identity בהתקנה חדשה
אם אתם מפעילים את התכונה 'זהויות של עומסי עבודה' במהלך התקנה היברידית חדשה, אתם צריכים לפעול לפי ההוראות האלה.
- מוסיפים את השורה המודגשת הבאה לקובץ
overrides.yamlבקטע [gcp]:gcp: projectID: "my-project" name: "my-project" region: "us-west1" workloadIdentityEnabled: true
- יוצרים חשבונות שירות של Google. יש שתי שיטות שבהן אפשר להשתמש:
- משתמשים בכלי
create-service-accountכדי ליצור חשבון שירות של Google לכל רכיב באמצעות הפקודה הבאה:$APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts
הפקודה הזו תיצור את חשבונות השירות הבאים:
apigee-loggerapigee-metricsapigee-cassandraapigee-udcaapigee-synchronizerapigee-martapigee-watcherapigee-distributed-trace
ההוראות הבאות מניחות שהשתמשתם בכלי
create-service-accountכדי ליצור את חשבונות השירות. - הגדרת מוסכמות שמות מותאמות אישית וחשבונות שירות לכל סביבה (למשתמשים מתקדמים).
- משתמשים בכלי
- יוצרים את חשבונות השירות של Kubernetes.
לרכיבים ברמת הארגון:
- Cassandra
kubectl create sa -n $NAMESPACE apigee-cassandra-schema-setup-$(apigeectl encode --org $ORG_NAME)-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-cassandra,org=$ORG_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-cassandra-schema-setup-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
kubectl create sa -n $NAMESPACE apigee-cassandra-user-setup-$(apigeectl encode --org $ORG_NAME)-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-cassandra,org=$ORG_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-cassandra-user-setup-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
- MART
kubectl create sa -n $NAMESPACE apigee-mart-$(apigeectl encode --org $ORG_NAME)-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-mart,org=$ORG_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-mart-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
- Apigee Connect
kubectl create sa -n $NAMESPACE apigee-connect-$(apigeectl encode --org $ORG_NAME)-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-connect,org=$ORG_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-connect-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
- Apigee Watcher
kubectl create sa -n $NAMESPACE apigee-watcher-$(apigeectl encode --org $ORG_NAME)-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-watcher,org=$ORG_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-watcher-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
- מדדים של Apigee
kubectl create sa -n $NAMESPACE apigee-metrics-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-metrics,org=$ORG_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-metrics-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
לכל סביבה:
- זמן ריצה
kubectl create sa -n $NAMESPACE apigee-runtime-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-runtime,org=$ORG_NAME,env=$ENV_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-runtime-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
- UDCA
kubectl create sa -n $NAMESPACE apigee-udca-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-udca,org=$ORG_NAME,emv=$ENV_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-udca-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
- Synchronizer
kubectl create sa -n $NAMESPACE apigee-synchronizer-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \ && kubectl label sa -n $NAMESPACE -l app=apigee-synchronizer,org=$ORG_NAME,env=$ENV_NAME \ && kubectl annotate serviceaccount \ --namespace $NAMESPACE apigee-synchronizer-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
- Cassandra
- ממשיכים בהתקנה של Apigee hybrid כרגיל.
שדרוג התקנה לשימוש ב-Workload Identity
כדי להוסיף Workload Identity להתקנה היברידית קיימת, פועלים לפי ההוראות הבאות.
הנה דוגמה שמציגה חשבונות שירות של Google (GSA) שנוצרו עבור Apigee:
gcloud iam service-accounts list | grep apigee
apigee-connect apigee-connect@$PROJECT_ID.iam.gserviceaccount.com False apigee-runtime apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com False apigee-metrics apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com False apigee-mart apigee-mart@$PROJECT_ID.iam.gserviceaccount.com False apigee-watcher apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com False apigee-sync apigee-sync@$PROJECT_ID.iam.gserviceaccount.com False apigee-udca apigee-udca@$PROJECT_ID.iam.gserviceaccount.com False
זו דוגמה לחשבונות שירות של Kubernetes (KSA) שנוצרו עבור Apigee (בהנחה שגרסה Apigee hybrid 1.4 ומעלה מותקנת):
kubectl get sa -n $NAMESPACE
apigee-cassandra-schema-setup-ORG_NAME-cb84b88-sa 1 xxd apigee-cassandra-user-setup-ORG_NAME-cb84b88-sa 1 xxd apigee-connect-agent-ORG_NAME-cb84b88-sa 1 xxd apigee-init 1 xxd apigee-mart-ORG_NAME-cb84b88-sa 1 xxd apigee-metrics-apigee-telemetry 1 xxd apigee-runtime-ORG_NAME-ENV_NAME-1d0dc5e-sa 1 xxd apigee-synchronizer-ORG_NAME-ENV_NAME-1d0dc5e-sa 1 xxd apigee-udca-ORG_NAME-ENV_NAME-1d0dc5e-sa 1 xxd apigee-watcher-ORG_NAME-cb84b88 1 xxd
- מוסיפים את התפקיד Workload Identity לכל חשבון שירות:
gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \ GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
לדוגמה, אם מגדירים את ההרשאות של Apigee Synchronizer, מריצים את הפקודה:
export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:$PROJECT_ID.svc.id.goog[apigee/$KSA_NAME]" apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
- מוסיפים לכל KSA את פרטי ה-GSA:
kubectl annotate serviceaccount \ --namespace $NAMESPACE \ $KSA_NAME \ iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
לדוגמה, אם מגדירים את ההרשאות של Apigee Synchronizer, מריצים את הפקודה:
export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})kubectl annotate serviceaccount --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
- כדי לוודא שהשלבים פעלו:
gcloud config set project $PROJECT_ID
kubectl run --rm -it --image google/cloud-sdk:slim --serviceaccount $KSA_NAME --namespace $NAMESPACE workload-identity-test -- gcloud auth list
אם לא מופיעה שורת פקודה, מנסים להקיש על Enter.
אם השלבים בוצעו בצורה נכונה, אמורה להתקבל תגובה כמו זו:
Credentialed Accounts ACTIVE ACCOUNT * GSA@PROJECT_ID.iam.gserviceaccount.com
- אם משדרגים מהתקנה קודמת, צריך לנקות סודות שהכילו מפתחות פרטיים של חשבונות שירות:
kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}') - בדיקת היומנים:
kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer