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 Antarmuka Penyimpanan Container vSphere.

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

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

Ringkasan langkah

Berikut adalah langkah utama latihan yang diberikan dalam dokumen ini:

  1. Membuat PersistentVolumeClaim.
    Buat PersistentVolumeClaim yang meminta kelas penyimpanan standard-rwo. Selanjutnya, cluster menyediakan secara dinamis PersistentVolume dan mengaitkannya dengan PersistentVolumeClaim.
  2. Membuat Deployment.
    Membuat Deployment yang memiliki satu Pod. Pod menentukan volume berdasarkan PersistentVolumeClaim. Satu container dalam Pod memasang volume di /hello/.
  3. Tulis file ke volume Pod.
    Buat file bernama hello.txt di volume Pod. Isi filenya adalah "Hello World!".
  4. Membuat VolumeSnapshot.
    Membuat VolumeSnapshot yang merekam status volume Pod.
  5. Buat file rusak.
    Ubah file hello.txt sehingga terlihat seperti file yang rusak. Konten file sekarang menjadi "Hello W-corrupted-file-orld!"
  6. Gunakan snapshot untuk memulihkan volume.
    Buat PersistentVolumeClaim kedua yang menggunakan VolumeSnapshot sebagai sumber datanya. Edit Deployment Anda agar volumenya terkait dengan PersistentVolumeClaim yang 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 ditetapkan ke standard-rwo. Ini adalah kelas penyimpanan yang terkait dengan driver vSphere CSI.

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

Pada output, Anda dapat melihat bahwa PersistentVolumeClaim terikat dengan PersistentVolume yang disediakan secara dinamis. Misalnya, output berikut menunjukkan bahwa PersistentVolumeClaim yang 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 untuk memahami manifes Deployment sebelumnya:

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

  • Pod memiliki satu container, dan container memasang volume pada /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. Mendapatkan 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 filenya.

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 akan 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 tampak 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'

Di 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 menghapus Pod dan membuat Pod baru yang menggunakan PersistentVolumeClaim baru.

Tunggu beberapa menit, lalu dapatkan nama Pod baru:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Pastikan 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.