הפעלת Workload Identity ב-Apigee Hybrid

במאמר הזה מוסבר איך להפעיל את 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

לפני שמתחילים בתהליך ההתקנה, פועלים לפי השלבים שבקטע הזה.

הפעלת משתנים

מאתחלים (או מאמתים) את המשתנים הבאים:

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export 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 בהתקנה חדשה

אם אתם מפעילים את התכונה 'זהויות של עומסי עבודה' במהלך התקנה היברידית חדשה, אתם צריכים לפעול לפי ההוראות האלה.

  1. מוסיפים את השורה המודגשת הבאה לקובץ overrides.yaml בקטע [gcp]:
    gcp:
      projectID: "my-project"
      name: "my-project"
      region: "us-west1"
      workloadIdentityEnabled: true
  2. יוצרים חשבונות שירות של Google. יש שתי שיטות שבהן אפשר להשתמש:
    • משתמשים בכלי create-service-account כדי ליצור חשבון שירות של Google לכל רכיב באמצעות הפקודה הבאה:
      $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts

      הפקודה הזו תיצור את חשבונות השירות הבאים:

      • apigee-logger
      • apigee-metrics
      • apigee-cassandra
      • apigee-udca
      • apigee-synchronizer
      • apigee-mart
      • apigee-watcher
      • apigee-distributed-trace

      ההוראות הבאות מניחות שהשתמשתם בכלי create-service-account כדי ליצור את חשבונות השירות.

    • הגדרת מוסכמות שמות מותאמות אישית וחשבונות שירות לכל סביבה (למשתמשים מתקדמים).
  3. יוצרים את חשבונות השירות של 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
  4. ממשיכים בהתקנה של 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
  1. מוסיפים את התפקיד 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
    
  2. מוסיפים לכל 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
    
  3. כדי לוודא שהשלבים פעלו:
    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
  4. אם משדרגים מהתקנה קודמת, צריך לנקות סודות שהכילו מפתחות פרטיים של חשבונות שירות:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  5. בדיקת היומנים:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer