פריסת אפליקציית Python Bookshelf באמצעות Cloud Deployment Manager

במדריך הזה מוסבר איך לפרוס את אפליקציית הדוגמה Python Bookshelf באמצעות Cloud Deployment Manager.

‫Deployment Manager מאפשר ליצור אתGoogle Cloud המשאבים הנדרשים לפריסה בשלב אחד, באמצעות תהליך הצהרתי שניתן לחזרה. באמצעות Deployment Manager, אתם יכולים לעדכן את הפריסות, לעקוב אחרי השינויים לאורך זמן, ליצור תבניות באמצעות Jinja או Python, ולהגדיר פרמטרים לתבניות, כך שפריסות דומות ישתמשו באותה תבנית.

מטרות

  • משכפלים ומגדירים את אפליקציית מדף הספרים לדוגמה.
  • יצירת תצורות ותבניות של Deployment Manager.
  • יצירת פריסות של Deployment Manager.
  • פורסים את אפליקציית הדוגמה Bookshelf באמצעות Deployment Manager.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

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

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

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

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Datastore API, Cloud Storage API, Pub/Sub API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. התקינו את ה-CLI של Google Cloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Datastore API, Cloud Storage API, Pub/Sub API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. התקינו את ה-CLI של Google Cloud.

  12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  14. מתקינים את Python‏, pip ו-virtualenv במערכת. הוראות מפורטות זמינות במאמר הגדרת סביבת פיתוח בשפת Python ל- Google Cloud.

יצירת קטגוריה של Cloud Storage

בהוראות הבאות מוסבר איך ליצור קטגוריה של Cloud Storage. קטגוריות הן הקונטיינרים הבסיסיים ששומרים את הנתונים שלכם ב-Cloud Storage.

  1. בחלון המסוף, יוצרים קטגוריה של Cloud Storage, כאשר YOUR_BUCKET_NAME מייצג את שם הקטגוריה:

    gcloud storage buckets create gs://YOUR_BUCKET_NAME
  2. כדי לראות תמונות שהועלו באפליקציית מדף הספרים, צריך להגדיר את מדיניות ניהול הזהויות והרשאות הגישה (IAM) של הקטגוריה כך שתוענק הרשאת legacyObjectReader לתפקיד allUsers:

    gcloud storage buckets add-iam-policy-binding gs://YOUR_BUCKET_NAME
    --member=allUsers --role=roles/storage.legacyObjectReader

שיבוט של האפליקציה לדוגמה

אפליקציית הדוגמה זמינה ב-GitHub בכתובת GoogleCloudPlatform/getting-started-python.

  1. משכפלים את המאגר:

    git clone https://github.com/GoogleCloudPlatform/getting-started-python.git -b steps
    
  2. עוברים לספריית הדוגמאות:

    cd getting-started-python/7-gce
    

הגדרת האפליקציה

  1. פותחים את config.py לעריכה.

    • מגדירים את הערך של PROJECT_ID למזהה הפרויקט.

    • מגדירים את הערך CLOUD_STORAGE_BUCKET לשם של הקטגוריה ב-Cloud Storage.

  2. שמירה וסגירה config.py.

הפעלת האפליקציה במחשב המקומי

  1. יוצרים סביבת Python מבודדת ומתקינים יחסי תלות:

    ‫Linux/macOS

    virtualenv -p python3 env
    source env/bin/activate
    pip install -r requirements.txt
    

    Windows

    virtualenv -p python3 env
    env\scripts\activate
    pip install -r requirements.txt
    

  2. מריצים את האפליקציה:

    python main.py
    
  3. בדפדפן, מזינים את הכתובת הבאה:

    http://localhost:8080

כדי לעצור את שרת האינטרנט המקומי, מקישים על Control+C. כדי לצאת מהסביבה הווירטואלית, מזינים deactivate.

פריסת האפליקציה לדוגמה

העברת הקוד למאגר

