A execução contínua de jobs em lote e cargas de trabalho tolerantes a falhas pode gerar custos elevados em instâncias sob demanda. As instâncias preemptíveis permitem executar essas cargas em Pods baseados no Elastic Container Instance (ECI) com custo significativamente menor. O controlador de Job do Kubernetes substitui automaticamente qualquer Pod recuperado antes da conclusão do job.
Cargas de trabalho adequadas
Use instâncias preemptíveis para cargas de trabalho que toleram interrupções:
|
Adequado |
Não adequado |
|
Jobs em lote e tarefas pontuais |
Aplicações com estado |
|
Aplicações stateless e tolerantes a falhas, como serviços web escaláveis |
Serviços de longa duração que não suportam interrupções durante a execução |
|
Tarefas computacionais de curta duração onde reinícios são aceitáveis |
Cargas cujo tempo de inicialização ou encerramento excede a janela de pré-liberação de 5 minutos |
Como funciona
Ao criar uma instância preemptível, você define uma política de lance. A instância é provisionada quando o preço do seu lance supera o preço de mercado em tempo real e há estoque suficiente de recursos para aquele tipo de instância.
Período de proteção: Após a criação, a instância executa por um período de proteção de 1 hora (padrão), com faturamento baseado no preço de mercado no momento da compra.
Após o período de proteção: O sistema verifica o preço de mercado e o estoque a cada 5 minutos. Caso o preço de mercado ultrapasse o valor do seu lance ou o estoque se esgote, a instância será liberada. Um evento SpotToBeReleased é enviado à lista de eventos do Kubernetes aproximadamente 5 minutos antes da liberação. Aproveite essa janela para interromper o tráfego de entrada ou salvar o estado da sua carga de trabalho.
Continuidade do job: Quando um Pod é liberado antes da conclusão do job, o controlador de Job do Kubernetes cria automaticamente um novo Pod para dar continuidade à tarefa. O Pod original permanece com o status BidFailed.
Limitações
O período de proteção padrão é de 1 hora.
Após o término da proteção, a disponibilidade da instância depende do preço de mercado e do estoque de recursos, sem garantia de uptime.
O evento
SpotToBeReleasedchega cerca de 5 minutos antes da liberação. Se o encerramento limpo da sua carga de trabalho levar mais de 5 minutos, as instâncias preemptíveis podem não ser a melhor opção.
Pré-requisitos
Antes de começar, verifique se você possui:
Um cluster ACK Serverless
O
kubectlconfigurado para se conectar ao cluster
Execute um job em uma instância preemptível
Etapa 1: Crie o manifesto do job
Crie um arquivo chamado spot_job.yaml com o seguinte conteúdo:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
annotations:
k8s.aliyun.com/eci-use-specs: ecs.c5.large,2-4Gi # Multiple instance types improve creation success rate
k8s.aliyun.com/eci-spot-strategy: SpotAsPriceGo # Use the real-time market price as the bid price
spec:
containers:
- name: pi
image: registry-vpc.cn-beijing.aliyuncs.com/ostest/perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
A anotação k8s.aliyun.com/eci-spot-strategy defina a política de lance:
|
Valor |
Descrição |
|
|
Adota automaticamente o preço de mercado no momento da compra como valor do lance. |
|
|
Utiliza um preço máximo por hora definido por você. Adicione a anotação |
A anotação k8s.aliyun.com/eci-use-specs lista múltiplos tipos de instância. Especificar vários tipos aumenta a probabilidade de criação da instância preemptível quando o estoque de um tipo específico estiver baixo.
Etapa 2: Crie o job
kubectl create -f spot_job.yaml
Etapa 3: Monitore o status do Pod
kubectl get pod
O Pod passa pelos seguintes status:
Running — o job está em andamento:
NAME READY STATUS RESTARTS AGE
pi-frmr8 1/1 Running 0 35s
Completed — o job foi concluído com sucesso:
NAME READY STATUS RESTARTS AGE
pi-frmr8 0/1 Completed 0 2h
BidFailed — o Pod foi liberado antes da conclusão do job. O controlador de Job já criou um novo Pod (pi-kp5zx) para continuar a execução:
NAME READY STATUS RESTARTS AGE
pi-frmr8 1/1 BidFailed 0 4h53m
pi-kp5zx 1/1 Running 0 3h45m
Um evento SpotToBeReleased é emitido aproximadamente 5 minutos antes de um Pod entrar em BidFailed. Para visualize o evento, execute kubectl get events. Para obter detalhes sobre como lidar com eventos de pré-liberação, consulte Liberação de instâncias preemptíveis.
Próximos passos
Criar uma instância de contêiner elástico preemptível — configure políticas avançadas de lance e estratégias de seleção de tipos de instância.