בדף הזה מוסבר איך לטעון שיתוף קבצים ב-NFS כנפח ב-Cloud Run. אפשר להשתמש בכל שרת NFS, כולל שרת NFS משלכם שמארח את עצמו באופן מקומי או במכונה וירטואלית ב-Compute Engine. אם עדיין אין לכם שרת NFS, מומלץ להשתמש ב-Filestore, שהוא שירות NFS מנוהל מלא של Google Cloud.
טעינת שיתוף הקבצים של NFS כנפח ב-Cloud Run מציגה את שיתוף הקבצים כקבצים במערכת הקבצים של הקונטיינר. אחרי שמעלים את שיתוף הקבצים כנפח אחסון, אפשר לגשת אליו כאילו הוא ספרייה במערכת הקבצים המקומית, באמצעות פעולות וספריות של מערכת הקבצים בשפת התכנות.
נתיבים אסורים
ב-Cloud Run אי אפשר לטעון נפח אחסון ב-/dev, ב-/proc או ב-/sys, או בספריות המשנה שלהם.
מגבלות
- Cloud Run לא תומך בנעילת NFS. נפחי NFS מותקנים אוטומטית במצב ללא נעילה.
לפני שמתחילים
כדי לטעון שרת 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 מספק גישת קריאה לכל המשתמשים, אבל מגביל את גישת הכתיבה למשתמש Root (
uid 0). אם הקונטיינר שלכם דורש גישת כתיבה ולא פועל כמשתמש Root, אתם צריכים להשתמש בלקוח מחובר (שפועל כמשתמש Root) כדי לשנות את הרשאות השיתוף. לדוגמה, אפשר להשתמש בפקודהchownכדי לשנות את הבעלות על הקבצים או הספריות למזהה המשתמש הספציפי שהקונטיינר פועל כמותו.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להגדרה ולפריסה של שירותי Cloud Run, אתם צריכים לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בשירות:
-
Cloud Run Developer (
roles/run.developer) – שירות Cloud Run -
משתמש בחשבון שירות (
roles/iam.serviceAccountUser) – זהות השירות
אם אתם פורסים שירות או פונקציה מקוד מקור, אתם צריכים גם לקבל תפקידים נוספים בפרויקט ובחשבון השירות של Cloud Build.
רשימת ההרשאות והתפקידים ב-IAM שמשויכים ל-Cloud Run מופיעה במאמרים תפקידי IAM ב-Cloud Run והרשאות IAM ב-Cloud Run. אם שירות Cloud Run שלכם מתקשר עםGoogle Cloud ממשקי API, כמו ספריות לקוח ב-Cloud, כדאי לעיין במדריך להגדרת זהות שירות. מידע נוסף על מתן תפקידים זמין במאמרים הרשאות פריסה וניהול גישה.
צירוף נפח אחסון מסוג NFS
אפשר לטעון כמה שרתי NFS, מופעי Filestore או סוגים אחרים של נפחים בנתיבי טעינה שונים.
אם אתם משתמשים בכמה מאגרי תגים, קודם מציינים את עוצמת הקול, ואז מציינים את נקודות הטעינה של עוצמת הקול לכל מאגר תגים.
המסוף
נכנסים ל-Cloud Run במסוף Google Cloud :
בתפריט הניווט של Cloud Run, בוחרים באפשרות Services (שירותים) ולוחצים על Deploy container (פריסת קונטיינר) כדי להגדיר שירות חדש. אם אתם מגדירים שירות קיים, לוחצים על השירות ואז על עריכה ופריסה של עדכון חדש.
אם אתם מגדירים שירות חדש, ממלאים את דף ההגדרות הראשוניות של השירות ואז לוחצים על Container(s), Volumes, Networking, Security (מאגרים, אמצעי אחסון, רשתות, אבטחה) כדי להרחיב את דף הגדרות השירות.
לוחצים על הכרטיסייה Volumes (נפחים).
- בקטע כרכים:
- לוחצים על הוספת עוצמת קול.
- בתפריט הנפתח Volume type, בוחרים באפשרות NFS כסוג הנפח.
- בשדה Volume name (שם נפח האחסון), מזינים את השם שרוצים להשתמש בו עבור נפח האחסון.
- בשדה NFS server (שרת NFS), מזינים את שם הדומיין או את המיקום (בפורמט
IP_ADDRESS) של שיתוף הקבצים ב-NFS. - בשדה נתיב, מזינים את הנתיב לספריית שרת ה-NFS שרוצים לטעון.
- לוחצים על סיום.
- לוחצים על הכרטיסייה Container (מאגר), מרחיבים את מאגר התגים שאליו רוצים לצרף את אמצעי האחסון כדי לערוך אותו.
- לוחצים על הכרטיסייה Volume Mounts (חיבורי אמצעי אחסון).
- לוחצים על Mount volume (הוספת אמצעי אחסון).
- בוחרים את נפח ה-NFS מהתפריט.
- מציינים את הנתיב שבו רוצים לטעון את אמצעי האחסון.
- לוחצים על Mount Volume (הוספת נפח אחסון).
- בקטע כרכים:
לוחצים על יצירה או על פריסה.
gcloud
כדי להוסיף אמצעי אחסון ולהפעיל אותו:
gcloud run services update SERVICE \ --add-volume=name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
מחליפים את:
- SERVICE בשם של השירות.
- VOLUME_NAME בשם שרוצים לתת לנפח האחסון.
- IP_ADDRESS עם המיקום של שיתוף הקבצים ב-NFS.
- NFS_PATH עם הנתיב לשיתוף הקבצים ב-NFS שמתחיל בלוכסן, לדוגמה
/example-directory. - MOUNT_PATH עם הנתיב היחסי שבו אתם מטמיעים את אמצעי האחסון, לדוגמה,
/mnt/my-volume. - VOLUME_NAME בשם שרוצים לתת לנפח האחסון. הערך VOLUME_NAME משמש למיפוי הנפח לנקודת הטעינה של הנפח.
כדי לטעון את אמצעי האחסון כאמצעי אחסון לקריאה בלבד:
--add-volume=name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
אם אתם משתמשים בכמה מאגרי תגים, קודם מציינים את אמצעי האחסון, ואז מציינים את נקודות הטעינה של אמצעי האחסון לכל מאגר תגים:
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
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")Go
משתמשים בחבילה 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 יכול להאריך מעט את זמן ההפעלה במצב התחלתי(cold start) של קונטיינר 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 services update SERVICE \ --clear-volumes --clear-volume-mounts
אם יש לכם כמה מאגרי תגים, אתם יכולים לפעול לפי המוסכמות של CLI של sidecars כדי לנקות את אמצעי האחסון והחיבורים של אמצעי האחסון:
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