טעינת קטגוריות של Cloud Storage כנפחי אחסון קבועים

במדריך הזה מוסבר איך להשתמש בנפחי אחסון מתמיד של Kubernetes שמגובים על ידי קטגוריות של Cloud Storage כדי לנהל משאבי אחסון עבור קבוצות Pod של Kubernetes ב-Google Kubernetes Engine ‏ (GKE). כדאי להשתמש באפשרות האחסון הזו אם אתם כבר מכירים את נפחי האחסון המתמיד ורוצים עקביות עם הפריסות הקיימות שלכם שמסתמכות על סוג המשאב הזה.

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

לפני שקוראים את הדף הזה, חשוב לוודא שמכירים את נפחי האחסון המתמיד של Kubernetes, את קבוצות ה-Pod של Kubernetes ואת קטגוריות Cloud Storage.

אם אתם רוצים ממשק יעיל שמבוסס על Pod ולא דורש ניסיון קודם בנפחי אחסון מתמיד של Kubernetes, כדאי לעיין במאמר בנושא טעינת קטגוריות של Cloud Storage כנפחי אחסון זמני של CSI.

לפני שמתחילים

חשוב לוודא שהשלמתם את הדרישות המוקדמות הבאות:

איך פועלים נפחי אחסון קבועים לקטגוריות של Cloud Storage

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

השימוש בנפח אחסון קבוע שמגובה על ידי קטגוריה של Cloud Storage כולל את הפעולות הבאות:

  1. הגדרת אחסון: מגדירים PersistentVolume באשכול GKE, כולל מנהל התקן CSI לשימוש וכל הפרמטרים הנדרשים. במנהל התקן ה-CSI של Cloud Storage FUSE, מציינים את שם הקטגוריה ופרטים רלוונטיים אחרים.

    אם רוצים, אפשר לשפר את הביצועים של מנהל ההתקן של CSI באמצעות התכונה file caching. שמירת קבצים במטמון יכולה לשפר את הביצועים של אפליקציות GKE על ידי שמירת קבצים ב-Cloud Storage שמתבצעת אליהם גישה לעיתים קרובות במטמון בדיסק מקומי מהיר יותר.

    בנוסף, אפשר להשתמש בתכונה הורדה מקבילה כדי להאיץ קריאה של קבצים גדולים מ-Cloud Storage להורדות מרובות-הליכים. אתם יכולים להשתמש בתכונה הזו כדי לשפר את זמני הטעינה של המודל, במיוחד כשמדובר בקריאות בגודל של יותר מ-‎1 GB.

  2. הפעלת ה-driver: כש-PersistentVolumeClaim מבקש אחסון שתואם למפרט של PersistentVolume, ‏ GKE מפעיל את ה-driver של Cloud Storage FUSE CSI.

  3. טעינת קטגוריה: דרייבר ה-CSI טוען את הקטגוריה לצומת שבו מתוזמן הפוד ששלח את הבקשה. כך התוכן של ה-Bucket נגיש ל-Pod כספרייה במערכת הקבצים המקומית של ה-Pod. כדי לחדד את האופן שבו קטגוריות נטענות במערכת הקבצים, אפשר להשתמש באפשרויות טעינה. אפשר גם להשתמש במאפייני נפח כדי להגדיר התנהגות ספציפית של מנהל התקן ה-CSI של Cloud Storage FUSE.

  4. חיבור מחדש: אם ה-Pod מופעל מחדש או מתוזמן מחדש לצומת אחר, מנהל ההתקן של CSI מרכיב מחדש את אותה קטגוריה לצומת החדש, כדי להבטיח גישה לנתונים.

