איך מפעילים ומגדירים תמונות מצב של Pod ב-Google Kubernetes Engine (GKE) באשכול, ומגדירים את Cloud Storage לאחסון תמונות המצב.
מידע נוסף על אופן הפעולה של תמונות מצב של Pod זמין במאמר מידע על תמונות מצב של Pod.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
הפעלת תמונות מצב של Pod
כדי להפעיל את התכונה 'תמונת מצב של Pod', צריך ליצור או לעדכן אשכול עם התכונה הזו. באשכולות Standard, צריך גם ליצור או לעדכן מאגר צמתים כדי להריץ ב-GKE Sandbox. GKE Sandbox נתמך כברירת מחדל באשכולות Autopilot.
כדי להפעיל צילומי מצב של 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.35.3-gke.1234000 ואילך:
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול. -
CLUSTER_VERSION: הגרסה של האשכול החדש, שצריכה להיות 1.35.3-gke.1234000 ואילך.
-
מפעילים תמונות מצב של Pod באשכול:
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION
תמונות מצב של Pod בהיקף ברירת המחדל של
whole-podלא תומכות בסוגי מכונות E2. ב-Autopilot, יכול להיות ש-GKE יגדיר כברירת מחדל סוגי מכונות שלא תומכים בתמונות מצב של Pod. אם אתם משתמשים בwhole-podתמונות מצב של היקף, כדי לוודא שעומסי העבודה שלכם פועלים על חומרה תואמת, כדאי להשתמש בComputeClass בהתאמה אישית כדי לתת עדיפות לסדרות מכונות תואמות. תמונות מצב של מערכת הקבצים (rootfs-only) תומכות בסוגי מכונות E2.
כדי ליצור ComputeClass מותאם אישית ולהשתמש בו, מבצעים את השלבים הבאים:
שומרים את קובץ המניפסט הבא בשם
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החלת המניפסט:
kubectl apply -f non-e2-class.yamlבמפרט של ה-Pod, מפנים אל ComputeClass באמצעות
cloud.google.com/compute-classnode selector:spec: nodeSelector: cloud.google.com/compute-class: non-e2-class ...
רגילה
כדי להפעיל צילומי מצב של Pod באשכול חדש, מריצים את הפקודה הבאה:
gcloud container clusters create CLUSTER_NAME \ --enable-pod-snapshots \ --cluster-version=CLUSTER_VERSION \ --workload-pool=PROJECT_ID.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: המיקום של מישור הבקרה של האשכול.
-
כדי להפעיל צילומי מצב של Pod באשכול קיים, מבצעים את השלבים הבאים:
משדרגים את האשכול לגרסה 1.35.3-gke.1234000 ואילך:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODEPOOL_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
NODEPOOL_NAME: השם של מאגר הצמתים. -
CLUSTER_VERSION: הגרסה שאליה צריך לעדכן את האשכול החדש, שחייבת להיות 1.35.3-gke.1234000 ואילך. -
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.
-
מפעילים תמונות מצב של Pod באשכול:
gcloud beta container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול.
-
כדי להריץ Pods ב-GKE Sandbox באשכול Standard, צריך ליצור או לעדכן מאגר צמתים עם gVisor מופעל. כדי לעדכן מאגר צמתים, משתמשים בדגל --sandbox type=gvisor. כדי ליצור מאגר צמתים עם gVisor מופעל,
מריצים את הפקודה הבאה:
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: המיקום של מישור הבקרה של האשכול.
מידע נוסף על השימוש ב-gVisor זמין במאמר בידוד עומסי עבודה באמצעות GKE Sandbox.
תמונות מצב של חנויות
תמונות המצב של ה-Pod מאוחסנות בקטגוריה של Cloud Storage, שמכילה את הזיכרון ואת מצב ה-GPU (אם יש). כדי להשתמש בחשבון השירות של ה-Pod לאימות ב-Cloud Storage, צריך להפעיל את איחוד שירותי אימות הזהות של עומסי עבודה ב-GKE.
כדי ליצור תמונות מצב של פודים, צריך להגדיר את הקטגוריה באופן הבא:
- מרחבי שמות היררכיים: צריך להפעיל אותם כדי לאפשר מספר גבוה יותר של שאילתות קריאה וכתיבה לשנייה. בנוסף, כדי להשתמש במרחבי שמות היררכיים, צריך להפעיל גישה אחידה ברמת הקטגוריה.
- מחיקה רכה: מכיוון שתמונות המצב של ה-Pod משתמשות בהעלאות מורכבות מקבילות, כדאי להשבית תכונות של הגנה על נתונים כמו מחיקה רכה. אם התכונות האלה מופעלות, מחיקות רכות של האובייקטים הזמניים עלולות להגדיל באופן משמעותי את חשבון האחסון.
- מיקום: המיקום של קטגוריית Cloud Storage צריך להיות זהה למיקום של אשכול GKE, כי הביצועים עלולים להיפגע אם התמונות של מצב המערכת מועברות בין אזורים שונים.
כדי ליצור את הקטגוריה וההרשאות הנדרשות, צריך לבצע את השלבים הבאים:
יצירת קטגוריה של Cloud Storage. הפקודה הבאה יוצרת קטגוריה עם ההגדרות הנדרשות:
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. כדי לקרוא ולכתוב קבצים של תמונות מצב, צריך להקצות תפקיד IAM שמכיל את ההרשאות המתאימות ל-Kubernetes ServiceAccount (KSA) שמשמש את פודים של עומסי העבודה, או להקצות אסימונים לטווח קצר.
הקצאת תפקידים לחשבונות שירות ספציפיים ב-Kubernetes
כדי לתקשר עם האשכול באמצעות פקודות
kubectl, צריך לקבל פרטי כניסה:gcloud container clusters get-credentials "CLUSTER_NAME"לכל Pod, מבצעים את השלבים הבאים:
יוצרים KSA לכל פוד:
kubectl create serviceaccount "KSA_NAME" \ --namespace "NAMESPACE"מחליפים את מה שכתוב בשדות הבאים:
-
KSA_NAME: השם של ה-KSA. -
NAMESPACE: מרחב השמות של ה-Pods.
-
נותנים ל-KSA הרשאה לגשת לקטגוריה:
gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role="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.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role="roles/storage.objectUser"מחליפים את מה שכתוב בשדות הבאים:
-
BUCKET_NAME: השם של הקטגוריה. -
PROJECT_NUMBER: מספר הפרויקט. PROJECT_ID: מזהה הפרויקט.-
NAMESPACE: מרחב השמות של ה-Pods. -
KSA_NAME: השם של ה-KSA.
-
הפעלת ריבוי דיירים באמצעות אסימונים לטווח קצר
במקום להעניק הרשאות ל-KSA ספציפיים, אפשר להפעיל ריבוי דיירים עם אסימונים לטווח קצר שמוגבלים להיקף מסוים. הגישה הזו עוזרת להימנע מהשהיית ההתפשטות שקשורה לקשרי IAM ידניים.
במקום להעניק הרשאות לכל KSA, מעניקים פעם אחת את התפקיד roles/storage.admin בקטגוריית האחסון של התמונת מצב לחשבון השירות של צומת GKE. לאחר מכן, חשבון השירות של הצומת יוצר אסימונים לטווח קצר לפי דרישה עבור נתיבים ספציפיים.
כדי להפעיל טוקנים עם תמונות מצב של Pod, צריך להשתמש ב-GKE בגרסה 1.35.3-gke.1737000 ואילך.
כדי להפעיל את האפשרות לשימוש במספר דיירים:
כדי לתת לחשבון השירות של הצומת הרשאה לגשת לקטגוריה, מריצים את הפקודה הבאה:
gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \ --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkenode.iam.gserviceaccount.com" \ --role="roles/storage.admin"כשמגדירים אחסון לתמונות מצב, מגדירים את הערך של השדה
tokenSourceל-federatedP4SA.
הענקת גישה לבקר של צילומי המצב של ה-Pod לקטגוריה של Cloud Storage
כדי לאפשר לבקר התמונות של ה-Pod למחוק תמונות בתוך קטגוריית Cloud Storage, צריך להעניק לסוכן השירות של GKE את התפקיד Storage Object User (משתמש באובייקט אחסון) (roles/storage.objectUser) בפרויקט. מריצים את הפקודה הבאה כדי להעניק את התפקיד roles/storage.objectUser:
gcloud projects add-iam-policy-binding "PROJECT_ID" \
--member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.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_NUMBER: מספר הפרויקט. PROJECT_ID: מזהה הפרויקט.-
BUCKET_NAME: השם של הקטגוריה.
(אופציונלי) יצירת תיקיות מנוהלות לקטגוריה של Cloud Storage
יצירת תיקיות מאפשרת לכם לבודד את ההרשאות לצילומי מצב מ-Pods שלא מהימנים הדדית, וזה שימושי בתרחישי שימוש של ריבוי דיירים. כדי להגדיר תיקיות מנוהלות, מבצעים את השלבים הבאים:
יוצרים תפקיד IAM בהתאמה אישית שמכיל רק את ההרשאות הנדרשות לצילומי מצב של Pod:
gcloud iam roles create podSnapshotGcsReadWriter \ --project="PROJECT_ID" \ --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"נותנים את התפקיד
roles/storage.bucketViewerלכל החשבונות של שירותי הליבה במרחב השמות של היעד. התפקיד הזה מאפשר ל-KSA לקרוא את המטא-נתונים של הקטגוריה, אבל לא מעניק הרשאות קריאה או כתיבה לאובייקטים בקטגוריה.gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/namespace/NAMESPACE" \ --role="roles/storage.bucketViewer"מחליפים את מה שכתוב בשדות הבאים:
-
BUCKET_NAME: השם של הקטגוריה. -
PROJECT_NUMBER: מספר הפרויקט. PROJECT_ID: מזהה הפרויקט.-
NAMESPACE: מרחב השמות של ה-Pods.
-
לכל KSA שצריך לאחסן תמונות מצב של Pod, מבצעים את השלבים הבאים:
יוצרים תיקייה מנוהלת עבור ערב הסעודית:
gcloud storage managed-folders create "gs://BUCKET_NAME/FOLDER_PATH/"מחליפים את מה שכתוב בשדות הבאים:
-
BUCKET_NAME: השם של הקטגוריה. -
FOLDER_PATH: הנתיב לתיקייה המנוהלת, לדוגמהmy-app-snapshots.
-
נותנים לחשבון ה-KSA את התפקיד המותאם אישית
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.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"מחליפים את מה שכתוב בשדות הבאים:
-
BUCKET_NAME: השם של הקטגוריה. -
FOLDER_PATH: הנתיב לתיקייה המנוהלת, לדוגמהmy-app-snapshots. -
PROJECT_NUMBER: מספר הפרויקט. PROJECT_ID: מזהה הפרויקט.-
NAMESPACE: מרחב השמות של ה-Pods. -
KSA_NAME: השם של ה-KSA.
-
הגדרת אחסון לתמונות מצב
כדי לציין איפה לאחסן קבצים של snapshot, יוצרים משאב PodSnapshotStorageConfig.
בדוגמה הבאה מוגדר GKE לאחסון תמונות מצב של Pod בנתיב
FOLDER_PATH/בתוך קטגוריית Cloud Storage BUCKET_NAME. שומרים את קובץ המניפסט הבא בשםexample-pod-snapshot-storage-config: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לריבוי דיירים.
-
החלת המניפסט:
kubectl apply -f example-pod-snapshot-storage-config.yaml