En esta página se explica cómo crear un PersistentVolume con discos persistentes que ya tienen datos y cómo usar el PersistentVolume en un pod.
Información general
Hay dos situaciones habituales en las que se usa un disco persistente preexistente.
- Crear manualmente un objeto PersistentVolumeClaim y un objeto PersistentVolume, enlazarlos y hacer referencia al objeto PersistentVolumeClaim en una especificación de Pod.
- Usa un StatefulSet para generar automáticamente PersistentVolumeClaims que estén vinculados a PersistentVolumes generados manualmente correspondientes a una serie de discos persistentes preexistentes.
En los ejemplos de esta página se usan discos persistentes de Compute Engine.
Aunque ext4
es el tipo de sistema de archivos predeterminado, puedes usar un disco persistente con el sistema de archivos xfs
si tu imagen de nodo lo admite. Para usar un disco xfs
, cambia spec.csi.fsType
por xfs
en el manifiesto de PersistentVolume.
Windows no admite el tipo de sistema de archivos ext4
. Debes usar el sistema de archivos NTFS
para los grupos de nodos de Windows Server.
Para usar un disco NTFS
, cambia spec.csi.fsType
por NTFS
en el manifiesto de PersistentVolume.
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 gcloud CLI, obtén la versión más reciente ejecutando
gcloud components update
.
- Asegúrate de que tienes discos persistentes. Para aprovisionar un disco, consulta Aprovisionar discos persistentes regionales.
- Asegúrate de que tu clúster use el controlador de CSI para Persistent Disk en Compute Engine.
Usar un PersistentVolumeClaim enlazado al PersistentVolume
Para que un contenedor pueda acceder a un disco persistente que ya tengas, debes hacer lo siguiente:
- Aprovisiona el disco persistente como PersistentVolume.
- Asocia el PersistentVolume a un PersistentVolumeClaim.
- Da acceso al PersistentVolume a los contenedores del Pod.
Crear PersistentVolume y PersistentVolumeClaim
Hay varias formas de vincular un PersistentVolumeClaim a un PersistentVolume específico. Por ejemplo, el siguiente manifiesto YAML crea un PersistentVolume y un PersistentVolumeClaim, y luego vincula el volumen a la reclamación mediante el claimRef
definido en PersistentVolume.
Para vincular un PersistentVolume a un PersistentVolumeClaim, el storageClassName
de los dos recursos debe coincidir, así como capacity
, accessModes
y volumeMode
. Puedes omitir storageClassName
, pero debes especificar ""
para evitar que Kubernetes use la clase de almacenamiento predeterminada.
No es necesario que storageClassName
haga referencia a un objeto StorageClass. Si solo necesitas vincular la reclamación a un volumen, puedes usar el nombre que quieras. Sin embargo, si necesitas una función adicional configurada por un StorageClass, como el cambio de tamaño del volumen, storageClassName
debe hacer referencia a un objeto StorageClass.
Para obtener más información, consulta la documentación de Kubernetes sobre PersistentVolumes.
Guarda el siguiente manifiesto YAML:
apiVersion: v1 kind: PersistentVolume metadata: name: PV_NAME spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK_SIZE accessModes: - ReadWriteOnce claimRef: name: PV_CLAIM_NAME namespace: default csi: driver: pd.csi.storage.gke.io volumeHandle: DISK_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: default name: PV_CLAIM_NAME spec: storageClassName: "STORAGE_CLASS_NAME" accessModes: - ReadWriteOnce resources: requests: storage: DISK_SIZE
Haz los cambios siguientes:
PV_NAME
: el nombre del nuevo PersistentVolume.STORAGE_CLASS_NAME
: el nombre de tu nuevo StorageClass.DISK_SIZE
: el tamaño de tu disco persistente. Por ejemplo,500G
.PV_CLAIM_NAME
: nombre de tu nuevo PersistentVolumeClaim.DISK_ID
: el identificador de tu disco persistente. El formato esprojects/{project_id}/zones/{zone_name}/disks/{disk_name}
para discos persistentes de zona oprojects/{project_id}/regions/{region_name}/disks/{disk_name}
para discos persistentes regionales.FS_TYPE
: el tipo de sistema de archivos. Puedes dejarlo como predeterminado (ext4
) o usarxfs
. Si tus clústeres usan un grupo de nodos de Windows Server, debes cambiarlo aNTFS
.
Para aplicar la configuración y crear los recursos PersistentVolume y PersistentVolumeClaim, ejecuta el siguiente comando:
kubectl apply -f FILE_PATH
Sustituye
FILE_PATH
por la ruta al archivo YAML.
Usar el objeto PersistentVolume en un pod
Después de crear y vincular PersistentVolume y PersistentVolumeClaim, puedes dar acceso a los contenedores de un pod al volumen especificando valores en el campo volumeMounts
.
La siguiente configuración YAML crea un Pod y un contenedor que ejecuta una imagen nginx
y, a continuación, monta el PersistentVolume en el Pod:
kind: Pod
apiVersion: v1
metadata:
name: POD_NAME
spec:
volumes:
- name: VOLUME_NAME
persistentVolumeClaim:
claimName: PV_CLAIM_NAME
containers:
- name: CONTAINER_NAME
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: VOLUME_NAME
Haz los cambios siguientes:
POD_NAME
: el nombre del nuevo pod.VOLUME_NAME
: el nombre del volumen.PV_CLAIM_NAME
: el nombre del PersistentVolumeClaim que has creado en el paso anterior.CONTAINER_NAME
: el nombre del nuevo contenedor.
Aplica la configuración:
kubectl apply -f FILE_PATH
Sustituye FILE_PATH
por la ruta al archivo YAML.
Para comprobar que el volumen se ha montado, ejecuta el siguiente comando:
kubectl describe pods POD_NAME
En la salida, comprueba que se haya montado PersistentVolumeClaim:
...
Volumes:
VOLUME_NAME:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: PV_CLAIM_NAME
ReadOnly: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 29s default-scheduler Successfully assigned default/POD_NAME to gke-cluster-1-default-pool-d5cde866-o4g4
Normal SuccessfulAttachVolume 21s attachdetach-controller AttachVolume.Attach succeeded for volume "PV_NAME"
Normal Pulling 19s kubelet Pulling image "nginx"
Normal Pulled 19s kubelet Successfully pulled image "nginx"
Normal Created 18s kubelet Created container CONTAINER_NAME
Normal Started 18s kubelet Started container CONTAINER_NAME
Usar un disco preexistente en un StatefulSet
Puedes usar discos persistentes de Compute Engine preexistentes en un StatefulSet mediante PersistentVolumes. StatefulSet genera automáticamente un PersistentVolumeClaim para cada réplica. Puedes predecir los nombres de los PersistentVolumeClaims generados y enlazarlos a los PersistentVolumes mediante claimRef
.
En el siguiente ejemplo, se toman dos discos persistentes preexistentes, se crean objetos PersistentVolume para usar los discos y, a continuación, se montan los volúmenes en un objeto StatefulSet con dos réplicas en el espacio de nombres predeterminado.
- Decide el nombre del nuevo StatefulSet, el nombre de la plantilla PersistentVolumeClaim y el número de réplicas del StatefulSet.
Averigua los nombres de los PersistentVolumeClaims generados automáticamente. StatefulSet usa el siguiente formato para los nombres de PersistentVolumeClaim:
PVC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEX
Haz los cambios siguientes:
PVC_TEMPLATE_NAME
: el nombre de la nueva plantilla PersistentVolumeClaim.STATEFULSET_NAME
: el nombre de tu nuevo StatefulSet.REPLICA_INDEX
: el índice de la réplica de StatefulSet. En este ejemplo, se usan0
y1
.
Crea los PersistentVolumes. Debes crear un PersistentVolume para cada réplica del StatefulSet.
Guarda el siguiente manifiesto YAML:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-0 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK1_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK1_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-1 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK2_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-1 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK2_ID fsType: FS_TYPE
Haz los cambios siguientes:
DISK1_SIZE and DISK2_SIZE
: tamaños de los discos persistentes que ya tenías.DISK1_ID and DISK2_ID
: los identificadores de los discos persistentes que ya tenías.PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 and PVC_TEMPLATE_NAME-STATEFULSET_NAME-1
: los nombres de los PersistentVolumeClaims generados automáticamente con el formato definido en el paso anterior.STORAGE_CLASS_NAME
: el nombre de tu StorageClass.
Aplica la configuración:
kubectl apply -f FILE_PATH
Sustituye
FILE_PATH
por la ruta al archivo YAML.
Crea un StatefulSet con los valores que has elegido en el paso 1. Asegúrate de que el almacenamiento que especifiques en
volumeClaimTemplates
sea inferior o igual a la capacidad total de tus PersistentVolumes.Guarda el siguiente manifiesto YAML:
apiVersion: apps/v1 kind: StatefulSet metadata: name: STATEFULSET_NAME spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: PVC_TEMPLATE_NAME mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: PVC_TEMPLATE_NAME spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "STORAGE_CLASS_NAME" resources: requests: storage: 100Gi
Haz los cambios siguientes:
STATEFULSET_NAME
: el nombre de tu nuevo StatefulSet.PVC_TEMPLATE_NAME
: el nombre de la nueva plantilla PersistentVolumeClaim.STORAGE_CLASS_NAME
: el nombre de tu StorageClass.
Aplica la configuración:
kubectl apply -f FILE_PATH
Sustituye
FILE_PATH
por la ruta al archivo YAML.