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 comostse 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-bParâ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. QuandovolumeBindingModeestá definido comoWaitForFirstConsumer, 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.
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
Para melhorar a segurança dos dados dos seus volumes de disco, consulte Melhores práticas para segurança de dados de volumes de disco.
Para monitorar o uso de disco em tempo real, consulte Visão geral do monitoramento de armazenamento de contêineres.
Se um disco estiver cheio ou você precisar aumentar seu tamanho, consulte Expandir volumes de disco.
Para outros problemas de montagem de disco, consulte Perguntas frequentes sobre volumes de disco.