Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Configuração de alta disponibilidade para volumes de disco

Última atualização: Jun 27, 2026

Ao implantar um StatefulSet e montar volumes de disco, a inicialização da aplicação pode falhar devido a problemas como zonas de disponibilidade mal configuradas ou tipos de disco incompatíveis. Este tópico fornece recomendações de configuração para implantações em múltiplas zonas de disponibilidade, ajudando a prevenir esses problemas de infraestrutura e minimizar interrupções nas liberações.

Contexto

Os recursos avançados de orquestração de contêineres do Kubernetes facilitam a construção de aplicações stateful em grande escala (StatefulSets). No entanto, embora o Kubernetes simplifique a implantação, ele também abstrai o hardware subjacente. Essa abstração pode levar a comportamentos inesperados caso você não conheça bem a topologia e as limitações da infraestrutura de base.

  • Em um cluster que abrange múltiplas zonas de disponibilidade, um pod destinado à zona A é agendado em um nó na zona B.

  • Ocorre um erro ao criar um volume de disco. Por exemplo, falha no provisionamento de um PV dinâmico com o erro InvalidDataDiskCatagory.NotSupported.

  • Um pod falha ao montar um volume e retorna o erro: The instanceType of the specified instance does not support this disk category.

  • Um pod falha no agendamento e retorna o erro: 0/x node are available, x nodes had volume node affinity conflict.

Esses problemas podem interromper ou bloquear as liberações de aplicações. Este tópico apresenta recomendações de configuração de alta disponibilidade para reduzir o risco dessas falhas.

Configurações

Objetivos de configuração

  • Para StatefulSets, recomendamos o uso de discos para armazenamento persistente. Em comparação ao NAS, os discos oferecem maior estabilidade e melhor largura de banda para transferência de dados.

  • Garanta que o cluster abranja múltiplas zonas de disponibilidade, com recursos de computação e armazenamento suficientes para atender à demanda.

  • Configure o cluster para dimensionar automaticamente os nós e atender à demanda de agendamento quando uma zona de disponibilidade inteira ficar indisponível.

  • Utilize uma StorageClass de alta disponibilidade para evitar falhas na montagem de discos.

  • Assegure a distribuição uniforme dos pods entre os nós e as zonas de disponibilidade.

Configurações do pool de nós

  • Utilize uma única zona de disponibilidade para cada pool de nós.

    • Ao adicionar uma zona de disponibilidade, crie um novo pool de nós para ela. Para mais informações, consulte Criar e gerenciar um pool de nós.

    • Ao criar pools de nós, garanta que cada pool corresponda a uma zona de disponibilidade diferente. Use nomes de pool de nós para distinguir as zonas de disponibilidade.

  • Ative o Auto Scaling para os pools de nós. Para mais informações, consulte Ativar auto scaling de nós.

    Se não houver nós disponíveis em uma zona de disponibilidade, o sistema cria automaticamente um novo nó nessa zona para agendar o pod, conforme mostrado no log a seguir.

    Warning  FailedScheduling     3m26s                xxx                0/2 nodes are available: 2 node(s) had volume node affinity conflict.
    Warning  FailedScheduling     3m26s                xxx                0/2 nodes are available: 2 node(s) had volume node affinity conflict.
    Normal   Scheduled            14s                  xxx                Successfully assigned default/web-csi-available-test4-1 to cn-wulanchabu.172.xxx
    Warning  FailedScheduling     86s                  xxx                0/3 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate, 2 node(s) had volume node affinity conflict.
    Warning  FailedScheduling     76s                  xxx                0/3 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate, 2 node(s) had volume node affinity conflict.
    Warning  FailedScheduling     25s                  xxx                0/3 nodes are available: 3 node(s) had volume node affinity conflict.
    Normal   TriggeredScaleUp     3m8s                 cluster-autoscaler   pod triggered scale-up: [xxx 0->1 (max: 10)}]
    Normal   NotTriggerScaleUp    2m39s                cluster-autoscaler   pod didn't trigger scale-up (it wouldn't fit if a new node is added): 1 can't increase node group size
    Normal   TriggeredScaleUp     37s                  cluster-autoscaler   pod triggered scale-up: [{xxx 1->2 (max: 10)}]
    Normal   SuccessfulAttachVolume 15s                attachdetach-controller  AttachVolume.Attach succeeded for                         i3uqre"
    Warning  FailedMount          9s (x3 over 11s)     kubelet              MountVolume.MountDevice failed for volume "xxx" : rpc error: code = Aborted desc = NodeStageVolume: Attach volume: d-xxx
             with error: rpc error: code = Aborted desc = NodeStageVolume: Previous attach action is still in process: d xxx
    Normal   Pulling              3s                   kubelet              Pulling image "nginx"
  • Use o mesmo tipo de instância ECS em todas as zonas de disponibilidade. Se isso não for possível, utilize tipos de instância que suportem as mesmas categorias de block storage.

    Alguns tipos de disco não podem ser montados em determinados tipos de instância ECS. Mesmo que um pod seja agendado na zona de disponibilidade correta, ele pode falhar ao iniciar devido a erros de montagem de disco se o nó não suportar o tipo de disco solicitado.

  • Configure taints para todos os pools de nós, evitando que cargas de trabalho não intencionais sejam agendadas nesses nós e afetem sua aplicação. Ao criar um pool de nós, configure taints para seus nós na seção Taints. Por exemplo, defina a chave como app, o valor como sts e o efeito como NoSchedule. Isso impede que pods sem uma toleration correspondente sejam agendados nos nós deste pool.

