יצירת תמונות מכונה

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

במאמר תמונות מכונה מוסבר מתי ואיך משתמשים בתמונות מכונה.

במאמר הזה מוסבר איך ליצור תמונת מכונה ממכונה קיימת.

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

  • אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות. אימות הוא התהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים האלה:

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

    המסוף

    כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים ולממשקי ה-API של Google Cloud , לא צריך להגדיר אימות.

    gcloud

    1. התקינו את ה-CLI של Google Cloud ואז היכנסו ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם. אחרי שנכנסתם לחשבון, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:

      gcloud init
  • הגדרת אזור ותחום כברירת מחדל.
  • REST

    כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.

      התקינו את ה-CLI של Google Cloud ואז היכנסו ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם.

    מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .

מגבלות והגבלות

  • אפשר ליצור קובץ אימג' של מכונה ספציפית עד 6 פעמים בכל 60 דקות.
  • אתם יכולים להגן על קובץ אימג' של מכונה באמצעות Cloud Key Management Service‏ (Cloud KMS) או מפתח הצפנה באספקת הלקוח (CSEK) (הוצא משימוש). מפתח ההצפנה מגן על התוכן של הדיסקים. עם זאת, המטא-נתונים לא מוגנים.
  • אם אתם משתמשים ב-CSEK כדי להגן על קובץ האימג' של המכונה, עותק מלא של כל נתוני הדיסק נשמר במהלך היצירה של קובץ האימג' של המכונה. בכל שאר התרחישים, נתוני הדיסק מאוחסנים בעותקים דיפרנציאליים.
  • אי אפשר ליצור קובצי אימג' של מכונות ממכונות מקור של Compute Engine ש:

    • יש להם דיסקים מצורפים עם קיבולת משולבת של יותר מ-200TiB.
    • לא כוללים דיסקים מצורפים.
    • יש להם אמצעי אחסון מסוג Hyperdisk.
    • להשתמש בכל סוג מכונה של Z4D, ‏ Z4M או Z3, חוץ מ-z3-highmem-192-highlssd-metal.
    • צריך להשתמש במכונה מסוג C3D,‏ H3 או A3.

    במכונות שלא תומכות ביצירת קובצי אימג' של מכונות, אפשר ליצור קובץ אימג' של מערכת ההפעלה מדיסק האתחול של המכונה, כמו שמתואר במאמר יצירת קובצי אימג' בהתאמה אישית.

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

מאפייני המכונה והדיסק לא נתמכים על ידי קובץ האימג' של המכונה

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

  • disks.architecture
  • disks.description
  • disks.labels
  • disks.locked
  • disks.multiWriter
  • disks.onUpdateAction
  • disks.provisionedIops
  • disks.shieldedInstanceInitialState
  • disks.sourceImage
  • disks.sourceImageEncryptionKey
  • disks.sourceInstantSnapshot
  • disks.sourceSnapshot
  • disks.sourceSnapshotEncryptionKey
  • privateIpv6GoogleAccess
  • resourceManagerTags
  • resourcePolicies
  • secure_tag
  • shieldedInstanceConfig

יצירת קובץ אימג' של מכונה ממכונה קיימת

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

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

אפשר ליצור תמונות מכונה באמצעות מסוףGoogle Cloud , Google Cloud CLI או REST.

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

  • שם לתמונת המכונה שרוצים ליצור.
  • השם של מכונת המקור.
  • האזור שבו נמצא המכונה של המקור.
  • תיאור אופציונלי.
  • storageLocation אופציונלי. אם לא מציינים מיקום, מיקום האחסון שמוגדר כברירת מחדל הוא המיקום בכמה אזורים ב-Cloud Storage של מכונת המקור.
  • מפתח הצפנה אופציונלי. אתם יכולים לבחור בין Google-owned and Google-managed encryption key, מפתח של Cloud Key Management Service ‏ (Cloud KMS) או מפתח הצפנה באספקת הלקוח (CSEK)(הוצא משימוש). אם לא מציינים מפתח הצפנה, תמונות המכונה מוצפנות באמצעות Google-owned and Google-managed encryption key.
  • אם אתם רוצים להשתמש בתמונת מכונה בשביל שכפול מכונות וצילום תמונות מצב, הסירו את פרטי מערכת ההפעלה והאפליקציה הייחודיים למכונה לפני שתיצרו את תמונת המכונה ממכונה. לדוגמה, במכונות וירטואליות של Windows, משתמשים ב-GCESysprep כדי להכין את המערכת לשכפול.

