הכנה לתמונות מצב של פודים

תמונות מצב של Pod ב-Google Kubernetes Engine‏ (GKE) מאפשרות לשמור ולשחזר מצבים של Pod שפועל, כדי לשפר את זמן האחזור של הפעלת עומס העבודה. כדי לצלם את עומסי העבודה, קודם צריך להכין את סביבת האשכול והאחסון.

במאמר הזה מוסבר איך להפעיל ולהגדיר תמונות מצב של Pod באשכול, ואיך להגדיר את Cloud Storage לאחסון תמונות המצב. מידע נוסף על אופן הפעולה של תמונות מצב של Pod זמין במאמר מידע על תמונות מצב של Pod ב-GKE.

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

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

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

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-Google Cloud CLI למשימה הזו, מתקינים ואז מאתחלים את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.

הפעלת תמונות מצב של Pod

אפשר להפעיל תמונות מצב של Pod באשכול חדש או קיים. תמונות מצב של Pod דורשות GKE Sandbox ואיחוד זהויות של עומסי עבודה ל-GKE. באשכולות Autopilot שתי התכונות מופעלות כברירת מחדל. באשכולות Standard, צריך להפעיל את איחוד הזהויות של עומסי העבודה ל-GKE באשכול ולהגדיר מאגר צמתים להרצה ב-GKE Sandbox.

כדי להפעיל תמונות מצב של Pod באשכול, פועלים לפי השלבים של מצב הפעולה של GKE שבו רוצים להשתמש:

טייס אוטומטי

  • כדי להפעיל צילומי מצב של Pod באשכול חדש, מריצים את הפקודה הבאה:

      gcloud container clusters create-auto CLUSTER_NAME \
          --enable-pod-snapshots \
          --location=CONTROL_PLANE_LOCATION \
          --cluster-version=CLUSTER_VERSION
    

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

    • ‫CLUSTER_NAME: שם האשכול.
    • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.
    • ‫CLUSTER_VERSION: הגרסה של האשכול החדש, שצריכה להיות 1.35.3-gke.1234000 ואילך.
  • כדי להפעיל צילומי מצב של Pod באשכול קיים, פועלים לפי השלבים הבאים:

    1. משדרגים את האשכול לגרסה 1.35.3-gke.1234000 ואילך:

        gcloud container clusters upgrade CLUSTER_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

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

      • ‫CLUSTER_NAME: השם של האשכול.
      • ‫CLUSTER_VERSION: הגרסה שאליה רוצים לשדרג את האשכול. היא חייבת להיות 1.35.3-gke.1234000 או גרסה חדשה יותר.
      • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.
    2. מפעילים את תמונות המצב של Pod באשכול:

        gcloud container clusters update CLUSTER_NAME \
            --enable-pod-snapshots \
            --location=CONTROL_PLANE_LOCATION
      

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

      • ‫CLUSTER_NAME: שם האשכול.
      • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.

תמונות מצב של Pod עם היקף ברירת המחדל whole-pod לא תומכות בסוגי מכונות E2, אבל תמונות מצב של מערכת קבצים (rootfs-only) כן תומכות. באשכולות Autopilot, יכול להיות ש-GKE יתזמן Pods בצומתי E2 כברירת מחדל. אם אתם משתמשים בהיקף whole-pod, השתמשו במשאב בהתאמה אישית של ComputeClass כדי לוודא שעומסי העבודה שלכם פועלים בחומרה תואמת.

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

  1. שומרים את קובץ המניפסט הבא בשם non-e2-class.yaml:

      apiVersion: cloud.google.com/v1
      kind: ComputeClass
      metadata:
        name: non-e2-class
      spec:
        priorities:
        - machineFamily: n2
        - machineFamily: c3
        activeMigration:
          optimizeRulePriority: false
        whenUnsatisfiable: DoNotScaleUp
    
  2. מחילים את המניפסט:

      kubectl apply -f non-e2-class.yaml
    
  3. במפרט של ה-Pod, מפנים למשאב המותאם אישית ComputeClass באמצעות cloud.google.com/compute-class node selector:

      spec:
        nodeSelector:
          cloud.google.com/compute-class: non-e2-class
        # Multiple lines are omitted here
    

