בדף הזה מוסבר איך להגדיר נפח אחסון ייעודי בזיכרון שאפשר להשתמש בו לקריאה וכתיבה של קבצים באמצעות טעינת נפח אחסון ב-Cloud Run. שימו לב: התכונה הזו שונה ממערכת הקבצים בזיכרון המובנית שמוצעת על ידי Cloud Run.
כשמטעינים את אמצעי האחסון בזיכרון ב-Cloud Run, אמצעי האחסון בזיכרון מופיע כקבצים במערכת הקבצים של הקונטיינר. אחרי שמתקינים את אמצעי האחסון בזיכרון, אפשר לגשת אליו כאילו הוא היה ספרייה במערכת הקבצים המקומית, באמצעות פעולות וספריות של מערכת הקבצים בשפת התכנות.
אפשר להשתמש באמצעי אחסון בזיכרון כדי:
- הגבלת הגודל של נפח האחסון בזיכרון. כשמגבילים את הגודל של נפח אחסון, פעולות כתיבה לנפח אחסון מלא ייכשלו. זה עדיף על מצב שבו Cloud Run יסגור מופעים בגלל שנפח האחסון צורך יותר מדי זיכרון.
התנהגות
כשיוצרים נפח אחסון בזיכרון, מומלץ לציין מגבלת גודל. אם נפח האחסון יגיע למגבלת הגודל, פעולות כתיבה נוספות ייכשלו עם שגיאה של חוסר זיכרון. המכונה יכולה לטפל בשגיאה הזו ולהמשיך לפעול.
שימו לב שמגבלת הגודל היא רק מגבלה: היא לא מקצה נפח נוסף לכרך בזיכרון. במקום זאת, נפח האחסון בזיכרון צורך את הזיכרון שהגדרתם למאגרים. אם פורסים כמה מאגרי תגים, הזיכרון שמשמש כל פעולת כתיבה לנפח האחסון נספר כשימוש בזיכרון של מאגר התגים שכתב את הנתונים.
אם לא מציינים מגבלת גודל, המערכת מגדירה אותה באופן אוטומטי למחצית מהגודל הכולל של כל המאגדים במאגר העובדים. לדוגמה,
emptyDir נפח = [זיכרון (קונטיינר א') + זיכרון (קונטיינר ב') + זיכרון (קונטיינר נ')]/2.
התנהגות ברירת המחדל הזו יכולה לגרום לכך שמגבלת הגודל של הנפח בזיכרון תהיה גבוהה יותר מהזיכרון שהוקצה לחלק מהקונטיינרים. הדבר עלול לגרום לקריסות לא צפויות אם קונטיינר יחיד חורג מהזיכרון שהוקצה לו בזמן שהוא מנסה לכתוב עוד נתונים לנפח, גם אם לא הגיעה מגבלת הגודל של הנפח.
הגדרת מגבלת גודל היא אופציונלית, אבל מומלץ להגדיר אותה כדי להגן על הקונטיינרים מפני מצב שבו הזיכרון שלהם מלא והם קורסים.
נתיבים אסורים
ב-Cloud Run אי אפשר לטעון נפח אחסון ב-/dev, ב-/proc וב-/sys, או בספריות המשנה שלהם.
התפקידים הנדרשים
רשימת ההרשאות והתפקידים ב-IAM שמשויכים ל-Cloud Run מופיעה במאמרים תפקידי IAM ב-Cloud Run והרשאות IAM ב-Cloud Run. אם מאגר העובדים של Cloud Run מתקשר עםGoogle Cloud ממשקי API, כמו ספריות לקוח ב-Cloud, כדאי לעיין במדריך להגדרת זהות שירות. מידע נוסף על מתן תפקידים זמין במאמרים הרשאות פריסה וניהול גישה.
הגדרה של נפח אחסון בזיכרון
כל שינוי בהגדרות מוביל ליצירה של גרסה חדשה. גם גרסאות מאוחרות יותר יקבלו את הגדרת התצורה הזו באופן אוטומטי, אלא אם תבצעו עדכונים מפורשים כדי לשנות אותה.אחרי שמגדירים נפח אחסון בזיכרון עבור מאגר העובדים של Cloud Run, נוצר נפח אחסון ריק לכל מופע של Cloud Run שמופעל, ונפח האחסון קיים כל עוד המופע הזה פועל. כשהמכונה מפסיקה לפעול, הנתונים בכרך נמחקים באופן סופי.
אפשר להגדיר טעינה של אמצעי אחסון בזיכרון באמצעות מסוף Google Cloud , Google Cloud CLI, YAML או Terraform.
המסוף
במסוף Google Cloud , נכנסים לדף Cloud Run:
בתפריט הניווט של Cloud Run, בוחרים באפשרות Worker pools (מאגרי עובדים):
אם אתם מגדירים מאגר עובדים קיים, לוחצים על מאגר העובדים ואז על עריכה ופריסה של עדכון חדש.
אם אתם מגדירים מאגר עובדים חדש, לוחצים על Deploy container וממלאים את הדף הראשוני של מאגר העובדים. אחר כך לוחצים על Containers, Networking, Security כדי להרחיב את דף ההגדרות של מאגרי העובדים.
לוחצים על הכרטיסייה Volumes (אמצעי אחסון).
לוחצים על Mount volume (התקנת אמצעי אחסון).
לוחצים על In-memory (בזיכרון) כסוג הנפח.
כדי להגדיר את עוצמת הקול:
- בשדה נתיב להרכבה, מזינים את הנתיב שבו רוצים להרכיב את אמצעי האחסון.
- בשדה Volume name (שם הנפח), מזינים את שם הנפח.
- אופציונלי: מזינים את מגבלת הגודל ואת יחידת הזיכרון כדי לציין את מגבלת הזיכרון שרוצים להקצות לנפח. המגבלה הזו צריכה להיות קטנה מהזיכרון הכולל שצוין עבור הקונטיינרים. נתונים שמאוחסנים בנפח הזה צורכים זיכרון ששמור על ידי המאגר שכתב את הנתונים.
- לוחצים על Save.
לוחצים על יצירה או על פריסה.
gcloud
כדי לטעון נפח אחסון:
gcloud run worker-pools update WORKER_POOL \ --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT
מחליפים את מה שכתוב בשדות הבאים:
- WORKER_POOL: השם של מאגר העובדים.
- MOUNT_PATH: הנתיב היחסי במערכת הקבצים של קובץ המאגר שבו רוצים לטעון את אמצעי האחסון הזה, לדוגמה,
/mnt/my-volume. - SIZE_LIMIT: מגבלת הזיכרון שרוצים להקצות לנפח האחסון, ב-MiB או ב-GiB (מצוין כ-Mi או כ-Gi) – לדוגמה,
500Mi. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שהוגדר עבור הקונטיינרים.
אם אתם משתמשים בכמה מאגרי תגים, קודם מציינים את אמצעי האחסון, ואז מציינים את נקודות הגישה לאמצעי האחסון לכל מאגר תגים:
gcloud run worker-pools update WORKER_POOL \ --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 worker-pools describe WORKER_POOL --format export > worker-pool.yaml
בדוגמה הבאה מופיעה הגדרת ה-YAML:
apiVersion: run.googleapis.com/v1 kind: WorkerPool metadata: name: WORKER_POOL spec: template: spec: containers: - name: CONTAINER_NAME image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME emptyDir: medium: Memory sizeLimit: SIZE_LIMIT
מחליפים את מה שכתוב בשדות הבאים:
- WORKER_POOL: השם של מאגר העובדים של Cloud Run.
- CONTAINER_NAME: השם של הקונטיינר.
-
IMAGE_URL: הפניה לקובץ אימג' של קונטיינר שמכיל את מאגר ה-worker, למשלus-docker.pkg.dev/cloudrun/container/worker-pool:latest - VOLUME_NAME: כל שם שרוצים לתת לנפח האחסון. הערך VOLUME_NAME משמש למיפוי הנפח לנקודת הטעינה של הנפח.
- MOUNT_PATH: הנתיב היחסי שבו אתם מטמיעים את אמצעי האחסון, לדוגמה,
/mnt/my-volume. - SIZE_LIMIT: מגבלת הזיכרון שרוצים להקצות לנפח האחסון, ב-MiB או ב-GiB (מצוין כ-Mi או כ-Gi), לדוגמה,
500Mi. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שהוגדר עבור הקונטיינרים.
יוצרים או מעדכנים את מאגר העובדים באמצעות הפקודה הבאה:
gcloud run worker-pools replace worker-pool.yaml
אם קיים קובץ
worker-pool.yaml, הפקודהgcloud run worker-pools replaceמשתמשת בו כברירת מחדל.
Terraform
כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.
כדי לציין מאגר, נפח והרכבה של נפח יחיד:
resource "google_cloud_run_v2_worker_pool" "default" {
name = "WORKER_POOL"
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"
}
}
}
}
מחליפים את מה שכתוב בשדות הבאים:
- WORKER_POOL: השם של מאגר העובדים של Cloud Run.
- REGION: האזור Google Cloud . לדוגמה,
europe-west1. -
IMAGE_URL: הפניה לקובץ האימג' של הקונטיינר שמכיל את מאגר העובדים, כמוus-docker.pkg.dev/cloudrun/container/worker-pool:latest. - VOLUME_NAME: כל שם שרוצים לתת לנפח האחסון. הערך VOLUME_NAME משמש למיפוי הנפח לנקודת הטעינה של הנפח.
- MOUNT_PATH: הנתיב היחסי במערכת הקבצים של קובץ המכולה שבו רוצים לטעון את אמצעי האחסון הזה, לדוגמה,
/mnt/my-volume. - SIZE_LIMIT: מגבלת הזיכרון שרוצים להקצות לנפח, ב-MiB או ב-GiB (מצוין כ-Mi או כ-Gi). לדוגמה,
500Mi. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שהוגדר עבור הקונטיינרים.
כדי לציין כמה קונטיינרים, כרכים והרכבות של כרכים:
resource "google_cloud_run_v2_worker_pool" "default" {
name = "WORKER_POOL"
location = "REGION"
template {
containers {
image = "IMAGE_URL"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
containers {
image = "IMAGE_URL_2"
volume_mounts {
name = "VOLUME_NAME_2"
mount_path = "MOUNT_PATH_2"
}
}
volumes {
name = "VOLUME_NAME"
empty_dir {
medium = "MEMORY"
size_limit = "SIZE_LIMIT"
}
}
volumes {
name = "VOLUME_NAME_2"
empty_dir {
medium = "MEMORY"
size_limit = "SIZE_LIMIT_2"
}
}
}
}
מחליפים את מה שכתוב בשדות הבאים:
- WORKER_POOL: השם של מאגר העובדים של Cloud Run.
- REGION: האזור Google Cloud . לדוגמה,
europe-west1. - IMAGE_URL, IMAGE_URL_2: הפניה לתמונת מאגר שמכילה את מאגר העובדים, כמו
us-docker.pkg.dev/cloudrun/container/worker-pool:latest. - VOLUME_NAME, VOLUME_NAME_2: כל שם שרוצים לתת לנפח. הערך הזה משמש למיפוי עוצמת הקול לנקודת העלייה של עוצמת הקול.
- MOUNT_PATH, MOUNT_PATH_2: הנתיב היחסי במערכת הקבצים של הקונטיינר שבו רוצים לטעון את הווליום. לדוגמה:
/mnt/my-volume. - SIZE_LIMIT, SIZE_LIMIT_2: מגבלת הזיכרון שרוצים להקצות לנפח, ב-MiB או ב-GiB (מצוין כ-Mi או כ-Gi) – לדוגמה,
500Mi. המגבלה הזו צריכה להיות נמוכה מהזיכרון הכולל שהוגדר עבור הקונטיינרים.
הצגת ההגדרות של משתני הסביבה במאגר העובדים
נכנסים ל-Cloud Run במסוף Google Cloud :
לוחצים על Worker pools כדי להציג את רשימת מאגרי העובדים שנפרסו.
לוחצים על מאגר העובדים שרוצים לבדוק כדי להציג את חלונית הפרטים שלו.
לוחצים על הכרטיסייה Containers כדי להציג את ההגדרה של מאגר העובדים.
קריאה וכתיבה של נתונים בווליום
אם משתמשים בתכונה של 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 worker-pools update WORKER_POOL \ --clear-volumes \ --clear-volume-mounts
gcloud run worker-pools update WORKER_POOL \ --container=container1 \ --clear-volumes \ --clear-volume-mounts \ --container=container2 \ --clear-volumes \ --clear-volume-mounts
הסרה של אמצעי אחסון בודדים והצמדות של אמצעי אחסון
כדי להסיר נפח אחסון, צריך גם להסיר את כל הנפחים המחוברים שמשתמשים בנפח הזה.
כדי להסיר אמצעי אחסון בודדים או נקודות לחיבור אמצעי אחסון, משתמשים בדגלים remove-volume ו-remove-volume-mount:
gcloud run worker-pools update WORKER_POOL \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH