פריסת שירותים באמצעות Compose

בדף הזה מוסבר איך לפרוס שירותים ב-Cloud Run באמצעות קובץ שמבוסס על מפרט Compose.

אפשר לפרוס ל-Cloud Run באמצעות קובץ Compose בדרכים הבאות:

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

לניהול סביבות ייצור בסביבת תשתית כקוד (IaC), מומלץ להשתמש ב-Terraform.

מגבלות

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

פריסת שירותים מקובצי אימג' של קונטיינרים באמצעות Compose

הגדרת השירותים בקובץ compose.yaml ופריסתם מקובצי אימג' קיימים של קונטיינרים. מידע נוסף זמין במאמר בנושא פריסת תמונות של קונטיינרים.

דוגמה: אפליקציה עם שירות יחיד

בדוגמה הבאה מוצג קובץ compose.yaml לשירות אינטרנט שמשתמש בקובץ אימג' מוכן מראש של קונטיינר.

services:
  web:
    image: us-docker.pkg.dev/cloudrun/container/hello
    ports:
      - "8080:8080"

דוגמה: אפליקציה עם כמה קונטיינרים עם Nginx,‏ Flask ו-MongoDB

בדוגמה הבאה מוצג קובץ compose.yaml של אפליקציה עם שרת proxy של Nginx, קצה עורפי של Flask ומסד נתונים של MongoDB.

כדי לפרוס את הדוגמה הזו, צריך ליצור את מבנה הפרויקט הבא:

  • compose.yaml: קובץ ה-Compose שמגדיר את השירותים.
  • nginx/nginx.conf: הגדרות לשרת ה-Proxy של Nginx.
  • flask/: הספרייה שמכילה את קוד אפליקציית Flask‏ (server.py,‏ Dockerfile ו-requirements.txt).
services:
  web:
    image: nginx
    volumes:
      - ./nginx/nginx.conf:/tmp/nginx.conf
    environment:
      - FLASK_SERVER_ADDR=backend:9091
    command: /bin/bash -c "envsubst < /tmp/nginx.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
      - 80:80
    x-google-cloudrun:
      ingress-container: true
    depends_on:
      - backend

  backend:
    build:
      context: flask
      target: builder
    stop_signal: SIGINT
    environment:
      - FLASK_SERVER_PORT=9091
    volumes:
      - ./flask:/src
    depends_on:
      -  mongo
    ports:
      - 9091:9091

  mongo:
    image: mongo
    ports:
      - 27017:27017

פריסת השירותים

  1. כדי לפרוס את השירותים, מריצים את הפקודה gcloud run compose up:

    gcloud run compose up compose.yaml

  2. מגיבים y לכל ההנחיות להתקנת רכיבים נדרשים או להפעלת ממשקי API.

  3. אופציונלי: הפיכת השירות לציבורי אם רוצים לאפשר גישה לשירות ללא אימות.

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

פריסה מקוד המקור באמצעות Compose

מגדירים את השירותים בקובץ compose.yaml ומבצעים פריסה על ידי בנייה מקוד המקור. מידע נוסף מופיע במאמר פריסת שירותים מקוד מקור.

דוגמה: אפליקציה עם שירות יחיד

בדוגמה הבאה מוצג קובץ compose.yaml לשירות אינטרנט שנבנה ממקור בספרייה הנוכחית.

services:
  web:
    build: .
    ports:
      - "8080:8080"

פריסת השירותים

  • בספריית הפרויקט, יוצרים קובץ compose.yaml עם הגדרות השירות.

    1. כדי לפרוס את השירותים, מריצים את הפקודה gcloud run compose up:

      gcloud run compose up compose.yaml
    2. מגיבים y לכל ההנחיות להתקנת רכיבים נדרשים או להפעלת ממשקי API.

    3. אופציונלי: הפיכת השירות לציבורי אם רוצים לאפשר גישה לשירות ללא אימות.

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

אילוץ בנייה מחדש

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

gcloud run compose up compose.yaml --build

האפשרות הזו שימושית במיוחד אם מאגר, תמונה או תקציר מרוחקים נמחקו, אבל קוד המקור המקומי נשאר ללא שינוי. הדגלים --build ו---no-build הם בלעדיים הדדית.

תכונות נתמכות

כשפורסים באמצעות קובץ compose.yaml, ‏ Cloud Run יכול להקצות באופן אוטומטי משאבים אחרים של Google Cloud כפי שמוגדר בקובץ ה-Compose. אם נדרשים משאבים, Cloud Run יבקש מכם אישור לפני יצירתם.

