אימות של אשכולות Workload Identity

במאמר הזה מוסבר איך להגדיר ולהשתמש באימות של אשכולות של Workload Identity ב-Google Distributed Cloud (תוכנה בלבד) ב-bare metal. במקום מפתחות של חשבונות שירות, אימות של אשכולות Workload Identity משתמש באסימונים לטווח קצר ובאיחוד שירותי אימות הזהות של עומסי עבודה כדי ליצור את האשכולות ולאבטח אותם. פרטי הכניסה לטווח קצר לחשבון השירות הם בצורת אסימוני גישה מסוג OAuth 2.0. כברירת מחדל, התוקף של אסימוני הגישה פג אחרי שעה אחת. באופן דומה, התוקף של אסימונים לשליפת תמונות פג אחרי שעה אחת כברירת מחדל.

לעומת זאת, מצב עם מפתחות, השיטה הרגילה ליצירה ולאבטחה של אשכולות, משתמש במפתחות של חשבונות שירות שהורדו. כשיוצרים אשכול בניהול עצמי (אדמין, היברידי או עצמאי), מציינים את הנתיב למפתחות שהורדו. המפתחות מאוחסנים כסודות באשכול ובכל אשכול משתמש מנוהל. כברירת מחדל, למפתחות של חשבונות שירות אין תאריך תפוגה, והם עלולים לסכן את האבטחה אם לא מנהלים אותם בצורה נכונה. למידע על הגדרת זמן תפוגה למפתחות של חשבונות השירות, אפשר לעיין במאמר בנושא מועדי תפוגה של מפתחות בניהול משתמשים.

אימות אשכולות באמצעות Workload Identity מספק שני יתרונות עיקריים בהשוואה לשימוש במפתחות של חשבון שירות:

  • אבטחה משופרת: מפתחות של חשבונות שירות מהווים סיכון אבטחה אם לא מנהלים אותם בצורה נכונה. אסימוני OAuth 2.0 ואיחוד שירותי אימות הזהות של עומסי עבודה נחשבים לחלופות מומלצות למפתחות של חשבונות שירות. מידע נוסף על אסימונים של חשבונות שירות זמין במאמר פרטי כניסה לטווח קצר לחשבון שירות. מידע נוסף על איחוד שירותי אימות הזהות של עומסי עבודה זמין במאמר איחוד שירותי אימות הזהויות של עומסי עבודה.

  • פחות תחזוקה: מפתחות של חשבונות שירות דורשים יותר תחזוקה. החלפה ושמירה של המפתחות האלה באופן קבוע יכולות להיות נטל ניהולי משמעותי.

התכונה Workload Identity Cluster Authentication (אימות זהויות של עומסי עבודה באשכול) הושקה בגרסת Preview בגרסה 1.30, והיא זמינה בגרסה 1.33 ואילך. אפשר להפעיל את התכונה Workload Identity Cluster Authentication רק כשיוצרים אשכולות חדשים. אי אפשר להגדיר אשכול קיים לשימוש בתכונה Workload Identity Cluster Authentication במהלך עדכון או שדרוג. מגבלות נוספות מפורטות במאמר מגבלות.

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

לפני שמתחילים

בקטעים הבאים מוסבר איך ליצור חשבונות שירות ולהקצות להם את התפקידים שנדרשים לאימות של אשכול Workload Identity. ההוראות להגדרה שמופיעות במסמך הזה לא מחליפות את ההוראות שבמאמר הגדרת משאבים, אלא נדרשות בנוסף לדרישות המוקדמות הרגילות להתקנה של Google Distributed Cloud רק באמצעות תוכנה. Google Cloudחשבונות השירות שנדרשים לאימות של אשכולות עם Workload Identity דומים לחשבונות השירות שמתוארים במאמר הגדרת משאביGoogle Cloud , אבל יש להם שמות ייחודיים, כך שהם לא מפריעים לאשכולות שמשתמשים במפתחות ברירת המחדל של חשבונות השירות.

חשבונות השירות שנדרשים לאימות של Workload Identity באשכולות שונים בגרסת התצוגה המקדימה ובגרסה הזמינה לכולם, כמו שמתואר בטבלה הבאה:

‫1.33 ואילך

