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

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

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

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

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

gcloud compute instance-templates create example-template-with-startup \
    --image-family debian-9 \
    --image-project debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt install -y apache2
    scp myuser@108.59.87.185:index.php /var/www/'

יכולות להיות שתי בעיות פוטנציאליות בסקריפט לטעינה בזמן ההפעלה הזה:

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

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

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

איך למנוע התנהגות לא ברורה או לא צפויה של תבניות של הגדרות מכונה

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

  • משתמשים בקובצי אימג' שמותאמים לקונטיינרים או ב-Docker, עם תגי Docker. לדוגמה, מומלץ להקצות תגים חדשים לכל בנייה חדשה של קובץ אימג' של Docker, ולהשתמש בתגים האלה בתבניות של הגדרות מכונה במקום בתג ברירת המחדל latest. במקרה של קובץ אימג' שעבר אופטימיזציה לקונטיינר, אתם יכולים להפנות באופן מפורש לגרסת build מסוימת של קובץ האימג' בקובץ המניפסט. בדוגמה שלמטה נעשה שימוש בקובץ אימג' של Docker‏ myimage בגרסה שתויגה באמצעות version_2_1_3:

    version: v1beta2
    containers:
      - name: simple-echo
        image: myimage:version_2_1_3
           [ rest of your manifest file ]
    
  • יוצרים אימג' בהתאמה אישית לשימוש כאימג' של התבנית. השיטה הזו עדיפה על סקריפטים להפעלה כי היא מבטיחה שכל מופע יהיה זהה. יכול להיות שסקריפטים להפעלה יניבו תוצאות שונות אחרי עדכונים של חבילת ההפצה. כדי ליצור אב-טיפוס ולפתח במהירות, כדאי להשתמש בסקריפטים להפעלה בתבניות של מכונות וירטואליות, וכדי לפרוס שירותים באיכות של סביבת ייצור, כדאי להשתמש בתמונות בהתאמה אישית.

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

    gcloud compute instance-templates create example-template-with-startup-2-1-3 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --metadata startup-script='#! /bin/bash
        sudo apt install -y apache2=2.2.20-1ubuntu1
        scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'
    

    כאשר version_2_1_3 היא ספריית משנה שמכילה סקריפטים של PHP לגרסה 2.1.3 של השירות.

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

    כדי לראות את המזהה של תבנית מכונה, אפשר לעיין במאמר קבלת מידע על תבנית מכונה.

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