En esta página se explica cómo crear copias de seguridad y restaurar el almacenamiento en discos persistentes mediante capturas de volumen.
Para obtener una introducción, consulta Acerca de las copias de seguridad de volúmenes de Kubernetes.
Requisitos
Para usar capturas de volumen en GKE, debes cumplir los siguientes requisitos:
Usa un controlador de CSI que admita las copias de seguridad. El controlador Persistent Disk integrado no admite instantáneas. Para crear y gestionar capturas, debes usar el mismo controlador de CSI que el
PersistentVolumeClaim(PVC) subyacente.Para las capturas de volumen de Persistent Disk (PD), usa el controlador de CSI para Persistent Disk en Compute Engine. El controlador de CSI para Persistent Disk en Compute Engine se instala de forma predeterminada en los clústeres Linux nuevos que ejecutan GKE 1.18.10-gke.2100 o versiones posteriores, o bien 1.19.3-gke.2100 o versiones posteriores. También puedes habilitar el controlador de CSI para Persistent Disk en Compute Engine en un clúster.
Para ver una lista de todos los controladores CSI que admiten snapshots, consulta la columna Otras funciones de Controladores en la documentación de Kubernetes.
Usa las versiones 1.17 o posteriores del plano de control. Para usar el controlador de CSI para Persistent Disk en Compute Engine en un
VolumeSnapshot, usa GKE 1.17.6-gke.4 o una versión posterior.
- Tener un
PersistentVolumeClaimque quieras usar para una captura. ElPersistentVolumeque uses para una fuente de captura debe gestionarse mediante un controlador CSI. Para comprobar si estás usando un controlador CSI, verifica que la especificaciónPersistentVolumetenga una seccióncsicondriver: pd.csi.storage.gke.ioofilestore.csi.storage.gke.io. Si elPersistentVolumese aprovisiona dinámicamente mediante el controlador CSI, tal como se describe en las siguientes secciones, lo gestiona el controlador CSI.
Limitaciones
Todas las restricciones para crear una instantánea de disco en Compute Engine también se aplican a GKE.
Prácticas recomendadas
Asegúrate de seguir las prácticas recomendadas para las capturas de discos de Compute Engine
cuando uses capturas de Volume Persistent Disk en GKE.
Antes de empezar
Antes de empezar, asegúrate de que has realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando
gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
Crear y usar una captura de volumen
En los ejemplos de este documento se muestra cómo realizar las siguientes tareas:
- Crea un
PersistentVolumeClaimy unDeployment. - Añade un archivo al
PersistentVolumeque usa elDeployment. - Crea una
VolumeSnapshotClasspara configurar la captura. - Crea una captura de volumen de
PersistentVolume. - Elimina el archivo de prueba.
- Restaura el
PersistentVolumea la captura que has creado. - Verifica que la restauración se haya realizado correctamente.
Para usar una copia de seguridad de un volumen, debes completar los siguientes pasos:
- Crea un objeto
VolumeSnapshotClasspara especificar el controlador CSI y la política de eliminación de tu snapshot. - Crea un objeto
VolumeSnapshotpara solicitar una captura de unPersistentVolumeClaim. - Haz referencia a la
VolumeSnapshoten unPersistentVolumeClaimpara restaurar un volumen a esa captura o crear un volumen nuevo a partir de la captura.
Crear un PersistentVolumeClaim y un Deployment
Para crear el objeto
PersistentVolumeClaim, guarda el siguiente manifiesto comomy-pvc.yaml:Persistent Disk
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1GiEn este ejemplo se usa la clase de almacenamiento
standard-rwoinstalada de forma predeterminada con el controlador de CSI para Persistent Disk en Compute Engine. Para obtener más información, consulta Usar el controlador de CSI para Persistent Disk en Compute Engine.En el caso de
spec.storageClassName, puedes especificar cualquier clase de almacenamiento que utilice un controlador CSI compatible.Aplica el archivo de manifiesto:
kubectl apply -f my-pvc.yamlPara crear un
Deployment, guarda el siguiente manifiesto 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-pvcAplica el archivo de manifiesto:
kubectl apply -f my-deployment.yamlComprueba el estado de la
Deployment:kubectl get deployment hello-appPuede que el
Deploymenttarde un poco en estar listo. Puedes ejecutar el comando anterior hasta que veas un resultado similar al siguiente:NAME READY UP-TO-DATE AVAILABLE AGE hello-app 1/1 1 1 2m55s
Añade un archivo de prueba al volumen
Enumera los
Podsde laDeployment:kubectl get pods -l app=hello-appEl resultado debería ser similar al siguiente:
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56sCrea un archivo de prueba en un
Pod:kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'Sustituye
POD_NAMEpor el nombre de laPod.Comprueba que el archivo exista:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'El resultado debería ser similar al siguiente:
Hello World!
Crear un objeto VolumeSnapshotClass
Crea un objeto VolumeSnapshotClass para especificar el controlador CSI y deletionPolicy de tu instantánea de volumen. Puedes hacer referencia a objetos VolumeSnapshotClass al crear objetos VolumeSnapshot.
Guarda el siguiente archivo de manifiesto como
volumesnapshotclass.yaml.Persistent Disk
Usa la versión
v1de la API para los clústeres que ejecuten la versión 1.21 o una posterior.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: DeleteEn este ejemplo:
El controlador de CSI usa el campo
driverpara aprovisionar la instantánea. En este ejemplo,pd.csi.storage.gke.iousa el controlador de CSI para Persistent Disk en Compute Engine.El campo
deletionPolicyindica a GKE qué debe hacer con el objetoVolumeSnapshotContenty la instantánea subyacente cuando se elimine el objetoVolumeSnapshotenlazado. EspecificaDeletepara eliminar el objetoVolumeSnapshotContenty la instantánea subyacente. EspecificaRetainsi quieres conservar elVolumeSnapshotContenty la instantánea subyacente.Para usar una ubicación de almacenamiento personalizada, añade un parámetro
storage-locationsa la clase de la instantánea. Para usar este parámetro, tus clústeres deben usar la versión 1.21 o una 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 crear una imagen de disco, añade lo siguiente al campo
parameters:parameters: snapshot-type: images image-family: IMAGE_FAMILYSustituye
IMAGE_FAMILYpor el nombre de la familia de imágenes que prefieras, comopreloaded-data.
Aplica el archivo de manifiesto:
kubectl apply -f volumesnapshotclass.yaml
Crear un VolumeSnapshot
Un objeto VolumeSnapshot es una solicitud de una instantánea de un objeto PersistentVolumeClaim. Cuando creas un objeto VolumeSnapshot, GKE lo crea y lo vincula automáticamente con un objeto VolumeSnapshotContent, que es un recurso de tu clúster, como un objeto PersistentVolume.
Guarda el siguiente archivo de manifiesto como
volumesnapshot.yaml.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvcAplica el archivo de manifiesto:
kubectl apply -f volumesnapshot.yamlDespués de crear una
Volumeinstantánea, GKE crea un objetoVolumeSnapshotContentcorrespondiente en el clúster. Este objeto almacena la instantánea y las vinculaciones de los objetosVolumeSnapshot. No interactúas directamente con los objetosVolumeSnapshotContents.Confirma que GKE ha creado el objeto
VolumeSnapshotContents:kubectl get volumesnapshotcontentsEl resultado debería ser similar al siguiente:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
Una vez que se haya creado el contenido de la captura Volume, el controlador CSI que hayas especificado en VolumeSnapshotClass creará una captura en el sistema de almacenamiento correspondiente. Una vez que GKE crea una instantánea en el sistema de almacenamiento y la vincula a un objeto VolumeSnapshot en el clúster, la instantánea está lista para usarse. Para comprobar el estado, ejecuta el siguiente comando:
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
Si la instantánea está lista para usarse, el resultado será similar al siguiente:
NAME READY
my-snapshot true
Eliminar el archivo de prueba
Elimina el archivo de prueba que has creado:
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'Comprueba que el archivo ya no existe:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'El resultado debería ser similar al siguiente:
cat: /usr/share/hello/hello.txt: No such file or directory
Restaurar la captura del volumen
Puedes hacer referencia a una VolumeSnapshot en un PersistentVolumeClaim para aprovisionar un volumen nuevo con datos de un volumen ya creado o restaurar un volumen a un estado que hayas capturado en la captura.
Para hacer referencia a un VolumeSnapshot en un PersistentVolumeClaim, añade el campo dataSource al PersistentVolumeClaim. Se sigue el mismo proceso tanto si VolumeSnapshotContents hace referencia a una imagen de disco como a una instantánea.
En este ejemplo, se hace referencia al VolumeSnapshot que has creado en un nuevo PersistentVolumeClaim y se actualiza el Deployment para que use la nueva reclamación.
Comprueba si estás usando una copia de seguridad de disco o de imagen, que se diferencian en lo siguiente:
- Capturas de disco: haz capturas con frecuencia y restaura con poca frecuencia.
- Capturas de imágenes: haz capturas con poca frecuencia y restaura con frecuencia. Las capturas de imágenes también pueden tardar más en crearse que las capturas de discos.
Para obtener más información, consulta Límites de frecuencia de las copias de seguridad. Conocer el tipo de copia te ayudará a solucionar cualquier problema.
Inspecciona el
VolumeSnapshot:kubectl describe volumesnapshot SNAPSHOT_NAMEEl campo
volumeSnapshotClassNameespecifica la clase de la instantánea.kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAMEEl parámetro
snapshot-typeespecificarásnapshotsoimages. Si no se indica, el valor predeterminado essnapshots.Si no hay ninguna clase de captura (por ejemplo, si la captura se ha creado de forma estática), inspecciona
VolumeSnapshotContents.sh kubectl describe volumesnapshotcontents SNAPSHOT_CONTENTS_NAMEEl formato de un identificador de captura en la salida indica el tipo de captura, de la siguiente manera: *projects/PROJECT_NAME/global/snapshots/SNAPSHOT_NAME: captura de discoprojects/PROJECT_NAME/global/images/IMAGE_NAME: imagen de la captura
Guarda el siguiente archivo de manifiesto 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: 1GiAplica el archivo de manifiesto:
kubectl apply -f pvc-restore.yamlActualiza el archivo
my-deployment.yamlpara usar el nuevoPersistentVolumeClaim:... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restoreAplica el archivo de manifiesto actualizado:
kubectl apply -f my-deployment.yaml
Comprobar que la instantánea se ha restaurado correctamente
Obtén el nombre del nuevo
Podque GKE crea para elDeploymentactualizado:kubectl get pods -l app=hello-app
Verifica que el archivo de prueba exista:
kubectl exec NEW_POD_NAME \
-- sh -c 'cat /usr/share/hello/hello.txt'
Sustituye NEW_POD_NAME por el nombre del nuevo Pod
que ha creado GKE.
El resultado debería ser similar al siguiente:
Hello World!
Importar una copia de seguridad
Puedes usar una instantánea de volumen creada fuera del clúster actual para aprovisionar manualmente el objeto VolumeSnapshotContents. Por ejemplo, puedes rellenar un volumen en GKE con una instantánea de otroGoogle Cloud recurso creado en otro clúster.
Busca el nombre de la copia.
Google Cloud consola
Google Cloud CLI
Ejecuta el siguiente comando:
gcloud compute snapshots listEl resultado debería ser similar al siguiente:
NAME DISK_SIZE_GB SRC_DISK STATUS snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0 1 us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READYGuarda el siguiente manifiesto
VolumeSnapshotcomorestored-snapshot.yaml.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: restored-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: volumeSnapshotContentName: restored-snapshot-contentAplica el archivo de manifiesto:
kubectl apply -f restored-snapshot.yamlGuarda el siguiente manifiesto
VolumeSnapshotContentcomorestored-snapshot-content.yaml. Sustituye el camposnapshotHandlepor el ID de tu proyecto y el nombre de la instantánea. TantovolumeSnapshotRef.namecomovolumeSnapshotRef.namespacedeben apuntar alVolumeSnapshotcreado anteriormente para que el enlace bidireccional sea válido.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: defaultAplica el archivo de manifiesto:
kubectl apply -f restored-snapshot-content.yamlGuarda el siguiente manifiesto
PersistentVolumeClaimcomorestored-pvc.yaml. El controlador de almacenamiento de Kubernetes buscará unVolumeSnapshotllamadorestored-snapshoty, a continuación, intentará encontrar o crear dinámicamente unPersistentVolumecomo fuente de datos. Después, puedes usar este PVC en un pod para acceder a los datos 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: 1GiAplica el archivo de manifiesto:
kubectl apply -f restored-pvc.yamlGuarda el siguiente manifiesto
Podcomorestored-pod.yamlhaciendo referencia a laPersistentVolumeClaim. El controlador de CSI aprovisionará unPersistentVolumey lo rellenará con la información de la instantánea.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: falseAplica el archivo de manifiesto:
kubectl apply -f restored-pod.yamlVerifica que el archivo se haya restaurado:
kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
Limpieza
Para evitar que se apliquen cargos en tu Google Cloud cuenta por los recursos utilizados en esta página, sigue estos pasos.
Elimina el
VolumeSnapshot:kubectl delete volumesnapshot my-snapshotElimina el
VolumeSnapshotClass:kubectl delete volumesnapshotclass my-snapshotclassElimina el
Deployment:kubectl delete deployments hello-appElimina los
PersistentVolumeClaimobjetos:kubectl delete pvc my-pvc pvc-restore
Siguientes pasos
- Consulta la documentación sobre creación de copias de seguridad de volúmenes de Kubernetes.
- Consulta información sobre la ampliación de volumen.
- Consulta cómo instalar manualmente un controlador de CSI.
- Consulta información sobre el almacenamiento en bloque (Persistent Disk) para GKE.