בדף הזה מוסבר איך לטעון קובץ שמשותף ב-NFS כנפח אחסון ב-Cloud Run. אתם יכולים להשתמש בכל שרת NFS, כולל שרת NFS משלכם שמתארח באופן מקומי או במכונה וירטואלית של Compute Engine. אם אין לכם שרת NFS, אנחנו ממליצים על Filestore, שהוא שירות NFS מנוהל של Google Cloud.
כשמגדירים את שיתוף הקבצים ב-NFS כנפח אחסון ב-Cloud Run, שיתוף הקבצים מוצג כקבצים במערכת הקבצים של הקונטיינר. אחרי שמתקינים את התיקייה המשותפת כנפח, אפשר לגשת אליה כאילו היא ספרייה במערכת הקבצים המקומית, באמצעות פעולות וספריות של מערכת הקבצים של שפת התכנות.
מגבלות
- ב-Cloud Run אין תמיכה בנעילת NFS. נפחי NFS נטענים באופן אוטומטי במצב ללא נעילה.
- נתיבים אסורים: ב-Cloud Run אי אפשר לטעון אמצעי אחסון ב-
/dev, ב-/procאו ב-/sys, או בספריות המשנה שלהם. - תאימות לשרת NFS: שירות Cloud Run מעדכן מדי פעם את לקוח ה-NFS במכונות שלו. אם אתם משתמשים בשרת NFS משלכם, חשוב להקפיד להשתמש בגרסה עדכנית ונתמכת כדי שהחיבורים ימשיכו לפעול אחרי העדכונים האלה. לבעיות תאימות עדכניות, ראו בעיות מוכרות.
לפני שמתחילים
כדי לטעון שרת NFS כנפח אחסון ב-Cloud Run, צריך לוודא שיש לכם:
- רשת VPC שבה פועל שרת ה-NFS או מכונת Filestore.
- שרת NFS שפועל ברשת VPC, כששירות Cloud Run מחובר לאותה רשת VPC. אם עדיין אין לכם שרת NFS, אתם יכולים ליצור מכונה של Filestore.
- שירות Cloud Run מחובר לרשת ה-VPC שבה פועל שרת ה-NFS. כדי לקבל את הביצועים הכי טובים, השתמשו ב-Direct VPC במקום במחברי VPC.
- אם אתם משתמשים בפרויקט קיים, ודאו שהגדרת חומת האש של ה-VPC מאפשרת ל-Cloud Run להגיע לשרת ה-NFS. (אם אתם מתחילים מפרויקט חדש, זה נכון כברירת מחדל). אם אתם משתמשים ב-Filestore כשרת NFS, פעלו לפי ההוראות במאמרי העזרה של Filestore כדי ליצור כלל תעבורת נתונים יוצאת בחומת האש, שיאפשר ל-Cloud Run להגיע ל-Filestore.
- מגדירים את ההרשאות בשיתוף הקבצים המרוחק של NFS כדי לאפשר גישה למשתמש של הקונטיינר. כברירת מחדל, Filestore מספק גישת קריאה לכל המשתמשים, אבל מגביל את גישת הכתיבה למשתמש ה-root (
uid 0). אם הקונטיינר דורש גישת כתיבה ולא פועל כמשתמש root, צריך להשתמש בלקוח מחובר (שפועל כ-root) כדי לשנות את הרשאות השיתוף. לדוגמה, אפשר להשתמש בפקודהchownכדי לשנות את הבעלות על הקבצים או הספריות למזהה המשתמש הספציפי שהקונטיינר פועל כמזהה שלו.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להגדרה ולפריסה של שירותי 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, עיינו במדריך להגדרת זהות השירות. מידע נוסף על הקצאת תפקידים זמין במאמרים הרשאות פריסה וניהול הגישה.
טעינת נפח NFS
אפשר לטעון כמה שרתי NFS, מכונות Filestore או סוגי נפחים אחרים בנתיבי טעינה שונים.
אם משתמשים בכמה קונטיינרים, קודם צריך לציין את אמצעי האחסון ואז לציין את נקודות הטעינה של אמצעי האחסון לכל קונטיינר.
המסוף
נכנסים ל-Cloud Run במסוף Google Cloud :
בתפריט הניווט של Cloud Run, לוחצים על Services:
אם אתם מגדירים שירות חדש, לוחצים על Deploy container וממלאים את דף הגדרות השירות הראשוני. לוחצים על Containers, Networking, Security כדי להרחיב את דף הגדרת השירות, ואז לוחצים על Volumes.
אם אתם מגדירים שירות קיים, לוחצים על השירות ואז על הכרטיסייה Containers.
לוחצים על Mount volume.
לוחצים על NFS בתור סוג הנפח.
בשדה Mount path, מזינים את הנתיב שבו רוצים לטעון את הנפח.
בשדה NFS server, מזינים את שם הדומיין או המיקום (בפורמט
IP_ADDRESS) של שיתוף הקבצים ב-NFS.בשדה Path, מזינים את הנתיב לספריית שרת ה-NFS שרוצים לטעון.
לוחצים על Save.
כדי ליצור שירות חדש, לוחצים על יצירה. לוחצים על View diff & redeploy ואז על Deploy changes בשירות קיים.
gcloud
כדי להוסיף נקודת טעינה של אמצעי אחסון:
gcloud run services update SERVICE \ --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY
מחליפים את מה שכתוב בשדות הבאים:
- SERVICE: שם השירות.
- MOUNT_PATH: הנתיב היחסי שבו אתם טוענים את אמצעי האחסון, לדוגמה
/mnt/my-volume. - IP_ADDRESS: המיקום של שיתוף הקבצים ב-NFS.
- NFS_PATH: הנתיב לשיתוף הקבצים ב-NFS, שמתחיל בלוכסן, לדוגמה
/example-directory. - READ_ONLY: הערך
trueכדי להגדיר את אמצעי האחסון לקריאה בלבד, או הערךfalseכדי לאפשר כתיבה.
אם משתמשים בכמה קונטיינרים, קודם מציינים את אמצעי האחסון ואז מציינים את נקודות הטעינה של אמצעי האחסון לכל קונטיינר:
gcloud run services update SERVICE \ --add-volume=name VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --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
מעדכנים את השדות MOUNT_PATH, VOLUME_NAME, IP_ADDRESS ו-NFS_PATH לפי הצורך. אם יש לכם כמה נקודות טעינה של אמצעי אחסון, יהיו לכם כמה מאפיינים כאלה.
apiVersion: run.googleapis.com/v1 kind: Service metadata: name: SERVICE spec: template: metadata: annotations: run.googleapis.com/execution-environment: gen2 spec: containers: - image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME nfs: server: IP_ADDRESS path: NFS_PATH readOnly: IS_READ_ONLY
מחליפים את מה שכתוב בשדות הבאים:
- SERVICE: השם של שירות Cloud Run
- MOUNT_PATH: הנתיב היחסי שבו אתם טוענים את אמצעי האחסון, לדוגמה,
/mnt/my-volume. - VOLUME_NAME: השם שרוצים לתת לנפח האחסון. הערך VOLUME_NAME משמש למיפוי של אמצעי האחסון לנקודת הטעינה של אמצעי האחסון.
- IP_ADDRESS: הכתובת של שיתוף הקבצים ב-NFS.
- NFS_PATH: הנתיב לשיתוף הקבצים ב-NFS, שמתחיל בלוכסן, לדוגמה
/example-directory. - IS_READ_ONLY: הערך
Trueכדי להגדיר את אמצעי האחסון לקריאה בלבד, או הערךFalseכדי לאפשר כתיבה.
יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:
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"
template {
execution_environment = "EXECUTION_ENVIRONMENT_GEN2"
containers {
image = "us-docker.pkg.dev/cloudrun/container/hello"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
vpc_access {
network_interfaces {
network = "default"
subnetwork = "default"
}
}
volumes {
name = "VOLUME_NAME"
nfs {
server = google_filestore_instance.default.networks[0].ip_addresses[0]
path = "NFS_PATH"
read_only = IS_READ_ONLY
}
}
}
}
resource "google_filestore_instance" "default" {
name = "cloudrun-service-ro"
location = "REGION"
tier = "BASIC_HDD"
file_shares {
capacity_gb = 1024
name = "share1"
}
networks {
network = "default"
modes = ["MODE_IPV4"]
}
}
מחליפים את מה שכתוב בשדות הבאים:
- SERVICE: השם של שירות Cloud Run.
- REGION: האזור של Google Cloud . לדוגמה:
europe-west1. - MOUNT_PATH: הנתיב היחסי שבו אתם טוענים את הנפח, לדוגמה
/mnt/nfs/filestore. - VOLUME_NAME: השם שרוצים לתת לנפח האחסון. הערך של VOLUME_NAME משמש למיפוי של אמצעי האחסון לנקודת הטעינה של אמצעי האחסון.
- NFS_PATH: הנתיב לשיתוף הקבצים ב-NFS, שמתחיל בלוכסן, לדוגמה
/share1. - IS_READ_ONLY: הערך
Trueכדי להגדיר את אמצעי האחסון לקריאה בלבד, או הערךFalseכדי לאפשר כתיבה.
קריאה וכתיבה של אמצעי אחסון
אם אתם משתמשים בתכונה של טעינת נפח אחסון ב-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");פתרון בעיות ב-NFS
אם נתקלתם בבעיות, כדאי לבדוק את הדברים הבאים:
- שירות Cloud Run מחובר לרשת ה-VPC שבה נמצא שרת ה-NFS.
- אין כללים של חומת אש שמונעים מ-Cloud Run להגיע לשרת ה-NFS.
- אם הקונטיינר צריך לכתוב נתונים, ודאו שהרשאות השיתוף של NFS מוגדרות כך שהמשתמש של הקונטיינר יוכל לכתוב.
- אם טעינת שרת NFS בניהול עצמי נכשלת עם השגיאה
mount.nfs: mount system call failedאוinput/output error, צריך לבדוק אם השרת מריץ את NFS-Ganesha בגרסה 3.x או גרסה קודמת. לפרטים ולתיקונים, ראו בעיות מוכרות.
זמן ההפעלה של קונטיינר וטעינת נפח NFS
שימוש ב-NFS volume mounts יכול להאריך קצת את זמן ההפעלה הראשונית של הקונטיינר ב-Cloud Run, כי ה-volume mount מתחיל לפני הקונטיינרים. הקונטיינר יתחיל לפעול רק אם ה-NFS יותקן בהצלחה.
חשוב לזכור ש-NFS טוען את אמצעי האחסון רק אחרי שהוא מתחבר לשרת ומאחזר את הטיפול בקבצים. אם Cloud Run לא מצליח להתחבר לשרת, שירות Cloud Run לא יופעל.
בנוסף, עיכובים ברשת יכולים להשפיע על זמן ההפעלה של הקונטיינר, כי ב-Cloud Run יש זמן קצוב לתפוגה של 30 שניות לכל נקודות ה-mount. אם טעינת ה-NFS נמשכת יותר מ-30 שניות, שירות Cloud Run לא יופעל.
מאפייני הביצועים של NFS
אם יוצרים יותר מנפח NFS אחד, כל הנפחים נטענים במקביל.
מכיוון ש-NFS היא מערכת קובצי רשת, היא כפופה למגבלות רוחב פס, והגישה למערכת הקבצים יכולה להיות מושפעת מרוחב פס מוגבל.
כשכותבים לנפח ה-NFS, הכתיבה נשמרת בזיכרון של Cloud Run עד שהנתונים נמחקים. הנתונים נמחקים במקרים הבאים:
- האפליקציה מרוקנת את נתוני הקובץ באופן מפורש באמצעות sync(2), msync(2) או fsync(3).
- האפליקציה סוגרת קובץ באמצעות close(2).
- עומס על הזיכרון מאלץ את המערכת לפנות משאבי זיכרון.
מידע נוסף זמין במאמרי העזרה של Linux בנושא NFS.
ניקוי והסרה של אמצעי אחסון ונקודות טעינה של אמצעי אחסון
אפשר לנקות את כל אמצעי האחסון ונקודות הטעינה, או להסיר אמצעי אחסון ונקודות טעינה ספציפיים.
ניקוי כל אמצעי האחסון ונקודות הטעינה של אמצעי האחסון
כדי לנקות את כל אמצעי האחסון ונקודות הטעינה של אמצעי האחסון מהשירות עם קונטיינר יחיד, מריצים את הפקודה הבאה:
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