Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Aug 11, 2026

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 volumeClaimTemplates pour 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 PVC data-volume-web-0 et data-volume-web-1 pour les pods web-0 et web-1 respectivement, établissant ainsi une correspondance stable entre un pod et son stockage.

    Sur la base des paramètres du modèle (tels que storageClassName, storage et accessModes), 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.

  1. Créez un fichier nommé statefulset.yaml.

    Le tableau suivant décrit les paramètres dans volumeClaimTemplates :

    Paramètre

    Description

    accessModes

    Mode d'accès du volume. ReadWriteOnce signifie que le volume peut être monté en lecture-écriture par un seul nœud à la fois.

    storageClassName

    Nom de la StorageClass à utiliser.

    alicloud-disk-essd est 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.

    Remarque

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

    storage

    Capacité du volume de disque.

    Modèle 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. Déployez le StatefulSet.

    kubectl create -f statefulset.yaml
  3. Vérifiez que les pods sont en cours d'exécution.

    kubectl get pod -l app=nginx
  4. Consultez les PVC pour confirmer que le système a automatiquement créé et lié une PVC correspondante pour chaque pod.

    kubectl get pvc

    Ré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)

  1. Augmentez le nombre de réplicas du StatefulSet à 3.

    kubectl scale sts web --replicas=3
  2. Vérifiez que les pods sont en cours d'exécution.

    kubectl get pod -l app=nginx
  3. Consultez les PVC pour confirmer que le système a automatiquement créé le pod web-2 et sa PVC correspondante disk-essd-web-2.

    kubectl get pvc

    Ré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)

  1. Réduisez le nombre de réplicas du StatefulSet à 2.

    kubectl scale sts web --replicas=2
  2. Vérifiez que les pods sont en cours d'exécution.

    kubectl get pod -l app=nginx
  3. Consultez les PVC.

    kubectl get pvc

    Ré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>                 36s
    Remarque

    À ce stade, le pod web-2 a été supprimé, mais la PVC disk-essd-web-2 existe toujours afin d'assurer la persistance des données.

Remettre à l'échelle l'application (scale-out)

  1. Augmentez à nouveau le nombre de réplicas du StatefulSet à 3.

    kubectl scale sts web --replicas=3
  2. Vérifiez que les pods sont en cours d'exécution.

    kubectl get pod -l app=nginx
  3. Consultez les PVC.

    kubectl get pvc

    Ré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>                 65s

    Le pod nouvellement créé web-2 s'est automatiquement lié à la PVC disk-essd-web-2 pré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.

  1. Écrivez des données de test dans le pod.

    En prenant le pod web-1 comme exemple, créez un fichier test dans le chemin de montage du disque /data.

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

    Résultat attendu :

    lost+found
    test
  2. Simulez une défaillance de pod en supprimant le pod.

    kubectl delete pod web-1

    Exécutez à nouveau kubectl get pod -l app=nginx ; vous constaterez qu'un nouveau pod nommé web-1 est automatiquement créé.

  3. Vérifiez les données dans le nouveau pod.

    Consultez le répertoire /data dans le nouveau pod web-1.

    kubectl exec web-1 -- ls /data

    Le fichier test que 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.