‫Cloud Run תומך בקבוצת המשנה הבאה של תכונות Compose:

שדה הכתיבה מיפוי ותיאור של Cloud Run
services

השירותים ממופים לקונטיינרים נפרדים בשירות Cloud Run שנפרס.

volumes

יש תמיכה חלקית. מתרגם את ההגדרות של bind, volume ו-tmpfs לערכים מקבילים ב-Cloud Run.

secrets

יש תמיכה שימוש ב-Secret Manager.

configs

יש תמיכה שימוש ב-Cloud Storage.

build

יש תמיכה הפקודה יוצרת את הקונטיינר באמצעות הקשר של ה-build, מתייגת אותו ומעבירה אותו בדחיפה למאגר cloud-run-source-deploy ב-Artifact Registry. משתמשים בדגל --build כדי לאלץ בנייה מחדש גם אם קוד המקור לא השתנה מאז הבנייה האחרונה.

image

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

ports

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

expose

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

depends_on

ההגדרה הזו מגדירה את סדר ההפעלה של הקונטיינר. כך מוודאים שלכל שירות שמופיע ברשימה run-compose יש יציאה שמוגדרת על ידי ports או expose, כדי שמכולות אחרות יוכלו לתקשר איתו.

cpus

רמז שמשמש להגדרת מגבלות המעבד והזיכרון ב-Cloud Run, והקצאת משאבים באופן אוטומטי לפי הלוגיקה הבאה:

  • <= 2 CPU: 1Gi Memory
  • <= 4 CPU: 2Gi Memory
  • > 4 CPU: 4Gi Memory
container_name

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

environment

מעבירה משתני סביבה לקונטיינר המתאים ב-Cloud Run.

command

המאפיין הזה מחליף את פקודת ברירת המחדל של הקונטיינר, שהוגדרה על ידי הקונטיינר, על ידי מיפוי למאפיין args ב-Cloud Run. לדוגמה, ההוראה CMD ב-Dockerfile.

entrypoint

יש תמיכה

env_file

יש תמיכה

x-google-cloudrun:ingress-container

‫(Extension) מוסיפים את התוסף הספציפי הזה של Google לשירות ומגדירים אותו ל-true כדי לסמן אותו כמאגר התגים של הכניסה שמקבל את כל התנועה החיצונית.

x-google-cloudrun:volume-type: in-memory

(תוסף) מוסיפים את התוסף הזה שספציפי ל-Google לנפח אחסון ומגדירים אותו ל-in-memory במקום נפח האחסון שמוגדר כברירת מחדל ומגובה על ידי Cloud Storage.

סודות שממופים ל-Secret Manager

אם קובץ compose.yaml מגדיר את secrets, ה-CLI של gcloud מקצה סודות של Secret Manager לאחסון הנתונים האלה.

כרכים והגדרות שממופים ל-Cloud Storage

אם בקובץ compose.yaml מוגדרים volumes או configs ברמה העליונה, ה-CLI של gcloud מקצה קטגוריה של Cloud Storage לניהול הנתונים האלה. נוצרת קטגוריה אחת לכל פריסה, והתיקיות משמשות להפרדה בין נפחים והגדרות.

  • כרכים עם שם: תיקייה ריקה שמתאימה לשם הכרך נוצרת בקטגוריה.
  • טעינת תיקיות: כשמטעינים תיקיות, Cloud Run מעלה את התוכן של תיקיית המקור המקומית לתיקייה בקטגוריה לפני הפריסה.
  • Configs: לכל הגדרה שמוגדרת עם מקור file:, ‏ Cloud Run מעלה את התוכן של הקובץ המקומי לתיקייה בדלי.

התפקידים הנדרשים

במהלך הפריסה, Cloud Run מקצה אוטומטית את התפקידים הנדרשים לזהות השירות של השירות שנפרס, כדי לגשת למשאבים שהוקצו:

  • Cloud Storage Bucket: roles/storage.objectUser
  • Secret Manager Secrets: roles/secretmanager.secretAccessor

תקשורת בין מאגרים של אותו מופע

‫Cloud Run מוסיף רשומה לקובץ /etc/hosts בכל קונטיינר. הערך הזה ממפה את שמות השירותים מקובץ compose.yaml לכתובות ה-IP הפנימיות שלהם, וכך מאפשר לשירותים לתקשר ביניהם באמצעות שמות השירותים.

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