חשבון שירות מטרה תפקידים
admin-sa משתמשים בחשבון השירות הזה כדי ליצור אסימונים. לכל אסימון יש את ההרשאות שמשויכות לתפקידים בחשבון השירות. roles/gkehub.admin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountTokenCreator
roles/iam.workloadIdentityPoolAdmin*
roles/logging.admin
roles/monitoring.admin
roles/resourcemanager.projectIamAdmin
baremetal-gcr ‫Google Distributed Cloud משתמש בחשבון השירות הזה כדי להוריד קובצי אימג' של קונטיינרים מ-Artifact Registry. ללא

*תפקיד ה-IAM‏ roles/iam.workloadIdentityPoolAdmin נדרש רק בגרסה 1.34 ואילך.

‫1.30-1.32

חשבון שירות מטרה תפקידים
admin-sa משתמשים בחשבון השירות הזה כדי ליצור אסימונים. לכל אסימון יש את ההרשאות שמשויכות לתפקידים בחשבון השירות. roles/gkehub.admin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountTokenCreator
roles/logging.admin
roles/monitoring.admin
baremetal-controller Connect Agent משתמש בחשבון השירות הזה כדי לשמור על חיבור בין האשכול לבין Google Cloud וכדי לרשום את האשכולות ב צי. חשבון השירות הזה גם מרענן אסימונים עבור חשבון השירות baremetal-gcr. roles/gkehub.admin
roles/monitoring.dashboardEditor
roles/serviceusage.serviceUsageViewer
baremetal-cloud-ops סוכן Stackdriver משתמש בחשבון השירות הזה כדי לייצא יומנים ומדדים מאשכולות אל Cloud Logging וCloud Monitoring. roles/kubernetesmetadata.publisher
roles/logging.logWriter
roles/monitoring.dashboardEditor
roles/monitoring.metricWriter
roles/monitoring.viewer
roles/opsconfigmonitoring.resourceMetadata.writer
roles/serviceusage.serviceUsageViewer
roles/stackdriver.resourceMetadata.writer
baremetal-gcr ‫Google Distributed Cloud משתמש בחשבון השירות הזה כדי להוריד קובצי אימג' של קונטיינרים מ-Artifact Registry. ללא

הגדרה של חשבונות שירות

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

יצירת חשבונות שירות

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

  1. במחשב של האדמין, מתחברים ל-Google Cloud CLI:

    gcloud auth login
    
  2. יוצרים את חשבונות השירות הנדרשים לאימות של Workload Identity Cluster:

    שם חשבון השירות admin-sa הוא שרירותי. אפשר לשנות את השם אם הוא גורם לקונפליקט בפרויקט. לחשבונות השירות האחרים לאימות של Workload Identity Cluster יש שמות שנקבעו מראש, ואפשר להתאים אותם אישית אם רוצים.

    ‫1.33 ואילך

    gcloud iam service-accounts create admin-sa \
        --project=PROJECT_ID
    
    gcloud iam service-accounts create baremetal-gcr \
        --project=PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה שלGoogle Cloud הפרויקט.

    ‫1.30-1.32

    ```sh gcloud iam service-accounts create admin-sa
    --project=PROJECT_ID

    gcloud iam service-accounts create baremetal-controller
    --project=PROJECT_ID

    gcloud iam service-accounts create baremetal-cloud-ops
    --project=PROJECT_ID

    gcloud iam service-accounts create baremetal-gcr
    --project=PROJECT_ID ```

    מחליפים את PROJECT_ID במזהה שלGoogle Cloud הפרויקט.

הוספת קשרי מדיניות של ניהול זהויות והרשאות גישה (IAM) לחשבונות שירות

כדי להחיל את הקישורים הנדרשים למדיניות בנושא ניהול זהויות וגישה (IAM) על חשבונות השירות החדשים:

‫1.33 ואילך

  1. מוסיפים קישורים בין תפקידים למדיניות IAM עבור התפקידים הנדרשים לחשבון השירות admin-sa:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/gkehub.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/resourcemanager.projectIamAdmin
    

