En este documento se explica cómo crear una captura de volumen y, a continuación, usarla para restaurar el volumen. Las instrucciones que se indican aquí se aplican a los clústeres que usan el controlador de CSI para vSphere.
Antes de empezar
Consulta Usar el controlador de interfaz de almacenamiento de contenedor de vSphere.
Verifica
que tu clúster tenga un StorageClass llamado standard-rwo
y que el
controlador CSI de vSphere esté instalado.
Tu versión de vSphere, ESXi y vCenter Server debe ser 7.0 Update 3 o una posterior. Para obtener más información, consulta Solucionar problemas de almacenamiento.
Pasos que deben seguirse
Estos son los pasos principales del ejercicio que se indica en este documento:
- Crea un PersistentVolumeClaim.
- Crea un PersistentVolumeClaim que solicite la clase de almacenamiento
standard-rwo
. A continuación, el clúster aprovisiona dinámicamente un PersistentVolume y lo asocia a tu PersistentVolumeClaim.
- Crea un despliegue.
- Crea un Deployment que tenga un Pod. El pod especifica un volumen basado en tu PersistentVolumeClaim. El contenedor del pod monta el volumen en
/hello/
.
- Escribe un archivo en el volumen del pod.
- Crea un archivo llamado
hello.txt
en el volumen del pod. El contenido del archivo es "Hello World!".
- Crea un VolumeSnapshot.
- Crea un VolumeSnapshot que capture el estado del volumen del pod.
- Daña el archivo.
- Modifica el archivo
hello.txt
para que parezca dañado. El contenido del archivo ahora es "Hello W-corrupted-file-orld!".
- Usa la captura para restaurar el volumen.
- Crea un segundo PersistentVolumeClaim que use tu VolumeSnapshot como fuente de datos. Edita tu Deployment para que su volumen esté asociado al nuevo PersistentVolumeClaim. A continuación, comprueba que se ha restaurado el archivo
hello.txt
.
Crear un PersistentVolumeClaim
Aquí tienes un manifiesto de PersistentVolumeClaim:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard-rwo
En el manifiesto anterior, puedes ver que storageClassName
tiene el valor
standard-rwo
. Esta es la clase de almacenamiento asociada al controlador CSI de vSphere.
Guarda el manifiesto en un archivo llamado my-pvc.yaml
. Crea y consulta el PersistentVolumeClaim:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc
En la salida, puedes ver que PersistentVolumeClaim está enlazado a un PersistentVolume aprovisionado dinámicamente. Por ejemplo, el siguiente resultado muestra que el PersistentVolumeClaim llamado my-pvc
está enlazado a un PersistentVolume llamado pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5
:
my-pvc Bound pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 … standard-rwo 100s
Crear un despliegue
Aquí tienes un manifiesto de un Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment 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: my-volume mountPath: /hello/ volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc
En el contexto de este ejercicio, estos son los puntos importantes que debes tener en cuenta sobre el manifiesto de Deployment anterior:
El pod solicita almacenamiento especificando el PersistentVolumeClaim,
my-pvc
, que has creado anteriormente.El pod tiene un contenedor y el contenedor monta el volumen en
/hello/
.
Guarda el manifiesto en un archivo llamado my-deployment.yaml
y crea la implementación:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml
El Deployment tiene un Pod. Obtener el nombre del pod:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
Anota el nombre del pod. Por ejemplo, en el siguiente resultado, el nombre del pod es my-deployment-7575c4f5bf-r59nt
:
my-deployment-7575c4f5bf-r59nt 1/1 Running 0 65s
Crea un archivo en el volumen del pod y consulta el archivo.
kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec POD_NAME \ -- sh -c 'echo "Hello World!" > /hello/hello.txt' kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec POD_NAME \ -- sh -c 'cat /hello/hello.txt'
El resultado muestra el contenido del archivo /hello/hello.txt
:
Hello World!
Crear una captura
Aquí tienes un manifiesto de un VolumeSnapshot:
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: csi-vsphere-snapshot-class source: persistentVolumeClaimName: my-pvc
Guarda el manifiesto en un archivo llamado my-snapshot.yaml
y crea el
VolumeSnapshot:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml
Corromper el archivo del volumen
Cambia el contenido de hello.txt
para que parezca que se ha dañado:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec POD_NAME \ -- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt' kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec POD_NAME \ -- sh -c 'cat /hello/hello.txt'
En el resultado, puedes ver que el archivo se ha modificado:
Hello W-corrupted-file-orld!
Restaurar
Aquí tienes un manifiesto para un segundo PersistentVolumeClaim:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc-2 spec: storageClassName: standard-rwo dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
En el manifiesto anterior, puede ver que la fuente de datos de la nueva reclamación de PersistentVolume es el VolumeSnapshot que ha creado anteriormente.
Guarda el manifiesto en un archivo llamado my-pvc-2.yaml
. Crea y consulta el PersistentVolumeClaim:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2
Abre la implementación para editarla:
kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment
Cambia my-pvc
por my-pvc-2
y cierra el editor:
… volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc-2
La implementación elimina el pod y crea uno nuevo que usa el nuevo PersistentVolumeClaim.
Espera unos minutos y, a continuación, obtén el nuevo nombre del pod:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
Comprueba que se haya restaurado el volumen del Pod:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec NEW_POD_NAME \ -- sh -c 'cat /hello/hello.txt'
El resultado muestra que se ha restaurado el volumen:
Hello World!
Solución de problemas
Para obtener ayuda sobre cómo solucionar problemas, consulta Solucionar problemas de almacenamiento.