גיבוי של אחסון Persistent Disk באמצעות תמונות מצב של נפח

גיבוי ושחזור של האחסון ב-Persistent Disk ב-Google Kubernetes Engine‏ (GKE) באמצעות קובצי snapshot של אמצעי אחסון. תמונת מצב של נפח יוצרת עותק של נתוני הדיסק לאחסון מתמיד בנקודת זמן מסוימת, ומאפשרת שחזור ובדיקה יעילים. היכולת הזו עוזרת להגן מפני אובדן נתונים, לחזור למצבים קודמים ולהבטיח את המשכיות העסק בעומסי העבודה. למידע נוסף על המושגים הבסיסיים של קובצי snapshot של אמצעי אחסון ב-Kubernetes, קראו את המאמר מידע על קובצי snapshot של אמצעי אחסון ב-Kubernetes.

דרישות

כדי להשתמש בתמונות מצב של אמצעי אחסון ב-GKE, צריך לעמוד בדרישות הבאות:

  • יש לכם PersistentVolumeClaim קיים שאתם רוצים להשתמש בו בשביל תמונת המצב. מנהל התקן CSI צריך לנהל את ה-PersistentVolume שמשמש כמקור לתמונת המצב. כדי לוודא שאתם משתמשים במנהל התקן CSI, צריך לבדוק שבמפרט PersistentVolume יש קטע csi עם driver: pd.csi.storage.gke.io או filestore.csi.storage.gke.io. אם PersistentVolume מוקצה באופן דינמי על ידי מנהל התקן CSI, כפי שמתואר בקטעים הבאים, הוא מנוהל על ידי מנהל התקן CSI.

מגבלות

כל ההגבלות על יצירת תמונת מצב של דיסק ב-Compute Engine חלות גם על GKE.

שיטות מומלצות

כשמשתמשים בתמונות מצב של Persistent Disk Volume ב-GKE, חשוב לפעול לפי השיטות המומלצות לתמונות מצב של דיסקים ב-Compute Engine.

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

לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:

  • מפעילים את Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.

יצירה ושימוש בתמונת מצב של אמצעי אחסון

הדוגמאות במאמר הזה מראות איך לבצע את הפעולות הבאות:

  1. יצירת PersistentVolumeClaim וDeployment.
  2. מוסיפים קובץ ל-PersistentVolume שבו משתמש Deployment.
  3. יוצרים VolumeSnapshotClass כדי להגדיר את ה-snapshot.
  4. יוצרים קובץ snapshot של אמצעי האחסון של PersistentVolume.
  5. מוחקים את קובץ הבדיקה.
  6. משחזרים את PersistentVolume לתמונת המצב שיצרתם.
  7. איך מוודאים שהשחזור פעל

כדי להשתמש בתמונת מצב של נפח, צריך לבצע את השלבים הבאים:

  1. יוצרים אובייקט VolumeSnapshotClass כדי לציין את מנהל ההתקן של CSI ואת מדיניות המחיקה של התמונה.
  2. יוצרים אובייקט VolumeSnapshot כדי לבקש קובץ snapshot של PersistentVolumeClaim קיים.
  3. אפשר להשתמש ב-VolumeSnapshot בPersistentVolumeClaim כדי לשחזר נפח ל-snapshot הזה או ליצור נפח חדש באמצעות ה-snapshot.

יצירת PersistentVolumeClaim וDeployment

  1. כדי ליצור את האובייקט PersistentVolumeClaim, שומרים את המניפסט הבא בתור my-pvc.yaml:

    Persistent Disk

     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: my-pvc
     spec:
       storageClassName: standard-rwo
       accessModes:
       - ReadWriteOnce
       resources:
         requests:
           storage: 1Gi
    

    בדוגמה הזו משתמשים במחלקת האחסון standard-rwo שמותקנת כברירת מחדל עם מנהל התקן ה-CSI של Persistent Disk ב-Compute Engine. מידע נוסף זמין במאמר שימוש במנהל ההתקן של Compute Engine Persistent Disk CSI.

    בשביל spec.storageClassName, אפשר לציין כל מחלקת אחסון שמשתמשת במנהל התקן CSI נתמך.

  2. מחילים את המניפסט:

    kubectl apply -f my-pvc.yaml
    
  3. כדי ליצור Deployment, שומרים את המניפסט הבא בתור my-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app
    spec:
      selector:
        matchLabels:
          app: hello-app
      template:
        metadata:
          labels:
            app: hello-app
        spec:
          containers:
          - name: hello-app
            image: google/cloud-sdk:slim
            args: [ "sleep", "3600" ]
            volumeMounts:
            - name: sdk-volume
              mountPath: /usr/share/hello/
          volumes:
          - name: sdk-volume
            persistentVolumeClaim:
              claimName: my-pvc
    
  4. מחילים את המניפסט:

    kubectl apply -f my-deployment.yaml
    
  5. בודקים את הסטטוס של Deployment:

    kubectl get deployment hello-app
    

    יכול להיות שיעבור קצת זמן עד שDeployment יהיה מוכן. אפשר להריץ את הפקודה הקודמת עד שיוצג פלט שדומה לזה:

    NAME        READY   UP-TO-DATE   AVAILABLE   AGE
    hello-app   1/1     1            1           2m55s
    

