עדכון פריסה

אחרי שיוצרים פריסה, אפשר לעדכן אותה כשהאפליקציה או השירות משתנים. אפשר להשתמש ב-Deployment Manager כדי לעדכן פריסה על ידי:

  • הוספה או הסרה של משאבים מפריסת Google Cloud.
  • עדכון המאפיינים של משאבים קיימים בפריסה.

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

  1. עורכים את קובץ ההגדרות או יוצרים קובץ הגדרות עם השינויים הרצויים.
  2. אפשר לבחור את המדיניות שבה רוצים להשתמש לעדכונים, או להשתמש במדיניות ברירת המחדל.
  3. שולחים את בקשת העדכון אל Deployment Manager.

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

הכנת העדכון

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

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

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

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

  • אם אתם מעדכנים את הפריסה כדי להחליף משאב, כדאי לבדוק את התלות שלו

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

    resources:
    - name: vm-a
      properties:
        zone: us-central1-f
        ...
        metadata:
          dependsOn:
          - vm-depends-on
    
    # The second VM
    - name: vm-depends-on
      properties:
        zone: $(ref.vm-a.zone)
        ...
    

    בפריסה הזו, כדי להשתמש ב-vm-a, צריך ליצור את vm-depends-on לפני vm-a.dependsOn עם זאת, הפונקציה vm-depends-on משתמשת בהפניה לאזור עבור vm-a, ולכן צריך ליצור את vm-a לפני vm-depends-on. בתרחיש כזה, יחסי התלות הם בלולאה, והפריסה נכשלת.

    אם יש לכם משאב שתלוי במשאבים אחרים וגם משאבים אחרים תלויים בו, החלפת המשאב הזה עלולה לגרום למחזור פריסה.

    לדוגמה, נניח שפריסה כוללת דיסק אחסון מתמיד בשם disk-a, מכונת VM בשם vm-a וקבוצת מכונות בשם ig-a. ההגדרה של vm-a כוללת הפניה אל disk-a, וההגדרה של ig-a כוללת הפניה אל vm-a. בהגדרה מעודכנת, אתם רוצים להסיר את vm-a ולהחליף אותו ב-vm-b. במקרה כזה, פתרון התלות של vm-a ו-vm-b יכול לגרום למחזור פריסה, והפריסה תיכשל.

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

    • מסירים את התלויות של המשאב שרוצים להחליף, על ידי הסרת סעיף dependsOn או על ידי הסרה או שינוי של הפניות למשאבים אחרים. אחרי שתעדכנו את הפריסה עם השינויים האלה, תצטרכו לבצע עדכון נוסף כדי להחליף את המשאב.

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

  • מוודאים שיש API בסיסי שתומך בעדכון.

    ‫Deployment Manager משתמש בממשקי ה-API של כל שירות כדי ליצור ולשנות את הפריסות. כדי לוודא שאפשר להשלים את הבקשה באמצעות Deployment Manager, כדאי לעיין במסמכי התיעוד של ה-API של שירות Cloud Platform לגבי המשאבים שרוצים לעדכן.

    לדוגמה, אם רוצים לעדכן קבוצת נתונים של BigQuery בפריסה, אפשר לעיין בשיטות הזמינות בהפניית API של Datasets. השיטות כוללות את השיטה update, שמציינת שאפשר לעדכן את מערך הנתונים באמצעות Deployment Manager.

    לממשקי API מסוימים יש שיטות מותאמות אישית לעדכון המשאבים שלהם. לדוגמה, ב-Compute Engine יש שיטה מותאמת אישית לעדכון המטא-נתונים של מכונה שנקראת setMetadata. במקרים כאלה, Deployment Manager מנסה להשתמש בשיטות המותאמות אישית.

  • מוודאים שהמשאבים שאתם מעדכנים ניתנים לשינוי.

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

מגבלות

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

  • אם שיניתם משאב בפריסה בלי להשתמש ב-Deployment Manager, למשל במסוף Google Cloud או ב-gcloud, יכול להיות שתראו שגיאות או בעיות לא צפויות כשאתם מנסים לשנות את המשאב בעדכון.

ביצוע שינויים בהגדרות

אם שמרתם הגדרה קיימת, מבצעים שינויים בהגדרה ומשתמשים בה בבקשת העדכון.

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

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

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

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

התבנית הנוכחית תבנית מעודכנת
resources:
- name: vm-created-by-cloud-config
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        diskName: disk-created-by-cloud-config
        sourceImage: image-url
    networkInterfaces:
    - network: network-url
