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

{i>Read<i} Menggunakan driver Antarmuka Penyimpanan Container vSphere.

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

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

Ringkasan langkah

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

  1. Buat PersistentVolumeKlaim.
    Buat PersistentVolumeClaim yang meminta kelas penyimpanan standard-rwo. Cluster tersebut kemudian penyediaan secara dinamis PersistentVolume dan mengaitkannya dengan PersistentVolume Claims Anda.
  2. Membuat Deployment.
    Membuat Deployment yang memiliki satu Pod. Pod menentukan volume berdasarkan PersistentVolumeKlaim. Satu container di Pod memasang volume pada /hello/.
  3. Menulis file ke volume Pod.
    Buat file bernama hello.txt di volume Pod. Isi file "Hello World!".
  4. Membuat VolumeSnapshot.
    Buat VolumeSnapshot yang merekam status volume Pod.
  5. Rusakkan file.
    Ubah file hello.txt sehingga terlihat seperti file yang rusak. Konten file tersebut sekarang menjadi "Hello W-corrupted-file-orld!"
  6. Gunakan snapshot untuk memulihkan volume.
    Buat PersistentVolumeKlaim kedua yang menggunakan VolumeSnapshot sebagai sumber data. Edit Deployment agar volumenya terkait dengan yang baru PersistentVolumeKlaim. Kemudian, pastikan file hello.txt telah dipulihkan.

Membuat PersistentVolumeClaim

Berikut adalah manifes untuk PersistentVolume Claims:

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 kelas penyimpanan yang terkait dengan CSI vSphere {i>driver<i}.

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

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

Di output, Anda bisa melihat bahwa PersistentVolume Claims terikat dengan PersistentVolume yang disediakan secara dinamis. Misalnya, output berikut menunjukkan bahwa PersistentVolumeKlaim 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 hal-hal penting untuk dipahami tentang manifes Deployment sebelumnya:

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

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

Simpan manifes dalam file bernama my-deployment.yaml, dan buat elemen Penyebaran:

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 dalam volume Pod, dan 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 menunjukkan 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, dan buat elemen VolumeSnapshot:

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

Merusak file dalam volume

Ubah konten hello.txt sehingga terlihat seperti 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 PersistentVolumeKlaim 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 bisa melihat bahwa sumber data untuk Klaim PersistentVolume adalah VolumeSnapshot yang Anda buat sebelumnya.

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

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, dan tutup editor:

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

Deployment menghapus Pod, dan membuat Pod baru yang menggunakan PersistentVolumeKlaim.

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.