Skip to main content

Restaurar um Snapshot

O Kubernetes permite que seja realizada a restauração de um VolumeSnapshot (VS) em um novo PersistentVolumeClaim (PVC).

info

Funcionalidade somente disponível para a versão v3.

Clique aqui para mais informações sobre as versões de plataforma do produto de Kubernetes.

Com acesso ao Cluster, crie um novo PVC, conectando-o a um VolumeSnapshot previamente criado:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: meu-pvc-restaurado
spec:
storageClassName: mgc-csi-magalu-sc
dataSource:
name: meu-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
EOF

Verifique que o PVC foi criado corretamente. O status ficará como Pending até que um Pod utilize o PVC, de acordo com o parâmetros do StorageClass padrão:

kubectl get pvc meu-pvc-restaurado

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
meu-pvc-restaurado Pending mgc-csi-magalu-sc <unset> 15s

Para realizar a criação do PersistentVolume, crie um Pod para utilizar o PVC criado no comando anterior.

info

Caso o VolumeSnapshotClass seja do tipo Instant (como o VolumeSnapshotClass padrão), o Pod que utilizar o VolumeSnapshot deverá estar na mesma zona de disponibilidade (AZ) do PersistentVolume (PV) no qual o VolumeSnapshot foi criado.

Com o tipo Object, o VolumeSnapshot será disponibilizado em todas as AZs, podendo ser consumido por Pods agendados em Nodes de qualquer AZ.

Para encontrar a AZ do PV, primeiramente identifique o nome do PV (campo VOLUME) através do PVC no qual o VolumeSnapshot foi criado:

kubectl get pvc meu-pvc

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
meu-pvc Bound pvc-3e35c607-17e8-4ef7-9720-77bfcf36ad5c 20Gi RWO mgc-csi-magalu-sc <unset> 15m90s

Verifique a AZ do PV utilizando o valor do campo VOLUME do comando acima:

kubectl get pv pvc-3e35c607-17e8-4ef7-9720-77bfcf36ad5c -o custom-columns=NAME:.metadata.name,AZ:".spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values[0]"

NAME AZ
pvc-3e35c607-17e8-4ef7-9720-77bfcf36ad5c br-se1-a

Crie o Pod utilizando o campo .spec.nodeSelector para instanciá-lo na AZ correta:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: pod-com-pvc-restaurado
spec:
nodeSelector:
topology.kubernetes.io/zone: br-se1-a
volumes:
- name: meu-pvc-restaurado
persistentVolumeClaim:
claimName: meu-pvc-restaurado
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: meu-pvc-restaurado
EOF

Verifique que o PVC está sendo utilizado (STATUS: Bound):

kubectl get pvc meu-pvc-restaurado

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
meu-pvc-restaurado Bound pvc-01bc9c15-88de-45da-8929-3aa0895f0223 20Gi RWO mgc-csi-magalu-sc <unset> 16m

E também que um novo PV foi criado:

kubectl get pv pvc-01bc9c15-88de-45da-8929-3aa0895f0223

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pvc-01bc9c15-88de-45da-8929-3aa0895f0223 20Gi RWO Retain Bound default/meu-pvc-restaurado mgc-csi-magalu-sc <unset> 4m55s