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

כשרוצים ליצור מספר גדול של מכונות וירטואליות (VM) זהות ובלתי תלויות זו בזו, אפשר ליצור מכונות וירטואליות בכמות גדולה באמצעות Google Cloud CLI או Compute Engine API. אפשר ליצור את מכונות ה-VM האלה בכל האזורים באזור או לפזר אותן בין אזורים מסוימים.

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

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

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות ליצירת מספר גדול של מכונות וירטואליות, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד אדמין מכונות של Compute ‏ (v1) (roles/compute.instanceAdmin.v1) בפרויקט. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

ההרשאות הנדרשות

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

  • ‫compute.instances.create בפרויקט
  • כדי להשתמש באימג' בהתאמה אישית ליצירת המכונה הווירטואלית (VM)‏: ‫compute.images.useReadOnly בקובץ אימג'
  • כדי להשתמש ב-snapshot ליצירת המכונה הווירטואלית: ‫compute.snapshots.useReadOnly בקובץ snapshot
  • כדי להשתמש בתבנית של הגדרות מכונה ליצירת המכונה הווירטואלית: compute.instanceTemplates.useReadOnly בתבנית של הגדרות המכונה
  • כדי לציין רשת משנה למכונה הווירטואלית: ‫compute.subnetworks.use בפרויקט או ברשת המשנה שנבחרה
  • כדי לציין כתובת IP סטטית למכונה הווירטואלית: ‫compute.addresses.use בפרויקט
  • כדי להקצות כתובת IP חיצונית למכונה הווירטואלית כשמשתמשים ברשת VPC: ‫compute.subnetworks.useExternalIp בפרויקט או ברשת המשנה שנבחרה
  • כדי להקצות רשת מדור קודם למכונה הווירטואלית: ‫compute.networks.use בפרויקט
  • כדי להקצות כתובת IP חיצונית למכונה הווירטואלית כשמשתמשים ברשת מדור קודם: ‫compute.networks.useExternalIp בפרויקט
  • כדי להגדיר מטא-נתונים של המכונה הווירטואלית: ‫compute.instances.setMetadata בפרויקט
  • כדי להגדיר תגים למכונה הווירטואלית: ‫compute.instances.setTags במכונה הווירטואלית
  • כדי להגדיר תוויות למכונה הווירטואלית: ‫compute.instances.setLabels במכונה הווירטואלית
  • כדי להגדיר חשבון שירות לשימוש של המכונה הווירטואלית: ‫compute.instances.setServiceAccount במכונה הווירטואלית
  • כדי ליצור דיסק חדש למכונה הווירטואלית: ‫compute.disks.create בפרויקט
  • כדי לצרף דיסק קיים במצב קריאה-בלבד או במצב קריאה וכתיבה: ‫compute.disks.use בדיסק
  • כדי לצרף דיסק קיים במצב קריאה-בלבד: ‫compute.disks.useReadOnly בדיסק

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

יצירת מכונות וירטואליות בכמות גדולה באזור

כדי ליצור כמות גדולה של מכונות וירטואליות באזור מסוים, משתמשים ב-CLI של gcloud או ב-Compute Engine API.

אם מציינים סוג מכונה או תמיכה בחומרה נוספת כמו GPU או SSD מקומי, מערכת Compute Engine ממקמת את המכונות הווירטואליות בתחום באזור שתומך בסוג המכונה ובחומרה הנוספת.

gcloud

כדי ליצור כמות גדולה של מכונות וירטואליות באזור מסוים, משתמשים בפקודה gcloud compute instances bulk create הבאה:

gcloud compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --region=REGION \
    --count=COUNT \
    [ --min-count=MIN_COUNT \ ]
    [--location-policy=LOCATION_POLICY \ ]
    [--target-distribution-shape=TARGET_DISTRIBUTION_SHAPE ]

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

  • ‫NAME_PATTERN: תבנית השם של המכונות הווירטואליות. משתמשים ברצף של תווי סולמית (#) כדי ש-Compute Engine יחליף אותם ברצף של מספרים. לדוגמה, שימוש ב-vm-# בתבנית השם יוצר מכונות וירטואליות עם שמות כמו vm-1 ו-vm-2, עד למספר המכונות הווירטואליות שצוין על ידי --count, שחייב להיות קטן או שווה למספר המכונות הווירטואליות שהתבנית מאפשרת.

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

  • ‫PREDEFINED_NAMES: רשימה של שמות מוגדרים מראש של מכונות וירטואליות שרוצים ליצור. אם משתמשים בדגל הזה ומציינים את COUNT, הערך של COUNT חייב להיות שווה למספר השמות שסופקו.

  • ‫REGION: האזור שבו רוצים ליצור את המכונות הווירטואליות.

  • ‫COUNT: מספר המכונות הווירטואליות שרוצים ליצור. הערך הזה צריך להיות קטן ממספר המכונות הווירטואליות שמותר להשתמש בהן לפי NAME_PATTERN, או שווה לו. לחלופין, אם משתמשים ב---predefined-names, לא צריך לציין את COUNT, אבל אם מציינים אותו, הוא חייב להיות שווה למספר השמות שסופקו.

  • ‫MIN_COUNT: המספר המינימלי של מכונות וירטואליות שייווצרו. בטבלה הבאה מפורטת התנהגות הבקשה בהתאם להגדרת הדגל:

    ערך תיאור
    לא מוגדר ערך ברירת המחדל הוא COUNT. אם Compute Engine לא יכול ליצור את מספר המכונות הוירטואליות שצוין ב-COUNT, הבקשה תיכשל ולא ייווצרו מכונות וירטואליות.
    1 ‫Compute Engine יוצר כמה שיותר מכונות וירטואליות, עד COUNT.
    יותר מ-1 ופחות מ-COUNT ‫Compute Engine יוצר לפחות MIN_COUNT מכונות וירטואליות, עד למקסימום של COUNT מכונות וירטואליות. אם אי אפשר ליצור MIN_COUNT מכונות וירטואליות, הבקשה נכשלת ולא נוצרות מכונות וירטואליות.
  • ‫LOCATION_POLICY: האזורים שרוצים לכלול או להחריג באזור מסוים. משתמשים ברשימה של צמדי מפתח/ערך, כאשר האזור הוא המפתח והמדיניות היא הערך. הערכים התקינים של המדיניות הם allow (ברירת מחדל) ו-deny. ערך לדוגמה של הדגל הזה:

    --location-policy=us-east1-b=allow,us-east1-c=deny
    
  • ‫TARGET_DISTRIBUTION_SHAPE: חלוקת המכונות הווירטואליות בין האזורים שצוינו. משתמשים בדגל --location-policy כדי לציין את האזורים. בטבלה הבאה מפורטים הערכים התקינים של הדגל הזה:

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

REST

כדי ליצור כמות גדולה של מכונות וירטואליות באזור מסוים, משתמשים בinstances.bulkInsert שיטה הבאה:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {},
    "PREDEFINED_NAME_2": {},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  "locationPolicy": {
    "LOCATION_POLICY"
    },
    "targetShape": "TARGET_DISTRIBUTION_SHAPE"
  ...
}

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

  • ‫PROJECT_ID: מזהה הפרויקט.

  • ‫REGION: האזור שבו יוצרים את המכונות הווירטואליות.

  • ‫NAME_PATTERN: תבנית השם של המכונות הווירטואליות. צריך לציין את הערך הזה או את הערך perInstanceProperties. משתמשים ברצף של תווים מסוג סולמית (#) כדי שמערכת Compute Engine תחליף אותם ברצף של מספרים. לדוגמה, אם משתמשים ב-vm-# בתור תבנית השם, נוצרות מכונות וירטואליות עם שמות כמו vm-1 ו-vm-2, עד למספר המכונות הווירטואליות שצוין על ידי --count, שחייב להיות קטן או שווה למספר המכונות הווירטואליות שאפשר ליצור לפי תבנית השם.

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

  • ‫PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...: רשימה של שמות מוגדרים מראש למכונות הווירטואליות שרוצים ליצור. צריך לציין את הערך הזה או את הערך namePattern. אם משתמשים בדגל הזה ומציינים את COUNT, הערך של COUNT חייב להיות שווה למספר השמות שצוינו.

  • ‫COUNT: מספר המכונות הווירטואליות שרוצים ליצור. הערך הזה צריך להיות קטן ממספר המכונות הווירטואליות שמותר להשתמש בהן לפי NAME_PATTERN, או שווה לו. לחלופין, אם משתמשים ב-perInstanceProperties, לא צריך לציין את COUNT, אבל אם מציינים אותו, הוא צריך להיות שווה למספר השמות שצוינו.

  • ‫MIN_COUNT: המספר המינימלי של מכונות וירטואליות שייווצרו. בטבלה הבאה מפורטת התנהגות הבקשה בהתאם להגדרת הדגל:

    ערך תיאור
    לא מוגדר ערך ברירת המחדל הוא COUNT. אם Compute Engine לא יכול ליצור את מספר המכונות הוירטואליות שצוין ב-COUNT, הבקשה תיכשל ולא ייווצרו מכונות וירטואליות.
    1 ‫Compute Engine יוצר כמה שיותר מכונות וירטואליות, עד COUNT.
    יותר מ-1 ופחות מ-COUNT ‫Compute Engine יוצר לפחות MIN_COUNT מכונות וירטואליות, עד למקסימום של COUNT מכונות וירטואליות. אם אי אפשר ליצור MIN_COUNT מכונות וירטואליות, הבקשה נכשלת ולא נוצרות מכונות וירטואליות.
  • ‫LOCATION_POLICY: האזורים שרוצים לכלול או להחריג באזור מסוים. משתמשים ברשימה של צמדי מפתח/ערך, כאשר האזור הוא המפתח והמדיניות היא הערך. הערכים התקינים של המדיניות הם ALLOW (ברירת המחדל) ו-DENY. הנה ערך לדוגמה בשדה הזה:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • ‫TARGET_DISTRIBUTION_SHAPE: פיזור המכונות הווירטואליות באזורים שצוינו. משתמשים בשדה locationPolicy כדי לציין את האזורים. בטבלה הבאה מפורטים הערכים התקינים של השדה הזה:

    ערך תיאור
    ANY_SINGLE_ZONE המדיניות מחייבת מיקום של מכונות וירטואליות באזור אחד, ונותנת עדיפות לניצול של הזמנות שלא נעשה בהן שימוש. אפשר להשתמש בזה כדי להימנע מתעבורת נתונים יוצאת (egress) ברשת בין אזורים שונים, או כדי להפחית את זמן האחזור ברשת. זה ערך ברירת המחדל.
    BALANCED המערכת מנסה לפזר את המכונות הווירטואליות באופן שווה בכל התחומים באזור.
    ANY מאפשרת להפיץ מכונות וירטואליות בכמה אזורים באותו מחוז. בוחר אזורים שיש בהם משאבים זמינים, ומנצל באופן מקסימלי את ההזמנות שלא נוצלו באזורים.

יצירת מכונות וירטואליות בכמות גדולה באזור

כדי ליצור כמות גדולה של מכונות וירטואליות באזור מסוים, משתמשים ב-CLI של gcloud או ב-Compute Engine API.

gcloud

כדי ליצור כמות גדולה של מכונות וירטואליות באזור ספציפי, משתמשים בפקודה gcloud compute instances bulk create הבאה.

gcloud compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --zone=ZONE \
    --count=COUNT \
    [ --min-count=MIN_COUNT ]

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

  • ‫NAME_PATTERN: תבנית השם של המכונות הווירטואליות. משתמשים ברצף של תווי סולמית (#) כדי ש-Compute Engine יחליף אותם ברצף של מספרים. לדוגמה, שימוש ב-vm-# בתבנית השם יוצר מכונות וירטואליות עם שמות כמו vm-1 ו-vm-2, עד למספר המכונות הווירטואליות שצוין על ידי --count, שחייב להיות קטן או שווה למספר המכונות הווירטואליות שהתבנית מאפשרת.

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

  • ‫PREDEFINED_NAMES: רשימה של שמות מוגדרים מראש של מכונות וירטואליות שרוצים ליצור. אם משתמשים בדגל הזה ומציינים את COUNT, הערך של COUNT חייב להיות שווה למספר השמות שסופקו.

  • ‫ZONE: האזור שבו יוצרים את המכונות הווירטואליות.

  • ‫COUNT: מספר המכונות הווירטואליות שרוצים ליצור. הערך הזה צריך להיות קטן ממספר המכונות הווירטואליות שמותר להשתמש בהן לפי NAME_PATTERN, או שווה לו. לחלופין, אם משתמשים ב---predefined-names, לא צריך לציין את COUNT, אבל אם מציינים אותו, הוא חייב להיות שווה למספר השמות שסופקו.

  • ‫MIN_COUNT: המספר המינימלי של מכונות וירטואליות שייווצרו. בטבלה הבאה מפורטת התנהגות הבקשה בהתאם להגדרת הדגל:

    ערך תיאור
    לא מוגדר ערך ברירת המחדל הוא COUNT. אם Compute Engine לא יכול ליצור את מספר המכונות הוירטואליות שצוין ב-COUNT, הבקשה תיכשל ולא ייווצרו מכונות וירטואליות.
    1 ‫Compute Engine יוצר כמה שיותר מכונות וירטואליות, עד COUNT.
    יותר מ-1 ופחות מ-COUNT ‫Compute Engine יוצר לפחות MIN_COUNT מכונות וירטואליות, ועד COUNT מכונות וירטואליות לכל היותר. אם אי אפשר ליצור מכונות וירטואליות MIN_COUNT, הבקשה נכשלת ולא נוצרות מכונות וירטואליות.

REST

כדי ליצור כמות גדולה של מכונות וירטואליות באזור מסוים, משתמשים בשיטה instances.bulkInsert הבאה.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {},
    "PREDEFINED_NAME_2": {},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  ...
}

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

  • ‫PROJECT_ID: מזהה הפרויקט.

  • ‫ZONE: האזור שבו רוצים ליצור את המכונות הווירטואליות.

  • ‫NAME_PATTERN: תבנית השם של המכונות הווירטואליות. צריך לציין את הערך הזה או את הערך perInstanceProperties. משתמשים ברצף של תווים מסוג סולמית (#) כדי שמערכת Compute Engine תחליף אותם ברצף של מספרים. לדוגמה, אם משתמשים בתבנית השם vm-#, נוצרות מכונות וירטואליות עם שמות כמו vm-1 ו-vm-2, עד למספר המכונות הווירטואליות שצוין ב---count. המספר הזה חייב להיות קטן או שווה למספר המכונות הווירטואליות שתבנית השם מאפשרת.

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

  • ‫PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...: רשימה של שמות מוגדרים מראש למכונות הווירטואליות שרוצים ליצור. צריך לציין את הערך הזה או את הערך namePattern. אם משתמשים בדגל הזה ומציינים את COUNT, הערך של COUNT חייב להיות שווה למספר השמות שצוינו.

  • ‫COUNT: מספר המכונות הווירטואליות שרוצים ליצור. הערך הזה צריך להיות קטן ממספר המכונות הווירטואליות שמותר להשתמש בהן לפי NAME_PATTERN, או שווה לו. לחלופין, אם משתמשים ב-perInstanceProperties, לא צריך לציין את COUNT, אבל אם מציינים אותו, הוא צריך להיות שווה למספר השמות שצוינו.

  • ‫MIN_COUNT: המספר המינימלי של מכונות וירטואליות שייווצרו. בטבלה הבאה מפורטת התנהגות הבקשה בהתאם להגדרת הדגל:

    ערך תיאור
    לא מוגדר ערך ברירת המחדל הוא COUNT. אם Compute Engine לא יכול ליצור את מספר המכונות הוירטואליות שצוין ב-COUNT, הבקשה תיכשל ולא ייווצרו מכונות וירטואליות.
    1 ‫Compute Engine יוצר כמה שיותר מכונות וירטואליות, עד COUNT.
    יותר מ-1 ופחות מ-COUNT ‫Compute Engine יוצר לפחות MIN_COUNT מכונות וירטואליות, עד למקסימום של COUNT מכונות וירטואליות. אם אי אפשר ליצור מכונות וירטואליות MIN_COUNT, הבקשה נכשלת ולא נוצרות מכונות וירטואליות.

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

אפשר ליצור מכונות וירטואליות עם שמות מארחים בהתאמה אישית בכמות גדולה באזור או באזור זמינות באמצעות ה-CLI של gcloud או Compute Engine API.

צריך להגדיר באופן ידני את רשומת ה-DNS של שם המארח המותאם אישית. מידע נוסף זמין במאמר בנושא מגבלות.

אם לא מציינים שם מארח, Compute Engine מגדיר את שם המארח של המכונות הווירטואליות כאחד מהשמות הבאים:

  • VM_NAME.c.PROJECT_ID.internal כשמפעילים DNS גלובלי
  • VM_NAME.ZONE.c.PROJECT_ID.internal כשמפעילים DNS אזורי

מידע נוסף זמין במאמר בנושא שמות DNS פנימיים.

gcloud

כדי ליצור כמות גדולה של מכונות וירטואליות עם שמות מארחים בהתאמה אישית באזור מסוים, משתמשים בפקודה gcloud beta compute instances bulk create הבאה.

gcloud beta compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --per-instance-hostnames=[VM_NAME=HOSTNAME,...] \
    --zone=REGION \
    --count=COUNT \
    [ --min-count=MIN_COUNT ]
    [--location-policy=LOCATION_POLICY \ ]
    [--target-distribution-shape=TARGET_DISTRIBUTION_SHAPE ]

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

  • ‫NAME_PATTERN: תבנית השם של המכונות הווירטואליות. משתמשים ברצף של תווי סולמית (#) כדי ש-Compute Engine יחליף אותם ברצף של מספרים. לדוגמה, שימוש ב-vm-# בתבנית השם יוצר מכונות וירטואליות עם שמות כמו vm-1 ו-vm-2, עד למספר המכונות הווירטואליות שצוין על ידי --count, שחייב להיות קטן או שווה למספר המכונות הווירטואליות שהתבנית מאפשרת.

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

  • ‫PREDEFINED_NAMES: רשימה של שמות מוגדרים מראש של מכונות וירטואליות שרוצים ליצור. אם משתמשים בדגל הזה ומציינים את COUNT, הערך של COUNT חייב להיות שווה למספר השמות שסופקו.

  • ‫[VM_NAME=HOSTNAME, ...]: רשימה של צמדי מפתח/ערך של שמות מוגדרים מראש למכונות הווירטואליות ושמות מארחים של דומיינים מלאים שרוצים להקצות למכונות הווירטואליות. שמות מארחים מותאמים אישית צריכים לעמוד בדרישות של RFC 1035 לשמות מארחים תקינים.

  • ‫REGION: האזור שבו יוצרים את המכונות הווירטואליות.

  • ‫COUNT: מספר המכונות הווירטואליות שרוצים ליצור. הערך הזה צריך להיות קטן ממספר המכונות הווירטואליות שמותר להשתמש בהן לפי NAME_PATTERN, או שווה לו. לחלופין, אם משתמשים ב---predefined-names, לא צריך לציין את COUNT, אבל אם מציינים אותו, הוא חייב להיות שווה למספר השמות שסופקו.

  • ‫MIN_COUNT: המספר המינימלי של מכונות וירטואליות שייווצרו. בטבלה הבאה מפורטת התנהגות הבקשה בהתאם להגדרת הדגל:

    ערך תיאור
    לא מוגדר ערך ברירת המחדל הוא COUNT. אם Compute Engine לא יכול ליצור את מספר המכונות הוירטואליות שצוין ב-COUNT, הבקשה תיכשל ולא ייווצרו מכונות וירטואליות.
    1 ‫Compute Engine יוצר כמה שיותר מכונות וירטואליות, עד COUNT.
    יותר מ-1 ופחות מ-COUNT ‫Compute Engine יוצר לפחות MIN_COUNT מכונות וירטואליות, עד למקסימום של COUNT מכונות וירטואליות. אם אי אפשר ליצור MIN_COUNT מכונות וירטואליות, הבקשה נכשלת ולא נוצרות מכונות וירטואליות.
  • ‫LOCATION_POLICY: האזורים שרוצים לכלול או להחריג באזור מסוים. משתמשים ברשימה של צמדי מפתח/ערך, כאשר האזור הוא המפתח והמדיניות היא הערך. הערכים התקינים של המדיניות הם ALLOW (ברירת המחדל) ו-DENY. הנה ערך לדוגמה בשדה הזה:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • ‫TARGET_DISTRIBUTION_SHAPE: פיזור המכונות הווירטואליות באזורים שצוינו. משתמשים בשדה locationPolicy כדי לציין את האזורים. בטבלה הבאה מפורטים הערכים התקינים של השדה הזה:

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

REST

כדי ליצור מכונות וירטואליות עם שמות מארחים בהתאמה אישית בכמות גדולה באזור מסוים, משתמשים בשיטה instances.bulkInsert הבאה:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {"hostname": HOSTNAME_1},
    "PREDEFINED_NAME_2": {"hostname": HOSTNAME_2},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  "locationPolicy": {
    "LOCATION_POLICY"
    },
    "targetShape": "TARGET_DISTRIBUTION_SHAPE"
  ...
}

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

  • ‫PROJECT_ID: מזהה הפרויקט.

  • ‫REGION: האזור שבו יוצרים את המכונות הווירטואליות.

  • ‫NAME_PATTERN: תבנית השם של המכונות הווירטואליות. צריך לציין את הערך הזה או את הערך perInstanceProperties. משתמשים ברצף של תווים מסוג סולמית (#) כדי שמערכת Compute Engine תחליף אותם ברצף של מספרים. לדוגמה, אם משתמשים ב-vm-# בתור תבנית השם, נוצרות מכונות וירטואליות עם שמות כמו vm-1 ו-vm-2, עד למספר המכונות הווירטואליות שצוין על ידי --count, שחייב להיות קטן או שווה למספר המכונות הווירטואליות שאפשר ליצור לפי תבנית השם.

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

  • ‫PREDEFINED_NAME_1, PREDEFINED_NAME_2, ...: רשימה של שמות מוגדרים מראש למכונות הווירטואליות שרוצים ליצור. צריך לציין את השדה הזה או את namePattern. אם משתמשים בדגל הזה ומציינים את COUNT, הערך של COUNT חייב להיות שווה למספר השמות שצוינו.

  • ‫HOSTNAME_1, ‏HOSTNAME_2 וכו': שמות מארחים של דומיינים שמוגדרים במלואם, שאתם רוצים להקצות למכונות הווירטואליות. שמות מארחים בהתאמה אישית חייבים לעמוד בדרישות של RFC 1035 לשמות מארחים תקינים.

    לדוגמה, כדי ליצור שתי מכונות וירטואליות vm-1 ו-vm-2 עם שמות מארחים מותאמים אישית my-host1234.example.com ו-test.example.com בהתאמה, צריך לציין את המאפיין hostname ב-perInstanceProperties באופן הבא:

    {
    ...
    "perInstanceProperties": {
    "vm-1": { "hostname": "my-host1234.example.com" },
    "vm-2": { "hostname": "test.example.com" },
    ...}
    },
    
  • ‫COUNT: מספר המכונות הווירטואליות שרוצים ליצור. הערך הזה צריך להיות קטן ממספר המכונות הווירטואליות שמותר להשתמש בהן לפי NAME_PATTERN, או שווה לו. לחלופין, אם משתמשים ב-perInstanceProperties, לא צריך לציין את COUNT, אבל אם מציינים אותו, הוא צריך להיות שווה למספר השמות שצוינו.

  • ‫MIN_COUNT: המספר המינימלי של מכונות וירטואליות שייווצרו. בטבלה הבאה מפורטת התנהגות הבקשה בהתאם להגדרת הדגל:

    ערך תיאור
    לא מוגדר ערך ברירת המחדל הוא COUNT. אם Compute Engine לא יכול ליצור את מספר המכונות הוירטואליות שצוין ב-COUNT, הבקשה תיכשל ולא ייווצרו מכונות וירטואליות.
    1 ‫Compute Engine יוצר כמה שיותר מכונות וירטואליות, עד COUNT.
    יותר מ-1 ופחות מ-COUNT ‫Compute Engine יוצר לפחות MIN_COUNT מכונות וירטואליות, עד למקסימום של COUNT מכונות וירטואליות. אם אי אפשר ליצור MIN_COUNT מכונות וירטואליות, הבקשה נכשלת ולא נוצרות מכונות וירטואליות.
  • ‫LOCATION_POLICY: האזורים שרוצים לכלול או להחריג באזור מסוים. משתמשים ברשימה של צמדי מפתח/ערך, כאשר האזור הוא המפתח והמדיניות היא הערך. הערכים התקינים של המדיניות הם ALLOW (ברירת המחדל) ו-DENY. הנה ערך לדוגמה בשדה הזה:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • ‫TARGET_DISTRIBUTION_SHAPE: פיזור המכונות הווירטואליות באזורים שצוינו. משתמשים בשדה locationPolicy כדי לציין את האזורים. בטבלה הבאה מפורטים הערכים התקינים של השדה הזה:

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

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

כשיוצרים בקשה לשינוי נתונים, Compute Engine מחזיר operationמשאב שאפשר לדגום כדי לקבל את סטטוס הפעולה. מידע נוסף זמין במאמר בנושא טיפול בתגובות מה-API.

כדי לקבל את הסטטוס של בקשה להוספה בכמות גדולה, שולחים בקשת HTTP GET למשאב operation:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/OPERATION_ID

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

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/operations/OPERATION_ID

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

  • ‫PROJECT_ID: מזהה הפרויקט שבו יוצרים את המכונות הווירטואליות
  • ‫REGION: האזור שבו יוצרים את המכונות הווירטואליות
  • ‫ZONE: האזור שבו יוצרים את המכונות הווירטואליות
  • ‫OPERATION_ID: מזהה הפעולה של ההוספה בכמות גדולה

אובייקט instancesBulkInsertOperationMetadata בתגובה מכיל פרטים על הפעולה לפי אזור בשדה perLocationStatus. לכל אזור שכלול בבקשה ליצירה בכמות גדולה, perLocationStatus מכיל את השדות הבאים:

  • ‫status: הסטטוס הוא אחד מהבאים:
    • ‫CREATING: יצירת המכונה הווירטואלית מתבצעת באזור.
    • ‫ROLLING_BACK: הבקשה נכשלה באזור והיא מבוטלת.
    • ‫DONE: יצירת ה-VM או החזרה למצב הקודם הושלמו בהצלחה באזור.
  • ‫targetVmCount: מספר המכונות הווירטואליות ש-Compute Engine מנסה ליצור באזור. מערכת Compute Engine קובעת את המספר הזה אחרי בדיקות ראשוניות, והוא לא משתנה במהלך הפעולה. כשבודקים את סטטוס הפעולה, השדה הזה תמיד מופיע לכל אזור.
  • ‫createdVmCount: מספר המכונות הווירטואליות שכבר נוצרו באזור. הערך הזה לא חורג מ-targetVmCount באזור נתון.
    • ‫failedToCreateVmCount: מספר המכונות הווירטואליות שלא הצליחו ליצור באזור.
    • ‫deletedVmCount: מספר המכונות הווירטואליות שנמחקו באזור כחלק מהחזרה לאחור של פעולה שנכשלה.

השדה progress בתגובה מייצג את אחוז ההשלמה של הפעולה.

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

בזמן שפעולת ההוספה בכמות גדולה מתבצעת, אמורה להופיע תגובה דומה לזו:

{
  "kind" : "compute#operation",
  "id": "4653028658507445766",
  "name": "operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationType": "bulkInsert",
  "targetLink":  "https://www.googleapis.com/compute/v1/projects/my-project"
  "targetId": 4653028658507445766,
  "status": "RUNNING",
  "progress": 2,
  "user": "example@google.com",
  "insertTime": "2023-04-23T09:57:13.474-07:00",
  "startTime": "2023-04-23T09:57:13.474-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/operations/operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationGroupId": "4653028658507445766",
  "metadata":
    "instances_bulk_insert_operation_metadata": {
      "per_location_status": {
         "zones/us-central1-a": {
           "status": "CREATING",
           "targetVmCount": 50,
           "createdVmCount": 1
         }
      }
    }
}

בדוגמה הזו, מכונה אחת נוצרה בהצלחה והפעולה הושלמה ב-2%.

הפעולה מחזירה את הסטטוס DONE כש-Compute Engine יוצרת בהצלחה לפחות את המספר המינימלי של מכונות וירטואליות שצוין על ידי minCount, או כש-Compute Engine משלימה את הביטול של הבקשה. אחרי שהמכונות הווירטואליות נוצרות בהצלחה, מתקבלת תשובה דומה לזו:

{
  "endTime": "2023-04-23T09:58:13.474-07:00",
  "id": "5053101474378293244",
  "insertTime": "2023-04-23T09:57:13.474-07:00",
  "instancesBulkInsertOperationMetadata": {
    "perLocationStatus": {
      "zones/us-central1-a": {
        "status": "DONE",
        "createdVmCount": 50,
        "targetVmCount": 50
      }
    }
  },
  "kind": "compute#operation",
  "name": "operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationGroupId": "4653028658507445766",
  "operationType": "bulkInsert",
  "progress": 100,
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/operations/operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "startTime": "2023-09-11T16:21:55.629-07:00",
  "status": "DONE",
  "targetId": "625521788110",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/my-project",
  "user": "example@google.com",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a"
}

מידע נוסף מופיע במאמר בנושא אובייקט instancesBulkInsertOperationMetadata.

בדיקת הסטטוס של מכונה וירטואלית אחת

כדי לבדוק את הסטטוס של מכונה וירטואלית יחידה שנוצרה מבקשה ליצירת מכונות וירטואליות בכמות גדולה, משתמשים ב-CLI של gcloud או ב-Compute Engine API.

gcloud

  1. מהתגובה Operation שמוחזרת מהבקשה, מקבלים את הערך של המאפיין operationGroupId.

  2. כדי לחפש בכל הפעולות ובכל האזורים בפרויקט מכונות וירטואליות שמשויכות לבקשה האזורית או המקומית, משתמשים במאפיין operationGroupId כמסנן עם הפקודה gcloud compute operations list:

    gcloud compute operations list \
       --filter=(operationGroupId=OPERATION_GROUP_ID)
    
  3. כדי לקבל את שאר המאפיינים של המכונה הווירטואלית, מבצעים אחת מהפעולות הבאות:

    • ברשימת הפעולות, targetLink מייצג את הנתיב של מכונת ה-VM. כדי לקבל את המאפיינים של המכונה הווירטואלית, משתמשים בפקודה gcloud compute instances describe עם הנתיב הזה כשם של המכונה הווירטואלית:

      gcloud compute instances describe VM_NAME
      
    • משתמשים בפקודה gcloud compute instances list עם מסנן שכולל את שמות המכונות הווירטואליות מתוך רשימת הפעולות:

      gcloud compute instances list VM_NAME \
         --filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      
    • משתמשים בפקודה gcloud compute instances list כדי לקבל את המאפיינים של מכונות וירטואליות מכל האזורים והאזורים, ומסננים לפי תווית ייחודית למופעים או לפי השמות שלהם:

      gcloud compute instances list \
         --filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      

REST

  1. מהתגובה Operation שמוחזרת מהבקשה, מקבלים את הערך של המאפיין operationGroupId.

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

    • אם שלחתם בקשה אזורית, כדי לחפש בכל הפעולות ובכל האזורים בפרויקט, השתמשו ב-method globalOperations.aggregatedList וכללו את המאפיין operationGroupId כמסנן:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/aggregated/operations?filter=(operationGroupId=OPERATION_GROUP_ID)
      
    • אם שלחתם בקשה ברמת האזור, כדי להציג את הפעולות באותו אזור, השתמשו ב-method‏ zoneOperations.get וכללו את המאפיין operationGroupId בגוף הבקשה:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances/bulkInsert
      
      {
      ...
      "operationGroupId":"OPERATION_GROUP_ID"
      ...
      }
      
  3. כדי לקבל את שאר המאפיינים של המכונה הווירטואלית, מבצעים אחת מהפעולות הבאות:

    • ברשימת הפעולות, targetLink מייצג את הנתיב של המכונה הווירטואלית. משתמשים בשיטה instances.get עם הנתיב הזה בתור השם של המכונה הווירטואלית, כדי לקבל את כל המאפיינים של המכונה הווירטואלית:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances/VM_NAME
      
    • משתמשים בinstances.get method עם מסנן שכולל את שמות המכונות הווירטואליות מרשימת הפעולות:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances?filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      
    • אפשר להשתמש בinstances.aggregatedListשיטה כדי לקבל את המאפיינים של מכונות וירטואליות מכל האזורים והאזורים הזמינים, ולסנן לפי תווית שייחודית למופעים או לפי השמות שלהם:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/aggregated/instances?filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      

דוגמאות לפסאודו קוד

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

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

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

  1. מציינים את מספר המכונות הווירטואליות שרוצים ליצור באזור.

    nTarget = 1000
    
  2. מגדירים את האזורים שבהם רוצים לנסות ליצור את המכונות הווירטואליות.

    acceptableRegions = ["us-central1", "us-east1", "us-west1"]
    
  3. חוזרים על הפעולה באזורים השונים ומנסים ליצור את המכונות הווירטואליות בכל אזור עד שהפעולה מצליחה.

    for region in acceptableRegions:
      call bulk API: region=region, location-policy=location-policy, count=nTarget
      if request succeeds and the operation succeeds:
        break
    

יצירת מכונות וירטואליות מסוג מכונה ספציפי בכמות גדולה באזור

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

  1. מציינים את מספר המכונות הווירטואליות שרוצים ליצור ואת האזור שבו רוצים ליצור אותן.

    nTarget = 1000
    region = "us-central1"
    
  2. מציינים את משפחות המכונות שרוצים לנסות ליצור את המכונות הווירטואליות שלהן.

    acceptableMachineFamilies = ["n2","c2","e2","n1"]
    
  3. מבצעים איטרציה על קבוצת סוגי המכונות ומנסים ליצור את המכונות הווירטואליות מסוג המכונה עד שהפעולה מצליחה.

    for family in acceptableMachineFamilies:
      call bulk APIs: region=region, count=nTarget, machineFamily=family
      if request succeeds and the operation succeeds:
        break
    

יצירת יותר מ-5,000 מכונות וירטואליות באזור

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

  1. מציינים את מספר המכונות הווירטואליות שרוצים ליצור, מונה למעקב אחרי המספר הכולל של המכונות הווירטואליות שנוצרו, האזור שבו רוצים ליצור את המכונות הווירטואליות ומשתנה לאחסון האזור שבו Compute Engine יוצר את המכונות הווירטואליות.

    nTarget = 10000
    nCreated = 0
    region = "us-central1"
    targetZone = ""
    
  2. שולחים בקשה ראשונית ליצירת 5,000 מכונות וירטואליות, שומרים את האזור שמוחזר מהבקשה ומעדכנים את מונה מספר המכונות הווירטואליות שנוצרו.

    call bulk API: region=region, count=5000
    targetZone = zone chosen by bulk API
    nCreated += # of VMs created
    
  3. ממשיכים לשלוח בקשות ליצירת עד 5,000 מכונות וירטואליות בכל פעם באזור, עד ש-Compute Engine יוצר את מספר המכונות הווירטואליות שצוין.

    while(nTarget - nCreated > 0):
      call bulk API: zone=targetZone, count=5000
      nCreated += # of VMs created
    

יצירת מכונות וירטואליות בכמות גדולה וצפייה בסטטוס שלהן

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

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

    nTarget = 1000
    targetZone = "us-central-1a"
    names = []
    
  2. יוצרים את השמות עם התבנית למכונות הווירטואליות ומוסיפים את השמות למבנה הנתונים.

    for n in range(0, 1000):
      names.push("instance-%d".format(n))
    
  3. יוצרים את המכונות הווירטואליות ומשתמשים ב-perInstanceProperties כדי לציין את השמות.

    call bulk API(zone=targetZone, count=nTarget, names=perInstanceProperties)
    
  4. כדי לקבל את פרטי המכונות הווירטואליות, משתמשים בשיטה instances.list עם מסנן לשמות של המכונות הווירטואליות שרוצים לקבל את הפרטים שלהן.

    instances.list(filter=(name = "instance-1") OR (name = "instance-2") ...)
    

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

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