Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Configure cloud disk persistent storage for StatefulSets

Última actualización: Sep 04, 2026

Para aplicaciones con estado, como bases de datos y colas de mensajes, un StatefulSet de Kubernetes puede utilizar el campo volumeClaimTemplates para crear y vincular dinámicamente una solicitud de volumen persistente (PVC) dedicada a cada pod. Esta PVC se asocia posteriormente a un volumen persistente (PV) independiente. Cuando un pod se recrea o se reprograma, la PVC vuelve a montar automáticamente su PV original para garantizar la persistencia de los datos y la continuidad del servicio.

A continuación se muestra un ejemplo de configuración de volumeClaimTemplates:

apiVersion: apps/v1
kind: StatefulSet
# ...
spec:
  # ...
  volumeClaimTemplates:
  - metadata:
      name: data-volume                        # Name of the PVC template
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "alicloud-disk-essd"   # Specify the storage type
      resources:
        requests:
          storage: 20Gi                        # The requested storage capacity

Funcionamiento

  • Creación y escalado horizontal

    Durante la creación inicial o el escalado horizontal, el controlador del StatefulSet utiliza volumeClaimTemplates para crear y vincular una PVC con nombre único para cada réplica de pod. Las PVC siguen el patrón de nomenclatura [template-name]-[pod-name]. Por ejemplo, si la plantilla se llama data-volume, el controlador creará las PVC data-volume-web-0 y data-volume-web-1 para los pods web-0 y web-1 respectivamente, lo que establece una asignación estable entre cada pod y su almacenamiento.

    Con base en los parámetros de la plantilla (como storageClassName, storage y accessModes), la interfaz de almacenamiento de contenedores (CSI) crea automáticamente un PV coincidente con el tipo, tamaño y modo de acceso correctos; después lo vincula y lo monta.

  • Reducción de escala

    Cuando se reduce la escala de un StatefulSet, el controlador solo elimina el pod. La PVC asociada y el PV subyacente se conservan para proteger los datos.

  • Reescalado y recuperación ante fallos

    Al escalar horizontalmente de nuevo (aumentar el número de réplicas) o durante la recuperación ante fallos (cuando se elimina y recrea un pod), el controlador busca y reutiliza automáticamente la PVC retenida previamente que tiene el mismo nombre.

    • Si la PVC existe, el nuevo pod con el mismo nombre montará automáticamente el PV existente, lo que permite recuperar rápidamente su estado y sus datos.

    • Si la PVC no existe, por ejemplo, cuando la operación de escalado horizontal supera el pico histórico de réplicas, se creará una nueva PVC y su PV correspondiente.

Paso 1: Desplegar un StatefulSet con almacenamiento persistente

Este ejemplo despliega un Service y un StatefulSet con dos réplicas. El StatefulSet usa volumeClaimTemplates para crear automáticamente un disco en la nube de 20 GiB para cada réplica.

  1. Cree un archivo llamado statefulset.yaml.

    La siguiente tabla describe los parámetros en volumeClaimTemplates:

    Parámetro

    Descripción

    accessModes

    Modo de acceso del volumen. ReadWriteOnce indica que el volumen se puede montar en modo lectura-escritura por un solo nodo a la vez.

    storageClassName

    Nombre de la StorageClass que se utilizará.

    alicloud-disk-essd es una StorageClass predeterminada proporcionada por Container Service for Kubernetes (ACK) para crear discos SSD empresariales (ESSD) con un nivel de rendimiento (PL) predeterminado de PL1.

    Nota

    Estos discos utilizan facturación pay-as-you-go. Para más información, consulte Billing of block storage y Prices of block storage.

    storage

    Capacidad del volumen de disco.

    Plantilla YAML

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      # Set clusterIP to "None" to indicate a Headless Service
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      # The serviceName must match the name of the Headless Service defined above
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
              name: web
            # Mount the PV to a specified path in the container
            volumeMounts:
            - name: disk-essd
              mountPath: /data
      # PVC template used by the StatefulSet to create a PVC for each pod
      volumeClaimTemplates:
      - metadata:
          name: disk-essd
        spec:
          # Define the volume access mode
          accessModes: [ "ReadWriteOnce" ]
          # Specify the StorageClass for dynamic PV provisioning
          storageClassName: "alicloud-disk-essd"
          resources:
            requests:
              # Define the requested storage capacity for each PVC
              storage: 20Gi
  2. Despliegue el StatefulSet.

    kubectl create -f statefulset.yaml
  3. Compruebe que los pods se estén ejecutando.

    kubectl get pod -l app=nginx
  4. Consulte las PVC para confirmar que el sistema ha creado y vinculado automáticamente una PVC correspondiente para cada pod.

    kubectl get pvc

    Salida esperada:

    NAME              STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS         VOLUMEATTRIBUTESCLASS   AGE
    disk-essd-web-0   Bound    d-m5eb5ozeseslnz7zq54b   20Gi       RWO            alicloud-disk-essd   <unset>                 3m31s
    disk-essd-web-1   Bound    d-m5ecrvjrhqwehgzqpk5i   20Gi       RWO            alicloud-disk-essd   <unset>                 48s

