O ECI oferece suporte a instâncias spot. Utilize essas instâncias em Jobs de curta duração e aplicações stateless com alta escalabilidade e tolerância a falhas para reduzir custos. Este tópico descreve como criar um pod ECI spot em um cluster Kubernetes.
Informações básicas
Uma instância preemptível é um recurso de computação de baixo custo baseado em lances. Você pode dar lances em recursos ociosos na Alibaba Cloud para executar seus containers. O sistema recupera esses recursos quando seu lance fica abaixo do preço de mercado atual ou quando o estoque de recursos é insuficiente.
Instâncias preemptíveis são ideais para jobs de curta execução e aplicações stateless altamente escaláveis e tolerantes a falhas, como serviços web elásticos, renderização de imagens, análise de big data e computação paralela em larga escala. Quanto mais distribuída, escalável e tolerante a falhas for sua aplicação, maior será a economia de custos e o aumento de throughput ao usar instâncias preemptíveis. Para mais informações, consulte What is a preemptible instance?.
Conceitos principais
Antes de criar uma instância preemptível, compreenda os seguintes conceitos:
-
Método de faturamento
O preço de mercado de uma instância preemptível varia conforme a oferta e a demanda. Ao criar a instância, especifique uma política de lance. Se o seu lance for superior ao preço de mercado em tempo real para o tipo de instância especificado e houver estoque suficiente, a criação será bem-sucedida. Após a criação, a instância é faturada pelo preço de mercado vigente no momento da compra durante o período de proteção (1 hora por padrão). Terminado esse período, o faturamento passa a seguir o preço de mercado em tempo real.
NotaInstâncias preemptíveis oferecem desconto em comparação às instâncias de pagamento conforme o uso. O preço real oscila segundo a oferta e a demanda, e a cobrança considera apenas a duração efetiva de uso. Para mais detalhes, veja Billing of preemptible instances.
-
Mecanismo de recuperação
Após o término do período de proteção, o sistema verifica automaticamente o preço de mercado e o estoque do tipo de instância a cada 5 minutos. Caso o preço de mercado ultrapasse seu lance ou o estoque fique insuficiente, o sistema libera a instância preemptível.
NotaCerca de 3 minutos antes de recuperar os recursos, o sistema gera um evento indicando que a instância está prestes a ser liberada.
Depois que o sistema recupera os recursos, o faturamento da instância é interrompido. As informações da instância são mantidas e seu status muda para Expired.
Observações de uso
Ao utilizar instâncias preemptíveis, atente-se aos pontos abaixo:
-
Escolha um tipo de instância adequado e faça um lance razoável.
Para auxiliar na escolha do tipo de instância e na definição do lance, utilize as operações OpenAPI do ECS para consultar informações sobre instâncias preemptíveis dos últimos 30 dias. As operações relevantes são:
DescribeSpotPriceHistory: consulta preços históricos de instâncias.
DescribeSpotAdvice: consulta dados como taxa média de liberação e taxa média de desconto das instâncias.
ImportanteDefina um lance suficientemente alto para absorver flutuações de preço e alinhado às expectativas de custo do seu negócio. Isso aumenta a probabilidade de criar a instância preemptível com sucesso e evita liberações por variação de preço, permitindo atender às necessidades operacionais com economia.
Armazene dados importantes em mídias não afetadas pela liberação de instâncias preemptíveis, como discos cloud (com a opção de liberação junto com a instância desativada) ou NAS.
Métodos de criação
É possível criar uma instância de container elástico preemptível especificando um tipo de instância ECS ou definindo vCPU e memória:
-
Especificar um tipo de instância ECS
O faturamento baseia-se no preço de mercado de pagamento conforme o uso do tipo de instância escolhido e no desconto em tempo real.
-
Especificar vCPU e memória
Este método equivale a especificar um tipo de instância ECS. O sistema seleciona automaticamente um tipo que atenda aos requisitos de recursos e preço. O faturamento segue o preço de mercado desse tipo correspondente. Ou seja, o desconto incide sobre o preço de mercado do tipo de instância ECS selecionado, e não sobre o preço de pagamento conforme o uso da quantidade de vCPU e memória equivalente.
Este método suporta apenas especificações com 2 vCPUs ou mais. A tabela a seguir lista as combinações válidas de vCPU e memória. Caso você especifique uma configuração não suportada, o sistema arredondará automaticamente para a próxima especificação válida.
vCPU
Memória (GiB)
2
2, 4, 8, 16
4
4, 8, 16, 32
8
8, 16, 32, 64
12
12, 24, 48, 96
16
16, 32, 64, 128
24
24, 48, 96, 192
32
32, 64, 128, 256
52
96, 192, 384
64
128, 256, 512
Configuração
Para criar uma instância spot, adicione annotations aos metadados do pod. A tabela abaixo detalha as annotations aplicáveis.
|
Annotation |
Valor de exemplo |
Obrigatório |
Descrição |
|
k8s.aliyun.com/eci-spot-strategy |
SpotAsPriceGo |
Sim |
Estratégia de lance para a instância spot. Valores válidos:
|
|
k8s.aliyun.com/eci-spot-price-limit |
"0.5" |
Não |
Preço horário máximo para a instância spot. Aceita valores com até três casas decimais. Esta annotation só é válida quando |
|
k8s.aliyun.com/eci-spot-duration |
"0" |
Não |
Período de proteção da instância spot, em horas. O valor padrão é 1. O valor 0 indica ausência de período de proteção. |
|
k8s.aliyun.com/eci-spot-fallback |
"true" |
Não |
Define se uma instância de pagamento conforme o uso deve ser criada caso não seja possível provisionar a instância spot devido à falta de estoque. O valor padrão é false. |
Adicione as annotations nos metadados do pod. Por exemplo, ao criar um Job, insira a annotation em
spec>template>metadata.As annotations relacionadas ao Elastic Container Instance só têm efeito na criação do pod. Adicionar ou modificar essas annotations em um pod existente não produzirá nenhum resultado.
Exemplo 1: Especifique um tipo de instância ECS e use SpotWithPriceLimit
Exemplo 2: Especifique vCPU e memória e use SpotAsPriceGo
Exemplo 3: Defina sem período de proteção
Exemplo 4: Fallback para instância de pagamento conforme o uso
Detalhes da recuperação
Após a criação, a instância spot opera normalmente durante seu período de proteção. Quando esse período expira, a instância é recuperada se o preço de mercado exceder seu lance ou se o estoque de recursos tornar-se insuficiente. Esta seção aborda os eventos e status de pod associados à recuperação de instâncias spot.
-
Evento pré-liberação
Aproximadamente três minutos antes da recuperação de uma instância spot, o sistema gera um evento
SpotToBeReleased.ImportanteO ECI notifica você por meio de Eventos do Kubernetes sobre a iminente liberação da instância spot. Nesse intervalo, tome medidas para evitar interrupções nos negócios causadas pela recuperação da instância. Para mais informações, consulte Graceful termination.
-
Execute o comando
kubectl describepara visualizar informações detalhadas do pod. O evento pré-liberação aparece na seçãoEventsda saída. Veja o exemplo abaixo:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning SpotToBeReleased 3m32s kubelet, eci Spot ECI will be released in 3 minutes -
Utilize o comando
kubectl get eventspara consultar informações de eventos. O evento pré-liberação estará visível na saída, conforme o exemplo:LAST SEEN TYPE REASON OBJECT MESSAGE 3m39s Warning SpotToBeReleased pod/pi-frmr8 Spot ECI will be released in 3 minutes
-
-
Status do pod após recuperação
Quando uma instância spot é recuperada, suas informações permanecem registradas, mas o status muda para
Failede o motivo passa a serBidFailed.-
Execute o comando
kubectl get podpara verificar as informações do pod. A mudança de status será visível na saída, como no exemplo:NAME READY STATUS RESTARTS AGE pi-frmr8 1/1 BidFailed 0 3h5m -
Execute o comando
kubectl describepara obter detalhes do pod. As informações de status aparecerão na saída, conforme ilustrado abaixo:Status: Failed Reason: BidFailed Message: The pod is spot instance, and have been released at 2020-04-08T12:36Z
-
Encerramento gracioso
Cerca de três minutos antes da recuperação de uma instância spot, o sistema gera um evento SpotToBeReleased e define o campo ContainerInstanceExpired nas condições do pod como true. Utilize esses mecanismos de notificação para implementar encerramento gracioso e rotação de pods, minimizando impactos nos negócios decorrentes da recuperação de instâncias spot.
O Virtual Node suporta encerramento gracioso para instâncias spot do ECI. Adicione a annotation k8s.aliyun.com/eci-spot-release-strategy: api-evict ao seu pod ECI. Ao receber um evento SpotToBeReleased, o nó virtual aciona a Eviction API para remover a instância spot.
Para habilitar notificações de interrupção via condições do pod e remoção pela Eviction API, atualize o ACK Virtual Node para a versão v2.11.0 ou superior. Consulte ACK Virtual Node para mais detalhes.
Uma remoção iniciada por API respeita suas configurações de PodDisruptionBudget (PDB) e terminationGracePeriodSeconds. Criar um objeto de Eviction via API equivale a executar uma operação DELETE controlada por política no pod. O fluxo ocorre da seguinte forma:
-
Solicitação à API
O nó virtual recebe o evento
SpotToBeReleasede invoca a Eviction API. -
Verificação do PDB
O servidor de API valida o PodDisruptionBudget associado ao pod alvo.
-
Execução da remoção
Se o servidor de API autorizar a remoção, o pod é excluído seguindo estas etapas:
O recurso do pod no servidor de API recebe um timestamp de exclusão; a partir desse momento, o servidor considera o pod em estado de encerramento. O recurso também é marcado com o período de carência configurado.
O kubelet no nó onde o pod está em execução detecta a marcação de encerramento e inicia o desligamento gracioso do pod local.
Enquanto o kubelet encerra o pod, o plano de controle remove o pod dos objetos Endpoint e EndpointSlice. Consequentemente, os controladores deixam de considerar o pod um objeto válido.
Quando o período de carência do pod expira, o kubelet força o encerramento do pod local.
O kubelet solicita ao servidor de API que exclua o recurso do pod.
O servidor de API conclui a exclusão do recurso do pod.
-
Reconciliação da carga de trabalho
Se um controlador gerencia o pod alvo (como ReplicaSet, StatefulSet, Job tolerante a falhas, sparkApplication ou Workflow), ele geralmente cria um novo pod para substituir o removido.
Se o PodDisruptionBudget estiver mal configurado ou se muitos pods não estiverem no estado Ready quando a Eviction API for chamada, o processo de remoção pode ser bloqueado. Caso a remoção não seja concluída antes da expiração da instância spot, a recuperação ocorrerá imediatamente.