הגדרת דיסק אחסון ארעי (ephemeral disk) לשירותי Cloud Run

ב-Cloud Run יש נפח דיסק אחסון ארעי (ephemera disk) שנשמר רק למשך הזמן של המכונה. התכונה הזו מאפשרת לציין את נפח הדיסק שאתם צריכים ואת המיקום לטעינה שלו. לאחר מכן, Cloud Run יקצה את נפח הדיסק הזה למשאב.

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

  • קריסות של מכונות
  • שינוי קנה המידה של השירות
  • העברת תנועה לגרסה חדשה

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

לפני השבתת מכונה, Cloud Run שולח אות SIGTERM לכל הקונטיינרים במכונה, שמציין את תחילתה של תקופה של 10 שניות לפני ההשבתה בפועל, שבה Cloud Run שולח אות SIGKILL. אתם יכולים להשתמש בחלון הזמן הזה של 10 שניות כדי לבצע פעולות ניקוי, כמו סבב אחרון של העתקת תוכן הדיסק לאחסון מתמיד.

תרחישים לדוגמה

אפשר להשתמש בדיסק אחסון ארעי למטרות הבאות:

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

מגבלות על נפח האחסון ועל מספר המכונות

אלה המגבלות:

  • מגבלת גודל של אמצעי אחסון: כל אמצעי אחסון חייב להיות בין 1Gi ל-100Gi.
  • מגבלת האחסון של המכונה: כברירת מחדל, כל מכונה מוגבלת לנפח כולל של 10GiB. כדי להגדיר יותר מ-10GiB לכל מכונה, צריך לבקש הגדלה של המכסה.
  • מגבלת נפח למכונה: כל מכונה מוגבלת ל-10 נפחי דיסק אחסון ארעי (ephemeral disk) לכל היותר.
  • מגבלת פרויקט: כל פרויקט מתחיל עם מגבלת הקצאה אזורית כוללת של 0GiB כברירת מחדל. בפעם הראשונה שפורסים משאב עם דיסק אחסון ארעי באזור מסוים, הפרויקטים מקבלים באופן אוטומטי 100GiB לכל אזור. בזמן הריצה, המכסה האזורית הזו משותפת בין כל המכונות שפועלות באזור. כשפורסים משאב, הגודל המשולב של דיסק האחסון הארעי לכל מכונה, כפול המספר המקסימלי של המכונות, לא יכול לחרוג ממגבלת ההקצאה האזורית. לדוגמה, אם המגבלה האזורית היא 100GiB, אפשר להגדיר משאב עם דיסק של 10GiB עם עד 10 מכונות. במקרה הצורך, מבקשים להגדיל את המכסה.

שליחת בקשה להגדלת המכסה

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

המכסה הנוכחית קישור למכסה
‫10GiB לכל מכונה בקשה להגדלת המכסה לכל מכונה
‫100GiB לכל פרויקט בקשה להגדלת המכסה לכל פרויקט

איך מבקשים להגדיל את המכסה

מגבלות

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

נתיבים אסורים

ב-Cloud Run אי אפשר לטעון ווליום ב-/dev, ב-/proc או ב-/sys, או בספריות המשנה שלהם.

אזורים נתמכים

דיסק אחסון ארעי זמין בכל המיקומים של Cloud Run.

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

  1. 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

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

  3. מתקינים ומפעילים את ה-CLI של gcloud.
  4. מעדכנים את הרכיבים:
    gcloud components update
  5. בדף התמחור של Cloud Run תוכלו לקרוא על המעבד (CPU), הזיכרון ותעבורת הנתונים היוצאת (egress) ברשת. העלות מחושבת לפי הגודל הכולל של הדיסק שהוקצה ומשך החיים של המכונה שמשתמשת בו.

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

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

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

יצירה וטעינה של דיסק אחסון ארעי (ephemeral disk)

אפשר ליצור ולטעון דיסק אחסון ארעי באמצעות מסוף Google Cloud ,‏ Google Cloud CLI,‏ YAML או Terraform:

המסוף

  1. נכנסים ל-Cloud Run במסוף Google Cloud :

    כניסה ל-Cloud Run

  2. בתפריט הניווט של Cloud Run, בוחרים באפשרות Services ולוחצים על Deploy container כדי להגדיר שירות חדש. אם אתם מגדירים שירות קיים, לוחצים על השירות ואז על הכרטיסייה Containers.

  3. אם אתם מגדירים שירות חדש, מלאו את דף ההגדרות הראשוניות של השירות ואז לחצו על Containers, Networking, Security.

  4. בוחרים באפשרות דיסק אחסון ארעי (ephemeral disk).

  5. בוחרים את הגודל מהתפריט ומזינים את נתיב ההרכבה בשדה Mount path.

  6. לוחצים על יצירה כדי ליצור שירות חדש. לוחצים על View diff & redeploy ואז על Deploy changes בשירות קיים.

