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

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

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

המסוף

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

    כניסה ל-Cloud Run

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

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

  4. לוחצים על הכרטיסייה Volumes (נפחים).

    תמונה

    • לוחצים על Mount volume (התקנת אמצעי אחסון).
    • לוחצים על NFS בתור סוג הנפח.
    • בשדה Mount path (נתיב ההרכבה), מזינים את הנתיב שבו רוצים להרכיב את אמצעי האחסון.
    • בשדה NFS server (שרת NFS), מזינים את שם הדומיין או את המיקום (בפורמט IP_ADDRESS) של שיתוף הקבצים ב-NFS.
    • בשדה נתיב, מזינים את הנתיב לספריית שרת ה-NFS שרוצים לטעון.
    • לוחצים על Save.
  5. לוחצים על יצירה או על פריסה.

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

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

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

שימוש בנקודות חיבור של נפח 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 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