Tous les produits
Search
Centre de documentation

Elastic Container Instance:Créer une instance spot

Dernière mise à jour :Aug 11, 2026

ECI prend en charge les instances spot. Utilisez ces instances pour des jobs de courte durée et certaines applications sans état hautement évolutives et tolérantes aux pannes afin de réduire les coûts. Cette rubrique explique comment créer un pod ECI spot dans un cluster Kubernetes.

Informations générales

Une instance preemptible est une ressource de calcul peu coûteuse, basée sur un système d'enchères. Enchérissez sur les ressources inactives disponibles sur Alibaba Cloud pour exécuter vos conteneurs. Le système récupère ces ressources si votre enchère devient inférieure au prix actuel du marché ou si l'inventaire des ressources est insuffisant.

Les instances preemptibles conviennent aux jobs de courte durée et aux applications sans état hautement évolutives et tolérantes aux pannes, telles que les services web à mise à l'échelle élastique, le rendu d'images, l'analyse de big data et le calcul parallèle à grande échelle. Plus votre application est distribuée, évolutive et tolérante aux pannes, plus vous réalisez d'économies et augmentez le débit en utilisant des instances preemptibles. Pour plus d'informations, consultez la page Qu'est-ce qu'une instance preemptible ?.

Concepts clés

Avant de créer une instance preemptible, familiarisez-vous avec les concepts suivants :

  • Méthode de facturation

    Le prix du marché d'une instance preemptible fluctue selon l'offre et la demande. Lors de la création, spécifiez une politique d'enchère. Si votre enchère est supérieure au prix du marché en temps réel pour le type d'instance spécifié et que l'inventaire est suffisant, la création aboutit. Après sa création, l'instance est facturée au prix du marché en vigueur au moment de l'achat pendant sa période de protection (1 heure par défaut). À l'issue de cette période, l'instance est facturée au prix du marché en temps réel.

    Remarque

    Les instances preemptibles sont proposées à tarif réduit par rapport aux instances à la demande. Le prix réel fluctue selon l'offre et la demande, et la facturation s'applique à la durée d'utilisation effective. Pour plus d'informations, consultez la page Facturation des instances preemptibles.

  • Mécanisme de récupération

    Après la fin de la période de protection, le système vérifie automatiquement toutes les 5 minutes le prix du marché et l'inventaire du type d'instance. Si le prix du marché dépasse à tout moment votre enchère ou si l'inventaire du type d'instance est insuffisant, le système libère l'instance preemptible.

    Remarque
    • Environ 3 minutes avant la récupération des ressources, le système génère un événement indiquant que l'instance est sur le point d'être libérée.

    • Une fois les ressources récupérées, la facturation de l'instance s'arrête. Les informations relatives à l'instance sont conservées et son statut passe à Expired.

Remarques d'utilisation

Lorsque vous utilisez des instances preemptibles, tenez compte des points suivants :

  • Choisissez un type d'instance approprié et placez une enchère raisonnable.

    Appelez les opérations OpenAPI d'ECS pour consulter les informations sur les instances preemptibles des 30 derniers jours, ce qui vous aidera à sélectionner un type d'instance et à placer une enchère. Les opérations pertinentes sont les suivantes :

    Important

    Définissez une enchère suffisamment élevée pour tenir compte des fluctuations du prix du marché et correspondant à vos attentes en matière de coûts métier. Cela augmente les chances de créer avec succès une instance preemptible et empêche sa libération due aux variations de prix, vous permettant ainsi de répondre aux besoins métier tout en réalisant des économies.

  • Stockez vos données importantes sur des supports de stockage non affectés par la libération des instances preemptibles, tels que des disques cloud (avec l'option de libération avec l'instance désactivée) ou NAS.

Méthodes de création

Créez une instance de conteneur élastique preemptible en spécifiant un type d'instance ECS ou en spécifiant les vCPU et la mémoire :

  • Spécifier un type d'instance ECS

    La facturation est basée sur le prix du marché à la demande du type d'instance spécifié et sur la réduction en temps réel.

  • Spécifier les vCPU et la mémoire

    Cette méthode produit le même effet que la spécification d'un type d'instance ECS. Le système fait correspondre automatiquement un type d'instance ECS répondant aux exigences en matière de ressources et de prix. La facturation est basée sur le prix du marché de ce type d'instance correspondant. Autrement dit, la réduction s'applique au prix du marché du type d'instance ECS correspondant, et non au prix à la demande des vCPU et de la mémoire correspondants.

    Cette méthode prend uniquement en charge les spécifications de 2 vCPU ou plus. Le tableau ci-dessous répertorie les spécifications de vCPU et de mémoire prises en charge. Si vous spécifiez une configuration non prise en charge, le système l'arrondit automatiquement à la spécification prise en charge supérieure suivante.

    vCPU

    Mémoire (Go)

    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

Configuration

Créez une instance spot en ajoutant des annotations aux métadonnées du pod. Le tableau suivant décrit les annotations pertinentes.