המסוף

  1. נכנסים לדף Machine images במסוף Google Cloud .

    כניסה לדף Machine images

  2. לוחצים על Create Machine image.

  3. מציינים שם לתמונת המכונה.

  4. אופציונלי: מוסיפים תיאור.

  5. בוחרים את מכונת ה-VM המקורית.

  6. אופציונלי: מציינים איפה לאחסן את קובץ האימג' של המכונה. בוחרים בין אחסון במספר אזורים לבין אחסון אזורי. מידע נוסף על מיקום זמין במאמר מיקום האחסון של תמונת מכונה.

  7. אופציונלי: בוחרים שיטת הצפנה.

  8. לוחצים על יצירה.

gcloud

משתמשים בפקודה gcloud compute machine-images create כדי ליצור קובץ אימג' של מכונה ממכונה.

gcloud compute machine-images create MACHINE_IMAGE_NAME \
    --source-instance=SOURCE_INSTANCE_NAME

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

  • ‫MACHINE_IMAGE_NAME: השם של תמונת המכונה שרוצים ליצור.
  • ‫SOURCE_INSTANCE_NAME: שם המכונה שממנה רוצים ליצור את קובץ האימג'.

דוגמה

לדוגמה, אפשר להשתמש בפקודה הבאה של gcloud כדי ליצור תמונת מכונה בשם my-machine-image ממכונה של מקור בשם my-instance:

gcloud compute machine-images create my-machine-image  \
    --source-instance=my-instance

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

