בדף הזה מוסבר איך להגדיר נפח ייעודי בזיכרון שאפשר להשתמש בו לקריאה ולכתיבה של קבצים באמצעות נקודות טעינה של נפחי אחסון ב-Cloud Run. שימו לב שהתכונה הזו שונה ממערכת הקבצים המובנית בזיכרון ש-Cloud Run מספק.
כשאתם טוענים את אמצעי האחסון בזיכרון ב-Cloud Run, הוא מופיע כקבצים במערכת הקבצים של הקונטיינר. אחרי שמתקינים את אמצעי האחסון בזיכרון, אפשר לגשת אליו כאילו הוא ספרייה במערכת הקבצים המקומית, באמצעות פעולות וספריות של מערכת הקבצים של שפת התכנות.
אתם יכולים להשתמש בנפחים בזיכרון כדי:
- מגבילים את הגודל של אמצעי האחסון בזיכרון. כשמגבילים את גודל הנפח, פעולות כתיבה לנפח מלא ייכשלו, וזה עדיף על מצב שבו Cloud Run יסיים מכונות כי הנפח צורך יותר מדי זיכרון.
התנהגות
כשיוצרים ווליום בזיכרון, מומלץ לציין מגבלת גודל. אם הנפח מגיע למגבלת הגודל שלו, פעולות כתיבה נוספות ייכשלו עם שגיאת חוסר בזיכרון. המכונה יכולה לטפל בשגיאה הזו ולהמשיך לפעול.
שימו לב שמגבלת הגודל היא רק מגבלה: היא לא מקצה מקום נוסף לנפח בזיכרון. במקום זאת, הנפח בזיכרון צורך את הזיכרון שהגדרתם למאגרים. אם פורסים כמה קונטיינרים, הזיכרון שמשמש לכל כתיבה לנפח נחשב כשימוש בזיכרון של הקונטיינר שכתב את הנתונים.
אם לא מציינים מגבלת גודל, היא מוגדרת באופן אוטומטי למחצית מהגודל הכולל של כל הקונטיינרים בשירות. לדוגמה,
גודל הנפח של emptyDir = [זיכרון (קונטיינר א') + זיכרון (קונטיינר ב') + זיכרון (קונטיינר N)] חלקי 2.
התנהגות ברירת המחדל הזו יכולה לגרום לכך שמגבלת הגודל של הנפח בזיכרון תהיה גבוהה יותר מהקצאת הזיכרון לחלק מהקונטיינרים. זה יכול לגרום לקריסות לא צפויות אם קונטיינר אחד חורג מהזיכרון שהוקצה לו בזמן שהוא מנסה לכתוב עוד נתונים לווליום, גם אם לא הגעתם למגבלת הגודל של הווליום.
לא חובה להגדיר מגבלת גודל, אבל מומלץ לעשות זאת כדי להגן על הקונטיינרים שלכם מפני מצב של אין זיכרון פנוי וקריסה.
נתיבים אסורים
ב-Cloud Run אי אפשר לטעון ווליום ב-/dev, ב-/proc וב-/sys, או בספריות המשנה שלהם.
התפקידים הנדרשים
כדי לקבל את ההרשאות שנדרשות להגדרה ולפריסה של שירותי Cloud Run, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:
- מפתח ב-Cloud Run (
roles/run.developer) בשירות Cloud Run - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) בזהות השירות
אם אתם פורסים שירות או פונקציה מקוד מקור, אתם צריכים גם תפקידים נוספים בפרויקט ובחשבון השירות של Cloud Build.
רשימה של תפקידים והרשאות ב-IAM שמשויכים ל-Cloud Run מופיעה במאמרים תפקידי IAM ב-Cloud Run והרשאות IAM ב-Cloud Run. אם שירות Cloud Run שלכם מתממשק עם ממשקי API שלGoogle Cloud , כמו ספריות הלקוח ב-Cloud, עיינו במדריך להגדרת זהות השירות. מידע נוסף על הקצאת תפקידים זמין במאמרים הרשאות פריסה וניהול הגישה.
הגדרת נפח אחסון בזיכרון
כל שינוי בהגדרות יוצר גרסה חדשה. גם גרסאות עתידיות יקבלו את הגדרת התצורה הזו באופן אוטומטי, אלא אם תבצעו עדכונים מפורשים כדי לשנות אותה.אחרי שמגדירים נפח בזיכרון לשירות Cloud Run, נוצר נפח ריק לכל מכונה של Cloud Run שמופעלת, והנפח קיים כל עוד המכונה פועלת. כשהמכונה מפסיקה לפעול, הנתונים בנפח נמחקים באופן סופי.
המסוף
נכנסים ל-Cloud Run במסוף Google Cloud :
בתפריט הניווט של Cloud Run, לוחצים על Services:
אם אתם מגדירים שירות חדש, לוחצים על Deploy container וממלאים את דף הגדרות השירות הראשוני. לוחצים על Containers, Networking, Security כדי להרחיב את דף הגדרת השירות, ואז לוחצים על Volumes.
אם אתם מגדירים שירות קיים, לוחצים על השירות ואז על הכרטיסייה Containers.
לוחצים על Mount volume.
לוחצים על In-memory בתור סוג האחסון.
בשדה Mount path, מזינים את הנתיב שבו רוצים לטעון את הנפח.
אופציונלי: מזינים את Size limit ואת Memory unit כדי לציין את מגבלת הזיכרון שרוצים להקצות לנפח האחסון. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שצוין לקונטיינרים. הנתונים שמאוחסנים בנפח הזה צורכים זיכרון ששמור לקונטיינר שכתב את הנתונים.
לוחצים על Save.
כדי ליצור שירות חדש, לוחצים על יצירה. לוחצים על 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
אם אתם יוצרים שירות חדש, דלגו על השלב הזה. אם אתם מעדכנים שירות קיים, הורידו את הגדרת ה-YAML שלו:
gcloud run services describe SERVICE --format export > service.yaml
מגדירים את המאפיינים
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. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שצוין לקונטיינרים.
-
יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:
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.
פריסת השירותים
כדי לפרוס את השירותים, מריצים את הפקודה
gcloud run compose up:gcloud run compose up compose.yamlמשיבים
yלכל בקשה להתקנת רכיבים נדרשים או להפעלת ממשקי API.אופציונלי: אם רוצים לאפשר גישה לשירות בלי אימות, הופכים את השירות לגלוי לכולם.
אחרי הפריסה, כתובת ה-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
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