הוספת קובץ בדיקה לנפח האחסון

  1. תכין רשימה של Pods בDeployment:

    kubectl get pods -l app=hello-app
    

    הפלט אמור להיראות כך:

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-6d7b457c7d-vl4jr   1/1     Running   0          2m56s
    
  2. יוצרים קובץ בדיקה ב-Pod:

    kubectl exec POD_NAME \
        -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
    

    מחליפים את POD_NAME בשם של Pod.

  3. מוודאים שהקובץ קיים:

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    הפלט אמור להיראות כך:

    Hello World!
    

יצירת אובייקט VolumeSnapshotClass

יוצרים אובייקט VolumeSnapshotClass כדי לציין את מנהל ההתקן של CSI ואת deletionPolicy בשביל קובץ ה-snapshot של אמצעי האחסון. אפשר להפנות לאובייקטים מסוג VolumeSnapshotClass כשיוצרים אובייקטים מסוג VolumeSnapshot.

  1. שומרים את קובץ המניפסט הבא בשם volumesnapshotclass.yaml.

    Persistent Disk

    צריך להשתמש בגרסת ה-API‏ v1 לאשכולות שפועלים בגרסאות 1.21 ואילך.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    

    בדוגמה הזו:

    • מנהל ההתקן של CSI משתמש בשדה driver כדי להקצות את קובץ ה-snapshot. בדוגמה הזו, pd.csi.storage.gke.io משתמש במנהל ההתקן של ה-CSI של דיסק מתמשך ב-Compute Engine.

    • השדה deletionPolicy מציין ל-GKE מה לעשות עם האובייקט VolumeSnapshotContent ועם קובץ ה-snapshot הבסיסי כשמוחקים את האובייקט המקושר VolumeSnapshot. מציינים Delete כדי למחוק את האובייקט VolumeSnapshotContent ואת התמונה המיידית הבסיסית. מציינים Retain אם רוצים לשמור את VolumeSnapshotContent ואת הצילום מהמצלמה שמתחתיו.

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

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshotClass
      metadata:
        name: my-snapshotclass
      parameters:
        storage-locations: us-east2
      driver: pd.csi.storage.gke.io
      deletionPolicy: Delete
      
    • כדי ליצור תמונת דיסק, מוסיפים את הטקסט הבא לשדה parameters:

      parameters:
        snapshot-type: images
        image-family: IMAGE_FAMILY
      

      מחליפים את IMAGE_FAMILY בשם של משפחת האימג' המועדפת, כמו preloaded-data.

  2. מחילים את המניפסט:

    kubectl apply -f volumesnapshotclass.yaml
    

יצירת VolumeSnapshot

אובייקט VolumeSnapshot הוא בקשה לתמונת מצב של אובייקט PersistentVolumeClaim קיים. כשיוצרים אובייקט VolumeSnapshot, ‏GKE יוצר באופן אוטומטי אובייקט VolumeSnapshotContent ומקשר אותו לאובייקט PersistentVolume, שהוא משאב באשכול.

  1. שומרים את קובץ המניפסט הבא בשם volumesnapshot.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    
  2. מחילים את המניפסט:

    kubectl apply -f volumesnapshot.yaml
    

    אחרי שיוצרים תמונת מצב Volume, ‏ GKE יוצר אובייקט VolumeSnapshotContent תואם באשכול. מאגר אובייקטים זה מאחסן את קובץ ה-snapshot ואת הקישורים של אובייקטים מסוג VolumeSnapshot. אין אינטראקציה ישירה עם אובייקטים של VolumeSnapshotContents.

  3. מוודאים ש-GKE יצר את האובייקט VolumeSnapshotContents:

    kubectl get volumesnapshotcontents
    

    הפלט אמור להיראות כך:

    NAME                                               AGE
    snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s
    

