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

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

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

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

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

מגבלות

ל-MIG עם הגדרת stateful – stateful MIG – יש את המגבלות הבאות:

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

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

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

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

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

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

gcloud

כדי ליצור מכונה מנוהלת עם שם בהתאמה אישית ולהגדיר מטא-נתונים עם שמירת מצב במכונה הווירטואלית הזו, משתמשים בפקודה 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: השם של קבוצת המופעים המנוהלת (MIG) שבה רוצים ליצור מופע
  • ‫INSTANCE_NAME: השם של המופע שרוצים ליצור
  • ‫KEY ו-VALUE: צמדי מפתח/ערך של מטא-נתונים עם שמירת מצב, שאפשר להגדיר בנפרד לכל אחת מהמכונות, בנוסף למטא-נתונים שמוגדרים בתבנית של הגדרות מכונה
    • ערכי המפתח שאתם מגדירים כאן מקבלים עדיפות על פני ערכי מפתח סותרים מתבנית של הגדרות מכונה

דוגמה

צריך לפרוס אשכול של צמתים, 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

כדי ליצור מכונה וירטואלית מנוהלת עם שם בהתאמה אישית ולהגדיר מטא-נתונים עם שמירת מצב במכונה הווירטואלית הזו, משתמשים במשאב 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 עם שמות מותאמים אישית של מכונות וירטואליות, ולהגדיר מטא-נתונים עם שמירת מצב בנפרד במכונות הווירטואליות האלה, אפשר להשתמש באחת מהשיטות הבאות:

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 אזורי, מחליפים את zones/ZONE ב-regions/REGION ומציינים את האזור של ה-MIG.
  • ‫NAME: השם של קבוצת המופעים המנוהלת שבה רוצים ליצור מופע
  • ‫INSTANCE_NAME: השם של המופע שרוצים ליצור
  • ‫KEY ו-VALUE: צמדי מפתח/ערך של מטא-נתונים עם שמירת מצב, שאפשר להגדיר בנפרד לכל אחת מהמכונות, בנוסף למטא-נתונים שמוגדרים בתבנית של הגדרות מכונה
    • ערכי המפתח שאתם מגדירים כאן מקבלים עדיפות על פני ערכי מפתח סותרים מתבנית של הגדרות מכונה

דוגמה

צריך לפרוס אשכול של צמתים, 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, עבור המופע החדש.

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

כדי להגדיר, לשנות או להסיר מטא-נתונים עם שמירת מצב למכונה קיימת ב-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: צמדי מפתח/ערך של מטא-נתונים עם שמירת מצב שמוגדרים בנפרד עבור המכונה, בנוסף למטא-נתונים שמוגדרים בתבנית של הגדרות מכונה. ערכי המפתח שאתם מגדירים כאן מקבלים עדיפות על פני ערכי מפתח סותרים מתבנית המופע.
  • ‫KEY: מפתחות מטא-נתונים ספציפיים למכונה עם שמירת מצב להסרה מההגדרה לכל מכונה.
    • אם לא מוגדר ערך למפתח בתבנית של הגדרות מכונה, צמד המפתח/ערך יוסר לחלוטין מהמכונה כשהשינוי יוחל.
    • אם מוגדר ערך למפתח בתבנית המופע, הערך מתבנית המופע מוגדר במופע כשמחילים את השינוי.
  • ‫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, ב-MIG‏ 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

כדי להגדיר מטא-נתונים עם שמירת מצב בנפרד למכונות וירטואליות קיימות בקבוצת 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"
    },
    ...
  ]
}

אם כבר קיימות הגדרות לכל מופע עבור המופעים הנתונים, משתמשים בשיטה 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 אזורי, מחליפים את zones/ZONE ב-regions/REGION ומציינים את האזור של ה-MIG.
  • ‫NAME: השם של ה-MIG.
  • ‫INSTANCE_NAME: השם של מכונת ה-VM שעבורה רוצים להגדיר מטא-נתונים עם שמירת מצב.
  • ‫KEY ו-VALUE: צמדי מפתח/ערך של מטא-נתונים עם שמירת מצב, שאפשר להגדיר בנפרד למופעים בנוסף למטא-נתונים שהוגדרו בתבנית של הגדרות מכונה.
    • ערכים של מטא-נתונים עם שמירת מצב שהוגדרו למפתחות שכבר קיימים בתבנית של הגדרות המכונה, מחליפים את הערכים מהתבנית של הגדרות המכונה.
    • רשומות אחרות של מטא-נתונים מתבנית של הגדרות מכונה לא מושפעות ונשארות זמינות.
    • אם מציינים את הערך 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
        }
      }
    }
  ]
}

השיטה מבצעת את הפעולות הבאות:

  1. המדיניות מגדירה מטא-נתונים של mode:standby בהגדרה לכל מכונה שמשויכת למכונה הווירטואלית, node-12, ב-example-cluster MIG.
  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-discuss@google.com.

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