רגילה

  • כדי להפעיל צילומי מצב של Pod באשכול חדש, מריצים את הפקודה הבאה:

      gcloud container clusters create CLUSTER_NAME \
          --enable-pod-snapshots \
          --cluster-version=CLUSTER_VERSION \
          --workload-pool=PROJECT_ID.s3ns.svc.id.goog \
          --workload-metadata=GKE_METADATA \
          --location=CONTROL_PLANE_LOCATION
    

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

    • ‫CLUSTER_NAME: שם האשכול.
    • ‫CLUSTER_VERSION: הגרסה של האשכול החדש, שחייבת להיות 1.35.3-gke.1234000 ואילך.
    • PROJECT_ID: מזהה הפרויקט.
    • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.
  • כדי להפעיל קובצי Snapshot של Pod באשכול קיים, מבצעים את השלבים הבאים:

    1. משדרגים את האשכול לגרסה 1.35.3-gke.1234000 ואילך:

        gcloud container clusters upgrade CLUSTER_NAME \
            --node-pool=NODE_POOL_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

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

      • ‫CLUSTER_NAME: שם האשכול.
      • ‫NODE_POOL_NAME: שם מאגר הצמתים.
      • ‫CLUSTER_VERSION: הגרסה שאליה רוצים לשדרג את האשכול. היא חייבת להיות 1.35.3-gke.1234000 או גרסה חדשה יותר.
      • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.
    2. מפעילים את תמונות המצב של Pod באשכול:

        gcloud beta container clusters update CLUSTER_NAME \
            --enable-pod-snapshots \
            --location=CONTROL_PLANE_LOCATION
      

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

      • ‫CLUSTER_NAME: שם האשכול.
      • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.

כדי להריץ Pods ב-GKE Sandbox באשכול Standard, צריך ליצור או לעדכן מאגר צמתים שבו GKE Sandbox מופעל. כדי לעדכן מאגר צמתים, משתמשים בדגל --sandbox type=gvisor. כדי ליצור מאגר צמתים עם GKE Sandbox מופעל, מריצים את הפקודה הבאה:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --node-version=NODE_VERSION \
    --machine-type=MACHINE_TYPE \
    --location=CONTROL_PLANE_LOCATION \
    --image-type=cos_containerd \
    --sandbox type=gvisor

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

  • ‫NODE_POOL_NAME: השם של מאגר הצמתים החדש.
  • ‫CLUSTER_NAME: השם של האשכול.
  • ‫NODE_VERSION: הגרסה שבה משתמשים למאגר הצמתים.
  • ‫MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים.
  • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.

מידע נוסף על GKE Sandbox זמין במאמר הגברת הבידוד של עומסי עבודה באמצעות GKE Sandbox.

תמונות מצב של החנות

‫GKE שומר את קובצי ה-snapshot של Pod בקטגוריה של Cloud Storage. כל קובץ snapshot מכיל את זיכרון האפליקציה, ואם רוצים, גם את מצב ה-GPU של ה-Pod. כדי לבצע אימות ב-Cloud Storage, תמונות המצב של Pod משתמשות באובייקט ServiceAccount של ה-Pod, שדורש איחוד זהויות של עומסי עבודה ל-GKE.

כדי ליצור תמונות מצב של Pod, צריך להגדיר את הקטגוריות הבאות:

  • מרחבי שמות היררכיים: צריך להפעיל מרחבי שמות היררכיים כדי לתמוך במספר גבוה יותר של שאילתות קריאה וכתיבה לשנייה (QPS). במרחבי שמות היררכיים צריך גם להפעיל גישה אחידה ברמת הקטגוריה.
  • מחיקה רכה: מכיוון שתמונות המצב של Pod משתמשות בהעלאות מורכבות מקבילות, צריך להשבית תכונות של הגנה על נתונים כמו מחיקה רכה. אם משאירים את התכונות האלה מופעלות, מחיקות זמניות של האובייקטים הזמניים יכולות להגדיל משמעותית את חשבון האחסון.
  • מיקום: המיקום של הקטגוריה ב-Cloud Storage צריך להיות באותו מיקום של אשכול ה-GKE, כי העברת קובצי snapshot בין אזורים שונים עשויה להשפיע על הביצועים.

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

gcloud storage buckets create gs://BUCKET_NAME \
    --uniform-bucket-level-access \
    --enable-hierarchical-namespace \
    --soft-delete-duration=0d \
    --location=LOCATION

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

  • ‫BUCKET_NAME: שם הקטגוריה.
  • ‫LOCATION: המיקום של הקטגוריה.

