Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Use spot instances in Knative

Dernière mise à jour :Aug 11, 2026

Les instances Spot sont des instances de calcul préemptibles dont le prix est nettement inférieur aux tarifs à la demande. Si vos charges de travail Knative gèrent des requêtes éphémères et peuvent tolérer des interruptions occasionnelles, le basculement vers des instances Spot permet de réduire considérablement les coûts de calcul tout en préservant l'élasticité et la réactivité de votre architecture sans serveur.

Cette rubrique explique comment configurer des instances Spot pour les services Knative dans Container Service for Kubernetes (ACK), gérer les interruptions avec élégance et surveiller l'état des instances Spot.

Prérequis

Avant de commencer, assurez-vous d'avoir :

  • Knative déployé dans votre cluster ACK. Pour plus d'informations, consultez la section Déployer et gérer les composants Knative.

  • ack-virtual-node version 2.11.0 ou ultérieure, si vous souhaitez utiliser l'API Eviction pour un arrêt gracieux. Pour plus d'informations, consultez la section ack-virtual-node.

Concepts clés

  • Instance Spot

    Une instance de calcul économique et préemptible. Vous pouvez enchérir sur la capacité de calcul inutilisée d'Alibaba Cloud pour exécuter vos conteneurs. L'instance fonctionne jusqu'à ce que votre offre soit inférieure au prix du marché actuel ou jusqu'à ce que la ressource soit récupérée en raison d'un manque de stock. Pour plus d'informations, consultez la section Qu'est-ce qu'une instance Spot ?

  • Knative

    Knative vise à établir une norme pour l'orchestration d'applications sans serveur cloud-native et multiplateforme. Ses principales fonctionnalités incluent la mise à l'échelle automatique basée sur les requêtes, la mise à l'échelle à zéro, la gestion des versions multiples, les déploiements canaris basés sur le trafic, le déploiement de fonctions et une architecture événementielle. Pour plus d'informations, consultez les sections Présentation de ACK Knative et Présentation de ACK Serverless Knative.

Fonctionnement

Les services Knative ajustent automatiquement le nombre de Pods en fonction des requêtes entrantes. Chaque Pod s'exécute sur un nœud virtuel, qui provisionne la ressource Elastic Container Instance (ECI) correspondante en fonction des annotations du Pod. Pour utiliser des instances Spot, ajoutez des annotations spécifiques aux instances Spot au modèle de Pod de votre service Knative ; le nœud virtuel se charge du provisionnement et du remplacement automatique.

image

Knative convient parfaitement aux instances Spot pour les raisons suivantes :

  • Charges de travail limitées aux requêtes : les Pods Knative traitent des requêtes individuelles et libèrent les ressources immédiatement après leur achèvement, de sorte que les interruptions ont rarement un impact sur le travail en cours.

  • Arrêt gracieux intégré : Knative injecte un conteneur sidecar queue-proxy dans chaque Pod. Lorsqu'un Pod est arrêté, queue-proxy attend que toutes les requêtes en cours soient terminées avant l'arrêt du conteneur d'application.

  • Économique : pour les utilisateurs de Knative soucieux des coûts, l'utilisation d'instances Spot permet de réaliser des économies significatives.

Limites

Important

Les annotations des instances Spot ne sont appliquées que lors de la création d'un Pod ECI. L'ajout ou la modification de ces annotations sur un Pod ECI existant n'a aucun effet.

Configurer des instances Spot

Ajoutez les annotations suivantes au modèle de Pod de votre service Knative.

Annotation Exemple de valeur Obligatoire Description
k8s.aliyun.com/eci-spot-strategy SpotAsPriceGo Oui La stratégie d'enchère. Valeurs valides : SpotWithPriceLimit et SpotAsPriceGo. Consultez la section Choisir une stratégie d'enchère pour plus de détails.
k8s.aliyun.com/eci-spot-price-limit "0.5" Non Le prix horaire maximal de l'instance Spot. La valeur peut comporter jusqu'à trois décimales. Prend effet uniquement lorsque eci-spot-strategy est défini sur SpotWithPriceLimit.
k8s.aliyun.com/eci-spot-duration "1" Non La période de protection en heures. Par défaut : 1. Définissez cette valeur sur 0 pour désactiver la période de protection. Pendant la période de protection, l'instance Spot n'est pas récupérée même si le prix du marché dépasse votre offre.
k8s.aliyun.com/eci-spot-fallback "true" Non Indique s'il faut créer une instance à la demande si le stock Spot n'est pas disponible. Par défaut : false. Lorsque cette option est définie sur true, le nœud virtuel bascule vers une instance à la demande à la fois lors de la création et lors du remplacement d'un Pod récupéré.

