הגדרת מטא-נתונים עם שמירת מצב בקבוצות של מכונות וירטואליות מנוהלות

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

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

כדי להגדיר מטא-נתונים של מצב לכל מכונה וירטואלית בנפרד בקבוצת מכונות מנוהלת, צריך להגדיר אותם בהגדרות לכל מכונה ולהחיל את ההגדרות. אפשר להגדיר הגדרה לכל מכונה כשיוצרים מכונה או במכונות מנוהלות קיימות. אחרי שמחילים את ההגדרה לכל מכונה, קבוצת המכונות המנוהלות שומרת את המטא-נתונים של המצב בשדה preserved state from configuration (preservedStateFromConfig) של המכונה המנוהלת.

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

מגבלות

לקבוצת MIG עם הגדרות לשמירת מצב (stateful) – קבוצת MIG לשמירת מצב – יש את המגבלות הבאות:

  • אי אפשר להשתמש בהתאמה אוטומטית לעומס או בתזמוני התאמה לעומס אם לקבוצת ה-MIG יש הגדרה של שמירת מצב. כדי לתזמן פעולות התחלה ועצירה של קבוצות MIG עם שמירת מצב, אפשר להשתמש בתהליך עבודה אוטומטי חיצוני. לדוגמה, אפשר להשתמש ב-Cloud Scheduler כדי להפעיל פונקציות Cloud Run שקוראות ל-methods‏ stopInstances ו-startInstances הספציפיות ל-MIG.
  • אם רוצים להשתמש בעדכונים אוטומטיים בהדרגה (rolling), צריך להגדיר את שיטת ההחלפה ל-RECREATE.
  • בקבוצות MIG אזוריות עם שמירת מצב, צריך להשבית את החלוקה מחדש היזומה (להגדיר את סוג החלוקה מחדש ל-NONE) כדי למנוע מחיקה של מכונות עם שמירת מצב על ידי חלוקה מחדש אוטומטית בין אזורים.
  • אם משתמשים בהגדרות לכל המכונות כדי לשנות את המאפיינים של תבנית של הגדרות מכונה, אי אפשר לציין את המאפיינים האלה בהגדרות לכל מכונה בנפרד וגם בהגדרות לכל המכונות בקבוצה.

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

הגדרת מטא-נתונים של מצב כשיוצרים מכונה

הגדרת מטא-נתונים עם שמירת מצב כשיוצרים מכונות באופן ידני ב-MIG. האפשרות הזו שימושית כשמעבירים אפליקציה עם שמירת מצב (stateful) במכונות וירטואליות עצמאיות לקבוצת MIG עם שמירת מצב, וכשיוצרים מכונות עם שמירת מצב.

כשיוצרים מכונה באופן ידני ב-MIG ומספקים מטא-נתונים עם שמירת מצב, ה-MIG מבצע את המשימות הבאות:

  1. יוצרת מכונה מנוהלת מתבנית של הגדרות מכונה, באמצעות שם המכונה שצוין.
  2. יצירת הגדרה לכל מכונה עם המטא-נתונים של שמירת המצב שסופקו, והגדרת המטא-נתונים האלה במכונה.
  3. מאחסן את המטא-נתונים של המצב במצב השמור מההגדרה (preservedStateFromConfig) של המכונה המנוהלת המשויכת.

gcloud

כדי ליצור מכונה מנוהלת עם שם בהתאמה אישית ולהגדיר מטא-נתונים עם שמירת מצב (stateful) במכונה הווירטואלית הזו, משתמשים בפקודה gcloud compute instance-groups managed create-instance עם הדגל --stateful-metadata.

gcloud compute instance-groups managed create-instance NAME \
  --instance INSTANCE_NAME \
  --stateful-metadata KEY=VALUE[,KEY=VALUE,...]

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

  • ‫NAME: השם של קבוצת המכונות המנוהלת שבה רוצים ליצור מכונה
  • ‫INSTANCE_NAME: השם של המכונה שרוצים ליצור
  • ‫KEY ו-VALUE: צמדי מפתח/ערך של מטא-נתונים עם שמירת מצב (stateful) שצריך להגדיר בנפרד למכונות, בנוסף למטא-נתונים שמוגדרים בתבנית של הגדרות המכונה
    • ערכי המפתחות שמוגדרים כאן מקבלים עדיפות על פני ערכי מפתחות סותרים מתבנית של הגדרות מכונה.