gcloud

כדי להוסיף אמצעי אחסון ולטעון אותו:

gcloud run services update SERVICE \
    --execution-environment=gen2 \
    --add-volume=name=VOLUME_NAME,type=ephemeral-disk,size=SIZE \
    --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

מחליפים את מה שכתוב בשדות הבאים:

  • ‫SERVICE: שם השירות.
  • ‫VOLUME_NAME: השם שרוצים לתת לנפח האחסון.
  • ‫SIZE: גודל הדיסק, לדוגמה: 10Gi. הגודל חייב להיות בין 1Gi ל-100Gi לנפחים של ephemeral-disk.
  • ‫MOUNT_PATH: הנתיב היחסי שבו אתם טוענים את אמצעי האחסון, לדוגמה, /mnt/my-volume.

YAML

  1. אם אתם יוצרים שירות חדש, דלגו על השלב הזה. אם אתם מעדכנים שירות קיים, הורידו את הגדרת ה-YAML שלו:

    gcloud run services describe SERVICE --format export > service.yaml
  2. מגדירים את קובץ ה-YAML:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
    spec:
      template:
        spec:
          containers:
          - name: CONTAINER_NAME
            image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              medium: Disk
              sizeLimit: SIZE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫SERVICE: שם השירות.
    • ‫REGION: האזור של Google Cloud .
    • ‫CONTAINER_NAME: השם שרוצים לתת לקונטיינר.
    • ‫IMAGE_URL: הפניה לקובץ האימג' של הקונטיינר, לדוגמה us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, המאגר REPO_NAME כבר צריך להיות קיים. הפורמט של כתובת ה-URL הוא LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
    • ‫VOLUME_NAME: השם שרוצים לתת לנפח האחסון.
    • ‫MOUNT_PATH: הנתיב היחסי שבו אתם טוענים את אמצעי האחסון, לדוגמה, /mnt/my-volume.
    • ‫SIZE: גודל הדיסק, לדוגמה: 10Gi. הגודל חייב להיות בין 1Gi ל-100Gi לנפחים של ephemeral-disk.
  3. יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:

    gcloud run services replace service.yaml

    כברירת מחדל, הפקודה gcloud run services replace משתמשת בקובץ service.yaml אם הוא קיים.

Terraform

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

מוסיפים את הקוד הבא למשאב google_cloud_run_v2_service בתצורה של Terraform:
  resource "google_cloud_run_v2_service" "default" {
    name     = "SERVICE"
    location = "REGION"
    deletion_protection =  "true"
    ingress = "INGRESS_TRAFFIC_ALL"
  template {
    containers {
      image = "IMAGE_URL"
      volume_mounts {
        name = "VOLUME_NAME"
        mount_path = "MOUNT_PATH"
      }
    }
    volumes {
      name = "VOLUME_NAME"
      empty_dir {
        medium = "DISK"
        size_limit = "SIZE"
      }
    }
  }
  lifecycle {
    ignore_changes = [
      launch_stage,
    ]
  }
}

מחליפים את מה שכתוב בשדות הבאים:

  • ‫SERVICE: שם השירות.
  • ‫REGION: האזור של Google Cloud .
  • ‫IMAGE_URL: הפניה לקובץ האימג' של הקונטיינר, לדוגמה us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, המאגר REPO_NAME כבר צריך להיות קיים. הפורמט של כתובת ה-URL הוא LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  • ‫VOLUME_NAME: השם שרוצים לתת לנפח האחסון.
  • ‫MOUNT_PATH: הנתיב היחסי שבו אתם טוענים את אמצעי האחסון, לדוגמה, /mnt/my-volume.
  • ‫SIZE: גודל הדיסק, לדוגמה: 10Gi. הגודל חייב להיות בין 1Gi ל-100Gi לנפחים של ephemeral-disk.

קריאה וכתיבה של אמצעי אחסון

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

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

קטעי הקוד הבאים מניחים שיש טעינת נפח עם mountPath שמוגדר ל-/mnt/my-volume.

Nodejs

משתמשים במודול File System כדי ליצור קובץ חדש או להוסיף לקובץ קיים בנפח האחסון /mnt/my-volume:

var fs = require('fs');
fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });

Python

כותבים לקובץ שנשמר באמצעי האחסון, /mnt/my-volume:

f = open("/mnt/my-volume/sample-logfile.txt", "a")

המשך

משתמשים בחבילה os כדי ליצור קובץ חדש שיישמר בנפח האחסון, /mnt/my-volume:

f, err := os.Create("/mnt/my-volume/sample-logfile.txt")

Java

משתמשים במחלקה Java.io.File כדי ליצור קובץ יומן בנפח האחסון /mnt/my-volume:

import java.io.File;
File f = new File("/mnt/my-volume/sample-logfile.txt");