‫1.30-1.32

  1. מוסיפים קישורים בין תפקידים למדיניות IAM עבור התפקידים הנדרשים לחשבון השירות admin-sa:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/gkehub.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.admin
    
  2. מוסיפים קישורים בין תפקידים למדיניות IAM עבור התפקידים הנדרשים לחשבון השירות baremetal-controller:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/gkehub.admin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.dashboardEditor
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/serviceusage.serviceUsageViewer
    
  3. מוסיפים קישורים בין תפקידים למדיניות IAM עבור התפקידים הנדרשים לחשבון השירות baremetal-cloud-ops:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/kubernetesmetadata.publisher
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.logWriter
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.dashboardEditor
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.metricWriter
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/monitoring.viewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/opsconfigmonitoring.resourceMetadata.writer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/serviceusage.serviceUsageViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/stackdriver.resourceMetadata.writer
    
  4. נותנים לחשבון השירות baremetal-controller את היכולת ליצור אסימוני גישה בשם חשבון השירות baremetal-gcr:

    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-gcr@PROJECT_ID.iam.gserviceaccount.com \
        --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    

מגדירים אימות

בשלבים הבאים מוגדר תהליך האימות שמשתמש באסימון לטווח קצר לאימות פעולות באשכול:

  1. במחשב של האדמין, מתחברים ל-Google Cloud CLI:

    gcloud auth login
    
  2. בתחנת העבודה של האדמין, יוצרים ומורידים מפתח עבור admin-saחשבון השירות:

    המפתח הזה נדרש כדי לאשר גישה לחשבון השירות admin-sa.

    gcloud iam service-accounts keys create TMP_KEY_FILE_PATH \
        --iam-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com
    

    מחליפים את TMP_KEY_FILE_PATH בנתיב, כולל שם הקובץ, של קובץ המפתח שהורד.

  3. בתחנת העבודה של האדמין, יוצרים משתנה סביבה GOOGLE_APPLICATION_CREDENTIALS עם הערך של מפתח חשבון השירות שהורד:

    export GOOGLE_APPLICATION_CREDENTIALS=TMP_KEY_FILE_PATH
    
  4. בתחנת העבודה של האדמין, יוצרים GCP_ACCESS_TOKEN משתנה סביבה עם הערך של אסימון גישה שנוצר על ידי חשבון השירות admin-sa:

    export GCP_ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
    

    כברירת מחדל, משך החיים של אסימון הגישה הוא שעה אחת.

  5. מוודאים שהאסימון נוצר על ידי חשבון השירות admin-sa עם תאריך התפוגה הנכון:

    curl "https://oauth2.googleapis.com/tokeninfo?access_token=$GCP_ACCESS_TOKEN"
    

    התגובה צריכה לכלול שורות שדומות לאלה:

    ...
    "exp": "1759512810",
    "expires_in": "3589",
    ...
    

    ערך התפוגה הוא בשניות, והוא צריך להיות קטן מ-3600, מה שמציין שהאסימון יפוג תוך פחות משעה.

הגדרת איחוד שירותי אימות הזהות של עומסי העבודה באשכולות

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

‫1.33 ואילך

בגרסאות של אשכולות שבהן אימות אשכולות של Workload Identity זמין ב-GA, משתמשים בפקודה bmctl configure projects כדי להגדיר איחוד זהויות של עומסי עבודה לאשכולות. הפקודה הזו משולבת בשלבים של יצירת אשכול אדמין ויצירת אשכול משתמשים.

כדי למנוע חוסר יציבות ב-containerd כשמשתמשים במאגר תמונות (registry) כדי למשוך תמונות של קונטיינרים עבור האשכול, צריך להוסיף את baremetal.cluster.gke.io/enable-gcr-image-credential-refresh: "false"ההערה לאשכול. ההערה הזו זמינה בגרסאות 1.33.200-gke.70 ואילך:

---
...
registryMirrors:
  - endpoint: https://198.51.20.1:5000
    caCertPath: /root/ca.crt
    pullCredentialConfigPath: /root/.docker/config.json
    hosts:
      - somehost.io
      - otherhost.io
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin1
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: admin1
  namespace: cluster-admin1
  annotations:
    baremetal.cluster.gke.io/enable-gcr-image-credential-refresh: "false"
spec:
  type: admin
  anthosBareMetalVersion: 1.33.200-gke.70
  ...

‫1.30-1.32

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

הוספת קישורי מדיניות IAM למפעיל האשכול