דוגמה

אתם צריכים לפרוס אשכול של צמתים, example-cluster, שיכול לפעול באחד משני מצבים: active או standby. אתם מגדירים את המצב בנפרד לכל מכונה וירטואלית באשכול באמצעות מטא-נתונים, לדוגמה: mode:active. אתם גם מגדירים את רמת הפירוט של הרישום ביומן לכל צומת, באמצעות מפתח המטא-נתונים logging שאפשר להגדיר לערך basic או elaborate. האפליקציה בצומת מוגדרת באמצעות ערכים מהמטא-נתונים של המכונה.

כדי ליצור צומת פעיל, node-12, עם רישום מפורט ביומן, מריצים את הפקודה הבאה:

gcloud compute instance-groups managed create-instance example-cluster \
  --instance node-12 \
  --stateful-metadata mode=active,logging=elaborate

הפקודה יוצרת מכונה וירטואלית, node-12, ב-MIG‏ example-cluster ומגדירה שני צמדי מפתח/ערך של מטא-נתונים, mode:active ו-logging:elaborate, למכונה החדשה.

Terraform

כדי ליצור מכונה מנוהלת עם שם בהתאמה אישית ולהגדיר מטא-נתונים עם שמירת מצב (stateful) במכונה הווירטואלית הזו, משתמשים במשאב google_compute_per_instance_config.

בדוגמה הבאה נעשה שימוש ב-MIG אזורי. אם עדיין אין לכם קבוצת MIG אזורית, צרו קבוצת MIG אזורית עם מכונות וירטואליות שמוגבלות לאזור אחד.

resource "google_compute_per_instance_config" "default" {
  instance_group_manager = google_compute_instance_group_manager.default.name
  zone                   = google_compute_instance_group_manager.default.zone
  name                   = "node-12"
  preserved_state {
    metadata = {
      mode    = "active"
      logging = "elaborate"
    }
  }
}

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

REST

כדי ליצור מכונה מנוהלת אחת או יותר ב-MIG עם שמות מותאמים אישית של מכונות וירטואליות, ולהגדיר מטא-נתונים של שמירת מצב (stateful) בנפרד במכונות הווירטואליות האלה, צריך להשתמש באחת מהשיטות הבאות:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/createInstances
{
  "instances": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY" : "VALUE",
          ...
        }
      }
    },
    ...
  ]
}

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

  • ‫PROJECT_ID: מזהה הפרויקט של הבקשה
  • ‫ZONE: האזור שבו נמצאת קבוצת ה-MIG (רלוונטי לקבוצת MIG אזורית)
    • בקבוצת MIG אזורית, מחליפים את zones/ZONE ב-regions/REGION ומציינים את האזור של קבוצת ה-MIG.
  • ‫NAME: השם של קבוצת ה-MIG שבה רוצים ליצור מכונה
  • ‫INSTANCE_NAME: השם של המכונה שרוצים ליצור
  • ‫KEY ו-VALUE: צמדי מפתח/ערך של מטא-נתונים עם שמירת מצב (stateful) שצריך להגדיר בנפרד למכונות, בנוסף למטא-נתונים שמוגדרים בתבנית של הגדרות המכונה
    • ערכי המפתחות שמוגדרים כאן מקבלים עדיפות על פני ערכי מפתחות סותרים מתבנית של הגדרות מכונה.

דוגמה

