הפעלת Workload Identity באמצעות apigeectl

במאמר הזה מוסבר איך להפעיל את Workload Identity ב-Apigee Hybrid באמצעות apigeectl.

אם אתם משתמשים בתרשימי Helm כדי להתקין ולנהל את Apigee Hybrid, תוכלו לעיין במאמר בנושא הפעלת Workload Identity באמצעות תרשימי Helm.

סקירה כללית

Workload Identity היא דרך לאפליקציות שפועלות ב-GKE (Google Kubernetes Engine) לגשת לשירותי Google Cloud. סקירות כלליות על Workload Identity:

חשבון שירות ב-Cloud IAM של Google הוא זהות שאפליקציה יכולה להשתמש בה כדי לשלוח בקשות ל-Google APIs. במסמך הזה, חשבונות השירות האלה נקראים GSA (חשבונות שירות של Google). מידע נוסף על חשבונות שירות זמין במאמר חשבונות שירות.

בנוסף, ב-Kubernetes יש גם את המושג של חשבונות שירות. חשבון שירות מספק זהות לתהליכים שפועלים ב-Pod. חשבונות שירות ב-Kubernetes הם משאבים ב-Kubernetes, ואילו חשבונות שירות ב-Google הם ספציפיים ל-Google Cloud. מידע על חשבונות שירות של Kubernetes זמין במאמר הגדרת חשבונות שירות לקבוצות Pod במסמכי העזרה של Kubernetes.

ב-Apigee hybrid מגרסה 1.4 ואילך, מערכת Apigee יוצרת ומשתמשת בחשבון שירות של Kubernetes לכל סוג של רכיב. הפעלת Workload Identity מאפשרת לרכיבים ההיברידיים ליצור אינטראקציה עם חשבונות השירות של Kubernetes.

חשבונות שירות ב-Google ב-Apigee Hybrid ללא Workload Identity

בלי להשתמש ב-Workload Identity, צריך לקשר את חשבונות השירות של Google לכל רכיב בקובץ overrides.yaml באמצעות הפניה לקובץ אישור או לסוד של Kubernetes. לדוגמה:

משתני סביבה שמשמשים בהליכים האלה

בנהלים האלה נעשה שימוש במשתני הסביבה הבאים. אפשר להגדיר את הערכים האלה במעטפת הפקודות או להחליף אותם בדוגמאות הקוד בערכים בפועל:

  • ‫APIGEECTL_HOME: הספרייה שבה התקנתם את apigeectl.
  • ‫CLUSTER_LOCATION: האזור או האזור של האשכול, לדוגמה: us-west1.
  • ‫ENV_NAME: שם סביבת Apigee.
  • ‫HYBRID_FILES: ספריית הקבצים ההיברידית, לדוגמה hybrid-base-directory/hybrid-files.
  • ‫ORG_NAME: השם של הארגון שלכם ב-Apigee.
  • ‫PROJECT_ID: מזהה הפרויקט ב-Google Cloud.
  • ‫NAMESPACE: מרחב השמות של Apigee (בדרך כלל 'apigee').

בודקים את משתני הסביבה:

echo $PROJECT_ID
echo $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES

מאתחלים את המשתנים שרוצים:

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_LOCATION=my-cluster-location
export APIGEECTL_HOME=hybrid-base-directory/apigeectl
export HYBRID_FILES=hybrid-base-directory/hybrid-files

Workload Identity וקובצי מפתחות של חשבונות שירות

כשמריצים את Apigee hybrid ב-GKE, הדרך המקובלת היא ליצור ולהוריד מפתחות פרטיים (קובצי .json) לכל אחד מחשבונות השירות. כשמשתמשים ב-Workload Identity, אין צורך להוריד מפתחות פרטיים של חשבונות שירות ולהוסיף אותם לאשכולות GKE.

אם הורדתם קובצי מפתחות של חשבונות שירות כחלק מההתקנה של Apigee hybrid, תוכלו למחוק אותם אחרי הפעלת Workload Identity. ברוב ההתקנות, הם נמצאים בספרייה hybrid-base-directory/hybrid-files/service-accounts/.

