Todos os produtos
Search
Central de documentação

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

Última atualização: Jun 27, 2026

Para aplicações com estado, como bancos de dados e filas de mensagens, um StatefulSet do Kubernetes utiliza o campo volumeClaimTemplates para criar e anexar dinamicamente uma Persistent Volume Claim (PVC) dedicada a cada pod. Essa PVC se vincula a um Persistent Volume (PV) independente. Quando um pod é recriado ou reagendado, a PVC remonta automaticamente seu PV original, garantindo a persistência dos dados e a continuidade do serviço.

Abaixo está um exemplo de configuração 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

Como funciona

  • Criação e scale-out

    Durante a criação inicial ou o scale-out, o controlador do StatefulSet usa o volumeClaimTemplates para criar e vincular uma PVC com nome exclusivo para cada réplica de pod. As PVCs seguem o padrão de nomenclatura [template-name]-[pod-name]. Por exemplo, se o modelo se chamar data-volume, o controlador criará as PVCs data-volume-web-0 e data-volume-web-1 para os pods web-0 e web-1, respectivamente, estabelecendo um mapeamento estável entre o pod e seu armazenamento.

    Com base nos parâmetros do modelo (como storageClassName, storage e accessModes), a Container Storage Interface (CSI) cria automaticamente um PV correspondente com o tipo, tamanho e modo de acesso corretos e, em seguida, vincula e monta esse PV.

  • Scale-in

    Ao realizar o scale-in de um StatefulSet, o controlador exclui apenas o pod em si. A PVC associada e o PV subjacente são mantidos para proteger os dados.

  • Redimensionamento e recuperação de falhas

    Quando você faz scale-out novamente (aumenta o número de réplicas) ou durante a recuperação de falhas (um pod é excluído e recriado), o controlador localiza e reutiliza automaticamente a PVC retida anteriormente que possui o mesmo nome.

    • Se a PVC existir, o novo pod com o mesmo nome montará automaticamente o PV existente, permitindo a rápida recuperação de seu estado e dados.

    • Caso a PVC não exista, por exemplo, se a operação de scale-out ultrapassar o pico histórico de réplicas, uma nova PVC e um PV correspondente serão criados.

Etapa 1: Implantar um StatefulSet com armazenamento persistente

Este exemplo implanta um Service e um StatefulSet com duas réplicas. O StatefulSet usa volumeClaimTemplates para criar automaticamente um disco de nuvem de 20 GiB para cada réplica.

  1. Crie um arquivo chamado statefulset.yaml.

    A tabela a seguir descreve os parâmetros em volumeClaimTemplates:

    Parâmetro

    Descrição

    accessModes

    Modo de acesso do volume. ReadWriteOnce indica que o volume pode ser montado como leitura e escrita por um único nó por vez.

    storageClassName

    Nome da StorageClass a ser utilizada.

    alicloud-disk-essd é uma StorageClass padrão fornecida pelo Container Service for Kubernetes (ACK) para criar SSDs empresariais (ESSDs) com nível de desempenho (PL) padrão PL1.

    Nota

    Esses discos utilizam o faturamento pagamento conforme o uso. Para mais informações, consulte Faturamento de block storage e Preços de block storage.

    storage

    Capacidade do volume de disco.

    YAML template

    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. Implante o StatefulSet.

    kubectl create -f statefulset.yaml
  3. Verifique se os pods estão em execução.

    kubectl get pod -l app=nginx
  4. Visualize as PVCs para confirmar que o sistema criou e vinculou automaticamente uma PVC correspondente para cada pod.

    kubectl get pvc

    Saída 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

Etapa 2: Validar o ciclo de vida do armazenamento

Observe a criação, retenção e reutilização das PVCs associadas ao fazer scale-out, scale-in e, em seguida, scale-out novamente.

Fazer scale-out da aplicação

  1. Aumente o número de réplicas do StatefulSet para 3.

    kubectl scale sts web --replicas=3
  2. Verifique se os pods estão em execução.

    kubectl get pod -l app=nginx
  3. Visualize as PVCs para confirmar que o sistema criou automaticamente o pod web-2 e sua PVC correspondente disk-essd-web-2.

    kubectl get pvc

    Saída 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

Fazer scale-in da aplicação

  1. Diminua o número de réplicas do StatefulSet para 2.

    kubectl scale sts web --replicas=2
  2. Verifique se os pods estão em execução.

    kubectl get pod -l app=nginx
  3. Visualize as PVCs.

    kubectl get pvc

    Saída 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

    Neste ponto, o pod web-2 foi excluído, mas a PVC disk-essd-web-2 ainda existe para garantir a persistência dos dados.

Fazer scale-out da aplicação novamente

  1. Aumente o número de réplicas do StatefulSet de volta para 3.

    kubectl scale sts web --replicas=3
  2. Verifique se os pods estão em execução.

    kubectl get pod -l app=nginx
  3. Visualize as PVCs.

    kubectl get pvc

    Saída 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

    O pod recém-criado web-2 foi automaticamente vinculado e está utilizando a PVC disk-essd-web-2 retida anteriormente.

Etapa 3: Validar a persistência de dados após falha de pod

Verifique se os dados armazenados no disco persistem após a recriação de um pod escrevendo dados, excluindo o pod e, em seguida, verificando a existência dos dados.

  1. Escreva dados de teste no pod.

    Usando o pod web-1 como exemplo, crie um arquivo test no caminho de montagem do disco /data.

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

    Saída esperada:

    lost+found
    test
  2. Simule uma falha de pod excluindo-o.

    kubectl delete pod web-1

    Execute kubectl get pod -l app=nginx novamente e você verá que um novo pod chamado web-1 é criado automaticamente.

  3. Verifique os dados no novo pod.

    Verifique o diretório /data no novo pod web-1.

    kubectl exec web-1 -- ls /data

    O arquivo test que você criou ainda existe. Isso confirma que os dados persistem mesmo se o pod for excluído e recriado.

    lost+found
    test

Considerações para produção

  • Gerenciamento de custos e recursos: Ao fazer scale-in ou excluir um StatefulSet, as PVCs e discos associados são retidos por padrão. Esses recursos retidos continuam a gerar taxas. Certifique-se de limpar manualmente quaisquer PVCs e PVs não utilizados para evitar cobranças desnecessárias.

  • Segurança de dados e backup: O armazenamento persistente garante alta disponibilidade durante falhas de pod, mas não é uma solução de backup de dados. Para dados críticos, utilize o Cloud Backup para realizar backups regulares.

  • Alta disponibilidade e recuperação de desastres: Discos são recursos zonais e não podem ser montados entre zonas. Para recuperação de desastres entre zonas, utilize um tipo de disco que suporte replicação de dados entre zonas, como Regional ESSDs.