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

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

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

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

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

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

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

יצירת PersistentVolume

  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.

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

    ‫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: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 יכול לגשת אליהן. מידע נוסף זמין במאמר טעינה דינמית במסמכי התיעוד של Cloud Storage FUSE.
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f PV_FILE_PATH
    

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

יצירת PersistentVolumeClaim

  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 במניפסט של PersistentVolume צריך להתאים ל-spec.resources.requests.storage במניפסט של PersistentVolumeClaim. לקטגוריות של 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.

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

פתרון בעיות

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

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