הפעלת Workload Identity ב-Apigee Hybrid

כדי להתחיל, פועלים לפי ההוראות במאמר הכנה להפעלת Workload Identity כדי לעדכן את מאגרי הצמתים ולאתחל את המשתנים לפני שמפעילים את Workload Identity.

לאחר מכן, פועלים לפי ההוראות במאמר הגדרת workloadIdentityEnabled: true ויצירת חשבונות שירות כדי להפעיל Workload Identity בהתקנת Apigee hybrid.

הכנות להפעלת Workload Identity

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

  1. מגדירים את הפרויקט לפרויקט שרוצים לשנות:
    gcloud config set project $PROJECT_ID
  2. מריצים את הפקודה הבאה כדי לקבל את פרטי הכניסה gcloud של האשכול שבו מפעילים את Workload Identity:
    gcloud container clusters get-credentials ${CLUSTER_NAME} \
      --region ${CLUSTER_LOCATION} \
      --project ${PROJECT_ID}
  3. מריצים את הפקודה הבאה כדי לוודא שהתכונה Workload Identity מופעלת באשכול GKE שבו פועל Apigee:
    gcloud container clusters describe $CLUSTER_NAME --region $CLUSTER_LOCATION --project $PROJECT_ID

    הפלט צריך לכלול משהו כזה:

    …
      …
      status: RUNNING
      subnetwork: default
      workloadIdentityConfig:
        workloadPool: my-project-id.svc.id.goog

    אם צריך, מפעילים את Workload Identity באשכול. הפעולה הזו יכולה להימשך עד 30 דקות:

      gcloud container clusters update $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --project $PROJECT_ID \
      --region $CLUSTER_LOCATION

    מידע נוסף זמין במאמר הפעלת Workload Identity.

  4. מוודאים ש-Workload Identity מופעל בכל מאגר צמתים.
    1. מריצים את הפקודה הבאה כדי להציג את רשימת מאגרי הצמתים:
      gcloud container node-pools list \
        --cluster $CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID

      הפלט אמור להיראות כך:

        NAME            MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
        apigee-runtime  e2-standard-4  100           1.23.12-gke.100
        apigee-data     e2-standard-4  100           1.23.12-gke.100
    2. מוודאים שמאפיין Workload Identity מופעל לכל מאגר צמתים באמצעות הפקודה הבאה לכל מאגר צמתים:
      gcloud container node-pools update NODE_POOL_NAME \
        --cluster=$CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID \
        --workload-metadata=GKE_METADATA

      כאשר NODE_POOL_NAME הוא השם של כל מאגר צמתים.

אימות או יצירה של חשבונות שירות של Google