Configurações do cluster

  • Verifique se a versão do seu cluster é 1,20 ou posterior.

  • Confirme se a versão do seu plug-in CSI é 1,22 ou posterior. Para mais informações, consulte Gerenciar o plug-in CSI.

  • Adote uma StorageClass de alta disponibilidade.

    O exemplo a seguir mostra a configuração YAML:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-topology-alltype
    parameters:
      type: cloud_essd,cloud_ssd,cloud_efficiency
    provisioner: diskplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.diskplugin.csi.alibabacloud.com/zone
        values:
        - cn-beijing-a
        - cn-beijing-b

    Parâmetros principais:

    • type: cloud_essd,cloud_ssd,cloud_efficiency: Especifica uma lista priorizada de tipos de disco para um mecanismo de fallback. O plug-in CSI tenta criar um disco testando os tipos especificados em ordem: ESSD, SSD padrão e, em seguida, ultra disk. Essa abordagem evita falhas na inicialização de pods causadas por estoque insuficiente de um tipo específico de disco.

    • volumeBindingMode: WaitForFirstConsumer: Adia a criação do disco até que um pod seja agendado em um nó específico. Isso garante que o disco seja criado na mesma zona de disponibilidade do nó, prevenindo falhas na inicialização de pods causadas por incompatibilidade de zonas.

    • allowedTopologies: Restringe o provisionamento de volumes a zonas de disponibilidade específicas. Quando volumeBindingMode está definido como WaitForFirstConsumer, o agendador posiciona os pods em uma das zonas de disponibilidade especificadas, garantindo que o disco possa ser provisionado com sucesso.

Configurações da aplicação

O modelo a seguir apresenta uma configuração padrão de StatefulSet. Personalize-o conforme necessário.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      topologySpreadConstraints:
      - labelSelector:
          matchLabels:
            app: mysql
        maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: ScheduleAnyway
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "mysql"
        volumeMounts:
        - name: disk-csi
          mountPath: /var/lib/mysql
      tolerations:
      - key: "app"
        operator: "Exists"
        effect: "NoSchedule"
  volumeClaimTemplates:
  - metadata:
      name: disk-csi
    spec:
      accessModes: [ "ReadWriteMany" ]
      storageClassName: alicloud-disk-topology-alltype
      resources:
        requests:
          storage: 40Gi

Parâmetros principais:

  • topologySpreadConstraints: Distribui os pods entre diferentes zonas de disponibilidade da forma mais uniforme possível. Para mais informações, consulte Topology Spread Constraints.

  • volumeClaimTemplates: Cria automaticamente a quantidade necessária de discos com base na contagem de réplicas, o que simplifica o dimensionamento.

Importante

Quando um PV é provisionado dinamicamente, sua definição YAML inclui a zona de disponibilidade do nó. Consequentemente, o PV e seu PVC vinculado só podem ser usados por pods agendados nessa mesma zona de disponibilidade, o que garante uma montagem bem-sucedida.

Referências