Questa pagina mostra come eseguire il backup e il ripristino dello spazio di archiviazione Persistent Disk utilizzando gli snapshot dei volumi.
Per un'introduzione, vedi Informazioni sugli snapshot dei volumi Kubernetes.
Requisiti
Per utilizzare le istantanee del volume su GKE, devi soddisfare i seguenti requisiti:
Utilizza un driver CSI che supporti gli snapshot. Il driver Persistent Disk in-tree non supporta gli snapshot. Per creare e gestire gli snapshot, devi utilizzare lo stesso driver CSI del
PersistentVolumeClaim(PVC) sottostante.Per gli snapshot dei volumi del disco permanente, utilizza il driver CSI per il disco permanente di Compute Engine. Il driver CSI del disco permanente di Compute Engine è installato per impostazione predefinita sui nuovi cluster Linux che eseguono GKE versione 1.18.10-gke.2100 o successive oppure versione 1.19.3-gke.2100 o successive. Puoi anche abilitare il driver CSI per il disco permanente di Compute Engine su un cluster esistente.
Per un elenco di tutti i driver CSI che supportano gli snapshot, consulta la colonna Altre funzionalità in Driver nella documentazione di Kubernetes.
Utilizza le versioni del control plane 1.17 o successive. Per utilizzare il driver CSI del disco permanente di Compute Engine in un
VolumeSnapshot, utilizza GKE versione 1.17.6-gke.4 o successive.
- Avere un
PersistentVolumeClaimesistente da utilizzare per uno snapshot. IlPersistentVolumeche utilizzi per un'origine snapshot deve essere gestito da un driver CSI. Puoi verificare di utilizzare un driver CSI controllando che la specificaPersistentVolumeabbia una sezionecsicondriver: pd.csi.storage.gke.ioofilestore.csi.storage.gke.io. SePersistentVolumeviene provisionato dinamicamente dal driver CSI come descritto nelle sezioni seguenti, viene gestito dal driver CSI.
Limitazioni
Tutte le limitazioni per la creazione di uno snapshot del disco su Compute Engine si applicano anche a GKE.
Best practice
Assicurati di seguire le best practice per gli snapshot dei dischi Compute Engine
quando utilizzi gli snapshot di Persistent Disk Volume su GKE.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Creazione e utilizzo di uno snapshot del volume
Gli esempi riportati in questo documento mostrano come svolgere le seguenti attività:
- Crea un
PersistentVolumeClaime unDeployment. - Aggiungi un file al
PersistentVolumeutilizzato daDeployment. - Crea un
VolumeSnapshotClassper configurare lo snapshot. - Crea uno snapshot del volume di
PersistentVolume. - Elimina il file di test.
- Ripristina
PersistentVolumeallo snapshot che hai creato. - Verifica che il ripristino abbia funzionato.
Per utilizzare uno snapshot del volume, devi completare i seguenti passaggi:
- Crea un oggetto
VolumeSnapshotClassper specificare il driver CSI e la policy di eliminazione per lo snapshot. - Crea un oggetto
VolumeSnapshotper richiedere uno snapshot di unPersistentVolumeClaimesistente. - Fai riferimento a
VolumeSnapshotin unPersistentVolumeClaimper ripristinare un volume a quello snapshot o creare un nuovo volume utilizzando lo snapshot.
Crea un PersistentVolumeClaim e un Deployment
Per creare l'oggetto
PersistentVolumeClaim, salva il seguente manifest comemy-pvc.yaml:Persistent Disk
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1GiQuesto esempio utilizza la classe di archiviazione
standard-rwoinstallata per impostazione predefinita con il driver CSI per il disco permanente di Compute Engine. Per saperne di più, consulta la sezione Utilizzo del driver CSI per il disco permanente di Compute Engine.Per
spec.storageClassName, puoi specificare qualsiasi classe di archiviazione che utilizzi un driver CSI supportato.Applica il manifest:
kubectl apply -f my-pvc.yamlPer creare un
Deployment, salva il seguente manifest comemy-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-pvcApplica il manifest:
kubectl apply -f my-deployment.yamlControlla lo stato di
Deployment:kubectl get deployment hello-appPotrebbe essere necessario un po' di tempo prima che
Deploymentsia pronto. Puoi eseguire il comando precedente finché non visualizzi un output simile al seguente:NAME READY UP-TO-DATE AVAILABLE AGE hello-app 1/1 1 1 2m55s
Aggiungere un file di test al volume
Elenca
PodsinDeployment:kubectl get pods -l app=hello-appL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56sCrea un file di test in un
Pod:kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'Sostituisci
POD_NAMEcon il nome diPod.Verifica che il file esista:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'L'output è simile al seguente:
Hello World!
Crea un oggetto VolumeSnapshotClass
Crea un oggetto VolumeSnapshotClass per specificare il driver CSI e
deletionPolicy per lo snapshot del volume. Puoi fare riferimento
agli oggetti VolumeSnapshotClass quando crei oggetti VolumeSnapshot.
Salva il seguente manifest come
volumesnapshotclass.yaml.Persistent Disk
Utilizza la versione dell'API
v1per i cluster che eseguono la versione 1.21 o successive.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: DeleteIn questo esempio:
Il campo
driverviene utilizzato dal driver CSI per eseguire il provisioning dello snapshot. In questo esempio,pd.csi.storage.gke.ioutilizza il driver CSI per il disco permanente di Compute Engine.Il campo
deletionPolicyindica a GKE cosa fare con l'oggettoVolumeSnapshotContente lo snapshot sottostante quando l'oggettoVolumeSnapshotassociato viene eliminato. SpecificaDeleteper eliminare l'oggettoVolumeSnapshotContente lo snapshot sottostante. SpecificaRetainse vuoi conservareVolumeSnapshotContente lo snapshot sottostante.Per utilizzare una località di archiviazione personalizzata, aggiungi un parametro
storage-locationsalla classe snapshot. Per utilizzare questo parametro, i tuoi cluster devono utilizzare la versione 1.21 o successive.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass parameters: storage-locations: us-east2 driver: pd.csi.storage.gke.io deletionPolicy: DeletePer creare un'immagine disco, aggiungi quanto segue al campo
parameters:parameters: snapshot-type: images image-family: IMAGE_FAMILYSostituisci
IMAGE_FAMILYcon il nome della famiglia di immagini che preferisci, ad esempiopreloaded-data.
Applica il manifest:
kubectl apply -f volumesnapshotclass.yaml
Crea un VolumeSnapshot
Un oggetto VolumeSnapshot è una richiesta di snapshot di un oggetto PersistentVolumeClaim esistente. Quando crei un oggetto VolumeSnapshot,
GKE lo crea e lo associa automaticamente a un oggetto VolumeSnapshotContent, che è una risorsa nel tuo cluster come un oggetto PersistentVolume.
Salva il seguente manifest come
volumesnapshot.yaml.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvcApplica il manifest:
kubectl apply -f volumesnapshot.yamlDopo aver creato uno snapshot
Volume, GKE crea un oggettoVolumeSnapshotContentcorrispondente nel cluster. Questo oggetto memorizza lo snapshot e i binding degli oggettiVolumeSnapshot. Non interagisci direttamente con gli oggettiVolumeSnapshotContents.Verifica che GKE abbia creato l'oggetto
VolumeSnapshotContents:kubectl get volumesnapshotcontentsL'output è simile al seguente:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
Dopo aver creato i contenuti dello snapshot Volume, il driver CSI specificato in VolumeSnapshotClass crea uno snapshot sul sistema di archiviazione corrispondente. Dopo che GKE crea uno snapshot sul sistema di archiviazione e
lo associa a un oggetto VolumeSnapshot sul cluster, lo snapshot è pronto per
l'uso. Puoi controllare lo stato eseguendo il comando seguente:
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
Se lo snapshot è pronto per l'uso, l'output è simile al seguente:
NAME READY
my-snapshot true
Eliminare il file di test
Elimina il file di test che hai creato:
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'Verifica che il file non esista più:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'L'output è simile al seguente:
cat: /usr/share/hello/hello.txt: No such file or directory
Ripristina lo snapshot del volume
Puoi fare riferimento a un VolumeSnapshot in un PersistentVolumeClaim per eseguire il provisioning
di un nuovo volume con i dati di un volume esistente o ripristinare un volume a uno
stato acquisito nello snapshot.
Per fare riferimento a un VolumeSnapshot in un PersistentVolumeClaim, aggiungi il campo dataSource al PersistentVolumeClaim. Lo stesso processo viene utilizzato
indipendentemente dal fatto che VolumeSnapshotContents si riferisca a un'immagine disco o a uno snapshot.
In questo esempio, fai riferimento a VolumeSnapshot che hai creato in un nuovo
PersistentVolumeClaim e aggiorna Deployment per utilizzare la nuova rivendicazione.
Verifica se stai utilizzando uno snapshot del disco o dell'immagine, che differiscono come segue:
- Snapshot dei dischi: esegui snapshot di frequente e ripristina raramente.
- Snapshot delle immagini: esegui snapshot di rado e ripristina di frequente. Anche la creazione di snapshot delle immagini potrebbe essere più lenta rispetto a quella degli snapshot dei dischi.
Per maggiori dettagli, consulta Limiti di frequenza degli snapshot. Conoscere il tipo di istantanea è utile se devi risolvere eventuali problemi.
Ispeziona il
VolumeSnapshot:kubectl describe volumesnapshot SNAPSHOT_NAMEIl campo
volumeSnapshotClassNamespecifica la classe dello snapshot.kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAMEIl parametro
snapshot-typespecificheràsnapshotsoimages. Se non viene specificato, il valore predefinito èsnapshots.Se non è presente una classe di snapshot (ad esempio, se lo snapshot è stato creato staticamente), ispeziona
VolumeSnapshotContents.sh kubectl describe volumesnapshotcontents SNAPSHOT_CONTENTS_NAMEIl formato di un handle di snapshot nell'output indica il tipo di snapshot, come segue: *projects/PROJECT_NAME/global/snapshots/SNAPSHOT_NAME: snapshot del discoprojects/PROJECT_NAME/global/images/IMAGE_NAME: snapshot dell'immagine
Salva il seguente manifest come
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: 1GiApplica il manifest:
kubectl apply -f pvc-restore.yamlAggiorna il file
my-deployment.yamlper utilizzare il nuovoPersistentVolumeClaim:... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restoreApplica il manifest aggiornato:
kubectl apply -f my-deployment.yaml
Verifica che il ripristino dello snapshot sia andato a buon fine
Recupera il nome del nuovo
Podcreato da GKE per l'Deploymentaggiornato:kubectl get pods -l app=hello-app
Verifica che il file di test esista:
kubectl exec NEW_POD_NAME \
-- sh -c 'cat /usr/share/hello/hello.txt'
Sostituisci NEW_POD_NAME con il nome del nuovo Pod
che GKE ha creato.
L'output è simile al seguente:
Hello World!
Importare uno snapshot preesistente
Puoi utilizzare uno snapshot del volume esistente creato al di fuori del cluster corrente
per eseguire il provisioning manuale dell'oggetto VolumeSnapshotContents. Ad esempio, puoi popolare un volume in GKE con uno snapshot di un'altra risorsaGoogle Cloud creata in un cluster diverso.
Individua il nome dello snapshot.
Console Google Cloud
Google Cloud CLI
Esegui questo comando:
gcloud compute snapshots listL'output è simile al seguente:
NAME DISK_SIZE_GB SRC_DISK STATUS snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0 1 us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READYSalva il seguente manifest
VolumeSnapshotcomerestored-snapshot.yaml.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: restored-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: volumeSnapshotContentName: restored-snapshot-contentApplica il manifest:
kubectl apply -f restored-snapshot.yamlSalva il seguente manifest
VolumeSnapshotContentcomerestored-snapshot-content.yaml. Sostituisci il camposnapshotHandlecon l'ID progetto e il nome dello snapshot. SiavolumeSnapshotRef.namechevolumeSnapshotRef.namespacedevono puntare aVolumeSnapshotcreato in precedenza affinché il binding bidirezionale sia valido.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: defaultApplica il manifest:
kubectl apply -f restored-snapshot-content.yamlSalva il seguente manifest
PersistentVolumeClaimcomerestored-pvc.yaml. Il controller di archiviazione Kubernetes troverà unVolumeSnapshotdenominatorestored-snapshote poi tenterà di trovare o creare dinamicamente unPersistentVolumecome origine dati. Puoi quindi utilizzare questa PVC in un pod per accedere ai dati ripristinati.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: 1GiApplica il manifest:
kubectl apply -f restored-pvc.yamlSalva il seguente manifest
Podcomerestored-pod.yamlfacendo riferimento aPersistentVolumeClaim. Il driver CSI eseguirà il provisioning di unPersistentVolumee lo compilerà dallo 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: falseApplica il manifest:
kubectl apply -f restored-pod.yamlVerifica che il file sia stato ripristinato:
kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa pagina, segui questi passaggi.
Elimina il
VolumeSnapshot:kubectl delete volumesnapshot my-snapshotElimina il
VolumeSnapshotClass:kubectl delete volumesnapshotclass my-snapshotclassElimina il
Deployment:kubectl delete deployments hello-appElimina gli oggetti
PersistentVolumeClaim:kubectl delete pvc my-pvc pvc-restore
Passaggi successivi
- Leggi la documentazione Snapshot del volume Kubernetes.
- Scopri di più sull'espansione del volume.
- Scopri come installare manualmente un driver CSI.
- Scopri di più sull'archiviazione a blocchi (Persistent Disk) per GKE.