ניקוי והסרה של אמצעי אחסון ונקודות טעינה של אמצעי אחסון

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

ניקוי כל אמצעי האחסון ונקודות הטעינה של אמצעי האחסון

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

gcloud run services update SERVICE \
    --clear-volumes \
    --clear-volume-mounts
אם יש לכם כמה קונטיינרים, צריך לפעול לפי המוסכמות של CLI של sidecars כדי לנקות את אמצעי האחסון ואת נקודות הטעינה של אמצעי האחסון:

gcloud run services update SERVICE \
    --container=container1 \
    --clear-volumes \
    --clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    --clear-volume-mounts

הסרת אמצעי אחסון ונקודות טעינה ספציפיים

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

כדי להסיר ווליומים ספציפיים או נקודות טעינה של ווליומים, משתמשים בדגלים remove-volume ו-remove-volume-mount:

gcloud run services update SERVICE \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH

שיטות מומלצות

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

העתקה לאחסון מתמיד

אם אתם מתכוונים להעתיק את התוכן של דיסק האחסון הארעי לאחסון מתמיד, כמו קטגוריה של Cloud Storage, מומלץ להעתיק אותו באופן מצטבר ולא להסתמך על תקופת החסד של 10 שניות בין SIGTERM ל-SIGKILL. למידע נוסף על השבתת מכונות, ראו חוזה זמן ריצה של קונטיינר.

אפשר לקרוא ולכתוב מ-Cloud Storage ב-Cloud Run בלי הגדרות רשת נוספות. כדי להשיג ביצועים אופטימליים, מומלץ לנתב את התנועה אל Cloud Storage וממנו דרך רשת VPC באמצעות Direct VPC.

השיטה הזו מתאימה אם אתם לא צריכים גישה לאינטרנט ממשאב Cloud Run. אם אתם צריכים גישה לאינטרנט, הגדירו את Cloud NAT או עיינו במאמר תעבורת נתונים פנימית ל-Google API.

כדי להגדיר Direct VPC egress עם שירות:

  1. נכנסים לדף Cloud Run במסוף Google Cloud :

    כניסה ל-Cloud Run

  2. אם אתם מגדירים שירות חדש לפריסה, לוחצים על Create Service. אם אתם מגדירים ופורסים שירות קיים, לוחצים על השירות.

  3. אם אתם מגדירים שירות חדש, מלאו את דף הגדרות השירות הראשוני לפי הצורך, ואז לחצו על Containers, Networking, Security כדי להרחיב את דף הגדרות השירות.

  4. נכנסים לכרטיסייה Networking.

  5. לוחצים על Connect to a VPC for outbound traffic.

  6. לוחצים על שליחת תנועה ישירות ל-VPC.

  7. בשדה Network, בוחרים את רשת ה-VPC שאליה רוצים לשלוח את התנועה.

  8. בשדה Subnet, בוחרים את רשת המשנה שממנה השירות מקבל כתובות IP. אפשר לפרוס כמה שירותים באותה רשת משנה.

  9. בקטע Traffic routing, בוחרים באפשרות Route all traffic to the VPC כדי לשלוח את כל התנועה היוצאת דרך רשת ה-VPC.

    1. לוחצים על יצירה כדי ליצור שירות חדש. לוחצים על View diff & redeploy ואז על Deploy changes בשירות קיים.

    2. כדי לוודא שהשירות נמצא ברשת ה-VPC, לוחצים על השירות ואז על הכרטיסייה Networking. הרשת ותת-הרשת מופיעות בכרטיס VPC.

      עכשיו אפשר לשלוח בקשות משירות Cloud Run לכל משאב ברשת ה-VPC, בהתאם לכללי חומת האש.

    3. מפעילים את גישה פרטית ל-Google בתת-הרשת שאליה התחברתם.

פתרון בעיות

אם נתקלתם בבעיות, כדאי לבדוק את הדברים הבאים:

  • אם אין זיכרון פנוי (OOM) בקונטיינר והשתמשתם במסוף Google Cloud כדי לפרוס גרסה חדשה של שירות עם דיסק אחסון ארעי (ephemeral disk) מצורף, סביר להניח שמסוף Google Cloud המיר את נפח הדיסק לנפח בזיכרון. כתוצאה מכך, פעולות הכתיבה בדיסק נכתבות בזיכרון, וכתוצאה מכך אין זיכרון פנוי (OOM) בקונטיינר. כדי לפתור את הבעיה, פורסים מחדש את השירות באמצעות ה-CLI של gcloud ומוודאים שבקובץ ה-YAML מצוין medium: Disk בקטע volumes.
  • אם מהירות הרשת איטית כשמורידים כמות גדולה של נתונים לדיסק האחסון הארעי, פועלים לפי השלבים להפעלת Direct VPC. אם לא מפעילים את Direct VPC, מהירות ההעברה ברשת תהיה איטית יותר.