Choisir une stratégie d'enchère

Deux stratégies d'enchère sont disponibles. Choisissez celle qui correspond à votre tolérance aux variations de coût et aux échecs de création.

Stratégie Fonctionnement des prix Comportement lors de la création
SpotAsPriceGo Suit automatiquement le prix actuel du marché La création peut réussir si du stock existe ; lorsque les ressources du type d'instance spécifié sont très demandées, le prix peut atteindre le tarif à la demande
SpotWithPriceLimit Enchérit à un prix maximum fixe que vous définissez Échoue si aucun stock n'est disponible à un prix inférieur ou égal à votre limite
Important

Lorsque vous utilisez SpotAsPriceGo pendant les périodes de forte demande de ressources, le prix Spot peut atteindre le tarif à la demande.

Exemples

Exemple 1 : Limite de prix fixe

Le code YAML suivant crée une instance Spot utilisant la stratégie SpotWithPriceLimit avec un prix horaire maximal de 0,25 $.

  • Pendant la création : échoue si aucun stock n'est disponible pour le type d'instance spécifié à un prix inférieur ou égal à 0,25 $/heure.

  • Après la création : l'instance fonctionne pendant une période de protection garantie d'une heure. Après cette période, l'instance est récupérée si le prix du marché dépasse 0,25 $ ou si le stock du type d'instance spécifié est insuffisant.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
spec:
  template:
    metadata:
      labels:
        alibabacloud.com/eci: "true"
      annotations:
        k8s.aliyun.com/eci-use-specs : "ecs.c6.large"           # Specify the ECS instance type.
        k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit"  # Use the strategy that sets a custom price limit.
        k8s.aliyun.com/eci-spot-price-limit: "0.25"            # Set the maximum hourly price.
    spec:
      containers:
      - env:
        - name: TARGET
          value: "Knative"
        image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56

Exemple 2 : Limite de prix fixe avec basculement vers le mode à la demande

Le code YAML suivant crée une instance Spot avec un basculement vers le mode à la demande. Cette approche permet d'équilibrer les économies de coûts et la disponibilité.

  • Pendant la création : si du stock Spot est disponible à un prix inférieur ou égal à 0,05 $/heure, une instance Spot est créée avec une période de protection d'une heure. Si le stock Spot n'est pas disponible, une instance à la demande est créée à la place, laquelle n'est pas récupérée automatiquement.

  • Après la création : si l'instance Spot est récupérée après sa période de protection, le nœud virtuel crée un remplaçant. Si le stock Spot n'est toujours pas disponible au moment du remplacement, une instance à la demande est créée.

Pour vérifier si un Pod a été dégradé vers le mode à la demande, exécutez kubectl describe pod et recherchez un événement SpotDegraded dans la sortie.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
spec:
  template:
    metadata:
      labels:
        alibabacloud.com/eci: "true"
      annotations:
        k8s.aliyun.com/eci-use-specs : "ecs.c6.large"           # Specify the ECS instance type.
        k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit"  # Use the strategy that sets 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 fall back to an on-demand instance if spot inventory is unavailable.
    spec:
      containers:
      - env:
        - name: TARGET
          value: "Knative"
        image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56

Créer un service Knative avec des instances Spot

