הגדרת טעינת נפח אחסון של NFS למשימות

בדף הזה מוסבר איך לטעון תיקיית קבצים משותפת ב-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, צריך לוודא שיש לכם:

  • רשת 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) – זהות השירות

רשימה של תפקידים והרשאות ב-IAM שמשויכים ל-Cloud Run מופיעה במאמרים תפקידי IAM ב-Cloud Run והרשאות IAM ב-Cloud Run. אם המשימה ב-Cloud Run מתממשקת עם ממשקי API שלGoogle Cloud , כמו ספריות הלקוח ב-Cloud, עיינו במדריך להגדרת זהות השירות. מידע נוסף על הקצאת תפקידים זמין במאמרים הרשאות פריסה וניהול הגישה.

טעינת נפח NFS

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

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

המסוף

  1. נכנסים לדף Cloud Run במסוף Google Cloud :

    כניסה ל-Cloud Run

  2. בתפריט הניווט של Cloud Run, לוחצים על Jobs:

    1. אם אתם יוצרים משימה חדשה, לוחצים על Deploy container כדי למלא את דף הגדרות המשימה הראשוני.

    2. אם אתם מגדירים משימה קיימת, בוחרים את המשימה ולוחצים על View and edit job configuration.

  3. לוחצים על Containers, Connections, Security כדי להרחיב את דף מאפייני המשימה.

  4. לוחצים על הכרטיסייה כרכים.

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

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

  7. כדי להגדיר את עוצמת הקול:

    1. בשדה Mount path, מזינים את הנתיב שבו רוצים לטעון את אמצעי האחסון.
    2. בשדה NFS server, מזינים את שם הדומיין או המיקום (בפורמט IP_ADDRESS) של שיתוף הקבצים ב-NFS.
    3. בשדה Path, מזינים את הנתיב לספריית שרת ה-NFS שרוצים לטעון.
    4. לוחצים על Save.
  8. לוחצים על יצירה או על עדכון.

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

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

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

    gcloud run jobs replace job.yaml

    כברירת מחדל, הפקודה gcloud run jobs replace משתמשת בקובץ job.yaml אם הוא קיים.

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 עם האזור 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

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

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

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

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

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

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

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