אחרי שנוצר תוכן קובץ ה-Snapshot של Volume, מנהל ההתקן של CSI שציינתם ב-VolumeSnapshotClass יוצר קובץ Snapshot במערכת האחסון המתאימה. אחרי ש-GKE יוצר קובץ snapshot במערכת האחסון ומקשר אותו לאובייקט VolumeSnapshot באשכול, קובץ ה-snapshot מוכן לשימוש. כדי לבדוק את הסטטוס, מריצים את הפקודה הבאה:

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

אם תמונת המצב מוכנה לשימוש, הפלט ייראה כך:

NAME               READY
my-snapshot        true

מחיקת קובץ הבדיקה

  1. מוחקים את קובץ הבדיקה שיצרתם:

    kubectl exec POD_NAME \
        -- sh -c 'rm /usr/share/hello/hello.txt'
    
  2. מוודאים שהקובץ כבר לא קיים:

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    הפלט אמור להיראות כך:

    cat: /usr/share/hello/hello.txt: No such file or directory
    

שחזור תמונת המצב של אמצעי האחסון

אפשר להפנות ל-VolumeSnapshot ב-PersistentVolumeClaim כדי להקצות נפח חדש עם נתונים מנפח קיים, או לשחזר נפח למצב שתועד בתמונת המצב.

כדי להפנות אל VolumeSnapshot בתוך PersistentVolumeClaim, מוסיפים את השדה dataSource אל PersistentVolumeClaim. אותו תהליך משמש בין אם VolumeSnapshotContents מתייחס לתמונת דיסק או לתמונת מצב.

בדוגמה הזו, אתם משתמשים ב-VolumeSnapshot שיצרתם ב-PersistentVolumeClaim חדש ומעדכנים את Deployment כדי להשתמש בטענה החדשה.

  1. בודקים אם אתם משתמשים ב-snapshot של דיסק או של תמונה. ההבדלים ביניהם הם:

    • תמונות מצב של דיסקים: יוצרים תמונות מצב לעיתים קרובות ומשחזרים לעיתים רחוקות.
    • תמונות מצב של תמונות: כדאי לצלם תמונות מצב לעיתים רחוקות ולשחזר אותן לעיתים קרובות. יכול להיות שייקח יותר זמן ליצור תמונות מצב של תמונות מאשר תמונות מצב של דיסקים.

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

    בודקים את VolumeSnapshot:

    kubectl describe volumesnapshot SNAPSHOT_NAME
    

    השדה volumeSnapshotClassName מציין את מחלקת התמונות.

    kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAME
    

    הפרמטר snapshot-type יציין snapshots או images. אם לא מציינים ערך, ברירת המחדל היא snapshots.

    אם אין מחלקת קובץ snapshot (לדוגמה, אם קובץ ה-snapshot נוצר באופן סטטי), צריך לבדוק את VolumeSnapshotContents. sh kubectl describe volumesnapshotcontents SNAPSHOT_CONTENTS_NAME הפורמט של נקודת האחיזה של קובץ ה-snapshot בפלט מציין את סוג קובץ ה-snapshot, באופן הבא: * projects/PROJECT_NAME/global/snapshots/SNAPSHOT_NAME: קובץ snapshot של דיסק

    • ‫projects/PROJECT_NAME/global/images/IMAGE_NAME: תמונת מצב
  1. שומרים את קובץ המניפסט הבא בשם pvc-restore.yaml:

    Persistent Disk

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: standard-rwo
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
  2. מחילים את המניפסט:

    kubectl apply -f pvc-restore.yaml
    
  3. מעדכנים את הקובץ my-deployment.yaml כדי להשתמש בPersistentVolumeClaim החדש:

    ...
    volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: pvc-restore
    
  4. מחילים את מניפסט העדכונים:

    kubectl apply -f my-deployment.yaml
    

מוודאים שתמונת המצב שוחזרה בהצלחה

  1. מקבלים את השם של Pod החדש שנוצר על ידי GKE עבור Deployment המעודכן:

     kubectl get pods -l app=hello-app
    