הפקודות הבאות מעניקות לחשבון השירות של anthos-cluster-operator Kubernetes את היכולת להתחזות לחשבון השירות baremetal-controller ולקיים אינטראקציה עם משאבי Google Cloud בשם האשכול:

  1. לכל אשכול שהוגדר לאימות אשכולות באמצעות Workload Identity (או שמתוכנן להשתמש באימות אשכולות באמצעות Workload Identity), כולל אשכול האתחול, צריך להעניק ל-anthos-cluster-operator באשכול את היכולת להתחזות לחשבון השירות baremetal-controller:

    בפקודה הבאה, principalSet כולל את מאגר הזהויות של עומסי העבודה ואת חשבון השירות של Kubernetes, ‏ anthos-cluster-operator, במרחב השמות kube-system.

    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/anthos-cluster-operator \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_NUM: המזהה הייחודי של הפרויקט שנוצר באופן אוטומטי.

    • REGION: המיקום של החברות ב-Fleet עבור האשכול, שהוא global כברירת מחדל. מידע נוסף זמין במאמר בנושא מיקום החברות ב-Fleet.

    • CLUSTER_NAME: שם האשכול. כברירת מחדל, שם אשכול ה-bootstrap הוא bmctl-MACHINE_NAME.

  2. בודקים את הקישורים למדיניות של חשבון השירות baremetal-controller:

    gcloud iam service-accounts get-iam-policy \
        baremetal-controller@PROJECT_ID.iam.gserviceaccount.com
    

    התגובה אמורה להיראות כך:

    bindings:
    - members:
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/anthos-cluster-operator
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/anthos-cluster-operator
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/anthos-cluster-operator
      role: roles/iam.workloadIdentityUser
    etag: BwYoN3QLig0=
    version: 1
    

הוספת קישורי מדיניות IAM לאופרטורים של Google Cloud Observability

הפקודות הבאות מעניקות לחשבונות השירות הבאים של Google Cloud Observability Kubernetes את היכולת להתחזות לחשבון השירות baremetal-cloud-opsולבצע אינטראקציה עם Google Cloud משאבים בשם האשכול:

  • cloud-audit-logging
  • gke-metrics-agent
  • kubestore-collector
  • metadata-agent
  • stackdriver-log-forwarder
  1. לכל אשכול שהוגדר לאימות אשכולות באמצעות Workload Identity (או שמתוכנן להשתמש באימות אשכולות באמצעות Workload Identity), כולל אשכול האתחול, צריך להעניק לאופרטורים של Google Cloud Observability באשכול את היכולת להתחזות לחשבון השירות baremetal-cloud-ops:

    בכל אחת מהפקודות הבאות, principalSet מורכב ממאגר זהויות של עומסי עבודה ומחשבון שירות של Kubernetes, כמו cloud-audit-logging, במרחב השמות kube-system.

    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/cloud-audit-logging \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/gke-metrics-agent \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/kubestore-collector \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/metadata-agent \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
    gcloud iam service-accounts add-iam-policy-binding \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \
        --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/stackdriver-log-forwarder \
        --role=roles/iam.workloadIdentityUser \
        --project=PROJECT_ID
    
  2. בודקים את הקישורים למדיניות של חשבון השירות baremetal-cloud-ops:

    gcloud iam service-accounts get-iam-policy \
        baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com
    

    התגובה אמורה להיראות כך:

    bindings:
    - members:
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/cloud-audit-logging
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/gke-metrics-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/kubestore-collector
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/metadata-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/stackdriver-log-forwarder
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/cloud-audit-logging
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/gke-metrics-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/kubestore-collector
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/metadata-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/stackdriver-log-forwarder
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/cloud-audit-logging
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/gke-metrics-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/kubestore-collector
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/metadata-agent
      - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/stackdriver-log-forwarder
      role: roles/iam.workloadIdentityUser
    etag: BwYhT4gL-dY=
    version: 1
    

יצירת אשכול אדמין

השלבים ליצירת אשכול אדמין שונים מעט בגרסת התצוגה המקדימה (גרסאות 1.30 עד 1.32) ובגרסת הזמינות הכללית (GA) (גרסאות 1.33 ואילך). בשלבים של גרסת ה-GA משתמשים בפקודה bmctl configure projects כדי להגדיר איחוד שירותי אימות הזהות של עומסי עבודה באשכולות.

