Todos os produtos
Search
Central de documentação

Elastic Container Instance:Criar uma instância spot

Última atualização: Sep 12, 2026

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.

    Nota

    Instâ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.

    Nota
    • Cerca 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:

    Importante

    Defina 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:

  • SpotWithPriceLimit: Define um preço horário máximo para a instância spot. Ao usar esta estratégia, especifique também o limite de preço por meio da annotation k8s.aliyun.com/eci-spot-price-limit.

  • SpotAsPriceGo: O sistema dá lances automaticamente pelo preço de mercado atual.

    Importante

    Se você utilizar a política SpotAsPriceGo e os recursos para o tipo de instância especificado estiverem escassos na zona selecionada, o preço poderá subir até o valor padrão de pagamento conforme o uso.

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-strategy estiver definido como SpotWithPriceLimit.

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.

Importante
  • 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

apiVersion: batch/v1
kind: Job
metadata:
  name: test
spec:
  template:
    metadata:
      labels:
        app: perl
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs : "ecs.c6.large"           # Specify an ECS instance type.
        k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit"  # Use a bidding strategy with a custom price limit.
        k8s.aliyun.com/eci-spot-price-limit: "0.25"            # Set the maximum hourly price.
    spec:
      containers:
      - name: pi
        image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

O exemplo YAML acima cria uma instância spot do tipo ecs.c6.large.

  • No momento da criação, se não houver estoque que atenda ao tipo de instância e ao limite de preço, a operação falhará.

  • Após a criação, a instância conta com um período de proteção de 1 hora. Expirado esse prazo, a instância spot será recuperada se o preço de mercado exceder seu lance ou se o estoque para aquele tipo tornar-se insuficiente.

Exemplo 2: Especifique vCPU e memória e use SpotAsPriceGo

  • Defina vCPU e memória através de pod.spec.resources

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: test
    spec:
      template:
        metadata:
          labels:
            app: perl
            alibabacloud.com/eci: "true" 
          annotations:
            k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"  # Use the system's automatic bidding, which follows the real-time market price.
        spec:
          containers:
          - name: pi
            image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
            resources:
              limits:              # Specify 2 vCPUs and 4 GiB of memory for the pi container.
                cpu: 2000m
                memory: 4096Mi
          restartPolicy: Never
  • Defina vCPU e memória utilizando uma annotation

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: test
    spec:
      template:
        metadata:
          labels:
            app: perl
            alibabacloud.com/eci: "true" 
          annotations:
            k8s.aliyun.com/eci-use-specs : "2-4Gi"             # Specify vCPU and memory. Instances with 2 vCPUs or more are supported.
            k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"  # Use the system's automatic bidding, which follows the real-time market price.
        spec:
          containers:
          - name: pi
            image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never

Os exemplos YAML acima criam uma instância spot com 2 vCPUs e 4 GiB de memória.

  • Durante a criação, se não houver estoque compatível com os requisitos de recursos, a operação falhará.

  • Após a criação, a instância possui um período de proteção de 1 hora. Findo esse período, a instância spot será recuperada caso o preço de mercado supere seu lance ou o estoque do tipo de instância esteja insuficiente.

Exemplo 3: Defina sem período de proteção

apiVersion: batch/v1
kind: Job
metadata:
  name: test
spec:
  template:
    metadata:
      labels:
        app: perl
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs : "2-4Gi"             # Specify vCPU and memory. Instances with 2 vCPUs or more are supported.
        k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"  # Use the system's automatic bidding, which follows the real-time market price.
        k8s.aliyun.com/eci-spot-duration: "0"              # Set no protection period.
    spec:
      containers:
      - name: pi
        image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

O exemplo YAML acima cria uma instância spot com 2 vCPUs e 4 GiB de memória.

  • No momento da criação, a operação falhará se não houver estoque que satisfaça os requisitos de recursos.

  • Após a criação, não há período de proteção. A instância spot será recuperada assim que o preço de mercado exceder o lance ou o estoque do tipo de instância tornar-se insuficiente.

Exemplo 4: Fallback para instância de pagamento conforme o uso

apiVersion: batch/v1
kind: Job
metadata:
  name: test
spec:
  template:
    metadata:
      labels:
        app: perl
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs : "ecs.c6.large"           # Specify an ECS instance type.
        k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit"  # Use a bidding strategy with a custom price limit.
        k8s.aliyun.com/eci-spot-price-limit: "0.05"            # Set the maximum hourly price.
        k8s.aliyun.com/eci-spot-fallback: "true"                # Automatically convert to a pay-as-you-go instance if spot inventory is unavailable.
    spec:
      containers:
      - name: pi
        image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

O exemplo YAML acima cria uma instância spot do tipo ecs.c6.large.

  • Se houver estoque disponível que atenda ao tipo de instância e ao limite de preço durante a criação, uma instância spot será provisionada. Ela terá um período de proteção de 1 hora. Após esse período, a instância spot será recuperada se o preço de mercado superar seu lance ou se o estoque ficar insuficiente.

  • Caso não haja estoque compatível com o tipo de instância e o limite de preço no momento da criação, o sistema provisionará uma instância de pagamento conforme o uso. Após a criação, o sistema não recupera essa instância automaticamente.

    Depois que a instância for criada, execute o comando kubectl describe pod para verificar os eventos do pod e confirme se houve fallback para uma instância de pagamento conforme o uso. Um evento SpotDegraded indica que o fallback ocorreu.

    Events:
      Type     Reason                  Age   From               Message
      ----     ------                  ---   ----               -------
      Warning  MissingClusterDNS       32m   virtual-kubelet    pod: "default/test4-dbrw6(3ef7c65d-3908-40e3-ab1f-39ff9562a36b)". virtual-kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to "Default" policy.
      Warning  SpotDegraded            32m   EciService         [eci.containergroup]Spot[SpotStrategy:SpotWithPriceLimit,SpotPriceLimit:0.001,SpotDuration:1] will be degraded because the specified instance is out of stock
      Normal   SuccessfulHitImageCache 32m   EciService         [eci.imagecache]Successfully hit image cache imc-2ze7udxttnd(xxx), eci will be scheduled with this image cache.
      Normal   Pulled                  32m   kubelet            Container image "registry-vpc.cn-beijing.aliyuncs.com/eci_open/perl:5" already present on machine
      Normal   Created                 32m   kubelet            Created container pi
      Normal   Started                 32m   kubelet            Started container pi

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.

    Importante

    O 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 describe para visualizar informações detalhadas do pod. O evento pré-liberação aparece na seção Events da 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 events para 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 Failed e o motivo passa a ser BidFailed.

    • Execute o comando kubectl get pod para 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 describe para 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.

Importante

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:

  1. Solicitação à API

    O nó virtual recebe o evento SpotToBeReleased e invoca a Eviction API.

  2. Verificação do PDB

    O servidor de API valida o PodDisruptionBudget associado ao pod alvo.

  3. Execução da remoção

    Se o servidor de API autorizar a remoção, o pod é excluído seguindo estas etapas:

    1. 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.

    2. 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.

    3. 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.

    4. Quando o período de carência do pod expira, o kubelet força o encerramento do pod local.

    5. O kubelet solicita ao servidor de API que exclua o recurso do pod.

    6. O servidor de API conclui a exclusão do recurso do pod.

  4. 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.

Nota

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.