resources:
- name: vm-created-by-cloud-config
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      initializeParams:
        diskName: disk-created-by-cloud-config
        sourceImage: image-url
    networkInterfaces:
    - network: network-url
    metadata:
      items:
      - key: 'foo'
        value: 'bar'
      - key: 'dev'
        value: 'vm'

- name: a-new-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
      - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: false
      initializeParams:
        diskName: a-new-vm-disk
        sourceImage: image-url
    networkInterfaces:
    - network: network-url

(אופציונלי) קובעים את כללי המדיניות שישמשו לעדכון

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

ב-Deployment Manager נעשה שימוש במדיניות ברירת המחדל הבאה:

  • מדיניות ברירת המחדל להוספת משאבים היא CREATE_OR_ACQUIRE.
  • מדיניות ברירת המחדל להסרת משאבים היא DELETE.
  • מדיניות ברירת המחדל לעדכון משאבים היא UPDATE.

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

כללי מדיניות להוספת משאבים

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

  • CREATE_OR_ACQUIRE[ברירת מחדל]‏ Deployment Manager רוכש משאבים שקיימים בפרויקט, או יוצר משאבים אם הם לא קיימים. כדי להקצות משאב, Deployment Manager בודק את ההגדרה שלכם כדי לראות מה המאפיינים של המשאב שאתם מנסים ליצור. אם קיים משאב עם אותן מאפיינים, Deployment Manager יקבל את המשאב הזה כחלק מהפריסה.

    המאפיינים ש-Deployment Manager בודק תלויים בסוג המשאב שאתם יוצרים, והם עשויים לכלול:

    • ה-name של המשאב
    • ה-type של המשאב
    • ה-zone או region של המשאב, אם רלוונטי

    המאפיינים הם חלק מכתובת ה-URL של בקשת GET API למשאב. כדי לראות באילו מאפיינים משתמש Deployment Manager כדי לקבל משאב, אפשר לעיין במאמרי העזרה של ה-API של ה-method ‏GET של המשאב. לדוגמה, במכונות של Compute Engine, כתובת ה-URL של הבקשה לשיטה instances.get כוללת את resourceId (name בהגדרה), zone ו-project.

  • CREATE – Deployment Manager יוצר משאבים שלא קיימים. אם אחד מהמשאבים בהגדרה כבר קיים בפרויקט, הפריסה תיכשל.

  • ACQUIRE – Deployment Manager רוכש משאבים שכבר קיימים, באמצעות אותם קריטריונים כמו CREATE_OR_ACQUIRE.

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

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

מדיניות להסרת משאבים

צריך לספק אחת מהמדיניות הבאות להסרת משאבים:

  • DELETE[ברירת מחדל] האפשרות הזו מסירה מהפריסה את כל ההפניות למשאב ומוחקת את המשאב הבסיסי. המחיקה היא פעולה בלתי הפיכה, אבל אפשר ליצור מחדש משאב חדש עם אותם מאפיינים.

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

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

מדיניות לעדכון משאב קיים

אם קיימת שיטה UPDATE לעדכון משאבים קיימים, Deployment Manager משתמש בה.

אחרת, אם קיימת שיטה מותאמת אישית, Deployment Manager משתמש בשיטה המותאמת אישית. ‫Deployment Manager תומך בשיטות מותאמות אישית שמשתמשות בפועל set. לדוגמה, setMetadata() היא שיטה מותאמת אישית תקינה, אבל addAccessConfigs() לא.

(אופציונלי) תצוגה מקדימה של הגדרות אישיות מעודכנות

אתם יכולים לראות תצוגה מקדימה של העדכון שאתם רוצים לבצע לפני שאתם מאשרים את השינויים, באמצעות Google Cloud CLI או ה-API. שירות Deployment Manager מציג תצוגה מקדימה של ההגדרה על ידי הרחבת ההגדרה המלאה ויצירת משאבי 'מעטפת'.

‫Deployment Manager לא יוצר מופעים של משאבים בפועל כשמציגים תצוגה מקדימה של הגדרה, כך שיש לכם הזדמנות לראות את הפריסה לפני שאתם מאשרים אותה.

gcloud

באמצעות Google Cloud CLI, שולחים בקשת update עם הפרמטר --preview:

gcloud deployment-manager deployments update example-deployment \
    --config configuration-file.yaml \
    --preview

API

ב-API, יוצרים בקשת PUT() עם פריסה קיימת ומספקים את פרמטר השאילתה preview=true. גוף הבקשה צריך להכיל את השדות intent, target ו-name. צריך לציין את שם הפריסה גם בכתובת ה-URL וגם בגוף הבקשה.

