Usar discos persistentes preexistentes como PersistentVolumes

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.

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.

Usar un PersistentVolumeClaim enlazado al PersistentVolume

Para que un contenedor pueda acceder a un disco persistente que ya tengas, debes hacer lo siguiente:

  1. Aprovisiona el disco persistente como PersistentVolume.
  2. Asocia el PersistentVolume a un PersistentVolumeClaim.
  3. 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.

  1. 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 es projects/{project_id}/zones/{zone_name}/disks/{disk_name} para discos persistentes de zona o projects/{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 usar xfs. Si tus clústeres usan un grupo de nodos de Windows Server, debes cambiarlo a NTFS.
  2. 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.

  1. Decide el nombre del nuevo StatefulSet, el nombre de la plantilla PersistentVolumeClaim y el número de réplicas del StatefulSet.
  2. 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 usan 0 y 1.
  3. Crea los PersistentVolumes. Debes crear un PersistentVolume para cada réplica del StatefulSet.

    1. 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.
    2. Aplica la configuración:

      kubectl apply -f FILE_PATH
      

      Sustituye FILE_PATH por la ruta al archivo YAML.

  4. 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.

    1. 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.
    2. Aplica la configuración:

      kubectl apply -f FILE_PATH
      

      Sustituye FILE_PATH por la ruta al archivo YAML.

Siguientes pasos