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

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

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

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

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

התנהגות

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

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

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

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

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

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

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

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

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

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

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

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

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

המסוף

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

    כניסה ל-Cloud Run

  2. בתפריט הניווט של Cloud Run, לוחצים על Services:

    1. אם אתם מגדירים שירות חדש, לוחצים על Deploy container וממלאים את דף הגדרות השירות הראשוני. לוחצים על Containers, Networking, Security כדי להרחיב את דף הגדרת השירות, ואז לוחצים על Volumes.

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

  3. לוחצים על Mount volume.

  4. לוחצים על In-memory בתור סוג האחסון.

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

  6. אופציונלי: מזינים את Size limit ואת Memory unit כדי לציין את מגבלת הזיכרון שרוצים להקצות לנפח האחסון. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שצוין לקונטיינרים. הנתונים שמאוחסנים בנפח הזה צורכים זיכרון ששמור לקונטיינר שכתב את הנתונים.

  7. לוחצים על Save.

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

gcloud

  • כדי לטעון אמצעי אחסון:

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

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

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

    gcloud run services update SERVICE \
      --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 services describe SERVICE --format export > service.yaml
  2. מגדירים את המאפיינים volumeMounts ו-volumes באופן הבא:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_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/hello:latest. אם אתם משתמשים ב-Artifact Registry, המאגר REPO_NAME כבר צריך להיות קיים. הפורמט של כתובת ה-URL הוא LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
    • ‫VOLUME_NAME: כל שם שרוצים לתת לנפח האחסון. הערך VOLUME_NAME משמש למיפוי של אמצעי האחסון לנקודת הטעינה של אמצעי האחסון.
    • ‫MOUNT_PATH: הנתיב היחסי במערכת הקבצים של מאגר הנתונים שבו רוצים לטעון את אמצעי האחסון הזה, לדוגמה /mnt/my-volume.
    • ‫SIZE_LIMIT: מגבלת הזיכרון שרוצים להקצות לנפח האחסון, ב-MiB או ב-GiB (מצוין כ-Mi או Gi), לדוגמה, 500Mi. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שצוין לקונטיינרים.
  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_NAME"
  location = "REGION"

  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"
      }
    }
  }
}

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

  • ‫SERVICE_NAME: השם של שירות Cloud Run.
  • ‫REGION: האזור של Google Cloud . לדוגמה: europe-west1.
  • ‫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: כל שם שרוצים לתת לנפח האחסון. הערך של VOLUME_NAME משמש למיפוי של אמצעי האחסון לנקודת הטעינה של אמצעי האחסון.
  • ‫MOUNT_PATH: הנתיב היחסי בתוך מערכת הקבצים של מאגר הנתונים שבו רוצים לטעון את אמצעי האחסון הזה, לדוגמה /mnt/my-volume.
  • ‫SIZE_LIMIT: מגבלת הזיכרון שרוצים להקצות לנפח, ב-MiB או ב-GiB (מצוין כ-Mi או Gi), לדוגמה, 500Mi. המגבלה הזו חייבת להיות נמוכה מהזיכרון הכולל שצוין לקונטיינרים.

פיתוח נייטיב

כדי לציין נקודות טעינה של נפח בזיכרון בקובץ compose.yaml, משתמשים בתוסף x-google-cloudrun:volume-type: in-memory הספציפי ל-Google.

  services:
    web:
      image: IMAGE
      volumes:
        - VOLUME_NAME:MOUNT_PATH
  volumes:
    VOLUME_NAME:
      x-google-cloudrun:
        volume-type: in-memory

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

  • ‫IMAGE: כתובת ה-URL של קובץ האימג' של הקונטיינר.
  • ‫VOLUME_NAME: השם של אמצעי האחסון בזיכרון.
  • ‫MOUNT_PATH: הנתיב שבו רוצים לטעון את אמצעי האחסון, לדוגמה /mnt/my-volume.

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

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

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

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

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

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

אם אתם משתמשים בתכונה של טעינת נפח אחסון ב-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");

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

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

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

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

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

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