בדף הזה מוסבר איך לטעון שיתוף קבצים של NFS כנפח ב-Cloud Run. אפשר להשתמש בכל שרת NFS, כולל שרת NFS משלכם שמארח את עצמו באופן מקומי או במכונה וירטואלית ב-Compute Engine. אם עדיין אין לכם שרת NFS, מומלץ להשתמש ב-Filestore, שהוא שירות NFS מנוהל מלא של Cloud de Confiance by S3NS.
טעינת שיתוף הקבצים של NFS כנפח ב-Cloud Run מציגה את שיתוף הקבצים כקבצים במערכת הקבצים של הקונטיינר. אחרי שמתקינים את שיתוף הקבצים כנפח אחסון, אפשר לגשת אליו כאילו הוא ספרייה במערכת הקבצים המקומית, באמצעות פעולות וספריות של מערכת הקבצים בשפת התכנות.
מגבלות
- Cloud Run לא תומך בנעילת NFS. נפחי NFS מותקנים אוטומטית במצב ללא נעילה.
- נתיבים אסורים: ב-Cloud Run אי אפשר לטעון נפח בנתיבים
/dev,/procאו/sys, או בספריות המשנה שלהם.
לפני שמתחילים
כדי לטעון שרת NFS כנפח ב-Cloud Run, צריך לוודא שיש לכם:
- רשת VPC שבה פועל שרת ה-NFS או מופע Filestore.
- שרת NFS שפועל ברשת VPC, כשהג'וב של Cloud Run מחובר לרשת ה-VPC הזו. אם עדיין אין לכם שרת NFS, אתם יכולים ליצור אותו על ידי יצירת אירוע Filestore.
- הג'וב של Cloud Run מצורף לרשת ה-VPC שבה שרת ה-NFS פועל. כדי ליהנות מהביצועים הכי טובים, מומלץ להשתמש בDirect VPC ולא ב-VPC Connectors.
- אם אתם משתמשים בפרויקט קיים, ודאו שההגדרה של חומת האש של ה-VPC מאפשרת ל-Cloud Run להגיע לשרת ה-NFS. (אם מתחילים מפרויקט חדש, זה נכון כברירת מחדל). אם אתם משתמשים ב-Filestore כשרת NFS, אתם צריכים ליצור כלל ליציאה מחומת האש כדי לאפשר ל-Cloud Run להגיע ל-Filestore. לשם כך, פועלים לפי ההוראות במסמכי Filestore.
- מגדירים את ההרשאות בשיתוף הקבצים המרוחק של NFS כדי לאפשר גישה למשתמש של הקונטיינר. כברירת מחדל, Filestore מספק גישת קריאה לכל המשתמשים, אבל מגביל את גישת הכתיבה למשתמש הבסיסי (
uid 0). אם הקונטיינר שלכם דורש גישת כתיבה ולא פועל כמשתמש בסיסי, אתם צריכים להשתמש בלקוח מחובר (שפועל כמשתמש בסיסי) כדי לשנות את הרשאות השיתוף. לדוגמה, אפשר להשתמש בפקודהchownכדי לשנות את הבעלות על הקבצים או הספריות למזהה המשתמש הספציפי שהקונטיינר פועל כמותו.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להגדרת משימות של Cloud Run, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים במשימה:
- Cloud Run Developer (
roles/run.developer) – המשימה ב-Cloud Run - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) – זהות השירות
רשימת ההרשאות והתפקידים ב-IAM שמשויכים ל-Cloud Run מופיעה במאמרים תפקידי IAM ב-Cloud Run והרשאות IAM ב-Cloud Run. אם עבודת Cloud Run שלכם מתקשרת עםCloud de Confiance ממשקי API, כמו ספריות לקוח ב-Cloud, כדאי לעיין במדריך להגדרת זהות שירות. מידע נוסף על מתן תפקידים זמין במאמרים הרשאות פריסה וניהול גישה.
צירוף נפח אחסון מסוג NFS
אפשר לטעון כמה שרתי NFS, מופעי Filestore או סוגים אחרים של אמצעי אחסון בנתיבי טעינה שונים.
אם משתמשים בכמה מאגרי תגים, קודם מציינים את עוצמת הקול, ואז מציינים את נקודות ההרכבה של עוצמת הקול לכל מאגר תגים.
המסוף
נכנסים לדף Jobs ב-Cloud Run במסוף Cloud de Confiance by S3NS :
לוחצים על Deploy container (פריסת מאגר תגים) כדי למלא את דף ההגדרות הראשוניות של המשימה. אם אתם מגדירים משימה קיימת, בוחרים את המשימה ולוחצים על View and edit job configuration (הצגה ועריכה של הגדרת המשימה).
לוחצים על Containers, Connections, Security (מאגרי תגים, חיבורים, אבטחה) כדי להרחיב את דף מאפייני העבודה.
לוחצים על הכרטיסייה Volumes (אמצעי אחסון).
לוחצים על Mount volume (התקנת אמצעי אחסון).
לוחצים על NFS בתור סוג הנפח.
כדי להגדיר את עוצמת הקול:
- בשדה נתיב להרכבה, מזינים את הנתיב שבו רוצים להרכיב את אמצעי האחסון.
- בשדה NFS server (שרת NFS), מזינים את שם הדומיין או את המיקום (בפורמט
IP_ADDRESS) של שיתוף הקבצים ב-NFS. - בשדה נתיב, מזינים את הנתיב לספריית שרת ה-NFS שרוצים לטעון.
- לוחצים על Save.
לוחצים על יצירה או על עדכון.
gcloud
כדי להוסיף נקודת גישה לנפח:
gcloud run jobs update JOB \ --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY
מחליפים את מה שכתוב בשדות הבאים:
- JOB: השם של המשימה.
- MOUNT_PATH: הנתיב במערכת הקבצים של קובץ הקונטיינר שבו רוצים לטעון את הווליום.
- IP_ADDRESS: המיקום של שיתוף קבצים ב-NFS.
- NFS_PATH: הנתיב לשיתוף הקבצים ב-NFS.
- READ_ONLY:
trueכדי להגדיר את אמצעי האחסון לקריאה בלבד, אוfalseכדי לאפשר כתיבה.
אם אתם משתמשים בכמה מאגרי תגים, קודם מציינים את אמצעי האחסון, ואז מציינים את נקודות הגישה לאמצעי האחסון לכל מאגר תגים:
gcloud run jobs update JOB \ --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 jobs describe JOB_NAME --format export > job.yaml
מעדכנים את MOUNT_PATH, VOLUME_NAME, IP_ADDRESS ו-NFS_PATH לפי הצורך. אם יש לכם כמה נקודות לחיבור נפח אחסון, יהיו לכם כמה עותקים של המאפיינים האלה.
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME spec: metadata: template: metadata: annotations: run.googleapis.com/execution-environment: gen2 spec: template: 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
מחליפים את מה שכתוב בשדות הבאים:
- JOB: השם של המשימה ב-Cloud Run
- MOUNT_PATH: הנתיב היחסי שבו אתם מטמיעים את אמצעי האחסון, לדוגמה,
/mnt/my-volume. - VOLUME_NAME: כל שם שרוצים לתת לנפח האחסון. הערך VOLUME_NAME משמש למיפוי הנפח לנקודת הטעינה של הנפח.
- IP_ADDRESS: הכתובת של שיתוף קבצים ב-NFS.
- NFS_PATH: הנתיב לשיתוף הקבצים ב-NFS.
- IS_READ_ONLY:
Trueכדי להגדיר את אמצעי האחסון לקריאה בלבד, אוFalseכדי לאפשר כתיבה.
יוצרים או מעדכנים את העבודה באמצעות הפקודה הבאה:
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 = "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-job"
location = "REGION"
tier = "BASIC_HDD"
file_shares {
capacity_gb = 1024
name = "share1"
}
networks {
network = "default"
modes = ["MODE_IPV4"]
}
}
מחליפים את מה שכתוב בשדות הבאים:
- JOB_NAME: השם של המשימה ב-Cloud Run.
- REGION עם האזור Cloud de Confiance . לדוגמה:
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
שימוש בנקודות חיבור של נפח NFS יכול להגדיל מעט את זמן ההפעלה הקרה של קונטיינר Cloud Run, כי נקודת החיבור של הנפח מופעלת לפני הפעלת הקונטיינרים. הקונטיינר יופעל רק אם NFS יותקן בהצלחה.
שימו לב: מערכת NFS תבצע טעינה של נפח אחסון רק אחרי יצירת חיבור לשרת ואחרי שליפת ידית קובץ. אם Cloud Run לא מצליח ליצור חיבור לשרת, משימת Cloud Run לא תופעל.
בנוסף, עיכובים ברשת יכולים להשפיע על זמן ההפעלה של הקונטיינר, כי ב-Cloud Run יש פסק זמן כולל של 30 שניות לכל הנפחים. אם חולפות יותר מ-30 שניות עד שה-NFS מותקן, משימת Cloud Run לא תתחיל.
מאפייני הביצועים של NFS
אם יוצרים יותר מנפח NFS אחד, כל הנפחים מותקנים במקביל.
מכיוון ש-NFS היא מערכת קבצים ברשת, היא כפופה למגבלות רוחב פס, וגישה למערכת הקבצים עשויה להיות מושפעת מרוחב פס מוגבל.
כשכותבים לנפח NFS, הפעולה נשמרת בזיכרון של Cloud Run עד שהנתונים נמחקים. הנתונים נמחקים מהזיכרון במקרים הבאים:
- האפליקציה מרוקנת את נתוני הקובץ באופן מפורש באמצעות sync(2), msync(2) או fsync(3).
- האפליקציה סוגרת קובץ באמצעות close(2).
- עומס על הזיכרון גורם לשחרור משאבי זיכרון של המערכת.
מידע נוסף זמין במאמרי העזרה של Linux בנושא NFS.
ניקוי והסרה של נפחים ונקודות חיבור של נפחים
אפשר לנקות את כל אמצעי האחסון והחיבורים, או להסיר אמצעי אחסון וחיבורים ספציפיים.
ניקוי כל אמצעי האחסון והחיבורים שלהם
כדי לנקות את כל אמצעי האחסון והטעינות של אמצעי האחסון מהעבודה שלכם עם קונטיינר יחיד, מריצים את הפקודה הבאה:
gcloud run jobs update JOB \ --clear-volumes \ --clear-volume-mounts
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