אתם צריכים לפרוס אשכול של צמתים, example-cluster, שיכול לפעול באחד משני מצבים: active או standby. אתם מגדירים את המצב בנפרד לכל מכונה וירטואלית באשכול באמצעות מטא-נתונים, לדוגמה: mode:active. אתם גם מגדירים את רמת הפירוט של הרישום ביומן לכל צומת, באמצעות מפתח המטא-נתונים logging שאפשר להגדיר לערך basic או elaborate. האפליקציה בצומת מוגדרת באמצעות ערכים מהמטא-נתונים של המכונה.

כדי ליצור צומת פעיל, node-12, עם רישום מפורט ביומן, מריצים את השיטה הבאה:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/createInstances

{
  "instances": [
    {
      "name": "node-12",
      "preservedState" : {
        "metadata": {
          "mode":"active",
          "logging":"elaborate"
        }
      }
    }
  ]
}

השיטה יוצרת מכונה וירטואלית, node-12, ב-MIG example-cluster ומגדירה שני צמדי מפתח/ערך במטא-נתונים, mode:active ו-logging:elaborate, למכונה החדשה.

הגדרה, שינוי והסרה של מטא-נתונים של מצב (stateful) בנפרד למכונות וירטואליות קיימות

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

gcloud

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

אם למכונה מסוימת אין הגדרה ספציפית, משתמשים בפקודה gcloud compute instance-groups managed instance-configs create עם אחד מהדגלים הבאים:

gcloud compute instance-groups managed instance-configs create NAME \
  --instance INSTANCE_NAME \
  --stateful-metadata KEY=VALUE[,KEY=VALUE,...] \
  [--no-update-instance | --update-instance] \
  [--instance-update-minimal-action MINIMAL_ACTION]

אם כבר קיימת הגדרה לכל מכונה במכונה נתונה, משתמשים בפקודה gcloud compute instance-groups managed instance-configs update עם:

  • הדגל --stateful-metadata להגדרה או לשינוי של מטא-נתונים, או
  • הדגל --remove-stateful-metadata להסרת מטא-נתונים של מצב ספציפי למכונה.
gcloud compute instance-groups managed instance-configs update NAME \
  --instance INSTANCE_NAME \
  [--stateful-metadata KEY=VALUE[,KEY=VALUE,...]] \
  [--remove-stateful-metadata KEY[,KEY,...]] \
  [--no-update-instance | --update-instance] \
  [--instance-update-minimal-action MINIMAL_ACTION]

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

  • ‫NAME: השם של קבוצת המכונות המנוהלת.
  • ‫INSTANCE_NAME: השם של המכונה שעבורה רוצים להגדיר מטא-נתונים של שמירת מצב.
  • ‫KEY=VALUE: צמדי מפתח/ערך של מטא-נתונים עם שמירת מצב (stateful) שצריך להגדיר בנפרד למכונה, בנוסף למטא-נתונים שמוגדרים בתבנית של הגדרות המכונה. ערכי המפתחות שאתם מגדירים כאן מקבלים עדיפות על פני ערכי מפתחות סותרים מתבנית המכונה.
  • ‫KEY: מפתחות מטא-נתונים עם שמירת מצב (stateful) ספציפיים למכונה, שצריך להסיר מההגדרה לכל מכונה.
    • אם לא מוגדר ערך למפתח בתבנית של הגדרות המכונה, צמד המפתח/ערך יוסר לחלוטין מהמכונה כשהשינוי יחול.
    • אם בתבנית של הגדרות המכונה מוגדר ערך למפתח, הערך מהתבנית של הגדרות המכונה מוגדר במכונה כשמחילים את השינוי.
  • ‫MINIMAL_ACTION: ביצוע הפעולה שצוינה לפחות, כשמחילים את עדכון ההגדרות האישיות לכל מכונה. אפשר להגדיר MINIMAL_ACTION רק כשמשתמשים בדגל --update-instance. הערך צריך להיות אחד מהבאים:

    • ‫none: לא תתבצע פעולה.
    • ‫refresh: החלת עדכונים שאפשר להחיל בלי לעצור את המכונה.
    • ‫restart: עוצרים את המכונה ומפעילים אותה מחדש.
    • ‫replace: יוצרים מחדש את המכונה.

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