יש כמה דרכים להעביר את הקוד למכונה פעילה של Compute Engine. אחת הדרכים היא להשתמש ב-Cloud Source Repositories. כל פרויקט כולל מאגר Git שזמין למכונות של Compute Engine. לאחר מכן, המופעים שולפים את הגרסה העדכנית של קוד האפליקציה במהלך ההפעלה. השימוש במאגר Git נוח כי כדי לעדכן את האפליקציה לא צריך להגדיר תמונות או מופעים חדשים, אלא רק להפעיל מחדש מופע קיים או ליצור מופע חדש.

  1. בפעם הראשונה שמשתמשים ב-Git, צריך להשתמש ב-git config --global כדי להגדיר את הזהות.

  2. יוצרים מאגר במסוף Google Cloud :

    יצירת מאגר

  3. לאחר מכן מעבירים את קוד האפליקציה למאגר של הפרויקט, כאשר [YOUR_PROJECT_ID] הוא מזהה הפרויקט ו-[YOUR_REPO] הוא שם המאגר:

    git commit -am "Updating configuration"
    git config credential.helper gcloud.sh
    git remote add cloud https://source.developers.google.com/p/[YOUR_PROJECT_ID]/r/[YOUR_REPO]
    git push cloud master
    

יצירת הפריסה

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

  1. עוברים לספרייה deployment_manager:

    cd getting-started-python/7-gce/gce/deployment_manager
    
  2. יוצרים את הפריסה:

    gcloud deployment-manager deployments create my-deployment --config config.yaml
    
  3. צפייה ברשימה של כל הפריסות:

    gcloud deployment-manager deployments list
    
  4. לקבל תיאור של הפריסה והמשאבים שהיא יצרה:

    gcloud deployment-manager deployments describe my-deployment
    

צפייה באפליקציה

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

  1. כדי לבדוק את ההתקדמות:

    gcloud compute backend-services get-health bookshelf-my-deployment-frontend --global
    
  2. אם לפחות אחד מהמופעים מדווח על HEALTHY, צריך לקבל את כתובת ה-IP להעברה של מאזן העומסים:

    gcloud compute forwarding-rules list --global
    

    כתובת ה-IP של כלל ההעברה מופיעה בעמודה IP_ADDRESS.

  3. בדפדפן, מזינים את כתובת ה-IP מהרשימה.

    האפליקציה שלך פועלת עכשיו ב Google Cloud.

הסבר על הקוד

הגדרת הפריסה

אפשר לראות את הגדרות הפריסה בconfig.yaml:

imports:
- name: bookshelf.jinja
  path: ./bookshelf.jinja

resources:
- name: bookshelf
  type: bookshelf.jinja
  properties:
    zone: us-central1-f
    machine-type: n1-standard-1
    machine-image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    min-instances: 1
    max-instances: 10
    target-utilization: 0.6
    scopes:
    - https://www.googleapis.com/auth/cloud-platform

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

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

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


info:
  title: Bookshelf GCE Deploy
  author: Google Inc.
  description: Creates a GCE Deployment

imports:
- name: startup-script
  path: ../startup-script.sh

required:
- zone
- machine-type
- min-instances
- max-instances
- scopes

properties:
  zone:
    description: Zone to create the resources in.
    type: string
  machine-type:
    description: Type of machine to use
    type: string
  machine-image:
    description: The OS image to use on the machines
    type: string
  min-instances:
    description: The minimum number of VMs the autoscaler will create
    type: integer
  max-instances:
    description: The maximum number of VMs the autoscaler will create
    type: integer
  target-utilization:
    description: The target CPU usage for the autoscaler to base its scaling on
    type: number
  scopes:
    description: A list of scopes to create the VM with
    type: array
    minItems: 1
    items:
      type: string

הגדרת תבנית הפריסה

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

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

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

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

{% set NAME = "bookshelf-" + env["deployment"] %}
{% set SERVICE = "bookshelf-" + env["deployment"] + "-frontend" %}

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

            value: |
{{imports['startup-script']|indent(14, true)}}

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

- group: $(ref.{{ NAME }}-frontend-group.instanceGroup)
  zone: {{ properties['zone'] }}

אפשר להשתמש בתבנית במאפיינים שצוינו ב-config.yaml:

minNumReplicas: {{ properties['min-instances'] }}
maxNumReplicas: {{ properties['max-instances'] }}
loadBalancingUtilization:
  utilizationTarget: {{ properties['target-utilization'] }}

הסרת המשאבים

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

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת הפריסה

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

gcloud deployment-manager deployments delete my-deployment

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