הפעלה של Workload Identity ב-GKE

במאמר הזה מוסבר איך להפעיל את Workload Identity ב-Apigee hybrid ב-GKE.

אם אתם משתמשים ב-Apigee Hybrid AKS או EKS, אתם צריכים לפעול לפי ההוראות במאמר הפעלת איחוד שירותי אימות הזהות של עומסי עבודה ב-AKS וב-EKS.

סקירה כללית

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.

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

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

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

  • ‫CLUSTER_LOCATION: האזור או האזור של אשכול Kubernetes, לדוגמה: ‫us-west1.
  • ‫CLUSTER_NAME: השם של האשכול.
  • ‫ENV_NAME: שם סביבת Apigee.
  • ‫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 $CLUSTER_NAME
CLUSTER_NAME

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

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 CLUSTER_NAME=hybrid-base-directory/apigeectl

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

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

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

הפעלת Workload Identity ב-Apigee Hybrid

כדי להגדיר את Workload Identity בפרויקט, פועלים לפי ההוראות האלה.

התקנה שהועברה ו-Workload Identity

אם העברתם את האשכול מניהול apigeectl באמצעות כלי ההעברה של Apigee hybrid Helm, תחביר ההחלפות של Workload Identity ישתנה. צריך לבדוק את המאפיינים הבאים בקובץ ההחלפות:

  • השדה namespace הוא שדה חובה. לדוגמה:
    instanceID: "hybrid-instance-1"
    namespace: "apigee"
    
  • המאפיין gcp.workloadIdentity.enabled מחליף את המאפיין gcp.workloadIdentityEnabled. לדוגמה:
    gcp:
      workloadIdentity:
        enabled: true
  • בסביבות ייצור, לכל רכיב יש מאפיין gsa. הערך של המאפיינים האלה הוא כתובת האימייל של חשבון השירות של Google IAM עבור הרכיב המתאים. לדוגמה:
    watcher
      gsa: apigee-watcher@my-hybrid-project.iam.gserviceaccount.com
    
  • בהתקנות שאינן בסביבת ייצור, אפשר לספק GSA יחיד במאפיין gcp.workloadIdentity.gsa.
    gcp
      workloadIdentity
        gsa: apigee-watcher@my-hybrid-project.iam.gserviceaccount.com
    
  • עם תרשימי Helm ל-Apigee Hybrid, אפשר לשלב בין חשבונות GSA של סביבת ייצור וסביבה שאינה סביבת ייצור עבור Workload Identity. אפשר לציין רק GSA אחד לנכס gcp.workloadIdentity.gsa ולציין רכיבי GSA נפרדים לרכיבים ספציפיים. הערכים שתזינו עבור הרכיבים הנפרדים יבטלו את הערך שתזינו במאפיין gcp.workloadIdentity.gsa עבור הרכיב הזה בלבד.

הכנות להגדרת Workload Identity

  1. מוודאים שהתכונה Workload Identity מופעלת בקובץ ההחלפות. צריך להפעיל אותו בקובץ overrides, ולהגדיר ערכים למאפייני התצורה הבאים:
  2. מריצים את הפקודה הבאה כדי לוודא שההגדרה הנוכחית של gcloud מוגדרת למזהה הפרויקט ב-Google Cloud:
    gcloud config get project
  3. אם צריך, מגדירים את ההגדרות של gcloud:

    gcloud config set project $PROJECT_ID
  4. מוודאים ש-Workload Identity מופעל באשכול GKE. כשיוצרים את האשכול בשלב 1: יצירת אשכול, בשלב 6 מפעילים את Workload Identity. כדי לבדוק אם Workload Identity מופעל, מריצים את הפקודה הבאה:

    אשכולות אזוריים

    gcloud container clusters describe $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten 'workloadIdentityConfig'

    אשכולות אזוריים

    gcloud container clusters describe $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten 'workloadIdentityConfig'

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

      ---
    workloadPool: PROJECT_ID.svc.id.goog

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

    אשכולות אזוריים

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

    אשכולות אזוריים

    gcloud container clusters update  $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID
  5. מפעילים את התכונה Workload Identity לכל מאגר צמתים באמצעות הפקודות הבאות. הפעולה הזו יכולה להימשך עד 30 דקות לכל צומת:

    אשכולות אזוריים

    gcloud container node-pools update NODE_POOL_NAME \
      --cluster=$CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --workload-metadata=GKE_METADATA

    אשכולות אזוריים

    gcloud container node-pools update NODE_POOL_NAME \
      --cluster=$CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --workload-metadata=GKE_METADATA

    כאשר NODE_POOL_NAME הוא השם של כל מאגר צמתים. ברוב ההתקנות של Apigee hybrid מאגרי הצמתים שמוגדרים כברירת מחדל נקראים apigee-data ו-apigee-runtime.

  6. מריצים את הפקודות הבאות כדי לוודא שהתכונה Workload Identity מופעלת במאגרי הצמתים:

    אשכולות אזוריים

    gcloud container node-pools describe apigee-data \
      --cluster $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"
    gcloud container node-pools describe apigee-runtime \
      --cluster $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"

    אשכולות אזוריים

    gcloud container node-pools describe apigee-data \
      --cluster $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"
    gcloud container node-pools describe apigee-runtime \
      --cluster $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"

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

    ---
    diskSizeGb: 100
    diskType: pd-standard
    ...
    workloadMetadataConfig:
    mode: GKE_METADATA
      

הגדרת Workload Identity

כדי להפעיל את Workload Identity לרכיבים ההיברידיים הבאים, פועלים לפי השלבים הבאים:

  • apigee-telemetry
  • apigee-org
  • apigee-env

כשמריצים את הפקודה helm upgrade עם הדגל --dry-run עבור התרשימים apigee-datastore,‏ apigee-env,‏ apigee-org ו-apigee-telemetry, הפלט יכלול את הפקודות שצריך להשתמש בהן כדי להגדיר את Workload Identity עם השמות הנכונים של GSA ו-KSA.

לדוגמה:

helm upgrade datastore apigee-datastore/ \
  --namespace $NAMESPACE \
  -f overrides.yaml \
  --dry-run
NAME: datastore
...
For C* backup GKE Workload Identity, please make sure to add the below membership to the IAM policy binding using the respective kubernetes SA (KSA).
gcloud iam service-accounts add-iam-policy-binding  \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:my-project.svc.id.goog[apigee/apigee-cassandra-backup-sa]" \
      --project :my-project
  1. מקבלים את הפקודה להגדרת Workload Identity עבור apigee-datastore ומריצים את הפקודה בקטע NOTES: בפלט.
    helm upgrade datastore apigee-datastore/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run
  2. מקבלים את הפקודות להגדרת Workload Identity עבור apigee-telemetry ומריצים את הפקודה שמופיעה בקטע NOTES: בפלט.
    helm upgrade telemetry apigee-telemetry/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run
  3. מקבלים את הפקודות להגדרת Workload Identity עבור apigee-org ומריצים את הפקודה שמופיעה בקטע NOTES: בפלט.
    helm upgrade $ORG_NAME apigee-org/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run
  4. מקבלים את הפקודות להגדרת Workload Identity עבור apigee-env ומריצים את הפקודה שמופיעה בקטע NOTES: בפלט.
    helm upgrade $ENV_NAME apigee-env/ \
      --namespace $NAMESPACE \
      --set env=ENV_NAME \
      -f overrides.yaml \
      --dry-run

    חוזרים על השלב הזה לכל סביבה בהתקנה.

אימות של Workload Identity

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

    כניסה לדף Workloads