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
volumeClaimTemplatespara 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 llamadata-volume, el controlador creará las PVCdata-volume-web-0ydata-volume-web-1para los podsweb-0yweb-1respectivamente, lo que establece una asignación estable entre cada pod y su almacenamiento.Con base en los parámetros de la plantilla (como
storageClassName,storageyaccessModes), 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.
-
Cree un archivo llamado
statefulset.yaml.La siguiente tabla describe los parámetros en
volumeClaimTemplates:Parámetro
Descripción
accessModesModo de acceso del volumen.
ReadWriteOnceindica que el volumen se puede montar en modo lectura-escritura por un solo nodo a la vez.storageClassNameNombre de la StorageClass que se utilizará.
alicloud-disk-essdes 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.NotaEstos discos utilizan facturación pay-as-you-go. Para más información, consulte Billing of block storage y Prices of block storage.
storageCapacidad del volumen de disco.
-
Despliegue el StatefulSet.
kubectl create -f statefulset.yaml -
Compruebe que los pods se estén ejecutando.
kubectl get pod -l app=nginx -
Consulte las PVC para confirmar que el sistema ha creado y vinculado automáticamente una PVC correspondiente para cada pod.
kubectl get pvcSalida 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
-
Aumente el número de réplicas del StatefulSet a 3.
kubectl scale sts web --replicas=3 -
Compruebe que los pods se estén ejecutando.
kubectl get pod -l app=nginx -
Consulte las PVC para confirmar que el sistema ha creado automáticamente el pod
web-2y su PVC correspondientedisk-essd-web-2.kubectl get pvcSalida 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
-
Reduzca el número de réplicas del StatefulSet a 2.
kubectl scale sts web --replicas=2 -
Compruebe que los pods se estén ejecutando.
kubectl get pod -l app=nginx -
Consulte las PVC.
kubectl get pvcSalida 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> 36sNotaEn este punto, el pod
web-2se ha eliminado, pero la PVCdisk-essd-web-2aún existe para garantizar la persistencia de los datos.
Escalar horizontalmente la aplicación de nuevo
-
Aumente nuevamente el número de réplicas del StatefulSet a 3.
kubectl scale sts web --replicas=3 -
Compruebe que los pods se estén ejecutando.
kubectl get pod -l app=nginx -
Consulte las PVC.
kubectl get pvcSalida 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> 65sEl pod recién creado
web-2se ha vinculado automáticamente a la PVC retenida previamentedisk-essd-web-2y 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.
-
Escriba datos de prueba en el pod.
Tome como ejemplo el pod
web-1y cree un archivotesten la ruta de montaje del disco/data.kubectl exec web-1 -- touch /data/test kubectl exec web-1 -- ls /dataSalida esperada:
lost+found test -
Simule un fallo de pod eliminándolo.
kubectl delete pod web-1Ejecute
kubectl get pod -l app=nginxde nuevo; observará que se crea automáticamente un nuevo pod llamadoweb-1. -
Verifique los datos en el nuevo pod.
Revise el directorio
/dataen el nuevo podweb-1.kubectl exec web-1 -- ls /dataEl archivo
testque 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.