La procédure suivante permet de créer un exemple de service Knative utilisant la stratégie SpotAsPriceGo avec le basculement vers le mode à la demande activé.

  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur console ACKClusters.

  2. Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Applications > Knative.

  3. Sur la page Knative, cliquez sur l'onglet Services. Sélectionnez default dans la liste déroulante Namespace et cliquez sur Create from Template. Dans la liste déroulante Sample Template, sélectionnez custom. Collez le code YAML suivant dans l'éditeur et cliquez sur Create.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        metadata:
          labels:
            alibabacloud.com/eci: "true"
          annotations:
            k8s.aliyun.com/eci-use-specs : "ecs.c6.large"           # Specify the ECS instance type.
            k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"       # Use the strategy that follows the market price.
            k8s.aliyun.com/eci-spot-duration: "1"                   # Protection period in hours.
            k8s.aliyun.com/eci-spot-fallback: "true"                # Fall back to on-demand if spot inventory is unavailable.
        spec:
          containers:
          - env:
            - name: TARGET
              value: "Knative"
            image: registry-vpc.{REGION-ID}.aliyuncs.com/knative-samples/helloworld-go:160e4dc8 # Replace {REGION-ID} with your cluster's region ID, such as cn-hangzhou.

    Cette configuration crée une instance Spot ecs.c6.large avec le comportement suivant :

    • Si le stock Spot n'est pas disponible lors de la création, une instance à la demande est créée à la place.

    • Après la création, l'instance fonctionne pendant une période de protection garantie d'une heure.

    • Après la période de protection, l'instance Spot peut être récupérée si le prix du marché dépasse l'offre actuelle ou si le stock devient insuffisant. Le paramètre eci-spot-fallback: "true" garantit qu'une instance à la demande est créée si le stock Spot n'est pas disponible lorsque le nœud virtuel remplace le Pod.

Gérer les interruptions des instances Spot

Alibaba Cloud envoie un événement SpotToBeReleased et définit la condition de Pod ContainerInstanceExpired sur true environ 3 minutes avant la récupération d'une instance Spot.

La figure suivante montre un exemple de notification.图片 1.png

Durant cette fenêtre de 3 minutes, vous pouvez configurer une gestion gracieuse afin que les requêtes en cours se terminent avant l'arrêt du Pod.

Configurer l'éviction basée sur l'API

Ajoutez l'annotation k8s.aliyun.com/eci-spot-release-strategy: api-evict à vos Pods Spot. Lorsque le nœud virtuel reçoit un événement SpotToBeReleased , il appelle l'API Eviction pour évincer le Pod. Cela respecte vos paramètres PodDisruptionBudget (PDB) et terminationGracePeriodSeconds.

La séquence d'éviction est la suivante :

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

  2. Le serveur API vérifie le PDB configuré pour le Pod.

  3. L'horodatage de suppression du Pod est défini et la période de grâce commence.

  4. Le kubelet sur le nœud virtuel lance l'arrêt gracieux du Pod.

  5. Le plan de contrôle dissocie le Pod des Endpoints et EndpointSlices pertinents.

  6. À la fin de la période de grâce, le kubelet force la terminaison du Pod.

  7. Le kubelet notifie le système pour supprimer le Pod.

  8. Le serveur API supprime le Pod.

Dans un environnement Knative, le conteneur sidecar queue-proxy attend que toutes les requêtes en cours soient terminées avant l'arrêt du conteneur d'application, assurant ainsi un arrêt fluide à l'étape 4.

Surveiller les événements des instances Spot

Afficher l'événement SpotToBeReleased

Exécutez kubectl describe pour afficher l'avertissement d'interruption dans la section Events :

Events:
  Type     Reason            Age    From          Message
  ----     ------            ----   ----          -------
  Warning  SpotToBeReleased  3m32s  kubelet, eci  Spot ECI will be released in 3 minutes

Vous pouvez également exécuter kubectl get events pour lister tous les événements récents :

LAST SEEN   TYPE      REASON             OBJECT         MESSAGE
3m39s       Warning   SpotToBeReleased   pod/pi-frmr8   Spot ECI will be released in 3 minutes

Pour plus d'informations sur l'automatisation des réponses aux événements d'interruption, consultez la section Terminaison gracieuse.

Vérifier l'état après la récupération

Après la récupération d'une instance Spot, les informations sur l'instance sont toujours conservées. Le statut du Pod passe à BidFailed et la cause de l'échec est BidFailed.

Exécutez kubectl get pod pour voir le statut :

NAME       READY   STATUS      RESTARTS   AGE
pi-frmr8   1/1     BidFailed   0          3h5m

Exécutez kubectl describe pour afficher les détails complets du statut :

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

Étapes suivantes

Si votre application est sensible à la latence de démarrage à froid, envisagez d'utiliser des instances réservées pour maintenir en permanence une instance burstable de faible spécification en cours d'exécution. Cela réduit le temps de démarrage tout en maintenant les coûts à un niveau bas. Pour plus d'informations, consultez la section Configurer des instances réservées.