בדף הזה מוסבר איך ליצור ולהשתמש במכונה וירטואלית זמנית (VM). מכונות Preemptible VM זמינות בהנחה של עד 91% מהמחיר שמוגדר כברירת מחדל למכונות VM רגילות. עם זאת, יכול להיות ש-Compute Engine יפסיק (יבצע קדימה) את מכונות ה-VM האלה אם הוא יצטרך להחזיר את המשאבים האלה לשימוש במשימות אחרות. מכונות Preemptible VM תמיד מפסיקות לפעול אחרי 24 שעות. מומלץ להשתמש במכונות וירטואליות זמניות רק באפליקציות עמידות בכשלים שיכולות לעמוד בהפסקה זמנית של מכונה וירטואלית. לפני שיוצרים מכונה וירטואלית (VM) זמנית, צריך לוודא שהאפליקציה יכולה להתמודד עם הפסקות זמניות. כדי להבין את הסיכונים והערך של מכונות וירטואליות זמניות, כדאי לקרוא את התיעוד בנושא מכונות וירטואליות זמניות.
לפני שמתחילים
- קוראים את התיעוד בנושא מופעים זמניים של מכונות וירטואליות.
-
אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות.
אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:
צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:
המסוף
כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים ולממשקי ה-API, לא צריך להגדיר אימות. Google Cloud
gcloud
-
התקינו את ה-CLI של Google Cloud. אחר כך, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:
gcloud initאם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
- הגדרת אזור ותחום כברירת מחדל
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
אם אתם משתמשים במעטפת מקומית, אתם צריכים ליצור פרטי כניסה לאימות מקומי עבור חשבון המשתמש:
gcloud auth application-default login
אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.
אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
אם אתם משתמשים במעטפת מקומית, אתם צריכים ליצור פרטי כניסה לאימות מקומי עבור חשבון המשתמש:
gcloud auth application-default login
אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.
אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
אם אתם משתמשים במעטפת מקומית, אתם צריכים ליצור פרטי כניסה לאימות מקומי עבור חשבון המשתמש:
gcloud auth application-default login
אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.
אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
אם אתם משתמשים במעטפת מקומית, אתם צריכים ליצור פרטי כניסה לאימות מקומי עבור חשבון המשתמש:
gcloud auth application-default login
אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.
אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
המשך
כדי להשתמש בדוגמאות של Go שבדף הזה בסביבת פיתוח מקומית, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.
מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Java
כדי להשתמש בדוגמאות של Java שבדף הזה בסביבת פיתוח מקומית, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.
מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Node.js
כדי להשתמש בדוגמאות של Node.js שבדף הזה בסביבת פיתוח מקומית, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.
מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Python
כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של Python שבדף הזה, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.
מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
REST
כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.
התקינו את ה-CLI של Google Cloud.
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .
יצירת VM זמני
יוצרים VM זמני באמצעות ה-CLI של gcloud או Compute Engine API. כדי להשתמש במסוףGoogle Cloud , צריך ליצור VM במודל Spot במקום זאת.
gcloud
כדי להשתמש ב-gcloud compute, מריצים את אותה פקודה instances create שבה משתמשים כדי ליצור מכונה וירטואלית רגילה, אבל מוסיפים את הדגל --preemptible.
gcloud compute instances create VM_NAME --preemptible
כאשר VM_NAME הוא השם של המכונה הווירטואלית.
המשך
Java
Node.js
Python
REST
ב-API, יוצרים בקשה רגילה ליצירת מכונה וירטואלית, אבל כוללים את המאפיין preemptible בקטע scheduling ומגדירים אותו לערך true. לדוגמה:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
'machineType': 'zones/ZONE/machineTypes/MACHINE_TYPE',
'name': 'INSTANCE_NAME',
'scheduling':
{
'preemptible': true
},
...
}
מכסות של מעבדים (CPU) שניתנים להפסקה
כדי להשתמש במכונות וירטואליות זמניות, צריך מכסות CPU זמינות, כמו במכונות וירטואליות רגילות. כדי למנוע ממכונות וירטואליות שניתן לקטוע את הפעולה שלהן לצרוך את מכסות ה-CPU של המכונות הווירטואליות הרגילות, אפשר לבקש מכסה מיוחדת של 'CPU שניתן לקטוע את הפעולה שלו'. אחרי ש-Compute Engine יאשר את מכסת המעבדים הווירטואליים שניתנים להפסקת פעולה באותו אזור, כל המכונות הווירטואליות שניתנות להפסקת פעולה ייכללו במכסה הזו, וכל המכונות הווירטואליות הרגילות ימשיכו להיכלל במכסת המעבדים הווירטואליים הרגילה.
באזורים שבהם אין לכם מכסת CPU של מכונות preemptible VM, אתם יכולים להשתמש במכסת CPU רגילה כדי להפעיל מכונות preemptible VM. כמו כן, תצטרכו מכסת כתובות IP ומכסת נפח אחסון מספיקות, כרגיל. מכסת CPU שניתן להפסיק לא מוצגת ב-CLI של gcloud או בדפי המכסות במסוףGoogle Cloud אלא אם Compute Engine העניק את המכסה.
מידע נוסף על מכסות זמין בדף מכסות משאבים.
הפעלה של מכונה וירטואלית (VM) שהופסקה לפני הזמן
בדומה לכל מכונה וירטואלית אחרת, אם מכונה וירטואלית עם אפשרות קדימה נפסקה או נדחקה, אפשר להפעיל אותה מחדש ולהחזיר אותה למצב RUNNING. הפעלה של VM זמני מאפסת את מונה 24 השעות, אבל מכיוון שהוא עדיין VM זמני, מערכת Compute Engine יכולה להפסיק אותו לפני שיחלפו 24 שעות. אי אפשר להמיר מכונה וירטואלית שניתנת להפסקת פעולה למכונה וירטואלית רגילה בזמן שהיא פועלת.
אם Compute Engine מפסיק VM זמני בקבוצת מופעי מכונה מנוהלים (MIG) עם התאמה אוטומטית לעומס או באשכול Google Kubernetes Engine, הקבוצה מפעילה מחדש את המכונה הווירטואלית כשהמשאבים הופכים לזמינים שוב.
טיפול בהפקעה באמצעות סקריפט כיבוי
כש-Compute Engine מבצעת דחיקה של מכונת VM, אפשר להשתמש בסקריפט כיבוי כדי לנסות לבצע פעולות ניקוי לפני הדחיקה של מכונת ה-VM. לדוגמה, אתם יכולים להפסיק תהליך שפועל בצורה מסודרת ולהעתיק קובץ של נקודת ביקורת ל-Cloud Storage. חשוב לציין שאורך התקופה המקסימלית של ההשבתה קצר יותר בהודעה על הקצאה מראש מאשר בהשבתה שיזם המשתמש. מידע נוסף על תקופת ההשבתה של הודעת קדימות מופיע במאמר תהליך הקדימות במסמכי התיעוד התיאורטיים.
בהמשך מופיע סקריפט כיבוי שאפשר להוסיף למכונה וירטואלית שניתנת להפסקת פעולה או למכונה וירטואלית חדשה שניתנת להפסקת פעולה כשיוצרים אותה. הסקריפט הזה
פועל כשהמכונה הווירטואלית מתחילה להיסגר, לפני שהפקודה הרגילה kill של מערכת ההפעלה מפסיקה את כל התהליכים שנותרו. אחרי שהסקריפט מפסיק את התוכנית שנבחרה בצורה מסודרת, הוא מעלה במקביל קובץ של נקודת ביקורת לקטגוריה של Cloud Storage.
#!/bin/bash
MY_PROGRAM="PROGRAM_NAME" # For example, "apache2" or "nginx"
MY_USER="LOCAL_USERNAME"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
BUCKET_NAME="BUCKET_NAME" # For example, "my-checkpoint-files" (without gs://)
echo "Shutting down! Seeing if ${MY_PROGRAM} is running."
# Find the newest copy of $MY_PROGRAM
PID="$(pgrep -n "$MY_PROGRAM")"
if [[ "$?" -ne 0 ]]; then
echo "${MY_PROGRAM} not running, shutting down immediately."
exit 0
fi
echo "Sending SIGINT to $PID"
kill -2 "$PID"
# Portable waitpid equivalent
while kill -0 "$PID"; do
sleep 1
done
echo "$PID is done, copying ${CHECKPOINT} to gs://${BUCKET_NAME} as ${MY_USER}"
su "${MY_USER}" -c "gcloud storage cp $CHECKPOINT gs://${BUCKET_NAME}/"
echo "Done uploading, shutting down."
כדי להוסיף את הסקריפט הזה למכונה וירטואלית, צריך להגדיר את הסקריפט כך שיפעל עם אפליקציה במכונה הווירטואלית ולהוסיף אותו למטא-נתונים של המכונה הווירטואלית.
- מעתיקים או מורידים את סקריפט הכיבוי לתחנת העבודה המקומית.
- פותחים את הקובץ לעריכה ומשנים את המשתנים הבאים:
-
PROGRAM_NAMEהוא השם של התהליך או התוכנית שרוצים לסגור. לדוגמה,apache2אוnginx. -
LOCAL_USERNAMEהוא שם המשתמש שדרכו אתם מחוברים למכונה הווירטואלית. -
BUCKET_NAMEהוא השם של קטגוריית Cloud Storage שבה רוצים לשמור את קובץ נקודת הבדיקה של התוכנית. שימו לב שבמקרה הזה שם הקטגוריה לא מתחיל ב-gs://.
-
- שומרים את השינויים.
- מוסיפים את סקריפט הכיבוי למכונה וירטואלית חדשה או למכונה וירטואלית קיימת.
הסקריפט הזה יוצא מנקודת הנחה לגבי הדברים הבאים:
מכונת ה-VM נוצרה עם גישת קריאה/כתיבה לפחות ל-Cloud Storage. הוראות ליצירת מכונת VM עם ההיקפים המתאימים מופיעות במסמכי התיעוד בנושא אימות.
יש לכם קטגוריה של Cloud Storage קיימת והרשאה לכתוב בה.
זיהוי מכונות וירטואליות זמניות
כדי לבדוק אם מכונה וירטואלית היא VM זמני, פועלים לפי השלבים לזיהוי מודל ההקצאה ופעולת הסיום של מכונה וירטואלית.
איך בודקים אם מכונה וירטואלית הופסקה לפני הזמן
כדי לבדוק אם מכונה וירטואלית נדחקה, אפשר להשתמש ב-Google Cloud console, ב-ה-CLI של gcloud או ב-API.
המסוף
כדי לבדוק אם מכונה וירטואלית נדחקה, אפשר לעיין ביומני הפעילות של המערכת.
נכנסים לדף Logs במסוף Google Cloud .
בוחרים פרויקט ולוחצים על המשך.
מוסיפים
compute.instances.preemptedלשדה סינון לפי תווית או חיפוש טקסט.אופציונלי, אפשר גם להזין שם של מכונה וירטואלית אם רוצים לראות פעולות של קדימות למכונה וירטואלית ספציפית.
מקישים על Enter כדי להחיל את המסננים שצוינו. במסוף Google Cloud מתעדכנת רשימת היומנים ומוצגות רק הפעולות שבהן בוצעה קדימה למכונה וירטואלית.
בוחרים פעולה ברשימה כדי לראות פרטים על המכונה הווירטואלית שנפסקה.
gcloud
משתמשים בפקודה gcloud compute operations list עם הפרמטר filter כדי לקבל רשימה של אירועי קדימות בפרויקט.
gcloud compute operations list \
--filter="operationType=compute.instances.preempted"
אפשר להשתמש בפרמטר filter כדי לצמצם עוד יותר את היקף התוצאות. לדוגמה, כדי לראות אירועי הפסקה זמנית רק למכונות וירטואליות בקבוצת מופעי מכונה מנוהלים:
gcloud compute operations list \
--filter="operationType=compute.instances.preempted AND targetLink:instances/BASE_VM_NAME"
gcloud מחזירה תשובה שדומה לזו:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP systemevent-yyyyyyyy compute.instances.preempted us-central1-f/instances/example-vm-yyy 200 DONE 2015-04-02T12:12:10.881-07:00
סוג הפעולה compute.instances.preempted מציין שהמכונה הווירטואלית נדחקה. אפשר להשתמש בפקודה operations describe כדי לקבל מידע נוסף על פעולת קדימות ספציפית.
gcloud compute operations describe \
systemevent-yyyyyyyy
gcloud מחזירה תשובה שדומה לזו:
... operationType: compute.instances.preempted progress: 100 selfLink: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-f/operations/systemevent-yyyyyyyy startTime: '2015-04-02T12:12:10.881-07:00' status: DONE statusMessage: Instance was preempted. ...
REST
כדי לקבל רשימה של פעולות מערכת מהזמן האחרון, שולחים בקשת GET ל-URI של פעולות באזור.
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations
התגובה מכילה רשימה של פעולות מהזמן האחרון.
{
"kind": "compute#operation",
"id": "15041793718812375371",
"name": "systemevent-yyyyyyyy",
"zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-f",
"operationType": "compute.instances.preempted",
"targetLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-f/instances/EXAMPLE_VM",
"targetId": "12820389800990687210",
"status": "DONE",
"statusMessage": "Instance was preempted.",
...
}כדי להגדיר את היקף התגובה כך שיוצגו רק פעולות של קדימות, אפשר להוסיף מסנן לבקשת ה-API:
operationType="compute.instances.preempted". כדי לראות פעולות של קדימות למכונה וירטואלית ספציפית, מוסיפים את הפרמטר targetLink למסנן:
operationType="compute.instances.preempted" AND
targetLink="https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME".
אפשרות אחרת היא לבדוק אם מכונה וירטואלית נדחקה מתוך המכונה הווירטואלית עצמה. האפשרות הזו שימושית אם רוצים לטפל בסגירה שמתרחשת בגלל הפקעה של Compute Engine באופן שונה מסגירה רגילה בסקריפט סגירה. כדי לעשות זאת, בודקים את הערך preempted במטא-הנתונים של ברירת המחדל של המכונה הווירטואלית בשרת המטא-נתונים.
לדוגמה, אפשר להשתמש ב-curl מתוך המכונה הווירטואלית כדי לקבל את הערך של preempted:
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google"
TRUE
אם הערך הוא TRUE, המכונה הווירטואלית נדחקה על ידי Compute Engine, אחרת הערך הוא FALSE.
אם רוצים להשתמש בזה מחוץ לסקריפט כיבוי, אפשר להוסיף את המחרוזת ?wait_for_change=true לכתובת ה-URL. הפעולה הזו מבצעת בקשת HTTP GET תלויה שמחזירה נתונים רק כשהמטא-נתונים השתנו והמכונה הווירטואלית נדחקה.
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google"
TRUE
בדיקת הגדרות הקדימות
אתם יכולים להריץ סימולציות של אירועי תחזוקה במכונות הווירטואליות כדי לכפות עליהן את הפסקת הפעולה. אתם יכולים להשתמש בתכונה הזו כדי לבדוק איך האפליקציות שלכם מטפלות במכונות וירטואליות שניתנות להפסקת פעולה. במאמר בדיקת מדיניות הזמינות מוסבר איך לבדוק אירועי תחזוקה במכונות הווירטואליות.
אפשר גם לדמות את תהליך הדחיקה של מכונה וירטואלית על ידי הפסקת המכונה הווירטואלית. אפשר להשתמש בשיטה הזו במקום לדמות אירוע תחזוקה, והיא לא כפופה למגבלות מכסת השימוש.
שיטות מומלצות
ריכזנו כאן כמה שיטות מומלצות שיעזרו לכם להפיק את המקסימום ממופעי מכונות וירטואליות שניתן להפסיק.
שימוש ב-API של מופעים בכמות גדולה
במקום ליצור מכונות וירטואליות בודדות, אפשר להשתמש ב-API ליצירת מכונות בכמות גדולה.
בחירת צורות קטנות יותר של מכונות
המשאבים של מכונות וירטואליות שניתן להפסיק מגיעים מקיבולת עודפת ומגיבוי. Google Cloud
לרוב קל יותר לקבל קיבולת עבור סוגי מכונות קטנים יותר, כלומר סוגי מכונות עם פחות משאבים כמו vCPU וזיכרון. יכול להיות שתמצאו יותר קיבולת למכונות וירטואליות שניתנות להפסקה אם תבחרו סוג מכונה בהתאמה אישית שהוא קטן יותר, אבל סביר יותר שתמצאו קיבולת אם תבחרו סוג מכונה מוגדר מראש שהוא קטן יותר. לדוגמה, בהשוואה לקיבולת של מכונה עם קונפיגורציה מוגדרת (predefined) n2-standard-32, סביר יותר שתהיה קיבולת לסוג המכונה n2-custom-24-96 שמוגדר בהתאמה אישית, אבל סביר עוד יותר שתהיה קיבולת למכונה עם קונפיגורציה מוגדרת (predefined) n2-standard-16.
הפעלת אשכולות גדולים של מכונות וירטואליות שניתן לקטוע את הפעולה שלהן בשעות שבהן העומס נמוך
העומס על Google Cloud מרכזי הנתונים משתנה בהתאם למיקום ולשעה ביום, אבל בדרך כלל הוא הכי נמוך בלילות ובסופי שבוע. לכן, הלילות וסופי השבוע הם הזמנים הכי טובים להפעלת אשכולות גדולים של VM זמני.
תכנון האפליקציות כך שיהיו עמידות בפני כשלים ושיבושים
חשוב להיות מוכנים לעובדה שיש שינויים בדפוסי הקדימות בנקודות זמן שונות. לדוגמה, אם יש הפסקת חשמל חלקית באזור מסוים, יכול להיות שמספר גדול של מכונות וירטואליות זמניות יופסקו כדי לפנות מקום למכונות וירטואליות רגילות שצריך להעביר כחלק מהשחזור. בחלון הזמן הקצר הזה, שיעור הקדימות ייראה שונה מאוד ממה שהוא בדרך כלל. אם האפליקציה שלכם מניחה ששיבושים תמיד מתבצעים בקבוצות קטנות, יכול להיות שלא תהיו מוכנים לאירוע כזה. כדי לבדוק את התנהגות האפליקציה במהלך אירוע של קדימות, אפשר לעצור את המכונה הווירטואלית.
ניסיון חוזר ליצירת מכונות וירטואליות שהופסקו לפני הזמן
אם המכונה הווירטואלית שלכם נדחקה, נסו ליצור מכונות וירטואליות חדשות שניתנות לדחיקה פעם או פעמיים לפני שתחזרו למכונות וירטואליות רגילות. בהתאם לדרישות שלכם, כדאי לשלב בין מכונות וירטואליות רגילות לבין מכונות וירטואליות שניתנות להפסקת פעולה באשכולות, כדי להבטיח שהעבודה תתבצע בקצב מתאים.
שימוש בסקריפטים של כיבוי
אפשר לנהל את ההודעות על כיבוי והקצאה מראש באמצעות סקריפט כיבוי שיכול לשמור את ההתקדמות של עבודה מסוימת, כך שהיא תוכל להמשיך מהמקום שבו היא הפסיקה, במקום להתחיל מחדש.
מה השלב הבא?
- קוראים את התיעוד בנושא מופעים זמניים שניתנים להפסקה של מכונות וירטואליות.
- מידע נוסף על סקריפטים של כיבוי
- מתחברים ל-VM.