Restaurar um volume de um snapshot

Este documento mostra como criar um snapshot de volume e usá-lo para restaurar o volume. Estas instruções se aplicam aos clusters que usam o Driver CSI do vSphere.

Antes de começar

Confira Como usar o driver da interface de armazenamento de contêiner do vSphere.

Verifique se o cluster tem um StorageClass chamado standard-rwo e se o driver CSI do vSphere está instalado.

A versão do vSphere, o ESXi e o vCenter Server, precisam ser a versão 7.0 Update 3 ou mais recente. Para mais informações, consulte Solução de problemas de armazenamento.

Visão geral das etapas

Estas são as principais etapas do exercício fornecido neste documento:

  1. Criar um PersistentVolumeClaim.
    Crie uma PersitentVolumeClaim que solicite a classe de armazenamento standard-rwo. Em seguida, o cluster provisiona dinamicamente um PersistentVolume e o associa ao PersistentVolumeClaim.
  2. Crie uma implantação.
    Crie uma implantação que tenha um pod. O pod especifica um volume com base no seu PersistentVolumeClaim. O contêiner no pod monta o volume em /hello/.
  3. Grave um arquivo no volume do pod.
    Crie um arquivo chamado hello.txt no volume do pod. O conteúdo do arquivo é "Hello World!".
  4. Criar um VolumeSnapshot.
    Crie um VolumeSnapshot que capture o estado do volume do pod.
  5. Corrompa o arquivo.
    Altere o arquivo hello.txt para que ele pareça um arquivo corrompido. O conteúdo do arquivo agora é "Hello W-corrupted-file-orld!"
  6. Use o snapshot para restaurar o volume.
    Crie um segundo PersistentVolumeClaim que use o VolumeSnapshot como a fonte de dados. Edite sua implantação para que o volume dela seja associado ao novo PersistentVolumeClaim. Em seguida, verifique se o arquivo hello.txt foi restaurado.

Criar um PersistentVolumeClaim

Confira o manifesto de um PersistentVolumeClaim:

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

No manifesto anterior, é possível notar que storageClassName está definido como standard-rwo. Essa é a classe de armazenamento associada ao driver CSI do vSphere.

Salve o manifesto em um arquivo chamado my-pvc.yaml. Crie e acesse o PersistentVolumeClaim:

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

Na saída, é possível notar que o PersistentVolumeClaim está vinculado a um PersistentVolume provisionado dinamicamente. Por exemplo, a saída a seguir mostra que o PersistentVolumeClaim chamado my-pvc está vinculado a um PersistentVolume chamado pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:

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

Crie uma implantação

Veja o manifesto de uma implantação:

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

No contexto deste exercício, estes são os pontos importantes que você precisa entender sobre o manifesto de implantação anterior:

  • O pod solicita armazenamento especificando o PersistentVolumeClaim, my-pvc, que você criou anteriormente.

  • O pod tem um contêiner, e o contêiner monta o volume em /hello/.

Salve o manifesto em um arquivo chamado my-deployment.yaml e crie a implantação:

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

A implantação tem um pod. Consiga o nome do pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Anote o nome do pod. Por exemplo, na saída a seguir, o nome do pod é my-deployment-7575c4f5bf-r59nt:

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

Crie um arquivo no volume do pod e acesse o arquivo.

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'

A saída mostra o conteúdo do arquivo /hello/hello.txt:

Hello World!

Criar um snapshot

Confira o manifesto de um VolumeSnapshot:

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

Salve o manifesto em um arquivo chamado my-snapshot.yaml e crie o VolumeSnapshot:

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

Corromper o arquivo no volume

Altere o conteúdo de hello.txt para que ele pareça ter sido corrompido:

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'

Na saída, você notará que o arquivo foi alterado:

Hello W-corrupted-file-orld!

Restaurar

Confira o manifesto do segundo 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

No manifesto anterior, é possível notar que a fonte de dados do novo PersistentVolumeClaim é o VolumeSnapshot criado anteriormente.

Salve o manifesto em um arquivo chamado my-pvc-2.yaml. Crie e acesse o PersistentVolumeClaim:

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

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

Abra a implantação para edição:

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

Altere my-pvc para my-pvc-2 e feche o editor:

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

A implantação exclui o pod e cria um novo que usa o novo PersistentVolumeClaim.

Aguarde alguns minutos e acesse o novo nome do pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Verifique se o volume do pod foi restaurado:

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

A saída mostra que o volume foi restaurado:

Hello World!

Solução de problemas

Para acessar orientações sobre solução de problemas, consulte Solução de problemas de armazenamento.