Pour les applications avec état, telles que les bases de données et les files d'attente de messages, un StatefulSet Kubernetes peut utiliser le champ volumeClaimTemplates afin de créer et d'attacher dynamiquement une Persistent Volume Claim (PVC) dédiée à chaque pod. Cette PVC se lie ensuite à un Persistent Volume (PV) indépendant. Lors de la recréation ou du replanification d'un pod, la PVC remonte automatiquement son PV d'origine, garantissant ainsi la persistance des données et la continuité du service.
Voici un exemple de configuration 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
Fonctionnement
-
Création et mise à l'échelle horizontale (scale-out)
Lors de la création initiale ou d'une opération de scale-out, le contrôleur StatefulSet utilise les
volumeClaimTemplatespour créer et lier une PVC au nom unique pour chaque réplica de pod. Les PVC suivent le modèle de nommage[template-name]-[pod-name]. Par exemple, si le modèle est nommédata-volume, le contrôleur crée les PVCdata-volume-web-0etdata-volume-web-1pour les podsweb-0etweb-1respectivement, établissant ainsi une correspondance stable entre un pod et son stockage.Sur la base des paramètres du modèle (tels que
storageClassName,storageetaccessModes), l'interface de stockage de conteneur (CSI) crée automatiquement un PV correspondant avec le type, la taille et le mode d'accès appropriés, puis lie et monte ce PV. -
Réduction d'échelle (scale-in)
Lors d'une réduction d'échelle d'un StatefulSet, le contrôleur supprime uniquement le pod lui-même. La PVC associée et le PV sous-jacent sont conservés afin de protéger les données.
-
Mise à l'échelle ultérieure et récupération après incident
Lorsque vous effectuez à nouveau une mise à l'échelle horizontale (augmentation du nombre de réplicas) ou lors d'une récupération après incident (un pod est supprimé puis recréé), le contrôleur recherche et réutilise automatiquement la PVC précédemment conservée portant le même nom.
Si la PVC existe, le nouveau pod portant le même nom monte automatiquement le PV existant, permettant une restauration rapide de son état et de ses données.
Si la PVC n'existe pas, par exemple si l'opération de scale-out dépasse le pic historique de réplicas, une nouvelle PVC et un PV correspondant sont créés.
Étape 1 : Déployer un StatefulSet avec stockage persistant
Cet exemple déploie un Service et un StatefulSet comportant deux réplicas. Le StatefulSet utilise les volumeClaimTemplates pour créer automatiquement un disque cloud de 20 Go pour chaque réplica.
-
Créez un fichier nommé
statefulset.yaml.Le tableau suivant décrit les paramètres dans
volumeClaimTemplates:Paramètre
Description
accessModesMode d'accès du volume.
ReadWriteOncesignifie que le volume peut être monté en lecture-écriture par un seul nœud à la fois.storageClassNameNom de la StorageClass à utiliser.
alicloud-disk-essdest une StorageClass par défaut fournie par Container Service for Kubernetes (ACK) pour créer des SSD entreprise (ESSD) avec un niveau de performance (PL) PL1 par défaut.RemarqueCes disques utilisent la facturation au paiement à l'utilisation. Pour plus d'informations, consultez la Facturation du stockage par blocs et les Tarifs du stockage par blocs.
storageCapacité du volume de disque.
-
Déployez le StatefulSet.
kubectl create -f statefulset.yaml -
Vérifiez que les pods sont en cours d'exécution.
kubectl get pod -l app=nginx -
Consultez les PVC pour confirmer que le système a automatiquement créé et lié une PVC correspondante pour chaque pod.
kubectl get pvcRésultat attendu :
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
Étape 2 : Valider le cycle de vie du stockage
Observez la création, la conservation et la réutilisation des PVC associées en effectuant successivement une mise à l'échelle horizontale, une réduction d'échelle, puis une nouvelle mise à l'échelle horizontale.
Mettre à l'échelle l'application (scale-out)
-
Augmentez le nombre de réplicas du StatefulSet à 3.
kubectl scale sts web --replicas=3 -
Vérifiez que les pods sont en cours d'exécution.
kubectl get pod -l app=nginx -
Consultez les PVC pour confirmer que le système a automatiquement créé le pod
web-2et sa PVC correspondantedisk-essd-web-2.kubectl get pvcRésultat attendu :
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
Réduire l'échelle de l'application (scale-in)
-
Réduisez le nombre de réplicas du StatefulSet à 2.
kubectl scale sts web --replicas=2 -
Vérifiez que les pods sont en cours d'exécution.
kubectl get pod -l app=nginx -
Consultez les PVC.
kubectl get pvcRésultat attendu :
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> 36sRemarqueÀ ce stade, le pod
web-2a été supprimé, mais la PVCdisk-essd-web-2existe toujours afin d'assurer la persistance des données.
Remettre à l'échelle l'application (scale-out)
-
Augmentez à nouveau le nombre de réplicas du StatefulSet à 3.
kubectl scale sts web --replicas=3 -
Vérifiez que les pods sont en cours d'exécution.
kubectl get pod -l app=nginx -
Consultez les PVC.
kubectl get pvcRésultat attendu :
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> 65sLe pod nouvellement créé
web-2s'est automatiquement lié à la PVCdisk-essd-web-2précédemment conservée et l'utilise désormais.
Étape 3 : Valider la persistance des données après une défaillance de pod
Vérifiez que les données stockées sur le disque persistent après la recréation d'un pod en écrivant des données, en supprimant le pod, puis en vérifiant la présence des données.
-
Écrivez des données de test dans le pod.
En prenant le pod
web-1comme exemple, créez un fichiertestdans le chemin de montage du disque/data.kubectl exec web-1 -- touch /data/test kubectl exec web-1 -- ls /dataRésultat attendu :
lost+found test -
Simulez une défaillance de pod en supprimant le pod.
kubectl delete pod web-1Exécutez à nouveau
kubectl get pod -l app=nginx; vous constaterez qu'un nouveau pod nomméweb-1est automatiquement créé. -
Vérifiez les données dans le nouveau pod.
Consultez le répertoire
/datadans le nouveau podweb-1.kubectl exec web-1 -- ls /dataLe fichier
testque vous avez créé existe toujours. Cela confirme que les données persistent même si le pod est supprimé et recréé.lost+found test
Considérations pour la production
Gestion des coûts et des ressources : Lorsque vous réduisez l'échelle ou supprimez un StatefulSet, les PVC et les disques associés sont conservés par défaut. Ces ressources conservées continuent de générer des frais. Veillez à nettoyer manuellement toutes les PVC et PV inutilisés afin d'éviter des frais inutiles.
Sécurité des données et sauvegarde : Le stockage persistant garantit une haute disponibilité en cas de défaillance des pods, mais il ne constitue pas une solution de sauvegarde des données. Pour les données critiques, utilisez Cloud Backup pour effectuer des sauvegardes régulières.
Haute disponibilité et reprise après sinistre : Les disques sont des ressources zonales et ne peuvent pas être montés across zones. Pour la reprise après sinistre inter-zones, utilisez un type de disque prenant en charge la réplication des données inter-zones, tel que les Regional ESSDs.