במהלך ההתקנה נוצרים חשבונות שירות של Google לרכיבים רבים של Apigee Hybrid. משתמשים בהליך הזה כדי לאמת את חשבונות השירות של Google וליצור את החשבונות שנדרשים.

  1. כדי לבדוק את השמות של חשבונות השירות של Google בפרויקט, מריצים את הפקודה הבאה:
    gcloud iam service-accounts list --project $PROJECT_ID

    הפלט אמור להיראות כך:

    Prod

    לסביבות שאינן סביבות ייצור:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-logger        apigee-logger@my_project_id.iam.gserviceaccount.com        False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    Non-prod

    לסביבות שאינן סביבות ייצור:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    

    אם אתם צריכים ליצור את חשבונות השירות של Google עבור הפרויקט, יש שתי שיטות שבהן תוכלו להשתמש:

    • משתמשים בכלי create-service-account שכלול ב-Apigee בספרייה apigeectl/tools/. הכלי הזה יכול ליצור את כל חשבונות השירות באמצעות פקודה אחת, או לאפשר לכם ליצור אותם בנפרד. ‫
    • משתמשים בפקודה gcloud iam service-accounts create כדי ליצור את חשבונות השירות אחד בכל פעם, ובפקודה gcloud projects add-iam-policy-binding כדי להקצות לכל חשבון שירות את התפקידים המתאימים. בשיטה הזו צריך ליצור כל חשבון שירות בנפרד, אבל לא צריך להוריד את קובצי המפתחות.

    create-service-account

    כדי ליצור חשבון שירות של Google לכל רכיב, משתמשים בפקודה הבאה:

    Prod

    לסביבות שאינן סביבות ייצור:

    $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts

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

    • apigee-cassandra
    • apigee-logger
    • apigee-mart
    • apigee-metrics
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    • apigee-watcher

    Non-prod

    לסביבות שאינן סביבות ייצור:

    $APIGEECTL_HOME/tools/create-service-account --env non-prod --dir $APIGEECTL_HOME/../service-accounts

    הפקודה הזו תיצור חשבון שירות יחיד, apigee-non-prod, עם כל התפקידים שנדרשים לניהול כל רכיבי Apigee.

    gcloud

    יוצרים את חשבונות השירות הבאים ומקצים להם תפקידים.

    1. חשבון שירות: apigee-cassandra, תפקיד: roles/storage.objectAdmin

      יוצרים את החשבון:

      gcloud iam service-accounts create apigee-cassandra \
        --display-name="apigee-cassandra" \
        --project $PROJECT_ID
                  

      מקצים את התפקיד:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
                  
    2. חשבון שירות: apigee-logger, תפקיד: roles/logging.logWriter

      יוצרים את החשבון:

      gcloud iam service-accounts create apigee-logger \
        --display-name="apigee-logger" \
        --project $PROJECT_ID
                  

      מקצים את התפקיד:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-logger@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/logging.logWriter"
                  
    3. חשבון שירות: apigee-mart, תפקיד: roles/apigeeconnect.Agent

      יוצרים את החשבון:

      gcloud iam service-accounts create apigee-mart \
        --display-name="apigee-mart" \
        --project $PROJECT_ID
                  

      מקצים את התפקיד:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-mart@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigeeconnect.Agent"
                  
    4. חשבון שירות: apigee-metrics, תפקיד: roles/monitoring.metricWriter

      יוצרים את החשבון:

      gcloud iam service-accounts create apigee-metrics \
        --display-name="apigee-metrics" \
        --project $PROJECT_ID
                  

      מקצים את התפקיד:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter"
                  
    5. חשבון שירות: apigee-runtime, תפקיד: לא הוקצה תפקיד.

      יוצרים את החשבון:

      gcloud iam service-accounts create apigee-runtime \
        --display-name="apigee-runtime" \
        --project $PROJECT_ID
                  
    6. חשבון שירות: apigee-synchronizer, תפקיד: roles/apigee.synchronizerManager

      יוצרים את החשבון:

      gcloud iam service-accounts create apigee-synchronizer \
        --display-name="apigee-synchronizer" \
        --project $PROJECT_ID
                  

      מקצים את התפקיד:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.synchronizerManager"
                  
    7. חשבון שירות: apigee-udca, תפקיד: roles/apigee.analyticsAgent

      יוצרים את החשבון:

      gcloud iam service-accounts create apigee-udca \
        --display-name="apigee-udca" \
        --project $PROJECT_ID
                  

      מקצים את התפקיד:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-udca@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.analyticsAgent"
                  
    8. חשבון שירות: apigee-watcher, תפקיד: roles/apigee.runtimeAgent

      יוצרים את החשבון:

      gcloud iam service-accounts create apigee-watcher \
        --display-name="apigee-watcher" \
        --project $PROJECT_ID
                  

      מקצים את התפקיד:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.runtimeAgent"
                  

הגדרה של workloadIdentityEnabled: true ויצירה של חשבונות שירות