‫1.33 ואילך

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

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

    gcrKeyPath:
    sshPrivateKeyPath: /home/USERNAME/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath:
    gkeConnectRegisterServiceAccountKeyPath:
    cloudOperationsServiceAccountKeyPath:
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-ADMIN_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: ADMIN_CLUSTER_NAME
      namespace: cluster-ADMIN_CLUSTER_NAME
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    
  2. מוסיפים את ההערה baremetal.cluster.gke.io/enable-workload-identity-cluster-authentication: "true" לקובץ התצורה של האשכול:

    gcrKeyPath:
    sshPrivateKeyPath: /home/USERNAME/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath:
    gkeConnectRegisterServiceAccountKeyPath:
    cloudOperationsServiceAccountKeyPath:
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-ADMIN_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: ADMIN_CLUSTER_NAME
      namespace: cluster-ADMIN_CLUSTER_NAME
      annotations:
        baremetal.cluster.gke.io/enable-workload-identity-cluster-authentication: "true"
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    
  3. בתחנת העבודה של האדמין, מעדכנים את משתנה הסביבה GCP_ACCESS_TOKEN באמצעות אסימון גישה חדש שאוחזר:

    export GCP_ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
    

    כברירת מחדל, משך החיים של אסימון הגישה הוא 3,600 שניות (שעה אחת). כשמשתמשים באימות של אשכולות עם Workload Identity, bmctl בודק את זמן התפוגה של הטוקן. אם תוקף הטוקן יפוג תוך 1,800 שניות (30 דקות), bmctl ידווח על שגיאה ויסיים את הפעולה.

  4. מגדירים את איחוד זהויות של עומסי עבודה עבור האשכול שיוצרים:

    bmctl configure projects --project-id=PROJECT_ID \
        --admin-cluster=ADMIN_CLUSTER_NAME
    
  5. מריצים את הפקודה bmctl create cluster כדי ליצור את אשכול האדמין.

‫1.30-1.32

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

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

    gcrKeyPath:
    sshPrivateKeyPath: /home/USERNAME/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath:
    gkeConnectRegisterServiceAccountKeyPath:
    cloudOperationsServiceAccountKeyPath:
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-ADMIN_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: ADMIN_CLUSTER_NAME
      namespace: cluster-ADMIN_CLUSTER_NAME
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    
  2. בתחנת העבודה של האדמין, יוצרים ומורידים מפתח עבור admin-saחשבון השירות:

    המפתח הזה נדרש כדי לאשר גישה לחשבון השירות admin-sa, ואחרי שמאשרים את חשבון השירות צריך למחוק אותו באופן מיידי.

    gcloud iam service-accounts keys create TMP_KEY_FILE_PATH \
        --iam-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com
    

    מחליפים את TMP_KEY_FILE_PATH בנתיב, כולל שם הקובץ, של קובץ המפתח שהורד.

  3. מתן הרשאת גישה ל- Google Cloud באמצעות חשבון השירות admin-sa:

    gcloud auth activate-service-account admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --key-file=TMP_KEY_FILE_PATH
    
  4. מוחקים את קובץ מפתח ה-JSON שהורדתם:

    rm TMP_KEY_FILE_PATH
    

    התוקף של טוקן הגישה הוא קצר, ולכן בדרך כלל צריך ליצור אותו מחדש לפני שמריצים פקודות bmctl לפעולות באשכול, כמו יצירה, שדרוג או איפוס של אשכול.

  5. בתחנת העבודה של האדמין, יוצרים GCP_ACCESS_TOKEN משתנה סביבה עם הערך של אסימון גישה שנוצר על ידי חשבון השירות admin-sa:

    export GCP_ACCESS_TOKEN=$(gcloud auth print-access-token \
        --impersonate-service-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com)
    

    כברירת מחדל, משך החיים של אסימון הגישה הוא 3,600 שניות (שעה אחת).

  6. מריצים את הפקודה bmctl create cluster כדי ליצור את אשכול האדמין.

יצירת אשכול משתמשים

השלבים ליצירת אשכול אדמין שונים מעט בגרסת התצוגה המקדימה (גרסאות 1.30 עד 1.32) ובגרסת הזמינות הכללית (GA) (גרסאות 1.33 ואילך). בשלבים של גרסת ה-GA משתמשים בפקודה bmctl configure projects כדי להגדיר איחוד שירותי אימות הזהות של עומסי עבודה באשכולות.