Created [https://www.googleapis.com/compute/v1/projects/project-12345/global/machineImages/my-machine-image].
NAME               STATUS
my-machine-image   READY

REST

ב-API, יוצרים בקשת POST ל-method‏ machineimages.insert. בגוף הבקשה, כוללים את בקשת ה-POST הבאה:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/machineImages

{
  "name": "MACHINE_IMAGE_NAME",
  "sourceInstance": "SOURCE_INSTANCE_URL"
}

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

  • ‫PROJECT_ID: מזהה הפרויקט.
  • ‫MACHINE_IMAGE_NAME: השם של תמונת המכונה שרוצים ליצור.
  • ‫SOURCE_INSTANCE_URL: כתובת ה-URL המלאה או החלקית של המכונה שממנה רוצים ליצור את קובץ האימג' של המכונה. לדוגמה, אם יש לכם מכונה של מקור בשם my-instance בפרויקט בשם myProject. כתובות ה-URL הבאות תקינות:

    • https://www.googleapis.com/compute/v1/projects/myProject/global/instances/my-instance
    • projects/myProject/global/instances/my-instance
    • global/instances/my-instance

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

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

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

  • הכללת דיסקים ספציפיים שאינם דיסקי אתחול: אתם יכולים ליצור קובץ אימג' של מכונה שמגבה רק את דיסק האתחול ורשימה ספציפית של דיסקים שאינם דיסקי אתחול שאתם מספקים.

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

שיטות מומלצות למכונות Linux

במכונות Linux, מומלץ לפעול לפי השיטות המומלצות הבאות:

  • כשיוצרים תמונת מכונה שלא כוללת דיסקים ספציפיים שאינם דיסקי אתחול, או משמיטה אותם באמצעות רשימת הכללה, צריך לוודא שבקובץ /etc/fstab במכונות המקור של Compute Engine ב-Linux נעשה שימוש באפשרות nofail לדיסקים האלה. כך מונעים כשל בהפעלה של המכונה המשוחזרת של Compute Engine אם חסר דיסק צפוי.

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

הכללה של דיסקים ספציפיים בלבד

כך יוצרים תמונת מכונה מדיסקים ספציפיים בלבד: תמיד צריך לכלול את דיסק האתחול. אי אפשר ליצור תמונת מכונה רק מדיסקים ספציפיים באמצעות מסוף Google Cloud . צריך להשתמש ב-Google Cloud CLI או ב-REST.

Google Cloud CLI

משתמשים בפקודה gcloud beta compute machine-images create כדי ליצור קובץ אימג' של מכונה רק מדיסקים ספציפיים.

gcloud beta compute machine-images create MACHINE_IMAGE_NAME \
    --source-instance=SOURCE_INSTANCE_NAME \
    --source-instance-zone=ZONE \
    --include-disks=BOOT_DISK,DISK_NAME_1,DISK_NAME_2

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

  • ‫MACHINE_IMAGE_NAME: השם של תמונת המכונה שרוצים ליצור.
  • ‫SOURCE_INSTANCE_NAME: השם של מכונת המקור שממנה רוצים ליצור את קובץ האימג'.
  • ‫ZONE: האזור שבו נמצאת מכונת המקור.
  • ‫BOOT_DISK, DISK_NAME_1,DISK_NAME_2: רשימה מופרדת בפסיקים של דיסק האתחול והדיסקים שאינם דיסקי אתחול שמצורפים למכונה המקורית, שרוצים לכלול בתמונת המכונה.

לדוגמה, אתם יכולים להשתמש בפקודה הבאה של gcloud כדי ליצור תמונת מכונה בשם my-gmi-include ממכונה מקורית בשם my-instance שנמצאת ב-us-central1-a, שכוללת רק את data-disk-1 ו-data-disk-2:

gcloud beta compute machine-images create my-gmi-include \
    --source-instance=my-instance \
    --source-instance-zone=us-central1-a \
    --include-disks=boot-disk,data-disk-1,data-disk-2

REST

ב-API, יוצרים בקשת POST ל-method‏ machineimages.insert. בגוף הבקשה, כוללים את בקשת ה-POST הבאה:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/machineImages

{
  "name": "MACHINE_IMAGE_NAME",
  "sourceInstance": "SOURCE_INSTANCE_URL",
  "params": {
    "includedDisks": ["BOOT_DISK", "DISK_NAME_1", "DISK_NAME_2"]
  }
}

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

  • ‫PROJECT_ID: מזהה הפרויקט שמכיל את קובץ האימג' של המכונה, לדוגמה my-project.
  • ‫MACHINE_IMAGE_NAME: השם של תמונת המכונה שרוצים ליצור.
  • ‫SOURCE_INSTANCE_URL: כתובת ה-URL המלאה או החלקית של המכונה שממנה רוצים ליצור את קובץ האימג' של המכונה.
  • ‫BOOT_DISK, DISK_NAME_1, DISK_NAME_2: רשימה של דיסק האתחול והדיסקים שאינם לאתחול שמחוברים למכונה המקורית, שרוצים לכלול בתמונת המכונה.

יצירת תמונת מכונה והחרגת דיסקים ספציפיים (גרסת טרום-השקה (Preview))

כדי ליצור תמונת מכונה ולהחריג דיסקים ספציפיים מהגיבוי, פועלים לפי ההוראות הבאות. אי אפשר להחריג את דיסק האתחול. אי אפשר ליצור תמונת מכונה ולהחריג דיסקים ספציפיים באמצעות מסוף Google Cloud . אפשר להשתמש ב-Google Cloud CLI או ב-REST.

gcloud

משתמשים בפקודה gcloud beta compute machine-images create כדי ליצור תמונת מכונה ולהחריג דיסקים ספציפיים.

gcloud beta compute machine-images create MACHINE_IMAGE_NAME \
    --source-instance=SOURCE_INSTANCE_NAME \
    --source-instance-zone=ZONE \
    --exclude-disks=DISK_NAME_1,DISK_NAME_2

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

  • ‫MACHINE_IMAGE_NAME: השם של תמונת המכונה שרוצים ליצור.
  • ‫SOURCE_INSTANCE_NAME: שם המכונה שממנה רוצים ליצור את קובץ האימג'.
  • ‫ZONE: האזור שבו נמצאת מכונת המקור.
  • ‫DISK_NAME_1,DISK_NAME_2: רשימה מופרדת בפסיקים של הדיסקים שאינם דיסקי אתחול שמחוברים למכונה המקורית, שרוצים להחריג מתמונת המכונה.

דוגמה

לדוגמה, אפשר להשתמש בפקודה הבאה של gcloud כדי ליצור תמונת מכונה בשם my-gmi-exclude ממכונה של מקור בשם my-instance שנמצאת ב-us-central1-a, לא כולל temp-disk-1 ו-scratch-disk:

 gcloud beta compute machine-images create my-gmi-exclude \
    --source-instance=my-instance \
    --source-instance-zone=us-central1-a \
    --exclude-disks=temp-disk-1,scratch-disk

REST

ב-API, יוצרים בקשת POST ל-method‏ machineimages.insert. בגוף הבקשה, כוללים את בקשת ה-POST הבאה:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/machineImages

{
  "name": "MACHINE_IMAGE_NAME",
  "sourceInstance": "SOURCE_INSTANCE_URL",
  "params": {
    "excludedDisks": ["DISK_NAME_1", "DISK_NAME_2"]
  }
}

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

  • ‫PROJECT_ID: מזהה הפרויקט שמכיל את תמונת המכונה.
  • ‫MACHINE_IMAGE_NAME: השם של תמונת המכונה שרוצים ליצור.
  • ‫SOURCE_INSTANCE_URL: כתובת URL מלאה או חלקית של המכונה שממנה רוצים ליצור את קובץ האימג' של המכונה.
  • ‫DISK_NAME_1, DISK_NAME_2: רשימה של הדיסקים שאינם דיסקי אתחול שמצורפים למכונה המקורית, שרוצים להחריג מתמונת המכונה.

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

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

  • התחברות לקונסולה הטורית: מפעילים את הקונסולה הטורית האינטראקטיבית ומתחברים אליה במכונה של Compute Engine שלא ניתן להפעיל. נכנסים כדי לפתור בעיות ולערוך את הקובץ /etc/fstab ישירות כדי להסיר את רשומת הדיסק החסרה או להוסיף את האפשרות nofail.

  • החלפת דיסק: אם מכונה של Compute Engine לא מצליחה לבצע אתחול כי דיסק הוחרג מתמונת המכונה אבל עדיין מופיע ב-/etc/fstab בלי האפשרות nofail, צריך לפעול לפי ההוראות הבאות כדי לתקן את ההגדרה באמצעות Google Cloud CLI.

    1. עוצרים את המכונה של Compute Engine שלא ניתנת להפעלה באמצעות הפקודה gcloud compute instances stop:

      gcloud compute instances stop UNBOOTABLE_INSTANCE_NAME \
       --zone=ZONE
      

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

      • ‫UNBOOTABLE_INSTANCE_NAME: השם של המכונה ב-Compute Engine שלא ניתן להפעיל.
      • ‫ZONE: האזור שבו נמצאות המכונות של Compute Engine.
    2. מנתקים את דיסק האתחול באמצעות הפקודה gcloud compute instances detach-disk:

      gcloud compute instances detach-disk UNBOOTABLE_INSTANCE_NAME \
       --disk=BOOT_DISK_NAME \
       --zone=ZONE
      

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

      • ‫UNBOOTABLE_INSTANCE_NAME: השם של המכונה ב-Compute Engine שלא ניתן להפעיל.
      • ‫BOOT_DISK_NAME: השם של דיסק האתחול שמחובר למכונה של Compute Engine שלא ניתן להפעיל.
      • ‫ZONE: האזור שבו נמצאות המכונות של Compute Engine.
    3. מצרפים את הדיסק כדיסק משני למכונה אחרת של Compute Engine שפועלת, באמצעות הפקודה gcloud compute instances attach-disk:

      gcloud compute instances attach-disk SECONDARY_INSTANCE_NAME \
       --disk=BOOT_DISK_NAME \
       --zone=ZONE
      

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

      • ‫SECONDARY_INSTANCE_NAME: השם של המכונה המשנית הפעילה של Compute Engine שמשמשת לתיקון הדיסק.
      • ‫BOOT_DISK_NAME: השם של דיסק האתחול שמחובר למכונה של Compute Engine שלא ניתן להפעיל.
      • ‫ZONE: האזור שבו נמצאות המכונות של Compute Engine.
    4. טוענים את הדיסק ועורכים את הקובץ /etc/fstab שלו כדי לתקן את הרשומה הבעייתית, באמצעות רצף ההוראות הבא:

      1. מתחברים למכונה המשנית של Compute Engine באמצעות SSH:

        gcloud compute ssh SECONDARY_INSTANCE_NAME \
        --zone=ZONE
        

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

        • ‫SECONDARY_INSTANCE_NAME: השם של המכונה המשנית הפעילה של Compute Engine שמשמשת לתיקון הדיסק.
        • ‫ZONE: האזור שבו נמצאות המכונות של Compute Engine.
      2. מזהים את הדיסק המצורף, בדרך כלל /dev/sdb או משהו דומה, באמצעות lsblk:

        lsblk
        
      3. יוצרים נקודת טעינה זמנית:

        sudo mkdir /mnt/repair
        
      4. טוענים את מחיצת הבסיס:

        sudo mount /dev/DEVICE_PARTITION /mnt/repair
        

        מחליפים את DEVICE_PARTITION בשם המכשיר ובמספר המחיצה של הדיסק המשני שמחובר למכונה המשנית של Compute Engine (לדוגמה, sdb1).

      5. פותחים את הקובץ fstab:

        sudo nano /mnt/repair/etc/fstab
        
      6. מוסיפים את האפשרות nofail לרשומה של הדיסק החסר, או מסמנים את השורה כהערה על ידי הוספת # בתחילת השורה.

      7. שומרים ויוצאים.

      8. מנתקים את הדיסק:

        sudo umount /mnt/repair
        
    5. מנתקים את הדיסק מהמכונה המשנית של Compute Engine באמצעות הפקודה gcloud compute instances detach-disk:

      gcloud compute instances detach-disk SECONDARY_INSTANCE_NAME \
       --disk=BOOT_DISK_NAME \
       --zone=ZONE
      

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

      • ‫SECONDARY_INSTANCE_NAME: השם של המכונה המשנית הפעילה של Compute Engine שמשמשת לתיקון הדיסק.
      • ‫BOOT_DISK_NAME: השם של דיסק האתחול שמחובר למכונה של Compute Engine שלא ניתן להפעיל.
      • ‫ZONE: האזור שבו נמצאות המכונות של Compute Engine.
    6. מחברים מחדש את הדיסק כדיסק האתחול למכונה המקורית של Compute Engine באמצעות הפקודה gcloud compute instances attach-disk:

      gcloud compute instances attach-disk UNBOOTABLE_INSTANCE_NAME \
       --disk=BOOT_DISK_NAME \
       --boot \
       --zone=ZONE
      

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

      • ‫UNBOOTABLE_INSTANCE_NAME: השם של המכונה ב-Compute Engine שלא ניתן להפעיל.
      • ‫BOOT_DISK_NAME: השם של דיסק האתחול שמחובר למכונה של Compute Engine שלא ניתן להפעיל.
      • ‫ZONE: האזור שבו נמצאות המכונות של Compute Engine.
    7. מפעילים את המכונה המתוקנת של Compute Engine:

      gcloud compute instances start UNBOOTABLE_INSTANCE_NAME \
       --zone=ZONE
      

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

      • ‫UNBOOTABLE_INSTANCE_NAME: השם של המכונה ב-Compute Engine שלא ניתן להפעיל.
      • ‫ZONE: האזור שבו נמצאות המכונות של Compute Engine.

מה השלב הבא?