הגדרת נקודות חיבור של נפחי אחסון מסוג NFS לשירותים

בדף הזה מוסבר איך לטעון תיקיית קבצים משותפת ב-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.
  • אם אתם משתמשים בפרויקט קיים, ודאו שהגדרת חומת האש של ה-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 שלCloud de Confiance , כמו ספריות הלקוח ב-Cloud, עיינו במדריך להגדרת זהות השירות. מידע נוסף על הקצאת תפקידים זמין במאמרים הרשאות פריסה וניהול הגישה.

טעינת נפח NFS

אפשר לטעון כמה שרתי NFS, מכונות Filestore או סוגי נפחים אחרים בנתיבי טעינה שונים.

אם אתם משתמשים בכמה קונטיינרים, קודם צריך לציין את אמצעי האחסון ואז לציין את נקודות הגישה לאמצעי האחסון של כל קונטיינר.

המסוף

  1. נכנסים ל-Cloud Run במסוף Cloud de Confiance by S3NS :

    כניסה ל-Cloud Run

  2. בתפריט הניווט של Cloud Run, בוחרים באפשרות Services ולוחצים על Deploy container כדי להגדיר שירות חדש. אם אתם מגדירים שירות קיים, לוחצים על השירות ואז על הכרטיסייה Containers.

  3. אם אתם מגדירים שירות חדש, מלאו את דף הגדרות השירות הראשוניות, לחצו על Containers, Networking, Security כדי להרחיב את דף הגדרות השירות, ואז לחצו על Volumes.

  4. לוחצים על Mount volume.

  5. לוחצים על NFS בתור סוג הנפח.

  6. בשדה Mount path, מזינים את הנתיב שבו רוצים לטעון את הנפח.

  7. בשדה NFS server, מזינים את שם הדומיין או המיקום (בפורמט IP_ADDRESS) של שיתוף הקבצים ב-NFS.

  8. בשדה Path, מזינים את הנתיב לספריית שרת ה-NFS שרוצים לטעון.

  9. לוחצים על Save.

  10. כדי ליצור שירות חדש, לוחצים על יצירה. לוחצים על 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

  1. אם אתם יוצרים שירות חדש, דלגו על השלב הזה. אם אתם מעדכנים שירות קיים, הורידו את הגדרת ה-YAML שלו:

    gcloud run services describe SERVICE --format export > service.yaml
  2. מעדכנים את השדות 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 כדי לאפשר כתיבה.
  3. יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:

    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: האזור של 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 שניות לכל נקודות ה-mount. אם לוקח יותר מ-30 שניות לטעון את NFS, השירות של Cloud Run לא יופעל.

מאפייני הביצועים של NFS

אם יוצרים יותר מנפח NFS אחד, כל הנפחים נטענים במקביל.

מכיוון ש-NFS היא מערכת קובצי רשת, היא כפופה למגבלות רוחב פס, והגישה למערכת הקבצים יכולה להיות מושפעת מרוחב פס מוגבל.

כשכותבים לנפח ה-NFS, הכתיבה מאוחסנת בזיכרון של Cloud Run עד שהנתונים נמחקים. הנתונים נמחקים במקרים הבאים:

  • האפליקציה מרוקנת את נתוני הקובץ באופן מפורש באמצעות sync(2),‏ msync(2) או fsync(3).
  • האפליקציה סוגרת קובץ באמצעות close(2).
  • עומס על הזיכרון מאלץ את המערכת לפנות משאבים בזיכרון המערכת.

מידע נוסף זמין במאמרי העזרה של Linux בנושא NFS.

ניקוי והסרה של אמצעי אחסון ונקודות טעינה של אמצעי אחסון

אפשר לנקות את כל אמצעי האחסון ונקודות הטעינה, או להסיר אמצעי אחסון ונקודות טעינה ספציפיים.

ניקוי כל אמצעי האחסון ונקודות הטעינה של אמצעי האחסון

כדי לנקות את כל אמצעי האחסון ונקודות ה-mount של אמצעי האחסון מהשירות עם קונטיינר יחיד, מריצים את הפקודה הבאה:

gcloud run services update SERVICE \
    --clear-volumes \
    --clear-volume-mounts
אם יש לכם כמה קונטיינרים, פועלים לפי המוסכמות של CLI של קונטיינרים מסוג sidecar כדי לנקות את אמצעי האחסון ואת נקודות הגישה לאמצעי האחסון:

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