לדוגמה, בקשת ה-API הבאה מציגה תצוגה מקדימה של עדכון פשוט:

PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?preview=true

{
 "target": {
  "config": {
   "content": "resources:\n- name: vm-created-by-cloud-config\n  type: compute.v1.instance\n  properties:\n    zone: us-central1-a\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n    disks:\n    - deviceName: boot\n      type: PERSISTENT\n      boot: true\n      autoDelete: true\n      initializeParams:\n        diskName: disk-created-by-cloud-config\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n    networkInterfaces:\n    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
  }
 },
 "name": "example-deployment"
}

אחרי שצופים בתצוגה מקדימה של פריסה, אפשר לפרוס את ההגדרה באופן מלא על ידי שליחת אותה בקשת PUT(), בלי לציין את ההגדרה ואת פרמטר השאילתה preview. ‫Deployment Manager משתמש בתצוגה המקדימה האחרונה כדי לבצע את העדכון. לדוגמה:

gcloud deployment-manager deployments update example-deployment

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

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

ביטול של תקופת ניסיון

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

gcloud

באמצעות Google Cloud CLI, שולחים בקשת deployments cancel-preview:

gcloud deployment-manager deployments cancel-preview my-first-deployment

API

ב-API, שולחים בקשת PUT() ל-method cancelPreview ומספקים את טביעת האצבע העדכנית של הפריסה. טביעת אצבע היא ערך שנוצר באופן אקראי ומשתנה עם כל בקשת עדכון. כדי למנוע שגיאות במהלך העדכון, צריך לספק את טביעת האצבע העדכנית בבקשה.

כדי לקבל את טביעת האצבע העדכנית של פריסה, משתמשים בשיטה get() כדי לקבל פריסה, ומחפשים את ערך טביעת האצבע. ערך טביעת האצבע נראה כך:

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

cancelPreview()הבקשה שלכם תיראה כך:

POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/cancelPreview

{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }

שליחת בקשה לעדכון

כדי לבצע את העדכון:

gcloud

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

gcloud deployment-manager deployments update my-first-deployment \
    --create-policy POLICY \
    --delete-policy POLICY

אם הצגתם תצורה בתצוגה מקדימה בעבר, אל תציינו את התצורה ו-Deployment Manager ישתמש בתצורה האחרונה שהוצגה בתצוגה מקדימה כדי לבצע את העדכון.

gcloud deployment-manager deployments update my-first-deployment

API

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

כדי לקבל את טביעת האצבע העדכנית של פריסה, משתמשים בשיטה get() כדי לקבל פריסה, ומחפשים את ערך טביעת האצבע. ערך טביעת האצבע נראה כך:

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

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

צריך לציין את שם הפריסה גם בכתובת ה-URL וגם בגוף הבקשה.

PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?createPolicy=ACQUIRE&deletePolicy=ABANDON

{
 "target": {
  "config": {
   "content": "resources:\n- name: vm-created-by-cloud-config\n  type: compute.v1.instance\n  properties:\n    zone: us-central1-a\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n    disks:\n    - deviceName: boot\n      type: PERSISTENT\n      boot: true\n      autoDelete: true\n      initializeParams:\n        diskName: disk-created-by-cloud-config\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n    networkInterfaces:\n    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
  }
 },
 "name": "example-deployment",
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
}

הפסקת עדכון

אפשר לעצור עדכון שנמצא בתהליך באמצעות stop(). method. הפעולה הזו מבטלת את ההתקדמות של עדכון מסוים, אבל לא מבטלת שינויים שכבר בוצעו.

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

gcloud

באמצעות Google Cloud CLI, שולחים בקשת deployments stop:

gcloud deployment-manager deployments stop my-first-deployment

API

ב-API, שולחים בקשת POST() ל-method stop ומספקים את מאפיין טביעת האצבע העדכני. טביעת אצבע היא ערך שנוצר באופן אקראי ומשתנה עם כל בקשת עדכון. כדי למנוע שינויים סותרים, צריך לספק את טביעת האצבע העדכנית בבקשה, כדי לבצע נעילה אופטימית כך שרק עדכון אחד יוכל להתבצע בכל פעם.

כדי לקבל את טביעת האצבע העדכנית של פריסה, משתמשים בשיטה get() כדי לקבל פריסה, ומחפשים את ערך טביעת האצבע. ערך טביעת האצבע נראה כך:

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

הבקשה שלך נראית כך:

POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/stop

{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }

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