‫1.33 ואילך

  1. מוסיפים את ההערה baremetal.cluster.gke.io/enable-workload-identity-cluster-authentication: "true" לקובץ התצורה של האשכול:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-USER_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: USER_CLUSTER_NAME
      namespace: cluster-USER_CLUSTER_NAME
      annotations:
        baremetal.cluster.gke.io/enable-workload-identity-cluster-authentication: "true"
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    

    התוקף של טוקן הגישה הוא קצר, ולכן בדרך כלל צריך ליצור אותו מחדש לפני שמריצים פקודות bmctl לפעולות על אשכולות, כמו יצירה, שדרוג או איפוס של אשכול.

  2. בתחנת העבודה של האדמין, מעדכנים את משתנה הסביבה GCP_ACCESS_TOKEN באמצעות אסימון גישה חדש שאוחזר:

    export GCP_ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
    

    כברירת מחדל, משך החיים של אסימון הגישה הוא 3,600 שניות (שעה אחת).

  3. מגדירים את איחוד זהויות של עומסי עבודה עבור האשכול שיוצרים:

    bmctl configure projects --project-id=PROJECT_ID \
        --user-clusters=USER_CLUSTER_NAME
    
  4. משתמשים בפקודה kubectl כדי לפרוס את מניפסט אשכול המשתמשים:

    kubectl apply -f USER_CLUSTER_CONFIG \
        --kubeconfig ADMIN_KUBECONFIG
    

מחליפים את מה שכתוב בשדות הבאים:

  • USER_CLUSTER_CONFIG: הנתיב של קובץ ההגדרות של אשכול המשתמשים.

  • ADMIN_KUBECONFIG: הנתיב לקובץ kubeconfig של אשכול האדמין.

‫1.30-1.32

  1. בתחנת העבודה של האדמין, יוצרים ומורידים מפתח עבור admin-saחשבון השירות:

    המפתח הזה נדרש כדי לאשר גישה לחשבון השירות admin-sa, ואחרי שמאשרים את חשבון השירות צריך למחוק אותו באופן מיידי.

    gcloud iam service-accounts keys create TMP_KEY_FILE_PATH \
        --iam-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com
    

    מחליפים את TMP_KEY_FILE_PATH בנתיב, כולל שם הקובץ, של קובץ המפתח שהורד.

  2. מתן הרשאת גישה ל- Google Cloud באמצעות חשבון השירות admin-sa:

    gcloud auth activate-service-account admin-sa@PROJECT_ID.iam.gserviceaccount.com \
        --key-file=TMP_KEY_FILE_PATH
    
  3. מוחקים את קובץ מפתח ה-JSON שהורדתם:

    rm TMP_KEY_FILE_PATH
    

    התוקף של טוקן הגישה הוא קצר, ולכן בדרך כלל צריך ליצור אותו מחדש לפני שמריצים פקודות bmctl לפעולות באשכול, כמו יצירה, שדרוג או איפוס של אשכול.

  4. בתחנת העבודה של האדמין, יוצרים GCP_ACCESS_TOKEN משתנה סביבה עם הערך של אסימון גישה שנוצר על ידי חשבון השירות admin-sa:

    export GCP_ACCESS_TOKEN=$(gcloud auth print-access-token \
        --impersonate-service-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com)
    

    כברירת מחדל, משך החיים של אסימון הגישה הוא 3,600 שניות (שעה אחת).

  5. מריצים את הפקודה bmctl create cluster כדי ליצור את אשכול המשתמשים.

פעולות אחרות באשכול

במקרה של אשכולות שמשתמשים באימות אשכולות של Workload Identity, כדי להשתמש בפקודות bmctl הבאות צריך להגדיר את משתנה הסביבה GCP_ACCESS_TOKEN לאסימון גישה פעיל ותקין:

  • bmctl configure projects
  • bmctl create cluster
  • bmctl register bootstrap
  • bmctl reset cluster
  • bmctl upgrade cluster

ב-bmctl register bootstrap יש תמיכה בשימוש במשתנה הסביבה GCP_ACCESS_TOKEN לאימות של אשכולות Workload Identity רק ב-Google Distributed Cloud בגרסה 1.34.0 ואילך. בגרסאות קודמות ל-1.34.0, צריך להשתמש בקובצי מפתח של חשבון שירות כדי לאמת את bmctl register bootstrap.

