O ACS relata falhas de hardware por meio de Events e Conditions do Kubernetes (consulte GPU fault diagnosis and recovery). Configure o componente acs-instance-helper para automatizar o tratamento de falhas com dimensionamento automático e eviction, evitando interrupções no service.
Como funciona
Quando uma instância do ACS passa por manutenção programada de nó ou apresenta uma falha de hardware, como uma GPU danificada, a estabilidade e o desempenho do service podem ser afetados. O componente acs-instance-helper automatiza o tratamento dessas falhas:
Monitoramento automático de falhas: O componente monitora continuamente a
Conditionde falha dos Pods. A infraestrutura subjacente relata esse sinal automaticamente para eventos como falhas de GPU, problemas na máquina host ou manutenções e reinicializações programadas de nós.Alinhamento com janela de manutenção: O componente decide quando agir com base no prazo limite de tratamento de falhas reportado pelo nó subjacente e em uma janela de manutenção opcional. Se o prazo permitir, ele aguarda a janela de manutenção predefinida antes de prosseguir.
-
Atualização de rotação acionada: Para aplicações stateless, como Deployments e CloneSets, o componente utiliza uma estratégia de scale-up online (primeiro escala, depois destrói) para rotacionar os Pods no nó com falha.
ImportantePara aplicações não online, o acs-instance-helper realiza o eviction direto dos Pods na instância assim que detecta a condição de falha.
Pré-requisitos
Seu cluster ACS deve estar na versão 1,28 ou posterior.
O ACK Virtual Node deve estar instalado na versão v2.16.0 ou posterior. Para mais informações, consulte ACK Virtual Node.
Instale o componente
No console do ACS, clique em nome do cluster desejado. No painel de navegação à esquerda, escolha .
-
Na página Helm, clique em Deploy.
Basic Information: Na caixa de pesquisa Chart, insira acs-instance-helper e selecione-o nos resultados.
Parameters: Em Chart Version, selecione a versão mais recente.
Configure as definições globais do acs-instance-helper (Opcional)
Você também pode configurar uma janela de manutenção e adicionar suporte a tipos personalizados de workload.
Console
No painel de navegação à esquerda, escolha Configurations > ConfigMaps.
Na página ConfigMaps, clique em Create from YAML. Copie o manifesto abaixo para a área Template e clique em Create.
kubectl
Get the cluster KubeConfig and connect to the cluster by using kubectl.
Salve o conteúdo YAML a seguir como arquivo acs-instance-helper-global-configmap.yaml e execute o comando
kubectl apply -f acs-instance-helper-global-configmap.yaml.
apiVersion: v1
kind: ConfigMap
metadata:
name: acs-instance-helper-global-config
namespace: kube-system
data:
customOnlineWorkloads: foo.io/SomeWorkload,bar.io/AnotherWorkload
hardwareFaultEvictionSeconds: "60"
maintenanceTime: "2025-10-09T10:00:00+08:00"
maintenanceDuration: "4h"
maintenanceWeeklyPeriod: "Saturday,Sunday"
# maintenanceRecurrence: "FREQ=WEEKLY;BYDAY=SA,SU" # Maintenance window: every Saturday and Sunday
Expanda a seção abaixo para ver a descrição dos parâmetros.
Crie e configure um workload
Ative o recurso de tratamento de falhas para seu workload configurando uma annotation.
O recurso de tratamento de falhas executa a rotação tentando repetidamente evictions por meio da Eviction API em vez de excluir diretamente os Pods nas instâncias com falha. Você pode configurar uma política de PodDisruptionBudget (PDB) para controlar a concorrência de evictions e evitar interrupções no service. Para mais informações, consulte Use a PDB to control Pod eviction concurrency .
Console
No painel de navegação à esquerda do cluster desejado, escolha Workloads > Deployments.
-
Na página Deployments, clique em Create from YAML. Copie o conteúdo abaixo para a área Template e clique em Create.
apiVersion: apps/v1 kind: Deployment metadata: name: hardware-fault-helper-example namespace: default spec: replicas: 1 selector: matchLabels: app: hardware-fault-helper-example template: metadata: labels: app: hardware-fault-helper-example annotations: # Key annotation: Enables the fault handling feature for the workload. "ops.alibabacloud.com/enable-hardware-fault-helper": "true" spec: containers: - image: registry-cn-hangzhou.ack.aliyuncs.com/dev/hello-world:v1 name: main-container resources: limits: cpu: 100m memory: 100Mi restartPolicy: Always Na caixa de diálogo exibida, localize a aplicação stateless desejada e clique em View . Confirme se o status do Pod é
Running.
kubectl
-
Salve o conteúdo YAML a seguir como app.yaml e execute o comando
kubectl apply -f app.yaml.apiVersion: apps/v1 kind: Deployment metadata: name: hardware-fault-helper-example namespace: default spec: replicas: 1 selector: matchLabels: app: hardware-fault-helper-example template: metadata: labels: app: hardware-fault-helper-example annotations: # Key annotation: Enables the fault handling feature for the workload. "ops.alibabacloud.com/enable-hardware-fault-helper": "true" spec: containers: - image: registry-cn-hangzhou.ack.aliyuncs.com/dev/hello-world:v1 name: main-container resources: limits: cpu: 100m memory: 100Mi restartPolicy: Always -
Confirme se o status do Pod da aplicação desejada é
Running.kubectl get pods -l app=hardware-fault-helper-example
Simule um cenário de falha
Em produção, a Condition é adicionada automaticamente pelo plano de controle subjacente. Nesta seção, você injeta manualmente uma Condition em um Pod para simular um cenário de falha.
-
Simule a falha: Substitua
POD_NAMEpelo nome real do seu Pod para injetar umaConditionde falha de hardware.kubectl patch pod POD_NAME --type='merge' --subresource=status -p='{"status": {
"conditions": [
{
"type": "Interruption.HardwareFault",
"status": "True",
"reason": "MockForTest",
"message": "Underlying infrastructure issue [Reboot] scheduled at 2099-03-12T09:00:00.000+08:00",
"lastProbeTime": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'",
"lastTransitionTime": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"
}
]
}
}'
O prazo limite para tratamento da falha é especificado no campo
message. -
Observe o scale-up: Após injetar a falha, o acs-instance-helper aciona um scale-up de acordo com a maintenance window configuration. Se nenhuma janela estiver configurada, ele aciona o scale-up imediatamente. Um novo Pod é criado e o status do workload original permanece inalterado.
kubectl get pods -l app=hardware-fault-helper-exampleSaída esperada:
NAME READY STATUS RESTARTS AGE hardware-fault-helper-example-7cf4cf96c5-xxxxx 1/1 Running 0 2m21s hardware-fault-helper-example-7cf4cf96c5-yyyyy 1/1 Running 0 36s # The newly scaled-up Pod -
Verifique o evento de scale-up: Consulte os eventos do Pod com falha. Você deverá ver um evento
NewInstanceCreationTriggered, confirmando que o scale-up foi acionado pelohardware-fault-helper.kubectl describe po POD_NAMESaída esperada:
... Normal NewInstanceCreationTriggered 62s hardware-fault-helper controller default/hardware-fault-helper-example-7cf4cf96c5 (apiVersion:apps/v1, kind:ReplicaSet) will create a new instance -
Verifique o evento de eviction: Após o período de espera definido em
hardwareFaultEvictionSeconds, o Pod com falha é retirado de serviço. Ele entra no estado Terminating antes de ser excluído. Você também pode observar um evento correspondente a essa ação.kubectl describe po POD_NAMESaída esperada:
... Warning InstanceEvictedGracefully 2s hardware-fault-helper pod is deleted due to hardware fault Normal Killing 1s kubelet Stopping container main-container -
Confirme a recuperação: Por fim, o Pod com falha é completamente substituído, restando apenas o Pod recém-criado.
kubectl get pods -l app=hardware-fault-helper-exampleSaída esperada:
NAME READY STATUS RESTARTS AGE hardware-fault-helper-example-7cf4cf96c5-yyyyy 1/1 Running 0 5m5s
Faturamento
A instalação do componente acs-instance-helper implanta um Deployment com duas réplicas no seu cluster. Cada réplica consome 1 vCPU e 2 GiB de memória do cluster, o que gerará custos. Para mais informações sobre faturamento, consulte ACS computing power billing.
FAQ
Controle o eviction de Pods com um PDB
Para manter a alta disponibilidade durante evictions de Pods para drenagem de nós e autoscaling, configure uma política de PodDisruptionBudget (PDB). O PDB controla a concorrência de evictions com os seguintes parâmetros:
maxUnavailable: Número máximo de Pods que podem ficar indisponíveis durante o processo de eviction.minAvailable: Número mínimo de Pods que devem permanecer disponíveis durante o processo de eviction.
O exemplo a seguir garante que pelo menos um Pod permaneça disponível durante um eviction:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: app-pdb
namespace: YOUR_NAMESPACE # Specify the namespace where the policy applies. Defaults to `default` if not specified.
spec:
minAvailable: 1
selector:
matchLabels:
app: app