הגדרת טעינת נפחים בזיכרון למשימות

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

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

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

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

התנהגות

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

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

אם לא מציינים מגבלת גודל, המערכת מגדירה אותה באופן אוטומטי למחצית מהגודל הכולל של כל המאגדים בעבודה או בשירות. לדוגמה, emptyDir נפח = [זיכרון (מאגר א') + זיכרון (מאגר ב') + זיכרון (מאגר נ')]/2. התנהגות ברירת המחדל הזו יכולה לגרום לכך שמגבלת הגודל של נפח הזיכרון תהיה גבוהה יותר מהזיכרון שהוקצה לחלק מהקונטיינרים. הדבר עלול לגרום לקריסות לא צפויות אם קונטיינר יחיד חורג מהזיכרון שהוקצה לו בזמן שהוא מנסה לכתוב עוד נתונים לנפח, גם אם לא הגיעה למגבלת הגודל של הנפח.

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

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

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

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

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

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

הגדרה של נפח אחסון בזיכרון

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

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

המסוף

  1. נכנסים לדף Jobs ב-Cloud Run במסוף Cloud de Confiance by S3NS :

    כניסה ל-Cloud Run

  2. לוחצים על Deploy container (פריסת מאגר תגים) כדי למלא את דף ההגדרות הראשוניות של המשימה. אם אתם מגדירים משימה קיימת, בוחרים את המשימה ולוחצים על View and edit job configuration (הצגה ועריכה של הגדרת המשימה).

  3. לוחצים על Containers, Connections, Security (מאגרי תגים, חיבורים, אבטחה) כדי להרחיב את דף מאפייני העבודה.

  4. לוחצים על הכרטיסייה Volumes (נפחים).

    תמונה

    • לוחצים על Mount volume (התקנת אמצעי אחסון).
    • לוחצים על In-memory (בזיכרון) כסוג הנפח.
    • בשדה Mount path (נתיב ההרכבה), מזינים את הנתיב שבו רוצים להרכיב את אמצעי האחסון.
    • בשדה Volume name (שם הנפח), מזינים את שם הנפח.
    • אופציונלי: מזינים את מגבלת הגודל ויחידת הזיכרון כדי לציין את מגבלת הזיכרון שרוצים להקצות לנפח האחסון. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שצוין עבור הקונטיינרים. הנתונים שמאוחסנים בנפח הזה צורכים זיכרון ששמור על ידי הקונטיינר שכתב את הנתונים.
    • לוחצים על Save.
  5. לוחצים על יצירה או על עדכון.

gcloud

  • כדי לטעון נפח:third_party/devsite/cloud/en/run/docs/images/nfs-volume-mount.png

    gcloud run jobs update JOB \
      --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT

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

    • JOB: השם של המשימה.
    • MOUNT_PATH: הנתיב היחסי במערכת הקבצים של קובץ המאגר שבו רוצים לטעון את אמצעי האחסון הזה. לדוגמה: /mnt/my-volume.
    • SIZE_LIMIT: מגבלת הזיכרון שרוצים להקצות לנפח האחסון, ב-MiB או ב-GiB (מצוין כ-Mi או כ-Gi), לדוגמה, 500Mi. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שהוגדר עבור הקונטיינרים.
  • אם אתם משתמשים בכמה מאגרי תגים, קודם מציינים את אמצעי האחסון, ואז מציינים את נקודות הגישה לאמצעי האחסון לכל מאגר תגים:

    gcloud run jobs update JOB \
      --add-volume=name= VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \
      --container=CONTAINER_1 \
      --add-volume-mount=volume= VOLUME_NAME,mount-path=MOUNT_PATH \
      --container==CONTAINER_2 \
      --add-volume-mount=volume= VOLUME_NAME,mount-path=MOUNT_PATH2

YAML

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

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. מגדירים את המאפיינים volumeMounts ו-volumes כמו שמוצג:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              sizeLimit: SIZE_LIMIT
              medium: Memory

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

    • IMAGE_URL: הפניה לקובץ אימג' בקונטיינר, לדוגמה us-docker.pkg.dev/cloudrun/container/job:latest.
    • VOLUME_NAME: כל שם שרוצים לתת לנפח האחסון. הערך VOLUME_NAME משמש למיפוי הנפח לנפח mount.
    • MOUNT_PATH: הנתיב היחסי במערכת הקבצים של הקונטיינר שבו רוצים לטעון את אמצעי האחסון הזה. לדוגמה: /mnt/my-volume.
    • SIZE_LIMIT: מגבלת הזיכרון שרוצים להקצות לנפח, ב-MiB או ב-GiB (מצוין כ-Mi או כ-Gi), לדוגמה, 500Mi. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שהוגדר עבור הקונטיינרים.
  3. יוצרים או מעדכנים את העבודה באמצעות הפקודה הבאה:

    gcloud run jobs replace job.yaml

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

Terraform

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

מוסיפים את הטקסט הבא למשאב google_cloud_run_v2_job בקובץ התצורה של Terraform:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"
    volume_mounts {
      name = "VOLUME_NAME"
      mount_path = "MOUNT_PATH"
    }
      }
      volumes {
        name = "VOLUME_NAME"
    empty_dir {
      medium = "MEMORY"
      size_limit = "SIZE_LIMIT"
    }
      }
    }
  }
}

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

  • JOB_NAME: השם של המשימה ב-Cloud Run.
  • REGION עם האזור Cloud de Confiance . לדוגמה: europe-west1.
  • IMAGE_URL: הפניה לקובץ אימג' בקונטיינר, לדוגמה us-docker.pkg.dev/cloudrun/container/job:latest.
  • VOLUME_NAME: כל שם שרוצים לתת לנפח האחסון. הערך VOLUME_NAME משמש למיפוי הנפח לנקודת הטעינה של הנפח.
  • MOUNT_PATH: הנתיב היחסי במערכת הקבצים של קובץ המכולה שבו רוצים לטעון את אמצעי האחסון הזה, לדוגמה, /mnt.
  • SIZE_LIMIT: מגבלת הזיכרון שרוצים להקצות לנפח, ב-MiB או ב-GiB (מצוין כ-Mi או כ-Gi). לדוגמה, 128Mi. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שהוגדר עבור הקונטיינרים.

קריאה וכתיבה של נתונים בווליום

אם משתמשים בתכונה של 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 jobs update JOB \
    --clear-volumes
    --clear-volume-mounts

אם יש לכם כמה מאגרי תגים, אתם יכולים לפעול לפי המוסכמות של CLI של sidecars כדי לנקות את הכרכים והחיבורים של הכרכים:

gcloud run jobs update JOB \
    --clear-volumes \
    --clear-volume-mounts \
    --container=container1 \
    --clear-volumes \
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

הסרה של אמצעי אחסון בודדים והצמדות של אמצעי אחסון

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

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

gcloud run jobs update JOB \
    --remove-volume VOLUME_NAME
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH