שחזור נפח מ-Snapshot

במסמך הזה מוסבר איך ליצור snapshot של נפח אחסון ואז להשתמש ב-snapshot כדי לשחזר את נפח האחסון. ההוראות שבהמשך רלוונטיות לאשכולות שמשתמשים במנהל התקן CSI של vSphere.

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

מומלץ לקרוא את המאמר בנושא שימוש בדרייבר של vSphere Container Storage Interface.

מוודאים שלקלאסטר יש StorageClass בשם standard-rwo ושהותקן מנהל התקן vSphere CSI.

גרסת vSphere,‏ ESXi ו-vCenter Server צריכות להיות גרסה 7.0 Update 3 ואילך. מידע נוסף מופיע במאמר פתרון בעיות באחסון.

סקירה כללית של השלבים

אלה השלבים העיקריים בתרגיל שמופיע במסמך הזה:

  1. יוצרים PersistentVolumeClaim.
    יוצרים PersistentVolumeClaim שמבקש את סוג האחסון standard-rwo. לאחר מכן, האשכול מקצה באופן דינמי נפח אחסון מתמיד ומשייך אותו לדרישת נפח האחסון המתמיד.
  2. יצירת פריסה.
    יוצרים פריסה עם Pod אחד. ה-Pod מציין נפח אחסון על סמך PersistentVolumeClaim. הקונטיינר היחיד ב-Pod מעלה את עוצמת הקול ב-/hello/.
  3. כתיבת קובץ לנפח האחסון של ה-Pod.
    Create a file named hello.txt in the Pod volume. התוכן של הקובץ הוא Hello World!‎
  4. יוצרים VolumeSnapshot.
    יוצרים VolumeSnapshot שמתעד את המצב של נפח האחסון של ה-Pod.
  5. פוגמים בקובץ.
    משנים את הקובץ hello.txt כך שהוא ייראה כמו קובץ פגום. התוכן של הקובץ הוא עכשיו 'Hello W-corrupted-file-orld!'
  6. אפשר להשתמש בתמונת המצב כדי לשחזר את עוצמת הקול.
    יוצרים PersistentVolumeClaim שני שמשתמש ב-VolumeSnapshot כמקור הנתונים שלו. עורכים את הפריסה כך שהנפח שלה ישויך ל-PersistentVolumeClaim החדש. לאחר מכן מוודאים שקובץ hello.txt שוחזר.

יצירת PersistentVolumeClaim

זוהי הגדרת Manifest ל-PersistentVolumeClaim:

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

במניפסט הקודם אפשר לראות שהערך של storageClassName הוא standard-rwo. זהו סוג האחסון שמשויך לדרייבר vSphere CSI.

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

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

בפלט אפשר לראות שה-PersistentVolumeClaim קשור ל-PersistentVolume שהוקצה באופן דינמי. לדוגמה, הפלט הבא מראה ש-PersistentVolumeClaim בשם my-pvc קשור ל-PersistentVolume בשם pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:

my-pvc   Bound    pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5  …  standard-rwo   100s

יצירת פריסה

זוהי דוגמה למניפסט של פריסה:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
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: my-volume
          mountPath: /hello/
      volumes:
      - name: my-volume
        persistentVolumeClaim:
          claimName: my-pvc

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

  • ה-Pod מבקש אחסון על ידי ציון PersistentVolumeClaim, ‏ my-pvc, שיצרתם קודם.

  • ל-Pod יש קונטיינר אחד, והקונטיינר מטמיע את אמצעי האחסון ב-/hello/.

שומרים את המניפסט בקובץ בשם my-deployment.yaml ויוצרים את הפריסה:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml

לפריסת ה-Deployment יש Pod אחד. אחזור השם של ה-Pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

רושמים את שם ה-Pod. לדוגמה, בפלט הבא, שם ה-Pod הוא my-deployment-7575c4f5bf-r59nt:

my-deployment-7575c4f5bf-r59nt   1/1     Running   0          65s

יוצרים קובץ בנפח האחסון של ה-Pod ומציגים את הקובץ.

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

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

הפלט מציג את התוכן של הקובץ /hello/hello.txt:

Hello World!

יצירת קובץ snapshot

זוהי מניפסט של VolumeSnapshot:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
spec:
  volumeSnapshotClassName: csi-vsphere-snapshot-class
  source:
    persistentVolumeClaimName: my-pvc

שומרים את המניפסט בקובץ בשם my-snapshot.yaml ויוצרים את VolumeSnapshot:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml

השחתת הקובץ באמצעי האחסון

משנים את התוכן של hello.txt כך שייראה כאילו הוא נפגם:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt'

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

בפלט אפשר לראות שהקובץ השתנה:

Hello W-corrupted-file-orld!

שחזור

זוהי מניפסט של PersistentVolumeClaim שני:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc-2
spec:
  storageClassName: standard-rwo
  dataSource:
    name: my-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

במניפסט הקודם אפשר לראות שמקור הנתונים לתביעת PersistentVolume החדשה הוא VolumeSnapshot שיצרתם קודם.

שומרים את קובץ המניפסט בקובץ בשם my-pvc-2.yaml. יוצרים את PersistentVolumeClaim וצופים בו:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2

פותחים את הפריסה לעריכה:

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

משנים את my-pvc ל-my-pvc-2 וסוגרים את העורך:

…
  volumes:
  - name: my-volume
    persistentVolumeClaim:
    claimName: my-pvc-2

הפריסה מוחקת את ה-Pod ויוצרת Pod חדש שמשתמש ב-PersistentVolumeClaim החדש.

ממתינים כמה דקות ואז מקבלים את השם החדש של ה-Pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

מוודאים שעוצמת הקול של ה-Pod שוחזרה:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
   exec NEW_POD_NAME \
   -- sh -c 'cat /hello/hello.txt'

הפלט מראה שהנפח שוחזר:

Hello World!

פתרון בעיות

הוראות לפתרון בעיות מופיעות במאמר פתרון בעיות שקשורות לאחסון.