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:
- 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.
- 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/
.
- 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!".
- Crie um VolumeSnapshot.
- Crie um VolumeSnapshot que capture o estado do volume do pod.
- 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!"
- 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.