מוודאים שקובץ הבדיקה קיים:

   kubectl exec NEW_POD_NAME \
       -- sh -c 'cat /usr/share/hello/hello.txt'

מחליפים את NEW_POD_NAME בשם של Pod חדש שנוצר על ידי GKE.

הפלט אמור להיראות כך:

   Hello World!

ייבוא של תמונת מצב קיימת

אפשר להשתמש בתמונת מצב של נפח אחסון שנוצרה מחוץ לאשכול הנוכחי כדי להקצות באופן ידני את אובייקט VolumeSnapshotContents. לדוגמה, אתם יכולים לאכלס נפח אחסון ב-GKE עם תמונת מצב שלCloud de Confiance משאב אחר שנוצר באשכול אחר.

  1. מאתרים את השם של התמונה.

    מסוף Cloud de Confiance

    כניסה לדף Snapshots

    Google Cloud CLI

    מריצים את הפקודה הבאה:

    gcloud compute snapshots list
    

    הפלט אמור להיראות כך:

    NAME                                           DISK_SIZE_GB  SRC_DISK                                                     STATUS
    snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0  1             us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READY
    
  2. שומרים את המניפסט הבא של VolumeSnapshot בתור restored-snapshot.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: restored-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        volumeSnapshotContentName: restored-snapshot-content
    
  3. החלת המניפסט:

    kubectl apply -f restored-snapshot.yaml
    
  4. שומרים את המניפסט הבא של VolumeSnapshotContent בתור restored-snapshot-content.yaml. מחליפים את השדה snapshotHandle במזהה הפרויקט ובשם התמונה. כדי שהקישור הדו-כיווני יהיה תקין, גם volumeSnapshotRef.name וגם volumeSnapshotRef.namespace צריכים להצביע על VolumeSnapshot שנוצר קודם.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotContent
    metadata:
      name: restored-snapshot-content
    spec:
      deletionPolicy: Retain
      driver: pd.csi.storage.gke.io
      source:
        snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME
      volumeSnapshotRef:
        kind: VolumeSnapshot
        name: restored-snapshot
        namespace: default
    
  5. מחילים את המניפסט:

    kubectl apply -f restored-snapshot-content.yaml
    
  6. שומרים את קובץ המניפסט הבא PersistentVolumeClaim בשם restored-pvc.yaml. בקר האחסון של Kubernetes יחפש VolumeSnapshot בשם restored-snapshot ואז ינסה למצוא או ליצור באופן דינמי PersistentVolume כמקור הנתונים. אחר כך אפשר להשתמש ב-PVC הזה ב-Pod כדי לגשת לנתונים ששוחזרו.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restored-pvc
    spec:
      dataSource:
        name: restored-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: standard-rwo
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
  7. מחילים את המניפסט:

    kubectl apply -f restored-pvc.yaml
    
  8. שומרים את המניפסט הבא של Pod בתור restored-pod.yaml, בהתאם לPersistentVolumeClaim. מנהל ההתקן של CSI יקצה PersistentVolume ויאכלס אותו מתמונת המצב.

    apiVersion: v1
    kind: Pod
    metadata:
      name: restored-pod
    spec:
      containers:
      - name: busybox
        image: busybox
        args:
        - sleep
        - "3600"
        volumeMounts:
        - name: source-data
          mountPath: /demo/data
      volumes:
      - name: source-data
        persistentVolumeClaim:
          claimName: restored-pvc
          readOnly: false
    
  9. מחילים את המניפסט:

    kubectl apply -f restored-pod.yaml
    
  10. מוודאים שהקובץ שוחזר:

    kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
    

הסרת המשאבים

כדי לא לצבור חיובים בחשבון Cloud de Confiance by S3NS על המשאבים שבהם השתמשתם בדף הזה, פועלים לפי השלבים הבאים.

  1. מחיקת VolumeSnapshot:

    kubectl delete volumesnapshot my-snapshot
    
  2. מחיקת VolumeSnapshotClass:

    kubectl delete volumesnapshotclass my-snapshotclass
    
  3. מחיקת Deployment:

    kubectl delete deployments hello-app
    
  4. מחיקת האובייקטים PersistentVolumeClaim:

    kubectl delete pvc my-pvc pvc-restore
    

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