רשימת האפשרויות המלאה ליצירת קטגוריות מופיעה בקטע דגלים במאמרי העזרה של הפקודה buckets create.

מתן גישה לעומסי עבודה לקטגוריה של Cloud Storage

כברירת מחדל, ל-GKE אין גישה ל-Cloud Storage. כדי לקרוא ולכתוב קובצי Snapshot של Pod, צריך להקצות תפקיד IAM שמכיל את ההרשאות המתאימות לאובייקט Kubernetes ServiceAccount שבו משתמשים ה-Pods של עומס העבודה, או להפעיל ריבוי דיירים באמצעות אסימונים קצרי-טווח.

הקצאת תפקידים לאובייקטים ספציפיים של Kubernetes ServiceAccount

כדי להקצות תפקידים לאובייקטים ספציפיים של Kubernetes ServiceAccount:

  1. כדי לתקשר עם האשכול באמצעות פקודות kubectl, צריך לקבל אישורים לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

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

    • ‫CLUSTER_NAME: השם של האשכול.
    • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.
  2. מבצעים את השלבים הבאים לכל Pod:

    1. יוצרים אובייקט ServiceAccount:

      kubectl create serviceaccount SERVICEACCOUNT_NAME \
          --namespace=NAMESPACE
      

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

      • ‫SERVICEACCOUNT_NAME: השם של האובייקט ServiceAccount.
      • ‫NAMESPACE: מרחב השמות של ה-Pods.
    2. כדי לאפשר לאובייקט ServiceAccount לקרוא מטא-נתונים של קטגוריה, מקצים לו את התפקיד Storage Bucket Viewer (roles/storage.bucketViewer):

      gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \
          --role="roles/storage.bucketViewer"
      

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

      • ‫BUCKET_NAME: השם של הקטגוריה.
      • ‫PROJECT_NUMBER: מספר הפרויקט.
      • PROJECT_ID: מזהה הפרויקט.
      • ‫NAMESPACE: מרחב השמות של ה-Pods.
      • ‫SERVICEACCOUNT_NAME: השם של אובייקט ServiceAccount.
    3. כדי לאפשר לאובייקט ServiceAccount לקרוא ולכתוב אובייקטים של תמונת מצב בקטגוריה, מקצים לו את התפקיד Storage Object User (roles/storage.objectUser):

      gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \
          --role="roles/storage.objectUser"
      

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

במקום להעניק הרשאות לאובייקטים ספציפיים של ServiceAccount, אפשר להפעיל ריבוי דיירים עם אסימונים לטווח קצר שמוגבלים להיקף מסוים. הגישה הזו עוזרת למנוע את העיכוב בהפצה שקשור לקישורי IAM ידניים. במקום לתת הרשאות לכל אובייקט ServiceAccount, אתם נותנים פעם אחת את התפקיד "אדמין של אחסון" (roles/storage.admin) בקטגוריית האחסון של קובץ snapshot לחשבון השירות של צומת GKE. חשבון השירות של הצומת יוצר אסימונים לטווח קצר לפי דרישה לנתיבים ספציפיים.

כדי להפעיל טוקנים עם תמונות מצב של Pod, צריך להשתמש בגרסה 1.35.3-gke.1737000 או גרסה חדשה יותר של GKE.

כדי להפעיל ריבוי דיירים:

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

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkenode.s3ns-system.iam.gserviceaccount.com" \
        --role="roles/storage.admin"
    

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

    • ‫BUCKET_NAME: השם של הקטגוריה.
    • ‫PROJECT_NUMBER: מספר הפרויקט.
  2. כשמגדירים אחסון לתמונות מצב, מגדירים את הערך של השדה tokenSource ל-federatedP4SA.

מתן גישה לבקר של קובץ ה-snapshot של Pod לקטגוריה של Cloud Storage

כדי לאפשר לבקר של תמונת המצב של Pod למחוק תמונות מצב בתוך הקטגוריה של Cloud Storage, צריך להקצות את התפקיד Storage Object User (roles/storage.objectUser) לסוכן השירות של GKE בפרויקט. כדי להקצות את התפקיד, מריצים את הפקודה הבאה:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \
    --role="roles/storage.objectUser" \
    --condition="expression=resource.name.startsWith(\"projects/_/buckets/BUCKET_NAME\"),title=restrict_to_bucket,description=Restricts access to one bucket only"

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

  • PROJECT_ID: מזהה הפרויקט.
  • ‫PROJECT_NUMBER: מספר הפרויקט.
  • ‫BUCKET_NAME: השם של הקטגוריה.