אם bmctl מזהה שמשתנה הסביבה GCP_ACCESS_TOKEN הוגדר, הוא מבצע אימות של האסימון:

  • אם הטוקן תקף, bmctl משתמש בו לפעולות באשכול.

  • אם האסימון לא תקף, צריך לאחזר אסימון חדש:

    תוקף האסימון לגישה הוא קצר, ולכן בדרך כלל צריך ליצור אותו מחדש לפני שמריצים פקודות bmctl לפעולות על אשכולות, כמו יצירה, שדרוג או איפוס של אשכול. בתחנת העבודה של האדמין, מעדכנים את משתנה הסביבה GCP_ACCESS_TOKEN באסימון לגישה שאוחזר לאחרונה:

    ‫1.33 ואילך

    export GCP_ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
    

    ‫1.30-1.32

    sh export GCP_ACCESS_TOKEN=$(gcloud auth print-access-token \ --impersonate-service-account=admin-sa@PROJECT_ID.iam.gserviceaccount.com)

    כברירת מחדל, משך החיים של אסימון הגישה הוא 3,600 שניות (שעה אחת). כשמשתמשים באימות של אשכולות עם Workload Identity, bmctl בודק את זמן התפוגה של הטוקן. אם תוקף הטוקן יפוג תוך 1,800 שניות (30 דקות), bmctl ידווח על שגיאה ויסיים את הפעולה.

התאמה אישית

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

‫1.33 ואילך

כברירת מחדל, אימות אשכולות של Workload Identity בגרסה 1.33 ואילך של אשכולות משתמש רק בחשבון השירות baremetal-gcr. לכן, זהו חשבון השירות היחיד שאפשר להתאים אישית.

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

  2. מוסיפים הערות לקובץ התצורה של האשכול כדי לציין את השם המותאם אישית של חשבון השירות של Workload Identity Cluster Authentication:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: my-cluster
      namespace: cluster-my-cluster
      annotations:
        ...
        baremetal.cluster.gke.io/gcr-service-account: "CUSTOM_AR_GSA"
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.33.0-gke.799
      ...
    

מחליפים את הערך CUSTOM_AR_GSA בשם האימייל של חשבון השירות שמשמש את Google Distributed Cloud להורדת תמונות של מאגרי תגים מ-Artifact Registry.

‫1.30-1.32

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

  2. מוסיפים הערות לקובץ התצורה של האשכול כדי לציין את השמות המותאמים אישית של חשבונות השירות של Workload Identity Cluster Authentication:

    הגדרת שמות בהתאמה אישית מאפשרת לכם להשתמש בחשבונות שירות קיימים. חשוב לוודא ששמות חשבונות השירות המותאמים אישית שאתם מציינים שונים זה מזה. אנחנו לא תומכים בשימוש בחשבון שירות יחיד כדי להחליף שניים או יותר מחשבונות השירות שמוגדרים כברירת מחדל.

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: my-cluster
      namespace: cluster-my-cluster
      annotations:
        ...
        baremetal.cluster.gke.io/controller-service-account: "CUSTOM_CONTROLLER_GSA"
        baremetal.cluster.gke.io/cloud-ops-service-account: "CUSTOM_CLOUD_OPS_GSA"
        baremetal.cluster.gke.io/gcr-service-account: "CUSTOM_AR_GSA"
    spec:
      type: admin
      profile: default
      anthosBareMetalVersion: 1.30.0-gke.1930
      ...
    

מחליפים את מה שכתוב בשדות הבאים:

  • CUSTOM_CONTROLLER_GSA: כתובת האימייל של חשבון השירות שמשמש את Connect Agent כדי לשמור על חיבור בין האשכול לבין Google Cloud, וכדי לרשום את האשכולות.

  • CUSTOM_CLOUD_OPS_GSA: השם של חשבון השירות שמשמש את Stackdriver Agent לייצוא יומנים ומדדים מאשכולות ל-Cloud Logging ול-Cloud Monitoring.

  • CUSTOM_AR_GSA: השם של חשבון השירות שמשמש את Google Distributed Cloud להורדת תמונות של קונטיינרים מ-Artifact Registry.

מגבלות

התכונות והיכולות הבאות לא נתמכות כשמשתמשים באימות של Workload Identity Cluster ב-Google Distributed Cloud (תוכנה בלבד) בשרת פיזי:

  • שימוש בשרת Proxy
  • VPC Service Controls
  • עדכון אשכולות קיימים במצב עם מפתח לשימוש באימות אשכולות של Workload Identity
  • ניהול מחזור החיים של אשכולות באמצעות לקוחות GKE On-Prem API, כמו Google Cloud CLI,‏ Terraform או מסוף Google Cloud

המאמרים הבאים