Puedes usar la función instantánea de volumen de Kubernetes para volúmenes persistentes y aprovisionamiento dinámico 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 a fin de aprovisionar un volumen de reemplazo.
Puedes aprovisionar y adjuntar instantáneas de volumen con los siguientes componentes:
Requisitos
Para usar instantáneas de volumen en GKE en AWS, debes contar con lo siguiente:
Un volumen que use un controlador de Container Storage Interface (CSI) que admita instantáneas. Los controladores de Elastic Block Store (EBS) que GKE en AWS usa de forma predeterminada admiten instantáneas.
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.
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: ebs.csi.aws.com
. Si tu clúster aprovisiona de forma dinámica PersistentVolumes mediante el controlador de CSI, como se describe en las siguientes secciones, lo administra el controlador de CSI.
Antes de comenzar
Crea y usa una instantánea de volumen
En los ejemplos de este documento, se muestra cómo hacer las siguientes tareas:
- Crea un
PersistentVolumeClaim
yPod
de ejemplo. - Crea una VolumeSnapshot.
- Restablece la instantánea de volumen.
- Verificar que la restauración funcionó.
Para usar una instantánea de volumen, debes completar los siguientes pasos:
- 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 Pod
de ejemplo
Para crear el objeto
PersistentVolumeClaim
, guarda el siguiente manifiesto comoexample-pvc.yaml
:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
Para
spec.storageClassName
, puedes especificar cualquier clase de almacenamiento que use un controlador CSI compatible. En este ejemplo, se usa la clase de almacenamientostandard-rwo
predeterminada.Aplica el manifiesto
kubectl apply -f example-pvc.yaml
Crea un Pod que escriba la fecha y hora actuales en el volumen. Para crear un Pod, guarda el siguiente manifiesto como
snapshot-shell.yaml
:apiVersion: v1 kind: Pod metadata: name: snapshot-shell spec: terminationGracePeriodSeconds: 10 containers: - name: linux image: ubuntu:bionic command: ["/bin/sh"] args: ["-c", "echo $(date -u) >> /data/out.txt"] volumeMounts: - name: snapshot-volume mountPath: /data restartPolicy: Never volumes: - name: snapshot-volume persistentVolumeClaim: claimName: example-pvc
Aplica el manifiesto
kubectl apply -f snapshot-shell.yaml
Verifica el estado del pod:
kubectl get pod snapshot-shell
Es posible que el Pod tarde un poco en ejecutarse y completarse. Puedes ejecutar el comando anterior hasta que veas un resultado similar al siguiente:
NAME READY STATUS RESTARTS AGE snapshot-shell 0/1 Completed 0 24s
Crea una VolumeSnapshot
Un objeto VolumeSnapshot
es una solicitud de una instantánea de un objeto PersistentVolumeClaim
existente. Cuando creas un objeto VolumeSnapshot
, el clúster lo crea y vincula de forma automática con un objeto VolumeSnapshotContent
, que es un recurso en el clúster, como un objeto PersistentVolume
.
Guarda el siguiente manifiesto como
volumesnapshot.yaml
.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: example-snapshot spec: source: persistentVolumeClaimName: example-pvc
Aplica el manifiesto
kubectl apply -f volumesnapshot.yaml
Después de crear una instantánea de volumen, el clúster crea un objeto
VolumeSnapshotContent
correspondiente. Este objeto almacena la instantánea y las vinculaciones de objetosVolumeSnapshot
. No se interactúa directamente con los objetosVolumeSnapshotContents
.Confirma que tu clúster haya creado el objeto
VolumeSnapshotContents
:kubectl get volumesnapshotcontents
El resultado es similar a este:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
Confirma que la instantánea de volumen esté lista
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. Después de que el clúster crea una instantánea en el sistema de almacenamiento y la vincula a un objeto VolumeSnapshot
, 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
example-snapshot true
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
.
En este ejemplo, debes hacer referencia a la VolumeSnapshot
que creaste en un PersistentVolumeClaim
nuevo y crear un Pod que active el PersistentVolumeClaim
.
Guarda el siguiente manifiesto como
pvc-restore.yaml
:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: example-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
Aplica el manifiesto
kubectl apply -f pvc-restore.yaml
Inicia un Pod temporal que active el PVC en el Pod e imprima el contenido de
out.txt
en los registros.Guarda el siguiente manifiesto como
restore-log.yaml
:apiVersion: v1 kind: Pod metadata: name: restore-verify spec: volumes: - name: restore-data persistentVolumeClaim: claimName: pvc-restore containers: - name: shell-container image: ubuntu:bionic volumeMounts: - mountPath: "/data" name: restore-data command: [ "/bin/sh" ] args: ["-c", "cat /data/out.txt", "exit", "1"] restartPolicy: Never
Aplica el manifiesto
kubectl apply -f restore-log.yaml
Verifica que la instantánea se haya restablecido correctamente
El Pod que creaste en el paso anterior lee la instantánea. Para ver los datos de la instantánea, usa el comando kubectl logs
.
kubectl logs restore-verify
El resultado debe incluir una marca de tiempo de la instantánea.
Limpia
Para evitar que se apliquen cargos por los recursos que se usan en esta página, sigue estos pasos.
Borra
VolumeSnapshot
:kubectl delete volumesnapshot example-snapshot
Borra el Pod temporal:
kubectl delete -f restore-log.yaml
Borra el Pod:
kubectl delete -f snapshot-shell.yaml
Borra los objetos
PersistentVolumeClaim
:kubectl delete pvc example-pvc pvc-restore
¿Qué sigue?
- Lee la documentación de instantáneas de volumen de Kubernetes.
- Instala controladores de CSI adicionales.