‫apigeectl יוצר חשבונות שירות של Kubernetes לכל רכיב של Apigee hybrid כשמגדירים את workloadIdentityEnabled: true בקובץ ההחלפות ומחילים את השינויים.

  1. מוסיפים את השורה המודגשת שלמטה לקובץ overrides.yaml בקטע gcp. הפעולה הזו מפעילה את Workload Identity בהתקנה וגורמת ל-apigeectl ליצור את חשבונות השירות של Kubernetes כשמחילים את ההגדרות:
    gcp:
      projectID: "my-project-id"
      name: "my-project-id"
      region: "analytics-region"
      workloadIdentityEnabled: true
  2. מוסיפים את השורות המודגשות הבאות לקובץ overrides.yaml בקטע cassandra. הפעולה הזו מפעילה את היצירה של חשבון השירות apigee-cassandra-backup ב-Kubernetes:
    cassandra:
      ...
      backup:
        enabled: true
  3. מחילים את השינויים באמצעות apigeectl עם הדגל --restore:
    ‫
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore
  4. מאמתים את חשבונות השירות באמצעות הפקודה הבאה:
    kubectl get sa -n $NAMESPACE

    הפלט אמור להיראות כך: חשבונות השירות של Kubernetes שמופיעים במודגש הם אלה שצריך להוסיף להם הערות עם חשבונות השירות של Google:

    NAME                                                         SECRETS   AGE
    apigee-cassandra-backup                                      1         11m
    apigee-cassandra-restore                                     1         11m
    apigee-cassandra-schema-setup-my-project-id-123abcd-sa       1         11m
    apigee-cassandra-schema-val-my-project-id-123abcd            1         11m
    apigee-cassandra-user-setup-my-project-id-123abcd-sa         1         11m
    apigee-connect-agent-my-project-id-123abcd-sa                1         11m
    apigee-datastore-default-sa                                  1         11m
    apigee-ingressgateway                                        1         11m
    apigee-ingressgateway-my-project-id-123abcd                  1         11m
    apigee-ingressgateway-manager                                1         11m
    apigee-init                                                  1         11m
    apigee-mart-my-project-id-123abcd-sa                         1         11m
    apigee-metrics-sa                                            1         11m
    apigee-mint-task-scheduler-my-project-id-123abcd-sa          1         11m
    apigee-redis-default-sa                                      1         11m
    apigee-redis-envoy-default-sa                                1         11m
    apigee-runtime-my-project-id-env-name-234bcde-sa             1         11m
    apigee-synchronizer-my-project-id-env-name-234bcde-sa        1         11m
    apigee-udca-my-project-id-123abcd-sa                         1         11m
    apigee-udca-my-project-id-env-name-234bcde-sa                1         11m
    apigee-watcher-my-project-id-123abcd-sa                      1         11m
    default                                                      1         11m
        

הוספת הערות לחשבונות השירות של Kubernetes עם חשבונות השירות של Google

לכל רכיב של Apigee, מוסיפים הערה לחשבונות השירות המתאימים של Kubernetes עם חשבון השירות של Google לרכיב.

רכיבים ברמת הארגון

יהיה לכם רק מופע אחד של כל חשבון שירות של Kubernetes בארגון Apigee.

רכיב חשבון שירות ב-Kubernetes חשבון שירות של Google
Cassandra apigee-cassandra-backup apigee-cassandra
apigee-cassandra-restore apigee-cassandra
apigee-cassandra-schema-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-cassandra-schema-val-my-project-id-num-id1 apigee-cassandra
apigee-cassandra-user-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-datastore-default-sa apigee-cassandra
Apigee Connect apigee-connect-agent-my-project-id-num-id1-sa apigee-mart
MART apigee-mart-my-project-id-num-id1-sa apigee-mart
מדדים apigee-metrics-sa apigee-metrics
UDCA (org-level) apigee-udca-my-project-id-num-id1-sa apigee-udca
Watcher apigee-watcher-my-project-id-num-id1-sa apigee-watcher

רכיבים ברמת הסביבה

תהיה לכם מופע אחד של כל חשבון שירות של Kubernetes לכל סביבת Apigee.

רכיב חשבון שירות ב-Kubernetes חשבון שירות של Google
Apigee Runtime apigee-runtime-my-project-id-env-name-num-id2-sa apigee-runtime
Synchronizer apigee-synchronizer-my-project-id-env-name-num-id2-sa apigee-synchronizer
UDCA (env-level) apigee-udca-my-project-id-env-name-num-id2-sa apigee-udca

