Esta página mostra como fazer backup e restaurar o armazenamento do Persistent Disk usando snapshots de volume.
Para uma introdução, consulte Sobre snapshots de volume do Kubernetes.
Requisitos
Para usar snapshots de volume no GKE, você precisa atender aos seguintes requisitos:
Use um driver CSI que seja compatível com snapshots. O driver de Persistent Disk na árvore não é compatível com snapshots. Para criar e gerenciar snapshots, você precisa usar o mesmo driver CSI que o
PersistentVolumeClaim(PVC) subjacente.Para snapshots de volume de Persistent Disk (PD, na sigla em inglês), use o driver CSI do Persistent Disk do Compute Engine. O driver CSI do Persistent Disk do Compute Engine é instalado por padrão em novos clusters do Linux que executam o GKE versão 1.18.10-gke.2100 ou posterior ou versão 1.19.3-gke.2100 ou posterior. Também é possível ativar o driver CSI de Persistent Disk do Compute Engine em um cluster atual.
Para ver uma lista de todos os drivers CSI compatíveis com snapshots, consulte a coluna Outros recursos em Drivers na documentação do Kubernetes.
Use as versões 1.17 ou mais recentes do plano de controle. Para usar o driver CSI de Persistent Disk do Compute Engine em um
VolumeSnapshot, use as versões GKE 1.17.6-gke.4 ou posteriores.
- Tenha um
PersistentVolumeClaimpara usar em um snapshot. OPersistentVolumeque você usa para uma origem de snapshot precisa ser gerenciado por um driver CSI. Para saber se você está usando um driver CSI, verifique se a especificação doPersistentVolumetem uma seçãocsicomdriver: pd.csi.storage.gke.iooufilestore.csi.storage.gke.io. Se oPersistentVolumefor provisionado dinamicamente pelo driver CSI conforme descrito nas seções a seguir, ele será gerenciado pelo driver CSI.
Limitações
Todas as restrições para criar um snapshot de disco no Compute Engine também se aplicam ao GKE.
Práticas recomendadas
Siga as práticas recomendadas para snapshots de disco do Compute Engine ao usar snapshots Volume de Persistent Disk no GKE.
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ativar a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a CLI do Google Cloud para essa tarefa,
instale e inicialize a
gcloud CLI. Se você instalou a CLI gcloud anteriormente, instale a versão
mais recente executando o comando
gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.
Como criar e usar um snapshot de volume
Os exemplos neste documento mostram como fazer o seguinte:
- Crie um
PersistentVolumeClaime umDeployment. - Adicione um arquivo a
PersistentVolumeusado peloDeployment. - Crie um
VolumeSnapshotClasspara configurar o snapshot. - Crie um snapshot de volume do
PersistentVolume. - Exclua o arquivo de teste.
- Restaure o
PersistentVolumepara o snapshot criado. - Verifique se a restauração funcionou.
Para usar um snapshot de volume, conclua as etapas a seguir:
- Crie um objeto
VolumeSnapshotClasspara especificar o driver CSI e a política de exclusão do snapshot. - Crie um objeto
VolumeSnapshotpara solicitar um snapshot de umPersistentVolumeClaimexistente. - Faça referência ao
VolumeSnapshotem umPersistentVolumeClaimpara restaurar um volume para esse snapshot ou criar um novo volume usando o snapshot.
Criar um PersistentVolumeClaim e um Deployment
Para criar o objeto
PersistentVolumeClaim, salve o manifesto a seguir comomy-pvc.yaml:Persistent Disk
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1GiEste exemplo usa a classe de armazenamento
standard-rwoinstalada por padrão com o driver CSI de Persistent Disk do Compute Engine. Para saber mais, consulte Como usar o driver CSI do Persistent Disk do Compute Engine.Para
spec.storageClassName, é possível especificar qualquer classe de armazenamento que use um driver CSI compatível.Aplique o manifesto:
kubectl apply -f my-pvc.yamlPara criar um
Deployment, salve o seguinte manifesto comomy-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: hello-app 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: sdk-volume mountPath: /usr/share/hello/ volumes: - name: sdk-volume persistentVolumeClaim: claimName: my-pvcAplique o manifesto:
kubectl apply -f my-deployment.yamlVerifique o status de
Deployment.kubectl get deployment hello-appPode levar algum tempo para
Deploymentficar pronto. Execute o comando anterior até ver uma saída semelhante a esta:NAME READY UP-TO-DATE AVAILABLE AGE hello-app 1/1 1 1 2m55s
Adicionar um arquivo de teste ao volume
Liste o
PodsnoDeployment:kubectl get pods -l app=hello-appO resultado será assim:
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56sCrie um arquivo de teste em um
Pod:kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'Substitua
POD_NAMEpelo nome doPod.Verifique se o arquivo existe.
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'O resultado será assim:
Hello World!
Criar um objeto VolumeSnapshotClass.
Crie um objeto VolumeSnapshotClass para especificar o driver CSI e deletionPolicy para o snapshot de volume. É possível referenciar
objetos VolumeSnapshotClass ao criar objetos VolumeSnapshot.
Salve o seguinte manifesto
volumesnapshotclass.yamlcomo :Persistent Disk
Use a versão da API
v1para clusters que executam as versões 1.21 ou posteriores.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: DeleteNeste exemplo:
O campo
driveré usado pelo driver CSI para provisionar o snapshot. Neste exemplo,pd.csi.storage.gke.iousa o driver CSI de Persistent Disk do Compute Engine.O campo
deletionPolicyinforma ao GKE o que fazer com o objetoVolumeSnapshotContente o snapshot subjacente quando o objetoVolumeSnapshotvinculado é excluído. EspecifiqueDeletepara excluir o objetoVolumeSnapshotContente o snapshot subjacente. EspecifiqueRetainse quiser manterVolumeSnapshotContente o snapshot subjacente.Para usar um local de armazenamento personalizado, adicione um parâmetro
storage-locationsà classe de snapshot. Para usar esse parâmetro, os clusters precisam usar a versão 1.21 ou posterior.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass parameters: storage-locations: us-east2 driver: pd.csi.storage.gke.io deletionPolicy: DeletePara criar uma imagem de disco, adicione o seguinte ao campo
parameters:parameters: snapshot-type: images image-family: IMAGE_FAMILYSubstitua
IMAGE_FAMILYpelo nome da família de imagens preferida, comopreloaded-data.
Aplique o manifesto:
kubectl apply -f volumesnapshotclass.yaml
Criar um VolumeSnapshot
Um objeto VolumeSnapshot é uma solicitação para um snapshot de um objeto PersistentVolumeClaim atual. Quando você cria um objeto VolumeSnapshot, o GKE o cria e o vincula automaticamente a um objeto VolumeSnapshotContent, que é um recurso no cluster como um objeto PersistentVolume.
Salve o seguinte manifesto
volumesnapshot.yamlcomo :apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvcAplique o manifesto:
kubectl apply -f volumesnapshot.yamlDepois de criar um snapshot
Volume, o GKE cria um objetoVolumeSnapshotContentcorrespondente no cluster. Esse objeto armazena o snapshot e as vinculações dos objetosVolumeSnapshot. Você não interage diretamente com objetosVolumeSnapshotContents.Confirme se o GKE criou o objeto
VolumeSnapshotContents:kubectl get volumesnapshotcontentsO resultado será assim:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
Depois que o conteúdo do snapshot de Volume é criado, o driver CSI especificado
em VolumeSnapshotClass cria um snapshot no sistema de armazenamento
correspondente. Depois que o GKE cria um snapshot no sistema de armazenamento e
o vincula a um objeto VolumeSnapshot no cluster, o snapshot está
pronto para uso. Verifique o status executando o seguinte comando:
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
Se o snapshot estiver pronto para uso, a saída será semelhante a esta:
NAME READY
my-snapshot true
Excluir o arquivo de teste
Exclua o arquivo de teste que você criou:
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'Verifique se o arquivo não existe mais:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'O resultado será assim:
cat: /usr/share/hello/hello.txt: No such file or directory
Restaurar o snapshot do volume
É possível referenciar um VolumeSnapshot em um PersistentVolumeClaim para provisionar um novo volume com dados de um volume atual ou restaurar um volume para um estado capturado no snapshot.
Para fazer referência a um VolumeSnapshot em um PersistentVolumeClaim, adicione o
campo dataSource ao seu PersistentVolumeClaim. O mesmo processo é usado
se VolumeSnapshotContents se referir a uma imagem de disco ou um snapshot.
Neste exemplo, você faz referência ao VolumeSnapshot criado em um novo
PersistentVolumeClaim e atualiza o Deployment para usar a nova declaração.
Verifique se você está usando um snapshot de disco ou de imagem, que é diferente da seguinte:
- Instantâneos de disco: tire snapshots com frequência e restaure-os com pouca frequência.
- Snapshots de imagem: tire snapshots com pouca frequência e restaure-os com frequência. A criação de snapshots de imagem também pode ser mais lenta do que a de snapshots de disco.
Para detalhes, consulte Limites de frequência de snapshots. Conhecer o tipo de snapshot ajuda a resolver problemas.
Inspecione o
VolumeSnapshot:kubectl describe volumesnapshot SNAPSHOT_NAMEO campo
volumeSnapshotClassNameespecifica a classe de snapshot.kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAMEO parâmetro
snapshot-typeespecificarásnapshotsouimages. Se não for fornecido, o padrão serásnapshots.Se não houver classe de snapshot (por exemplo, se o snapshot foi criado estaticamente), inspecione o
VolumeSnapshotContents.sh kubectl describe volumesnapshotcontents SNAPSHOT_CONTENTS_NAMEO formato de um gerenciador de snapshot na saída informa o tipo de snapshot da seguinte maneira: *projects/PROJECT_NAME/global/snapshots/SNAPSHOT_NAME: snapshot do discoprojects/PROJECT_NAME/global/images/IMAGE_NAME: snapshot da imagem
Salve o seguinte manifesto como
pvc-restore.yaml:Persistent Disk
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1GiAplique o manifesto:
kubectl apply -f pvc-restore.yamlAtualize o arquivo
my-deployment.yamlpara usar o novoPersistentVolumeClaim:... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restoreAplique o manifesto atualizado:
kubectl apply -f my-deployment.yaml
Verificar se o snapshot foi restaurado
Obtenha o nome do novo
Podque o GKE cria para oDeploymentatualizado:kubectl get pods -l app=hello-app
Verifique se o arquivo de teste existe:
kubectl exec NEW_POD_NAME \
-- sh -c 'cat /usr/share/hello/hello.txt'
Substitua NEW_POD_NAME pelo nome do novo Pod criado pelo GKE.
O resultado será assim:
Hello World!
Importar um snapshot preexistente
É possível usar um snapshot de volume atual criado fora do cluster atual
para provisionar manualmente o objeto VolumeSnapshotContents. Por exemplo, é possível
preencher um volume no GKE com um snapshot de outro
recurso doCloud de Confiance criado em um cluster diferente.
Localize o nome do snapshot.
Console do Cloud de Confiance
CLI do Google Cloud
Execute este comando:
gcloud compute snapshots listO resultado será assim:
NAME DISK_SIZE_GB SRC_DISK STATUS snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0 1 us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READYSalve o seguinte manifesto
VolumeSnapshotcomorestored-snapshot.yaml.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: restored-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: volumeSnapshotContentName: restored-snapshot-contentAplique o manifesto:
kubectl apply -f restored-snapshot.yamlSalve o seguinte manifesto
VolumeSnapshotContentcomorestored-snapshot-content.yaml. Substitua o camposnapshotHandlepelo ID do projeto e nome do snapshot. TantovolumeSnapshotRef.namequantovolumeSnapshotRef.namespaceprecisam apontar para aVolumeSnapshotcriada anteriormente para que a vinculação bidirecional seja válida.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: restored-snapshot-content spec: deletionPolicy: Retain driver: pd.csi.storage.gke.io source: snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME volumeSnapshotRef: kind: VolumeSnapshot name: restored-snapshot namespace: defaultAplique o manifesto:
kubectl apply -f restored-snapshot-content.yamlSalve o seguinte manifesto
PersistentVolumeClaimcomorestored-pvc.yaml. O controlador de armazenamento do Kubernetes encontrará umVolumeSnapshotchamadorestored-snapshote tentará encontrar ou criar dinamicamente umPersistentVolumecomo a fonte de dados. Depois, use esse PVC em um pod para acessar os dados restaurados.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: restored-pvc spec: dataSource: name: restored-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1GiAplique o manifesto:
kubectl apply -f restored-pvc.yamlSalve o manifesto
Poda seguir comorestored-pod.yamlse referindo aPersistentVolumeClaim. O driver CSI provisionará umPersistentVolumee o preencherá a partir do snapshot.apiVersion: v1 kind: Pod metadata: name: restored-pod spec: containers: - name: busybox image: busybox args: - sleep - "3600" volumeMounts: - name: source-data mountPath: /demo/data volumes: - name: source-data persistentVolumeClaim: claimName: restored-pvc readOnly: falseAplique o manifesto:
kubectl apply -f restored-pod.yamlVerifique se o arquivo foi restaurado:
kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
Limpar
Para evitar cobranças na conta do Cloud de Confiance by S3NS pelos recursos usados nesta página, siga as etapas abaixo.
Exclua o
VolumeSnapshot:kubectl delete volumesnapshot my-snapshotExclua o
VolumeSnapshotClass:kubectl delete volumesnapshotclass my-snapshotclassExclua o
Deployment:kubectl delete deployments hello-appExcluir os objetos
PersistentVolumeClaim:kubectl delete pvc my-pvc pvc-restore
A seguir
- Leia a documentação do Snapshot de volume do Kubernetes.
- Saiba mais sobre a expansão de volume.
- Saiba como instalar manualmente um driver CSI.
- Saiba mais sobre o armazenamento em blocos (Persistent Disk) para o GKE.