Memulihkan volume dari snapshot

Dokumen ini menunjukkan cara membuat snapshot volume, lalu menggunakan snapshot tersebut untuk memulihkan volume. Petunjuk di sini berlaku untuk cluster yang menggunakan driver CSI vSphere.

Sebelum memulai

Baca Menggunakan driver vSphere Container Storage Interface.

Verifikasi bahwa cluster Anda memiliki StorageClass bernama standard-rwo dan bahwa driver vSphere CSI telah diinstal.

Versi vSphere, ESXi, dan vCenter Server Anda harus 7.0 Update 3 atau yang lebih baru. Untuk mengetahui informasi selengkapnya, lihat Memecahkan masalah penyimpanan.

Ringkasan langkah

Berikut adalah langkah-langkah utama latihan yang diberikan dalam dokumen ini:

  1. Buat PersistentVolumeClaim.
    Buat PersistentVolumeClaim yang meminta class penyimpanan standard-rwo. Cluster kemudian menyediakan PersistentVolume secara dinamis dan mengaitkannya dengan PersistentVolumeClaim Anda.
  2. Membuat Deployment.
    Buat Deployment yang memiliki satu Pod. Pod menentukan volume berdasarkan PersistentVolumeClaim Anda. Satu container dalam Pod memasang volume di /hello/.
  3. Tulis file ke volume Pod.
    Buat file bernama hello.txt di volume Pod. Konten file adalah "Hello World!".
  4. Buat VolumeSnapshot.
    Buat VolumeSnapshot yang merekam status volume Pod.
  5. Merusak file.
    Ubah file hello.txt sehingga terlihat seperti file yang rusak. Konten file kini menjadi "Hello W-corrupted-file-orld!"
  6. Gunakan snapshot untuk memulihkan volume.
    Buat PersistentVolumeClaim kedua yang menggunakan VolumeSnapshot Anda sebagai sumber datanya. Edit Deployment Anda agar volumenya dikaitkan dengan PersistentVolumeClaim baru. Kemudian, verifikasi bahwa file hello.txt telah dipulihkan.

Membuat PersistentVolumeClaim

Berikut adalah manifes untuk PersistentVolumeClaim:

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

Dalam manifes sebelumnya, Anda dapat melihat bahwa storageClassName disetel ke standard-rwo. Ini adalah class penyimpanan yang terkait dengan driver CSI vSphere.

Simpan manifes dalam file bernama my-pvc.yaml. Buat dan lihat PersistentVolumeClaim:

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

Dalam output, Anda dapat melihat bahwa PersistentVolumeClaim terikat dengan PersistentVolume yang disediakan secara dinamis. Misalnya, output berikut menunjukkan bahwa PersistentVolumeClaim bernama my-pvc terikat dengan PersistentVolume bernama pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:

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

Membuat Deployment

Berikut manifes untuk Deployment:

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

Dalam konteks latihan ini, berikut adalah poin-poin penting yang perlu dipahami tentang manifes Deployment sebelumnya:

  • Pod meminta penyimpanan dengan menentukan PersistentVolumeClaim, my-pvc, yang Anda buat sebelumnya.

  • Pod memiliki satu container, dan container memasang volume di /hello/.

Simpan manifes dalam file bernama my-deployment.yaml, lalu buat Deployment:

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

Deployment memiliki satu Pod. Dapatkan nama Pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Catat nama Pod. Misalnya, dalam output berikut, nama Pod adalah my-deployment-7575c4f5bf-r59nt:

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

Buat file di volume Pod, lalu lihat file tersebut.

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'

Output menampilkan konten file /hello/hello.txt:

Hello World!

Membuat snapshot

Berikut adalah manifes untuk VolumeSnapshot:

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

Simpan manifes dalam file bernama my-snapshot.yaml, lalu buat VolumeSnapshot:

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

Merusak file dalam volume

Ubah konten hello.txt sehingga terlihat seperti telah rusak:

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'

Dalam output, Anda dapat melihat bahwa file telah diubah:

Hello W-corrupted-file-orld!

Pulihkan

Berikut adalah manifes untuk PersistentVolumeClaim kedua:

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

Dalam manifes sebelumnya, Anda dapat melihat bahwa sumber data untuk klaim PersistentVolume baru adalah VolumeSnapshot yang Anda buat sebelumnya.

Simpan manifes dalam file bernama my-pvc-2.yaml. Buat dan lihat PersistentVolumeClaim:

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

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

Buka Deployment untuk mengedit:

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

Ubah my-pvc menjadi my-pvc-2, lalu tutup editor:

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

Deployment akan menghapus Pod, dan membuat Pod baru yang menggunakan PersistentVolumeClaim baru.

Tunggu beberapa menit, lalu dapatkan nama Pod baru:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Verifikasi bahwa volume Pod telah dipulihkan:

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

Output menunjukkan bahwa volume telah dipulihkan:

Hello World!

Pemecahan masalah

Untuk panduan pemecahan masalah, lihat Memecahkan masalah penyimpanan.