Annotation

Valeur d'exemple

Obligatoire

Description

k8s.aliyun.com/eci-spot-strategy

SpotAsPriceGo

Oui

La stratégie d'enchère pour l'instance spot. Valeurs possibles :

  • SpotWithPriceLimit : Définit un prix horaire maximal pour l'instance spot. Si vous utilisez cette stratégie, vous devez également spécifier la limite de prix à l'aide de l'annotation k8s.aliyun.com/eci-spot-price-limit.

  • SpotAsPriceGo : Le système enchérit automatiquement au prix actuel du marché.

    Important

    Si vous utilisez la stratégie SpotAsPriceGo et que les ressources pour le type d'instance spécifié sont rares dans la zone sélectionnée, le prix peut atteindre le prix standard à la demande.

k8s.aliyun.com/eci-spot-price-limit

"0.5"

Non

Le prix horaire maximal pour l'instance spot. Vous pouvez spécifier une valeur avec jusqu'à trois décimales.

Cette annotation n'est valide que lorsque k8s.aliyun.com/eci-spot-strategy est défini sur SpotWithPriceLimit.

k8s.aliyun.com/eci-spot-duration

"0"

Non

La période de protection pour l'instance spot, en heures. La valeur par défaut est 1. Une valeur de 0 signifie qu'il n'y a pas de période de protection.

k8s.aliyun.com/eci-spot-fallback

"true"

Non

Indique s'il faut créer une instance à la demande si une instance spot ne peut pas être créée en raison d'un inventaire insuffisant. La valeur par défaut est false.

Important
  • Ajoutez les annotations sous les métadonnées du pod. Par exemple, lors de la création d'un Job, ajoutez l'annotation sous spec>template>metadata.

  • Les annotations liées à Elastic Container Instance ne sont appliquées que lors de la création d'un pod. L'ajout ou la modification de ces annotations sur un pod existant n'aura aucun effet.

Exemple 1 : Spécifier un type d'instance ECS et utiliser 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

L'exemple YAML ci-dessus crée une instance spot du type d'instance ecs.c6.large.

  • Au moment de la création, si aucun inventaire ne répond aux exigences du type d'instance et de la limite de prix, la création échoue.

  • Après la création, l'instance bénéficie d'une période de protection d'une heure. À l'expiration de cette période d'une heure, l'instance spot est récupérée si le prix du marché dépasse votre enchère ou si l'inventaire pour le type d'instance est insuffisant.

Exemple 2 : Spécifier les vCPU et la mémoire et utiliser SpotAsPriceGo

  • Spécifiez les vCPU et la mémoire à l'aide 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
  • Spécifiez les vCPU et la mémoire à l'aide d'une 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

Les exemples YAML ci-dessus créent une instance spot avec 2 vCPU et 4 Go de mémoire.

  • Au moment de la création, si aucun inventaire ne répond aux exigences en matière de ressources, la création échoue.

  • Après la création, l'instance bénéficie d'une période de protection d'une heure. À l'expiration de cette période d'une heure, l'instance spot est récupérée si le prix du marché dépasse votre enchère ou si l'inventaire pour le type d'instance est insuffisant.

Exemple 3 : Définir aucune période de protection

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

L'exemple YAML ci-dessus crée une instance spot avec 2 vCPU et 4 Go de mémoire.

  • Au moment de la création, si aucun inventaire ne répond aux exigences en matière de ressources, la création échoue.

  • Après la création, il n'y a pas de période de protection. L'instance spot est récupérée dès que le prix du marché dépasse l'enchère ou que l'inventaire pour le type d'instance est insuffisant.

Exemple 4 : Basculer vers une instance à la demande

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

L'exemple YAML ci-dessus crée une instance spot du type d'instance ecs.c6.large.

  • Au moment de la création, si un inventaire répondant aux exigences du type d'instance et de la limite de prix est disponible, une instance spot est créée. Après la création, l'instance bénéficie d'une période de protection d'une heure. À l'expiration de cette période d'une heure, l'instance spot est récupérée si le prix du marché dépasse votre enchère ou si l'inventaire pour le type d'instance est insuffisant.

  • Au moment de la création, si aucun inventaire ne répond aux exigences du type d'instance et de la limite de prix, une instance à la demande est créée. Après la création, le système ne récupère pas automatiquement l'instance.

    Une fois l'instance créée, exécutez la commande kubectl describe pod pour vérifier les événements du pod et confirmer s'il a basculé vers une instance à la demande. Un événement SpotDegraded indique que l'instance a basculé vers une instance à la demande.

    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

Détails de la récupération

