שימוש בדיסקים של אחסון מתמיד (persistent disks) עם כמה קוראים

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

מידע נוסף על המצב הזה זמין במאמר בנושא מצבי גישה של נפחים קבועים.

דרישות

עיצוב ואכלוס של דיסק מקור של אחסון מתמיד

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

  1. יוצרים PersistentVolume באמצעות דיסק אחסון מתמיד קיים או באמצעות הקצאת משאבים דינמית.

  2. מעצבים את הדיסק ומאכלסים אותו בנתונים. כדי לפרמט את הדיסק, צריך להפנות לדיסק כאל ReadWriteOnce PersistentVolume ב-Pod. ‫GKE מעצב אוטומטית את הדיסק הבסיסי ומאפשר ל-Pod לכתוב נתונים בדיסק. כשמפעילים את ה-Pod, מוודאים שהוא כותב את הנתונים הרצויים לדיסק.

יצירת ReadOnlyMany PersistentVolume

אפשר ליצור ReadOnlyMany PersistentVolume באחת מהשיטות הבאות:

  • תמונת מצב של נפח אחסון מתמיד (PersistentVolume) של מקור נתונים, שמאכלסים אותו בנתונים.
  • שיבוט נפח של PersistentVolume במקור שאותו מאכלסים בנתונים.
  • אחסון מתמיד (persistent disk) קיים שכבר אוכלס בנתונים.

תמונת מצב של עוצמת הקול

  1. יוצרים snapshot של נפח האחסון של PersistentVolume של המקור.

  2. שומרים את המניפסט של PersistentVolumeClaim הבא בשם snapshot-pvc.yaml:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      namespace: PVC_NAMESPACE
      name: PVC_NAME
    spec:
      dataSource:
        apiGroup: snapshot.storage.k8s.io
        kind: VolumeSnapshot
        name: SNAPSHOT_NAME
      accessModes:
        - ReadOnlyMany
      storageClassName: premium-rwo
      resources:
        requests:
          storage: STORAGE_SIZE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PVC_NAMESPACE: מרחב השמות של ה-PersistentVolumeClaim החדש.
    • PVC_NAME: השם של ה-PersistentVolumeClaim החדש.
    • SNAPSHOT_NAME:השם של אובייקט VolumeSnapshot.
    • STORAGE_SIZE: כמות האחסון שרוצים לבקש. הערך הזה צריך להיות זהה לערך שצוין בבקשה ל-PersistentVolumeClaim של המקור.
  3. מחילים את המניפסט על האשכול:

    kubectl apply -f snapshot-pvc.yaml
    

פעולה זו יוצרת ב-Cluster טענת PersistentVolume חדשה בשם PVC_NAME, ש-GKE משתמש בה כדי להקצות באופן דינמי PersistentVolume חדש שמכיל את הנתונים מהתמונה של דיסק מקור קבוע.

שיבוט בכמות גדולה

לפני שמשתמשים בשיבוט נפח, חשוב להכיר את המגבלות של הגישה הזו.

  1. שומרים את קובץ המניפסט הבא בשם cloning-pvc.yaml:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      namespace: PVC_NAMESPACE
      name: PVC_NAME
    spec:
      dataSource:
        name: SOURCE_PVC
        kind: PersistentVolumeClaim
      accessModes:
        - ReadOnlyMany
      storageClassName: STORAGE_CLASS_NAME
      resources:
        requests:
          storage: STORAGE_SIZE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PVC_NAMESPACE: מרחב השמות של ה-PersistentVolumeClaim החדש.
    • PVC_NAME: השם של ה-PersistentVolumeClaim החדש.
    • SOURCE_PVC: השם של PersistentVolumeClaim של המקור שאוכלס בנתונים.
    • STORAGE_CLASS_NAME: סוג האחסון (storage class) של ה-PersistentVolumeClaim החדש. הערך הזה חייב להיות זהה לערך של סוג האחסון (storage class) של PersistentVolumeClaim המקורית.
    • STORAGE_SIZE: כמות האחסון של PersistentVolumeClaim החדש. הכמות הזו צריכה להיות זהה לכמות שצוינה בבקשה של מקור PersistentVolumeClaim.
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f cloning-pvc.yaml
    

הפעולה הזו יוצרת PersistentVolumeClaim בשם PVC_NAME ש-GKE משתמש בו כדי ליצור PersistentVolume חדש במצב ReadOnlyMany עם הנתונים ב-PersistentVolume של המקור.

מידע מפורט יותר על שיבוט נפחים זמין במאמר בנושא יצירת שיבוטים של נפחים מתמשכים.

דיסק אחסון מתמיד (persistent disk) קיים

  1. שומרים את קובץ המניפסט הבא בשם preexisting-disk-pv-pvc.yaml:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: PV_NAME
    spec:
      storageClassName: "STORAGE_CLASS_NAME"
      capacity:
        storage: DISK_SIZE
      accessModes:
        - ReadOnlyMany
      claimRef:
        namespace: PVC_NAMESPACE
        name: PVC_NAME
      csi:
        driver: pd.csi.storage.gke.io
        volumeHandle: DISK_ID
        fsType: FS_TYPE
        readOnly: true
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      namespace: PVC_NAMESPACE
      name: PVC_NAME
    spec:
      storageClassName: "STORAGE_CLASS_NAME"
      volumeName: PV_NAME
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: DISK_SIZE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PV_NAME: השם של PersistentVolume החדש.
    • STORAGE_CLASS_NAME: השם של StorageClass החדש.
    • DISK_SIZE: הגודל של דיסק האחסון המתמיד הקיים. לדוגמה, 500G.
    • PVC_NAMESPACE: מרחב השמות של ה-PersistentVolumeClaim החדש.
    • PVC_NAME: השם של ה-PersistentVolumeClaim החדש.
    • DISK_ID: המזהה של הדיסק הקשיח הקיים. הפורמט הוא projects/{project_id}/zones/{zone_name}/disks/{disk_name} עבור דיסקים לאחסון מתמיד של תחום מוגדר, או projects/{project_id}/regions/{region_name}/disks/{disk_name} עבור דיסקים לאחסון מתמיד אזורי.
    • FS_TYPE: סוג מערכת הקבצים. אפשר להשאיר את ברירת המחדל (ext4) או להשתמש ב-xfs. אם באשכולות שלכם נעשה שימוש במאגר צמתים של Windows Server, אתם צריכים לשנות את זה ל-NTFS.
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f preexisting-disk-pv-pvc.yaml
    

הפעולה הזו יוצרת PersistentVolumeClaim בשם PVC_NAME ו-PersistentVolume בשם PV_NAME במצב ReadOnlyMany.

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

שימוש ב-PersistentVolumeClaim ב-Pod

עכשיו אפשר להפנות ל-PersistentVolumeClaim החדש במצב קריאה בלבד בכמה פודים בכמה צמתים בו-זמנית. אי אפשר לצרף דיסקים קשיחים מתמשכים במצב ReadWriteOnce לכמה צמתים בו-זמנית. מידע נוסף זמין במאמר בנושא פריסות לעומת StatefulSets.

במפרט של ה-Pod, צריך לציין את readOnly: true בקטע volumeMounts ובקטע volumes, כמו בדוגמה הבאה:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: multi-read
  labels:
    app: web-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-server
  template:
    metadata:
      labels:
        app: web-server
    spec:
      containers:
      - name: web-server
        image: nginx
        volumeMounts:
        - mountPath: /test-mnt
          name: my-volume
          readOnly: true
      volumes:
      - name: my-volume
        persistentVolumeClaim:
          claimName: PVC_NAME
          readOnly: true

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