אופציונלי: יצירת תיקיות מנוהלות לקטגוריה של Cloud Storage

כדי לבודד הרשאות לתמונות מצב מ-Pods שלא סומכים זה על זה, דבר שימושי בתרחישים של ריבוי דיירים, יוצרים תיקיות מנוהלות. כדי להגדיר תיקיות מנוהלות, מבצעים את השלבים הבאים:

  1. יוצרים תפקיד IAM בהתאמה אישית שמכיל רק את ההרשאות שנדרשות לתמונות מצב של Pod:

    gcloud iam roles create podSnapshotGcsReadWriter \
        --project=PROJECT_ID \
        --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"
    

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

  2. מקצים את התפקיד 'צפייה בקטגוריית אחסון' (roles/storage.bucketViewer) לכל אובייקט ServiceAccount במרחב השמות של היעד. התפקיד הזה מאפשר לאובייקטים של ServiceAccount לקרוא את המטא-נתונים של הקטגוריה, אבל לא נותן להם הרשאות לקרוא או לכתוב את האובייקטים בקטגוריה.

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/namespace/NAMESPACE" \
        --role="roles/storage.bucketViewer"
    

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

    • ‫BUCKET_NAME: השם של הקטגוריה.
    • ‫PROJECT_NUMBER: מספר הפרויקט.
    • PROJECT_ID: מזהה הפרויקט.
    • ‫NAMESPACE: מרחב השמות של ה-Pods.
  3. מבצעים את השלבים הבאים לכל אובייקט ServiceAccount שצריך לאחסן קובצי snapshot של Pod:

    1. יוצרים תיקייה מנוהלת לאובייקט ServiceAccount:

      gcloud storage managed-folders create gs://BUCKET_NAME/FOLDER_PATH/
      

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

      • ‫BUCKET_NAME: שם הקטגוריה.
      • ‫FOLDER_PATH: הנתיב לתיקייה המנוהלת (לדוגמה, my-app-snapshots).
    2. מקצים לאובייקט ServiceAccount את התפקיד podSnapshotGcsReadWriter בהתאמה אישית בתיקייה המנוהלת:

      gcloud storage managed-folders add-iam-policy-binding gs://BUCKET_NAME/FOLDER_PATH/ \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \
          --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"
      

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

      • ‫BUCKET_NAME: שם הקטגוריה.
      • ‫FOLDER_PATH: הנתיב לתיקייה המנוהלת (לדוגמה, my-app-snapshots).
      • ‫PROJECT_NUMBER: מספר הפרויקט.
      • PROJECT_ID: מזהה הפרויקט.
      • ‫NAMESPACE: מרחב השמות של ה-Pods.
      • ‫SERVICEACCOUNT_NAME: השם של האובייקט ServiceAccount.

הגדרת אחסון לתמונות מצב

כדי לציין איפה לאחסן קובצי snapshot של Pod, יוצרים משאב בהתאמה אישית מסוג PodSnapshotStorageConfig:

  1. שומרים את המניפסט הבא בתור example-pod-snapshot-storage-config.yaml. בדוגמה הזו מוגדר GKE לאחסון קובצי snapshot של Pod בנתיב FOLDER_PATH/ בתוך קטגוריה של Cloud Storage‏ BUCKET_NAME:

    apiVersion: podsnapshot.gke.io/v1
    kind: PodSnapshotStorageConfig
    metadata:
      name: example-pod-snapshot-storage-config
    spec:
      snapshotStorageConfig:
        gcs:
          bucket: "BUCKET_NAME"
          path: "FOLDER_PATH"
          tokenSource: "TOKEN_SOURCE"
    

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

    • ‫BUCKET_NAME: שם הקטגוריה של Cloud Storage.
    • ‫FOLDER_PATH: הנתיב לתיקייה המנוהלת ב-Cloud Storage.
    • ‫TOKEN_SOURCE: ספק הזהויות לגישה. משתמשים ב-podKSA (ברירת המחדל) או ב-federatedP4SA לדיירים מרובים.
  2. מחילים את המניפסט:

    kubectl apply -f example-pod-snapshot-storage-config.yaml
    

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

איך מפעילים תמונת מצב של Pod