En Google Kubernetes Engine (GKE), puedes usar la función de instantánea de volumen de Kubernetes para volúmenes persistentes en los clústeres de GKE.
Las instantáneas de volumen te permiten crear una copia del volumen en un momento específico. Puedes usar esta copia para hacer que un volumen vuelva a su estado anterior o para aprovisionar un volumen nuevo. Una instantánea de volumen en Kubernetes equivale a realizar una copia de seguridad de los datos en otros sistemas de almacenamiento. Puedes usar instantáneas a fin de proteger tus cargas de trabajo y lograr objetivos de puntos de recuperación fundamentales para tu empresa en tu plan de recuperación ante desastres o si necesitas cumplir con los datos de forma periódica.
GKE admite dos formas de crear instantáneas de volumen:
- API de instantánea de volumen de la interfaz de almacenamiento de contenedores (CSI): este es un proceso manual que te permite crear y administrar instantáneas de volumen a través del controlador de CSI de disco persistente para Compute Engine o el controlador de CSI de Filestore mediante las primitivas nativas de código abierto de Kubernetes.
- Copia de seguridad para GKE: este es un servicio completamente administrado que automatiza la creación y la administración de instantáneas de volumen. La copia de seguridad para GKE admite la copia de seguridad de configuración y de volumen para cargas de trabajo con estado con discos persistentes. Para las cargas de trabajo con Filestore, solo se admite la copia de seguridad de configuración. Para la copia de seguridad de datos de Filestore, debes seguir usando la API de instantánea de volumen a través del controlador de CSI de Filestore.
En esta documentación, se explica cómo usar la API de instantánea de volumen con un controlador de CSI de GKE.
A partir de la versión 1.17 o posterior de GKE, puedes aprovisionar y adjuntar instantáneas de volumen con los siguientes componentes:
Requisitos
Para usar instantáneas de volumen en GKE, debes cumplir con los siguientes requisitos:
Usa un controlador CSI que admita instantáneas. El controlador de disco persistente en el árbol no admite instantáneas. Para crear y administrar instantáneas, debes usar el mismo controlador de CSI que el
PersistentVolumeClaim
(PVC) subyacente:- Para instantáneas de volumen de disco persistente (PD), usa el controlador de CSI de disco persistente para Compute Engine. El controlador CSI de disco persistente de Compute Engine se instala de forma predeterminada en los clústeres nuevos de Linux que ejecutan la versión 1.18.10-gke.2100 o posterior, o la versión 1.19.3-gke.2100 o posterior. También puedes habilitar el controlador de CSI de disco persistente de Compute Engine en un clúster existente.
- Para las instantáneas de volumen de Filestore, debes implementar el controlador de CSI de Filestore. El controlador de CSI de Filestore admite los siguientes niveles de servicio: HDD básico, SSD básico y Enterprise.
- Algunas limitaciones de funciones se aplican a las copias de seguridad de Filestore para instancias de nivel en vista previa.
- El controlador de CSI de Filestore no admite el nivel SSD de escala masiva para los flujos de trabajo de aprovisionamiento dinámico y copias de seguridad.
- Para obtener una lista de todos los controladores de CSI que admiten instantáneas, consulta la columna “Other features” en Controladores en la documentación de Kubernetes.
Usa las versiones 1.17 o posteriores del plano de control. Para usar el controlador CSI de disco persistente de Compute Engine en una VolumeSnapshot, usa la versión de GKE 1.17.6-gke.4 o posteriores. Para usar el controlador CSI de Filestore en una VolumeSnapshot, usa la versión de GKE 1.21 o posterior.
Tienes un
PersistentVolumeClaim
existente para usar en una instantánea. ElPersistentVolume
que usas para una fuente de instantáneas debe ser administrado por un controlador CSI. Puedes verificar que usas un controlador CSI si verificas que la especificación dePersistentVolume
tenga una seccióncsi
condriver: pd.csi.storage.gke.io
ofilestore.csi.storage.gke.io
. Si el controlador CSI aprovisiona de forma dinámica el PersistentVolume como se describe en las siguientes secciones, entonces lo administra el controlador CSI.
Limitaciones
Todas las restricciones para crear una instantánea de disco en Compute Engine también se aplican a GKE.
Los volúmenes de instantáneas tienen las mismas restricciones de tamaño que los volúmenes regulares. Por ejemplo, las instantáneas de Filestore deben ser mayores o iguales que 1 TiB en tamaño para el nivel HDD básico.
Prácticas recomendadas
Asegúrate de seguir las prácticas recomendadas para las instantáneas de discos de Compute Engine cuando uses instantáneas de volumen de disco persistente en GKE.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa la CLI de gcloud. Si ya instalaste la CLI de gcloud, ejecuta
gcloud components update
para obtener la versión más reciente.
Crea y usa una instantánea de volumen
En los ejemplos de este documento, se muestra cómo hacer las siguientes tareas:
- Crear un
PersistentVolumeClaim
y Deployment. - Agregar un archivo al recurso PersistentVolume que usa el Deployment.
- Crear un
VolumeSnapshotClass
para configurar la instantánea. - Crear una instantánea de volumen del PersistentVolume.
- Borrar el archivo de prueba.
- Restablecer el
PersistentVolume
en la instantánea que creaste. - Verificar que la restauración funcionó.
Para usar una instantánea de volumen, debes completar los siguientes pasos:
- Crea un objeto
VolumeSnapshotClass
a fin de especificar el controlador CSI y la política de eliminación para tu instantánea. - Crea un objeto
VolumeSnapshot
para solicitar una instantánea de un PersistentVolumeClaim existente. - Haz referencia a
VolumeSnapshot
en unaPersistentVolumeClaim
para restablecer un volumen en esa instantánea o crear un volumen nuevo con la instantánea.
Crea un PersistentVolumeClaim y un Deployment
Para crear el objeto
PersistentVolumeClaim
, guarda el siguiente manifiesto comomy-pvc.yaml
:Disco persistente
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
En este ejemplo, se usa la clase de almacenamiento
standard-rwo
instalada de forma predeterminada con el controlador de CSI de disco persistente para Compute Engine. Para obtener más información, consulta Usa el controlador de CSI de disco persistente para Compute Engine.Filestore
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: enterprise-rwx accessModes: - ReadWriteMany resources: requests: storage: 1Ti
En este ejemplo, se crea una PVC de nivel empresarial de Filestore. Para obtener más información, consulta Accede a instancias de Filestore con el controlador de CSI de Filestore.
Para
spec.storageClassName
, puedes especificar cualquier clase de almacenamiento que use un controlador CSI compatible.Aplica el manifiesto
kubectl apply -f my-pvc.yaml
Para crear un Deployment, guarda el siguiente manifiesto como
my-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-pvc
Aplica el manifiesto
kubectl apply -f my-deployment.yaml
Verifica el estado del Deployment:
kubectl get deployment hello-app
Es posible que el Deployment tarde 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
Agrega un archivo de prueba al volumen
Enumera los Pods en el Deployment:
kubectl get pods -l app=hello-app
El resultado es similar a este:
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56s
Crea un archivo de prueba en un pod:
kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
Reemplaza
POD_NAME
con el nombre del pod.Verifica que el archivo exista:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'
El resultado es similar al siguiente:
Hello World!
Crea un objeto VolumeSnapshotClass
Crea un objeto VolumeSnapshotClass
a fin de especificar el controlador CSI y deletionPolicy
para la instantánea de volumen. Puedes hacer referencia a objetos VolumeSnapshotClass
cuando creas objetos VolumeSnapshot
.
Guarda el siguiente manifiesto como
volumesnapshotclass.yaml
.Disco persistente
Usa la versión de la API
v1
para clústeres que ejecutan la versión 1.21 o posterior.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: Delete
En este ejemplo:
El controlador de CSI usa el campo
driver
para aprovisionar la instantánea. En este ejemplo,pd.csi.storage.gke.io
usa el controlador CSI del disco persistente de Compute Engine.El campo
deletionPolicy
le indica a GKE qué hacer con el objetoVolumeSnapshotContent
y la instantánea subyacente cuando se borra el objetoVolumeSnapshot
vinculado. EspecificaDelete
para borrar el objetoVolumeSnapshotContent
y la instantánea subyacente. EspecificaRetain
si deseas conservarVolumeSnapshotContent
y la instantánea subyacente.Para usar una ubicación de almacenamiento personalizada, agrega un parámetro
storage-locations
a la clase de instantánea. Para usar este parámetro, tus clústeres deben usar la versión 1.21 o 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: Delete
Para crear una imagen de disco, agrega lo siguiente al campo
parameters
:parameters: snapshot-type: images image-family: IMAGE_FAMILY
Reemplaza
IMAGE_FAMILY
por el nombre de tu familia de imágenes preferida, comopreloaded-data
.
Filestore
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: filestore.csi.storage.gke.io parameters: type: backup deletionPolicy: Delete
En este ejemplo:
- El controlador de CSI usa el campo
driver
para aprovisionar la instantánea. En este ejemplo,filestore.csi.storage.gke.io
usa el controlador de CSI de Filestore. - El campo
deletionPolicy
le indica a GKE qué hacer con el objetoVolumeSnapshotContent
y la instantánea subyacente cuando se borra el objetoVolumeSnapshot
vinculado. EspecificaDelete
para borrar el objetoVolumeSnapshotContent
y la instantánea subyacente. EspecificaRetain
si deseas conservarVolumeSnapshotContent
y la instantánea subyacente.
Aplica el manifiesto
kubectl apply -f volumesnapshotclass.yaml
Crea una VolumeSnapshot
Un objeto VolumeSnapshot
es una solicitud de una instantánea de un objeto PersistentVolumeClaim
existente. Cuando creas un objeto VolumeSnapshot
, GKE lo crea y lo vincula de forma automática con un objeto VolumeSnapshotContent
, que es un recurso en el clúster similar a un objeto PersistentVolume
.
Guarda el siguiente manifiesto como
volumesnapshot.yaml
.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvc
Aplica el manifiesto
kubectl apply -f volumesnapshot.yaml
Después de crear una instantánea de volumen, GKE crea un objeto
VolumeSnapshotContent
correspondiente en el clúster. Este objeto almacena la instantánea y las vinculaciones de objetosVolumeSnapshot
. No se interactúa directamente con los objetosVolumeSnapshotContents
.Confirma que GKE creó el objeto
VolumeSnapshotContents
:kubectl get volumesnapshotcontents
El resultado es similar a este:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
Después de crear el contenido de la instantánea de volumen, el controlador CSI que especificaste en VolumeSnapshotClass
crea una instantánea 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 de VolumeSnapshot
del clúster, la instantánea está lista para usarse. Para verificar 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 es similar al siguiente:
NAME READY
my-snapshot true
Borra el archivo de prueba
Borra el archivo de prueba que creaste:
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'
Verifica que el archivo ya no exista:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'
El resultado es similar al siguiente:
cat: /usr/share/hello/hello.txt: No such file or directory
Restablece la instantánea de volumen
Puedes hacer referencia a una VolumeSnapshot
en un PersistentVolumeClaim
para aprovisionar un volumen nuevo con datos de un volumen existente o restablecer un volumen a un estado que capturaste en la instantánea.
Para hacer referencia a una VolumeSnapshot
en un PersistentVolumeClaim
, agrega el campo dataSource
a tu PersistentVolumeClaim
. Se usa el mismo proceso, ya sea que VolumeSnapshotContents
haga referencia a una imagen de disco o a una instantánea.
En este ejemplo, debes hacer referencia a la VolumeSnapshot
que creaste en un PersistentVolumeClaim
nueva y actualizar el Deployment para que use la reclamación nueva.
Verifica si usas un disco o una instantánea de imagen, que difiere de la siguiente manera:
- Instantáneas de disco: toma instantáneas con frecuencia y restablece con poca frecuencia.
- Instantáneas de imágenes: Toma instantáneas con poca frecuencia y restablece con frecuencia. Las instantáneas de imágenes también pueden ser más lentas de crear que las instantáneas de disco.
Para obtener más información, consulta Límites de frecuencia de instantáneas. Conocer el tipo de instantánea te ayudará si necesitas solucionar problemas.
Inspecciona el
VolumeSnapshot
:kubectl describe volumesnapshot SNAPSHOT_NAME
El campo
volumeSnapshotClassName
especifica la clase de instantánea.kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAME
El parámetro
snapshot-type
especificarásnapshots
oimages
. Si no se proporciona, el valor predeterminado essnapshots
.Si no hay una clase de instantánea (por ejemplo, si la instantánea se creó de forma estática), inspecciona
VolumeSnapshotContents
.sh kubectl describe volumesnapshotcontents SNAPSHOT_CONTENTS_NAME
El formato del controlador de instantáneas en el resultado te indica el tipo de instantánea, de la siguiente manera: *projects/PROJECT_NAME/global/snapshots/SNAPSHOT_NAME
: instantánea de discoprojects/PROJECT_NAME/global/images/IMAGE_NAME
: Instantánea de imagen
Guarda el siguiente manifiesto como
pvc-restore.yaml
:Disco persistente
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: 1Gi
Filestore
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: enterprise-rwx accessModes: - ReadWriteMany resources: requests: storage: 1Ti
Aplica el manifiesto
kubectl apply -f pvc-restore.yaml
Actualiza el archivo
my-deployment.yaml
para usar elPersistentVolumeClaim
nuevo:... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restore
Aplica el manifiesto actualizado:
kubectl apply -f my-deployment.yaml
Verifica que la instantánea se haya restablecido correctamente
Obtén el nombre del Pod nuevo que GKE crea para la Deployment actualizada:
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'
Reemplaza NEW_POD_NAME
con el nombre del pod de GKE nuevo creado.
El resultado es similar a este:
Hello World!
Limpia
Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta página.
Borra
VolumeSnapshot
:kubectl delete volumesnapshot my-snapshot
Borra
VolumeSnapshotClass
:kubectl delete volumesnapshotclass my-snapshotclass
Borra la implementación:
kubectl delete deployments hello-app
Borra los objetos
PersistentVolumeClaim
:kubectl delete pvc my-pvc pvc-restore
¿Qué sigue?
- Lee la documentación de Instantáneas de volumen de Kubernetes.
- Obtenga información sobre volume expansion (expansión de volumen).
- Obtén más información sobre cómo instalar un controlador CSI de forma manual.