Usa instantáneas de volumen

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.

A partir de la versión 1.17 o posterior, puedes aprovisionar y adjuntar instantáneas de volumen con los siguientes componentes:

Requisitos

El uso de instantáneas de volumen en GKE tiene los siguientes requisitos:

  • Debes instalar un controlador CSI que admita instantáneas. Las instantáneas no son compatibles con el controlador de disco persistente en el árbol. Si usas el controlador CSI de disco persistente de Compute Engine, recomendamos implementar el controlador de forma automática para reducir la sobrecarga de administración. Para obtener una lista de todos los controladores CSI que admiten instantáneas, consulta la columna “Other features” en Controladores en la documentación de Kubernetes.

  • Debes usar versiones del plano de control (instancia principal) que sean versiones de GKE 1.17 o posteriores. 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.

  • Debes tener un PersistentVolumeClaim existente del cual tomar una instantánea y el PersistentVolume que se usa para una instantánea de origen, al cual lo debe administrar un controlador CSI. Puedes verificar que usas un controlador CSI si verificas que la especificación de PersistentVolume tenga una sección csi con driver: pd.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.

Crea una VolumeSnapshotClass

Crea un VolumeSnapshotClass a fin de determinar el controlador CSI y la deletionPolicy para tu VolumeSnapshot. Puedes hacer referencia a VolumeSnapshotClass en tu VolumeSnapshot.

El siguiente manifiesto llamado snapshot-class-example.yaml es un ejemplo de un volumen de VolumeSnapshotClass.

v1beta1

Usa la versión de la API v1beta1 para clústeres que ejecutan las versiones 1.23 o anteriores.

# snapshot-class-example.yaml
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
  name: snapshot-class
driver: csi-driver
deletionPolicy: Delete

v1

Usa la versión de la API v1 para clústeres que ejecutan las versiones 1.21 o posteriores.

# snapshot-class-example.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: snapshot-class
driver: csi-driver
deletionPolicy: Delete

Reemplaza lo siguiente:

  • snapshot-class es el nombre de tu VolumenSnapshotClass.
  • csi-driver especifica qué controlador CSI usar para aprovisionar la instantánea. Por ejemplo, puedes agregar pd.csi.storage.gke.io para usar el controlador CSI del disco persistente de Compute Engine.
  • Delete garantiza que el objeto VolumeSnapshotContent se borre cuando se borre VolumeSnapshot a la que está vinculada. También borra la instantánea del sistema de almacenamiento subyacente. Establece este valor en Retain si deseas mantener el VolumeSnapshotContent.

Para crear el VolumeSnapshotClass, ejecuta el siguiente comando después de crear el archivo.

kubectl apply -f snapshot-class-example.yaml

Crea una

Una VolumeSnapshot es una solicitud de instantánea de una PersistentVolumeClaim preexistente.

El siguiente manifiesto llamado snapshot-example.yaml es un ejemplo de una VolumeSnapshot:

v1beta1

Usa la versión de la API v1beta1 para clústeres que ejecutan las versiones 1.23 o anteriores.

#snapshot-example.yaml
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
  name: snapshot
spec:
  volumeSnapshotClassName: snapshot-class
  source:
    persistentVolumeClaimName: pvc

v1

Usa la versión de la API v1 para clústeres que ejecutan las versiones 1.21 o posteriores.

#snapshot-example.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: snapshot
spec:
  volumeSnapshotClassName: snapshot-class
  source:
    persistentVolumeClaimName: pvc

Reemplaza lo siguiente:

  • snapshot es el nombre de tu VolumeSnapshot.
  • snapshot-class especifica el nombre de la VolumenSnapshotClass a la que deseas hacer referencia. Si no especificas un valor, se usa el VolumeSnapshotClass predeterminado si está disponible.
  • pvc es el nombre del PersistentVolumeClaim existente del que deseas tomar una instantánea.

Para crear la VolumeSnapshot, ejecuta el siguiente comando después de crear el archivo:

kubectl apply -f snapshot-example.yaml

Verifica la creación de VolumeSnapshot

Después de crear una instantánea de volumen, se crea un objeto VolumenSnapshotContent correspondiente en el clúster. Este objeto almacena la instantánea y las vinculaciones de objetos VolumeSnapshot. No se interactúa directamente con los objetos VolumenSnapshotContents.

Para confirmar si se creó VolumenSnapshotContents, ejecuta el siguiente comando:

kubectl get volumesnapshotcontents

El resultado es similar al siguiente:

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 instantánea de volumen 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 está listo para usar, el resultado es similar al siguiente:

NAME               READY
snapshot-example   true

Aprovisiona y restablece volúmenes mediante una VolumeSnapshot

Hacer referencia a una VolumeSnapshot en una PersistentVolumeClaim te permite aprovisionar un volumen nuevo con datos de un volumen existente o restablecer un volumen a un estado que capturaste en una instantánea.

Para hacer referencia a una VolumenSnapshot en una PersistentVolumeClaim, agrega el campo dataSource a tu PersistentVolumeClaim.

El siguiente manifiesto llamado pvc-demo.yaml es un ejemplo de cómo agregar el campo dataSource:

# pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo
spec:
  dataSource:
    name: snapshot-name
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

Asegúrate de que dataSource tenga los siguientes campos:

  • snapshot-name es el nombre de la VolumeSnapshot que deseas usar.
  • kind debe ser VolumeSnapshot.
  • apiGroup debe ser snapshot.storage.k8s.io.

Para aplicar el cambio a la PersistentVolumeClaim, ejecute el siguiente comando:

kubectl apply -f pvc-demo.yaml

Borra un VolumeSnapshot

Para borrar un VolumeSnapshot, ejecuta el siguiente comando:

kubectl delete volumesnapshot snapshot-example

Si el VolumeSnapshotClass de una instantánea de volumen tiene deletionPolicy:Delete, también se borran la VolumeSnapshotContent correspondiente y la instantánea física del sistema de almacenamiento. Si tiene un deletionPolicy:Retain, GKE conserva la instantánea física.

¿Qué sigue?