דוגמה

יש לכם אשכול של צמתים, example-cluster, שיכול לפעול באחד משני מצבים: active או standby. מגדירים את המצב לכל מכונה וירטואלית באשכול בנפרד באמצעות מטא-נתונים, לדוגמה: mode:active. אתם גם מגדירים את רמת הפירוט של הרישום ביומן לכל צומת, באמצעות מפתח מטא-נתונים של logging שאפשר להגדיר לערך basic או elaborate. האפליקציה בכל צומת צורכת את הערכים מהמטא-נתונים של המכונה.

תבנית של הגדרות מכונה מגדירה את המטא-נתונים mode:active ו-logging:basic שישמשו כברירת מחדל לכל המכונות. הגדרתם את logging:elaborate בתצורה לכל מכונה של המכונה הווירטואלית node-12 באשכול. עכשיו אתם רוצים להעביר את node-12 למצב המתנה ולהעביר את הרישום ביומן ל-basic במכונה הווירטואלית הזו.

כדי להעביר את המכונה node-12 למצב המתנה ואת הרישום ביומן למצב בסיסי, מריצים את הפקודה הבאה:

gcloud compute instance-groups managed instance-configs update example-cluster \
  --instance node-12 \
  --stateful-metadata mode=standby \
  --remove-stateful-metadata logging

הפקודה מבצעת את הפעולות הבאות:

  1. מגדירה את המטא-נתונים של mode:standby בהגדרות של כל מכונה שמשויכת למכונה הווירטואלית node-12 בקבוצת המכונות המנוהלת example-cluster.
  2. הסרת המטא-נתונים של logging:elaborate מההגדרה של כל מכונה במכונה node-12.
  3. החלת השינוי בהגדרות לכל מכונה על המכונה הווירטואלית node-12:
    • מגדיר את המטא-נתונים של mode:standby בהתאם להגדרות האישיות.
    • הגדרת המטא-נתונים logging:basic מתבנית של הגדרות מכונה, כי הערך של המפתח logging כבר לא מוגדר בהגדרות של כל מכונה.
  4. השינוי מוחל על ה-VM באופן מיידי כברירת מחדל, כי הדגל --no-update-instance הושמט.
  5. המכונה הווירטואלית ממשיכה לפעול במהלך העדכון כי הדגל --instance-update-minimal-action הושמט, וכברירת מחדל נבחרה הפעולה הכי פחות משבשת לעדכון, במקרה הזה: refresh.

REST

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

אם עדיין לא קיימות הגדרות לכל מכונה במכונות הנתונות, משתמשים בשיטה instanceGroupManagers.updatePerInstanceConfigs עם מטא-נתונים של מצב:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/updatePerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY": "VALUE",
          ...
        }
      },
      "fingerprint": "FINGERPRINT"
    },
    ...
  ]
}

אם כבר קיימות הגדרות לכל מכונה במכונות הנתונות, משתמשים ב-method‏ instanceGroupManagers.patchPerInstanceConfigs

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY": "VALUE",
          ...
        }
      },
      "fingerprint": "FINGERPRINT"
    },
    ...
  ]
}

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

  • ‫PROJECT_ID: מזהה הפרויקט של הבקשה.
  • ‫ZONE: האזור שבו נמצאת קבוצת ה-MIG (רלוונטי לקבוצת MIG אזורית).
    • בקבוצת MIG אזורית, מחליפים את zones/ZONE ב-regions/REGION ומציינים את האזור של קבוצת ה-MIG.
  • ‫NAME: השם של ה-MIG.
  • ‫INSTANCE_NAME: השם של ה-VM שרוצים להגדיר לו מטא-נתונים לשמירת מצב.
  • ‫KEY ו-VALUE: צמדי מפתח/ערך של מטא-נתונים עם שמירת מצב (stateful) שצריך להגדיר בנפרד למכונות, בנוסף למטא-נתונים שמוגדרים בתבנית של הגדרות המכונה.
    • ערכי המטא-נתונים של המצב שהוגדרו למפתחות שכבר קיימים בתבנית של הגדרות המכונה, מבטלים את הערכים מהתבנית של הגדרות המכונה.
    • רשומות אחרות של מטא-נתונים מתבנית של הגדרות מכונה לא מושפעות ונשארות זמינות.
    • אם תציינו את הערך null, המפתח יוסר מההגדרה של כל מכונה.
  • ‫FINGERPRINT: (אופציונלי). טביעת האצבע של ההגדרה הנתונה, אם היא כבר קיימת. משמש לנעילה אופטימית.

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

