Restaure um volume a partir de um instantâneo

Este documento mostra como criar um instantâneo de volume e, em seguida, usar o instantâneo para restaurar o volume. As instruções aqui aplicam-se a clusters que usam o controlador CSI do vSphere.

Antes de começar

Leia o artigo Usar o controlador da interface de armazenamento de contentores do vSphere.

Verifique se o cluster tem uma StorageClass denominada standard-rwo e se o controlador CSI do vSphere está instalado.

A sua versão do vSphere, do ESXi e do vCenter Server tem de ser a 7.0 Update 3 ou posterior. Para mais informações, consulte o artigo Resolução de problemas de armazenamento.

Vista geral dos passos

Estes são os passos principais do exercício apresentado neste documento:

  1. Crie um PersistentVolumeClaim.
    Crie um PersistentVolumeClaim que solicite a classe de armazenamento standard-rwo. Em seguida, o cluster aprovisiona dinamicamente um PersistentVolume e associa-o ao seu PersistentVolumeClaim.
  2. Crie uma implementação.
    Crie uma implementação com um Pod. O pod especifica um volume com base no seu PersistentVolumeClaim. O recipiente no Pod aumenta o volume para /hello/.
  3. Escrever um ficheiro no volume do Pod.
    Crie um ficheiro com o nome hello.txt no volume do pod. O conteúdo do ficheiro é "Hello World!".
  4. Crie um VolumeSnapshot.
    Crie um VolumeSnapshot que capture o estado do volume do pod.
  5. Danificar o ficheiro.
    Altere o ficheiro hello.txt para que pareça um ficheiro danificado. O conteúdo do ficheiro é agora "Olá, ficheiro-corrompido-mundo!"
  6. Use a captura instantânea para restaurar o volume.
    Crie um segundo PersistentVolumeClaim que use o seu VolumeSnapshot como origem de dados. Edite a sua implementação para que o respetivo volume esteja associado ao novo PersistentVolumeClaim. Em seguida, verifique se o ficheiro hello.txt foi restaurado.

Crie um PersistentVolumeClaim

Segue-se um manifesto para um PersistentVolumeClaim:

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

No manifesto anterior, pode ver que storageClassName está definido como standard-rwo. Esta é a classe de armazenamento associada ao controlador CSI do vSphere.

Guarde o manifesto num ficheiro com o nome my-pvc.yaml. Crie e veja o PersistentVolumeClaim:

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

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

Na saída, pode ver que o PersistentVolumeClaim está associado a um PersistentVolume aprovisionado dinamicamente. Por exemplo, o resultado seguinte mostra que o PersistentVolumeClaim denominado my-pvc está associado a um PersistentVolume denominado pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:

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

Crie uma implementação

Segue-se um manifesto para uma implementaçã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 a compreender acerca do manifesto de implementação anterior:

  • O Pod pede armazenamento especificando o PersistentVolumeClaim, my-pvc, que criou anteriormente.

  • O Pod tem um contentor e o contentor monta o volume em /hello/.

Guarde o manifesto num ficheiro denominado my-deployment.yaml e crie a implementação:

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

A implementação tem um pod. Obtenha o nome do Pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

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

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

Crie um ficheiro no volume do pod e veja o ficheiro.

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 ficheiro /hello/hello.txt:

Hello World!

Criar um instantâneo

Segue-se um manifesto para um VolumeSnapshot:

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

Guarde o manifesto num ficheiro com o nome my-snapshot.yaml e crie o VolumeSnapshot:

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

Corromper o ficheiro no volume

Altere o conteúdo do ficheiro hello.txt para que pareça que foi danificado:

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'

No resultado, pode ver que o ficheiro foi alterado:

Hello W-corrupted-file-orld!

Restaurar

Segue-se um manifesto para um 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, pode ver que a origem de dados para a nova reivindicação PersistentVolume é o VolumeSnapshot que criou anteriormente.

Guarde o manifesto num ficheiro com o nome my-pvc-2.yaml. Crie e veja o PersistentVolumeClaim:

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

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

Abra a implementaçã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 implementação elimina o pod e cria um novo pod que usa o novo PersistentVolumeClaim.

Aguarde alguns minutos e, em seguida, obtenha 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'

O resultado mostra que o volume foi restaurado:

Hello World!

Resolução de problemas

Para orientações de resolução de problemas, consulte o artigo Resolução de problemas de armazenamento.