יצירת נפח אחסון מתמיד

  1. יוצרים מניפסט של PersistentVolume עם המפרט הבא:

    Pod

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class  
      mountOptions:
        - implicit-dirs
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE  
    

    מחליפים את הערכים הבאים:

    • NAMESPACE: מרחב השמות של Kubernetes שבו רוצים לפרוס את ה-Pod.
    • BUCKET_NAME: השם של קטגוריית Cloud Storage שציינתם כשהגדרתם גישה לקטגוריות של Cloud Storage. אפשר לציין קו תחתון (_) כדי לטעון את כל הקטגוריות שלחשבון השירות של Kubernetes יש גישה אליהן. מידע נוסף זמין במאמר Dynamic mounting במאמרי העזרה של Cloud Storage FUSE.

    בדוגמה למניפסט מוצגות ההגדרות הנדרשות האלה:

    • spec.csi.driver: משתמשים ב-gcsfuse.csi.storage.gke.io כשם של מנהל התקן CSI.

    אפשר גם לשנות את המשתנים האלה:

    קפסולה (שמירה במטמון של קבצים)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class 
      mountOptions:
        - implicit-dirs
        - file-cache:max-size-mb:-1
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE 
    

    מחליפים את הערכים הבאים:

    • NAMESPACE: מרחב השמות של Kubernetes שבו רוצים לפרוס את ה-Pod.
    • BUCKET_NAME: שם הקטגוריה ב-Cloud Storage שציינתם כשקבעתם את הגישה לקטגוריות ב-Cloud Storage. אפשר לציין קו תחתון (_) כדי לטעון את כל הקטגוריות שחשבון השירות של Kubernetes יכול לגשת אליהן. מידע נוסף זמין במאמר Dynamic mounting במאמרי העזרה של Cloud Storage FUSE.

    Pod (הורדה מקבילה)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class 
      mountOptions:
        - implicit-dirs
        - file-cache:enable-parallel-downloads:true
        - file-cache:max-size-mb:-1
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE 
    

    מחליפים את הערכים הבאים:

    • NAMESPACE: מרחב השמות של Kubernetes שבו רוצים לפרוס את ה-Pod.
    • BUCKET_NAME: שם הקטגוריה ב-Cloud Storage שציינתם כשקבעתם את הגישה לקטגוריות ב-Cloud Storage. אפשר לציין קו תחתון (_) כדי לטעון את כל הקטגוריות שחשבון השירות של Kubernetes יכול לגשת אליהן. מידע נוסף זמין במאמר Dynamic mounting במאמרי העזרה של Cloud Storage FUSE.
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f PV_FILE_PATH
    

    מחליפים את PV_FILE_PATH בנתיב לקובץ ה-YAML.

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

  1. יוצרים מניפסט PersistentVolumeClaim עם המפרט הבא:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: gcs-fuse-csi-static-pvc
      namespace: NAMESPACE
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      storageClassName: example-storage-class
    

    מחליפים את NAMESPACE במרחב השמות של Kubernetes שבו רוצים לפרוס את ה-Pod.

    כדי לקשר את PersistentVolume ל-PersistentVolumeClaim, צריך לבדוק את הגדרות התצורה הבאות:

    • spec.storageClassName: הערך storageClassName במניפסטים של PersistentVolume ו-PersistentVolumeClaim חייב להיות זהה כדי שהדרישה תקושר לנפח האחסון. מנהל התקן ה-CSI של Cloud Storage FUSE לא משתמש באובייקטים מסוג StorageClass. צריך רק לוודא שהשדה storageClassName זהה בשני המשאבים. אפשר להשתמש במחרוזת ריקה או לא ריקה בשדה הזה. היא לא צריכה להתייחס לאובייקט StorageClass קיים, והיא משמשת רק כתווית קישור בין PV ל-PVC.
    • השדות spec.accessModes במניפסטים של PersistentVolume ו-PersistentVolumeClaim צריכים להיות זהים.
    • השדה spec.capacity.storage במניפסט של נפח האחסון המתמיד צריך להיות זהה לערך של spec.resources.requests.storage במניפסט של בקשת נפח האחסון המתמיד. לקטגוריות של Cloud Storage אין מגבלות גודל, לכן אפשר להזין כל מספר לקיבולת, אבל אי אפשר להשאיר את השדה ריק.
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f PVC_FILE_PATH
    

    מחליפים את PVC_FILE_PATH בנתיב לקובץ ה-YAML.

צריכת הנפח ב-Pod

  1. יוצרים מניפסט של Pod בהתאם למפרט הבא:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-static-pvc  
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
    spec:
      containers:
      - image: busybox
        name: busybox
        command: ["sleep"]
        args: ["infinity"]
        volumeMounts:
        - name: gcs-fuse-csi-static
          mountPath: /data
          readOnly: true
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-static
        persistentVolumeClaim:
          claimName: gcs-fuse-csi-static-pvc
          readOnly: true  
    

    מחליפים את הערכים הבאים:

    בדוגמה למניפסט מוצגות ההגדרות הנדרשות האלה:

    • metadata.annotations: ההערה gke-gcsfuse/volumes: "true" נדרשת. מידע נוסף על הערות אופציונליות זמין במאמר בנושא הגדרת קונטיינר sidecar.

    אפשר גם לשנות את המשתנים האלה:

    • spec.containers[n].volumeMounts[n].readOnly: מציינים true אם רק נקודות טעינה ספציפיות של נפח הן לקריאה בלבד.
    • spec.volumes[n].persistentVolumeClaim.readOnly: מציינים true אם כל נקודות הטעינה של אמצעי האחסון הן לקריאה בלבד.
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f POD_FILE_PATH
    

    מחליפים את POD_FILE_PATH בנתיב לקובץ ה-YAML.

(אופציונלי) טעינת אותה קטגוריה של Cloud Storage עם PersistentVolumes שונים

החל מגרסה GKE 1.33.0-gke.1932000, אפשר להשתמש בכמה PersistentVolumes שמגובים על ידי אותה קטגוריה של Cloud Storage. בכל אובייקט PersistentVolume, צריך להשתמש בערך volumeHandle ייחודי בפורמט BUCKET_NAME:UNIQUE_SUFFIX.

תרחיש לדוגמה לשימוש יכול להיות צירוף של PersistentVolumes שונים עם אפשרויות צירוף שונות לאותו Pod, כאשר כל PersistentVolume מתייחס לאותה קטגוריה של Cloud Storage.

פתרון בעיות

מידע נוסף על פתרון בעיות בדרייבר Cloud Storage FUSE CSI אפשר למצוא במדריך לפתרון בעיות במאמרי העזרה של פרויקט GitHub.

המאמרים הבאים