בפקודות הבאות, משתמשים בשמות של חשבונות השירות ב-Kubernetes שמוחזרים על ידי הפקודה kubectl get sa -n $NAMESPACE, לדוגמה: apigee-cassandra-schema-val-hybrid-example-project-123abcd.

במסגרת התהליך הזה, לכל חשבון שירות של Kubernetes:

  • מקשרים את חשבון השירות ב-Kubernetes ואת חשבון השירות הראשי ב-Google אל roles/iam.workloadIdentityUser תפקיד ה-IAM.
  • מוסיפים הערה לחשבון השירות ב-Kubernetes עם חשבון השירות ב-Google.
  1. מקשרים את התפקידים ומבצעים הערות לחשבונות השירות.

    רכיבים ברמת הארגון

    הוספת הערות לחשבונות שירות ב-Kubernetes עבור הרכיבים ברמת הארגון. תצטרכו לעשות את זה פעם אחת לכל רכיב בארגון Apigee.

    • Cassandra

      לרכיב Cassandra יש שישה חשבונות שירות משויכים ב-Kubernetes:

      • apigee-cassandra-backup
      • apigee-cassandra-restore
      • apigee-cassandra-schema-setup
      • apigee-cassandra-schema-val (val = אימות)
      • apigee-cassandra-user-setup
      • apigee-datastore-default

      Prod

      apigee-cassandra-backup

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:
        GSA_NAME="apigee-cassandra"
        KSA_NAME="apigee-cassandra-backup"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-cassandra-restore"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"

        קישור תפקיד IAM:

        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
      2. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-datastore-default-sa"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      apigee-cassandra-backup

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:
        GSA_NAME="apigee-non-prod"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-cassandra-restore"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. מגדירים מחדש את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-datastore-default-sa"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • ‫Apigee Connect

      Prod

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:
        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. מגדירים את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-connect-agent-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • MART

      Prod

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:

        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-mart-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. מגדירים את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-mart-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • מדדים של Apigee

      Prod

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:

        GSA_NAME="apigee-metrics"
        KSA_NAME="apigee-metrics-sa"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. מגדירים את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-metrics-sa"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (org-level)

      Prod

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. מגדירים את משתני הסביבה KSA_NAME:

        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. קישור תפקיד IAM:
          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
      3. מוסיפים הערה לחשבון השירות:
          kubectl annotate serviceaccount \
            --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • ‫Apigee Watcher

      Prod

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:

        GSA_NAME="apigee-watcher"
        KSA_NAME="apigee-watcher-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. מגדירים את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-watcher-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

    לכל סביבה:

    • זמן ריצה

      Prod

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:

        GSA_NAME="apigee-runtime"
        KSA_NAME="apigee-runtime-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. מגדירים את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-runtime-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Synchronizer

      Prod

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:

        GSA_NAME="apigee-synchronizer"
        KSA_NAME="apigee-synchronizer-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. מגדירים את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-synchronizer-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (env-level)

      Prod

      1. מגדירים את משתני הסביבה KSA_NAME ו-GSA_NAME:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. מגדירים את משתנה הסביבה KSA_NAME:

        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. קישור תפקיד IAM:
        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
      3. מוסיפים הערה לחשבון השירות:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
  2. כדי לוודא שהשלבים עבדו:
    gcloud config set project $PROJECT_ID
    
    kubectl run --rm -it --image google/cloud-sdk:slim \
      --namespace $NAMESPACE workload-identity-test\
      -- gcloud auth list

    אם לא מופיעה שורת פקודה, נסו להקיש על Enter.

    אם השלבים בוצעו בצורה נכונה, אמורה להתקבל תגובה כמו זו:

                       Credentialed Accounts
    ACTIVE  ACCOUNT
    *       GSA@PROJECT_ID.iam.gserviceaccount.com
  3. אם משדרגים מהתקנה קודמת, צריך לנקות סודות שהכילו מפתחות פרטיים של חשבונות שירות:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  4. בדיקת היומנים:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
    
  5. (אופציונלי) אפשר לראות את הסטטוס של חשבונות השירות של Kubernetes בדף Kubernetes: Workloads Overview ב- Google Cloud console.

    כניסה לדף Workloads