דוגמה

יש לכם אשכול של צמתים, example-cluster, שיכול לפעול באחד משני מצבים: active או standby. מגדירים את המצב לכל מכונה וירטואלית באשכול בנפרד באמצעות מטא-נתונים, לדוגמה: mode:active. אתם גם מגדירים את רמת הפירוט של הרישום ביומן לכל צומת, באמצעות מפתח מטא-נתונים של logging שאפשר להגדיר לערך basic או elaborate. האפליקציה בכל צומת צורכת את הערכים מהמטא-נתונים של המכונה.

תבנית של הגדרות מכונה מגדירה את המטא-נתונים mode:active ו-logging:basic שישמשו כברירת מחדל לכל המכונות. הגדרתם את logging:elaborate בתצורה לכל מכונה של המכונה הווירטואלית node-12 באשכול. עכשיו אתם רוצים להעביר את node-12 למצב המתנה ולהעביר את הרישום ביומן ל-basic במכונה הזו.

כדי להעביר את ה-VM של node-12 למצב המתנה ואת הרישום ביומן למצב בסיסי, צריך לתקן את ההגדרות המשויכות לכל מכונה באמצעות השיטה patchPerInstanceConfigs:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "node-12",
      "preservedState" : {
        "metadata": {
          "mode": "standby",
          "logging": null
        }
      }
    }
  ]
}

ה-method מבצעת את הפעולות הבאות:

  1. מגדירה את המטא-נתונים של mode:standby בהגדרות של כל מכונה שמשויכת למכונה הווירטואלית node-12 בקבוצת המכונות המנוהלות example-cluster.
  2. הסרת המטא-נתונים של logging:elaborate מההגדרה לכל מכונה כי הערך שסופק הוא null.

עדכון ההגדרות עדיין לא הוחל על המכונה הווירטואלית node-12. עדכון ההגדרות יחול בפעם הבאה שתיצרו מחדש או תעדכנו את המכונה, או אם תשתמשו בעדכון אוטומטי יזום.

כדי להחיל את עדכון ההגדרות לכל מכונה על המכונה הווירטואלית node-12, מפעילים את ה-method‏ instanceGroupManagers.applyUpdatesToInstances במכונה:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/applyUpdatesToInstances

{
  "instances": ["/zones/us-east1-c/instances/node-12"],
  "minimalAction": "NONE"
}

השיטה מחילה את ההגדרה המעודכנת לכל מכונה על המכונה הווירטואלית node-12:

  1. מגדירה את המטא-נתונים של mode:standby בהתאם להגדרות של כל מכונה.
  2. מגדיר את המטא-נתונים של logging:basic מתבנית של הגדרות מכונה, כי הערך של המפתח logging כבר לא מוגדר בהגדרות של כל מכונה.
  3. המכונה הווירטואלית ממשיכה לפעול במהלך העדכון כי הערך של minimalAction מוגדר כ-NONE, מה שמאפשר ל-MIG להשתמש בפעולה הכי פחות משבשת שנדרשת לעדכון. כדי לעדכן את המטא-נתונים של המכונה, צריך לבצע את הפעולה REFRESH, שלא משבשת את פעולת המכונה.

משוב

נשמח לשמוע על תרחישי השימוש שלכם, על האתגרים שבהם נתקלתם ועל המשוב שלכם לגבי קבוצות MIG עם שמירת מצב. אתם יכולים לשלוח משוב לצוות שלנו בכתובת mig-discuss@google.com.

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