בדף הזה מוסבר איך ליצור ולהשתמש במכונה וירטואלית זמנית (VM). מכונות וירטואליות שניתן להפסיק זמינות בהנחה של עד 91% מהמחיר שמוגדר כברירת מחדל למכונות וירטואליות רגילות. עם זאת, יכול להיות שמערכת Compute Engine תפסיק (תבצע קדימה) את מכונות ה-VM האלה אם היא תצטרך לשחרר את המשאבים האלה כדי לבצע משימות אחרות. מכונות וירטואליות שניתנות להפסקת פעולה תמיד מפסיקות לפעול אחרי 24 שעות. מומלץ להשתמש במכונות וירטואליות שניתן להפסיק רק באפליקציות עמידות בכשלים שיכולות לעמוד בהפסקת פעולה של מכונות וירטואליות. לפני שיוצרים מכונה וירטואלית (VM) זמנית, צריך לוודא שהאפליקציה יכולה להתמודד עם הפסקות זמניות. כדי להבין את הסיכונים והערך של מכונות וירטואליות זמניות, כדאי לקרוא את התיעוד בנושא מכונות וירטואליות זמניות.
לפני שמתחילים
- קוראים את מאמר העזרה בנושא מכונות וירטואליות זמניות שניתנות להפסקה.
-
אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות.
אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:
צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:
המסוף
כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים Google Cloud ולממשקי ה-API, לא צריך להגדיר אימות.
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) שניתנת להפסקת פעולה באזור הזה, כל המכונות הווירטואליות שניתנות להפסקת פעולה ייכללו במכסה הזו, וכל המכונות הווירטואליות הרגילות ימשיכו להיכלל במכסת המעבד הרגילה.
באזורים שבהם אין לכם מכסת CPU עם אפשרות קדימה, אתם יכולים להשתמש במכסת CPU רגילה כדי להפעיל מכונות וירטואליות עם אפשרות קדימה. כמו כן, נדרשת מכסת כתובות IP ומכסת נפח אחסון מספיקות, כרגיל. המכסה של מעבדי preemptible לא מוצגת ב-CLI של gcloud או בדפי המכסות במסוףGoogle Cloud , אלא אם Compute Engine העניק את המכסה.
מידע נוסף על מכסות זמין בדף מכסות משאבים.
הפעלה של מכונה וירטואלית שנפסקה
בדומה לכל מכונה וירטואלית אחרת, אם מכונה וירטואלית עם אפשרות קדימה נפסקה או נדחקה, אפשר להפעיל אותה שוב ולהחזיר אותה למצב RUNNING. הפעלה של VM זמני מאפסת את מונה 24 השעות, אבל מכיוון שהוא עדיין VM זמני, Compute Engine יכול להפסיק את הפעולה שלו לפני שיחלפו 24 שעות. אי אפשר להמיר מכונה וירטואלית שניתנת להפסקת פעולה למכונה וירטואלית רגילה בזמן שהיא פועלת.
אם Compute Engine מפסיק VM זמני בקבוצת מופעי מכונה מנוהלים (MIG) עם התאמה אוטומטית לעומס או באשכול Google Kubernetes Engine, הקבוצה מפעילה מחדש את המכונה הווירטואלית כשהמשאבים הופכים שוב לזמינים.
טיפול בהקדמה באמצעות סקריפט כיבוי
כש-Compute Engine מבצעת דחיקה של מכונת VM, אפשר להשתמש בסקריפט כיבוי כדי לנסות לבצע פעולות ניקוי לפני הדחיקה של מכונת ה-VM. לדוגמה, אתם יכולים להפסיק תהליך שפועל בצורה מסודרת ולהעתיק קובץ של נקודת ביקורת ל-Cloud Storage. חשוב לציין שאורך התקופה המקסימלית של ההשבתה קצר יותר בהודעה על הפסקת פעולה מאשר בהשבתה שיזם המשתמש. מידע נוסף על תקופת ההשבתה של הודעת קדימות זמין במאמר תהליך הקדימות במסמכי התיעוד התיאורטיים.
בהמשך מופיע סקריפט כיבוי שאפשר להוסיף למכונה וירטואלית (VM) שניתנת להפסקת פעולה או למכונה וירטואלית חדשה שניתנת להפסקת פעולה כשיוצרים אותה. הסקריפט הזה פועל כשהמכונה הווירטואלית מתחילה להיסגר, לפני שהפקודה הרגילה 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. הוראות ליצירת מכונה וירטואלית עם ההיקפים המתאימים מופיעות במסמכי האימות.
יש לכם קטגוריה של Cloud Storage קיימת והרשאה לכתוב בה.
זיהוי מכונות וירטואליות שניתנות להפסקת פעולה
כדי לבדוק אם מכונה וירטואלית היא VM זמני, פועלים לפי השלבים לזיהוי מודל ההקצאה ופעולת הסיום של מכונה וירטואלית.
איך קובעים אם מכונה וירטואלית הופסקה לפני הזמן
כדי לבדוק אם מכונה וירטואלית נדחקה, אפשר להשתמש ב-Google Cloud console, ב-ה-CLI של gcloud או ב-API.
המסוף
כדי לבדוק אם מכונה וירטואלית נדחקה, אפשר לבדוק את יומני הפעילות של המערכת.
נכנסים לדף Logs במסוף Google Cloud .
בוחרים פרויקט ולוחצים על המשך.
מוסיפים
compute.instances.preemptedלשדה סינון לפי תווית או חיפוש טקסט.אופציונלי, אפשר גם להזין שם של מכונה וירטואלית אם רוצים לראות פעולות של קדימות למכונה וירטואלית ספציפית.
מקישים על Enter כדי להחיל את המסננים שצוינו. במסוף Google Cloud מתעדכנת רשימת היומנים ומוצגות רק הפעולות שבהן בוצעה קדימה למכונה וירטואלית.
בוחרים פעולה ברשימה כדי לראות פרטים על מכונת ה-VM שנשללה ממנה זכות הקדימה.
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". כדי לראות פעולות של קדימות ל-VM ספציפי, מוסיפים את הפרמטר 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.
אם רוצים להשתמש בכתובת ה-URL הזו מחוץ לסקריפט של כיבוי, אפשר להוסיף את המחרוזת ?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.