Paso 2: Validar el ciclo de vida del almacenamiento

Observe la creación, retención y reutilización de las PVC asociadas al escalar horizontalmente, reducir la escala y volver a escalar horizontalmente.

Escalar horizontalmente la aplicación

  1. Aumente el número de réplicas del StatefulSet a 3.

    kubectl scale sts web --replicas=3
  2. Compruebe que los pods se estén ejecutando.

    kubectl get pod -l app=nginx
  3. Consulte las PVC para confirmar que el sistema ha creado automáticamente el pod web-2 y su PVC correspondiente disk-essd-web-2.

    kubectl get pvc

    Salida esperada:

    NAME              STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS         VOLUMEATTRIBUTESCLASS   AGE
    disk-essd-web-0   Bound    d-m5eb5ozeseslnz7zq54b   20Gi       RWO            alicloud-disk-essd   <unset>                 4m1s
    disk-essd-web-1   Bound    d-m5ecrvjrhqwehgzqpk5i   20Gi       RWO            alicloud-disk-essd   <unset>                 78s
    disk-essd-web-2   Bound    d-m5ee2cvzx4dog1lounjn   20Gi       RWO            alicloud-disk-essd   <unset>                 16s

Reducir la escala de la aplicación

  1. Reduzca el número de réplicas del StatefulSet a 2.

    kubectl scale sts web --replicas=2
  2. Compruebe que los pods se estén ejecutando.

    kubectl get pod -l app=nginx
  3. Consulte las PVC.

    kubectl get pvc

    Salida esperada:

    NAME              STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS         VOLUMEATTRIBUTESCLASS   AGE
    disk-essd-web-0   Bound    d-m5eb5ozeseslnz7zq54b   20Gi       RWO            alicloud-disk-essd   <unset>                 4m21s
    disk-essd-web-1   Bound    d-m5ecrvjrhqwehgzqpk5i   20Gi       RWO            alicloud-disk-essd   <unset>                 98s
    disk-essd-web-2   Bound    d-m5ee2cvzx4dog1lounjn   20Gi       RWO            alicloud-disk-essd   <unset>                 36s
    Nota

    En este punto, el pod web-2 se ha eliminado, pero la PVC disk-essd-web-2 aún existe para garantizar la persistencia de los datos.

Escalar horizontalmente la aplicación de nuevo

  1. Aumente nuevamente el número de réplicas del StatefulSet a 3.

    kubectl scale sts web --replicas=3
  2. Compruebe que los pods se estén ejecutando.

    kubectl get pod -l app=nginx
  3. Consulte las PVC.

    kubectl get pvc

    Salida esperada:

    NAME              STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS         VOLUMEATTRIBUTESCLASS   AGE
    disk-essd-web-0   Bound    d-m5eb5ozeseslnz7zq54b   20Gi       RWO            alicloud-disk-essd   <unset>                 4m50s
    disk-essd-web-1   Bound    d-m5ecrvjrhqwehgzqpk5i   20Gi       RWO            alicloud-disk-essd   <unset>                 2m7s
    disk-essd-web-2   Bound    d-m5ee2cvzx4dog1lounjn   20Gi       RWO            alicloud-disk-essd   <unset>                 65s

    El pod recién creado web-2 se ha vinculado automáticamente a la PVC retenida previamente disk-essd-web-2 y la está utilizando.

Paso 3: Validar la persistencia de datos tras un fallo de pod

Verifique que los datos almacenados en el disco persisten después de recrear un pod mediante la escritura de datos, la eliminación del pod y la posterior comprobación de dichos datos.

  1. Escriba datos de prueba en el pod.

    Tome como ejemplo el pod web-1 y cree un archivo test en la ruta de montaje del disco /data.

    kubectl exec web-1 -- touch /data/test
    kubectl exec web-1 -- ls /data

    Salida esperada:

    lost+found
    test
  2. Simule un fallo de pod eliminándolo.

    kubectl delete pod web-1

    Ejecute kubectl get pod -l app=nginx de nuevo; observará que se crea automáticamente un nuevo pod llamado web-1.

  3. Verifique los datos en el nuevo pod.

    Revise el directorio /data en el nuevo pod web-1.

    kubectl exec web-1 -- ls /data

    El archivo test que creó todavía existe. Esto confirma que los datos persisten incluso si el pod se elimina y se recrea.

    lost+found
    test

Consideraciones para producción

  • Gestión de costos y recursos: Al reducir la escala o eliminar un StatefulSet, las PVC y los discos asociados se conservan de forma predeterminada. Estos recursos retenidos continúan generando cargos. Asegúrese de limpiar manualmente cualquier PVC y PV sin uso para evitar costos innecesarios.

  • Seguridad de datos y copia de seguridad: El almacenamiento persistente garantiza alta disponibilidad durante fallos de pod, pero no constituye una solución de copia de seguridad de datos. Para datos críticos, utilice Cloud Backup para realizar copias de seguridad periódicas.

  • Alta disponibilidad y recuperación ante desastres: Los discos son recursos zonales y no se pueden montar entre zonas. Para la recuperación ante desastres entre zonas, utilice un tipo de disco que admita replicación de datos entre zonas, como Regional ESSDs.