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:
- 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.
- 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/.
- Grave um arquivo no volume do pod.
- Crie um arquivo chamado
hello.txtno volume do pod. O conteúdo do arquivo é "Hello World!".
- Criar um VolumeSnapshot.
- Crie um VolumeSnapshot que capture o estado do volume do pod.
- Corrompa o arquivo.
- Altere o arquivo
hello.txtpara que ele pareça um arquivo corrompido. O conteúdo do arquivo agora é "Hello W-corrupted-file-orld!"
- 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.txtfoi 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.