Après la création d'une instance spot, elle fonctionne normalement pendant sa période de protection. À l'expiration de la période de protection, l'instance spot est récupérée si le prix du marché dépasse votre enchère ou si l'inventaire des ressources est insuffisant. Cette section décrit les événements et les statuts de pod liés à la récupération des instances spot.

  • Événement de pré-libération

    Environ trois minutes avant la récupération d'une instance spot, un événement SpotToBeReleased est généré.

    Important

    ECI vous informe via les événements Kubernetes que l'instance spot sera libérée. Pendant ce temps, prenez des mesures pour éviter les interruptions d'activité dues à la récupération de l'instance. Pour plus d'informations, consultez la section Arrêt gracieux.

    • Exécutez la commande kubectl describe pour afficher les informations détaillées sur le pod. Vous pouvez voir l'événement de pré-libération dans la section Events de la sortie. Voici un exemple :

      Events:
        Type     Reason            Age    From          Message
        ----     ------            ----   ----          -------
        Warning  SpotToBeReleased  3m32s  kubelet, eci  Spot ECI will be released in 3 minutes
    • Exécutez la commande kubectl get events pour afficher les informations sur les événements. Vous pouvez voir l'événement de pré-libération dans la sortie. Voici un exemple :

      LAST SEEN   TYPE      REASON             OBJECT         MESSAGE
      3m39s       Warning   SpotToBeReleased   pod/pi-frmr8   Spot ECI will be released in 3 minutes
  • Statut du pod après récupération

    Après la récupération d'une instance spot, ses informations sont conservées, mais son statut passe à Failed et la raison est BidFailed.

    • Exécutez la commande kubectl get pod pour afficher les informations sur le pod. Vous pouvez constater que le statut du pod a changé dans la sortie. Voici un exemple :

      NAME       READY   STATUS      RESTARTS   AGE
      pi-frmr8   1/1     BidFailed   0          3h5m
    • Exécutez la commande kubectl describe pour afficher les informations détaillées sur le pod. Vous pouvez voir les informations sur le statut du pod dans la sortie. Voici un exemple :

      Status:             Failed
      Reason:             BidFailed
      Message:            The pod is spot instance, and have been released at 2020-04-08T12:36Z

Arrêt gracieux

Environ trois minutes avant la récupération d'une instance spot, un événement SpotToBeReleased est généré et le champ ContainerInstanceExpired dans les conditions du pod est défini sur true. Utilisez ces mécanismes de notification pour mettre en œuvre un arrêt gracieux et une rotation des pods, ce qui minimise les interruptions d'activité dues à la récupération des instances spot.

Virtual Node prend en charge l'arrêt gracieux des instances spot ECI. Ajoutez l'annotation k8s.aliyun.com/eci-spot-release-strategy: api-evict à votre pod ECI. Lorsque le nœud virtuel reçoit un événement SpotToBeReleased, il appelle l'API d'éviction pour évincer l'instance spot.

Important

Pour prendre en charge les notifications d'interruption via les conditions de pod et l'éviction via l'API d'éviction, mettez à niveau ACK Virtual Node vers la version v2.11.0 ou ultérieure. Pour plus d'informations, consultez la page ACK Virtual Node.

Une éviction initiée par l'API respecte vos configurations PodDisruptionBudget (PDB) et terminationGracePeriodSeconds. La création d'un objet Eviction à l'aide de l'API est similaire à l'exécution d'une opération DELETE contrôlée par une politique sur un pod. Le processus est le suivant :

  1. Requête API

    Le nœud virtuel reçoit un événement SpotToBeReleased et appelle l'API d'éviction.

  2. Vérification PDB

    Le serveur API valide le PodDisruptionBudget associé au pod cible.

  3. Exécution de l'éviction

    Si le serveur API autorise l'éviction, le pod est supprimé comme suit :

    1. La ressource pod dans le serveur API est mise à jour avec un horodatage de suppression, après quoi le serveur API considère que le pod est en cours de terminaison. La ressource pod est également marquée avec la période de grâce configurée.

    2. Le kubelet sur le nœud où le pod est en cours d'exécution remarque que la ressource pod est marquée pour la terminaison et commence à arrêter gracieusement le pod local.

    3. Pendant que le kubelet arrête le pod, le plan de contrôle supprime le pod des objets Endpoint et EndpointSlice. Par conséquent, les contrôleurs ne considèrent plus le pod comme un objet valide.

    4. À l'expiration de la période de grâce du pod, le kubelet termine de force le pod local.

    5. Le kubelet informe le serveur API de supprimer la ressource pod.

    6. Le serveur API supprime la ressource pod.

  4. Réconciliation de la charge de travail

    Si le pod cible est géré par un contrôleur (tel qu'un ReplicaSet, un StatefulSet ou un Job tolérant aux pannes, une sparkApplication ou un Workflow), le contrôleur crée généralement un nouveau pod pour remplacer celui qui a été évincé.

Remarque

Si le PodDisruptionBudget est mal configuré, ou s'il y a beaucoup de pods qui ne sont pas dans l'état Ready lorsque l'API d'éviction est appelée, le processus d'éviction peut être bloqué. Si l'éviction n'est pas terminée avant l'expiration de l'instance spot, l'instance est récupérée immédiatement.