L'exécution continue de tâches par lots et de charges de travail tolérantes aux pannes sur des instances à la demande peut s'avérer coûteuse. Les instances préemptibles vous permettent d'exécuter ces charges de travail sur des Pods basés sur Elastic Container Instance (ECI) à un coût nettement inférieur. Le contrôleur Job de Kubernetes remplace automatiquement tout Pod récupéré avant la fin de la tâche.
Charges de travail adaptées
Utilisez des instances préemptibles pour les charges de travail qui peuvent tolérer une interruption :
| Adapté | Non adapté |
|---|---|
| Tâches par lots et tâches ponctuelles | Applications avec état |
| Applications sans état et tolérantes aux pannes, telles que les services web évolutifs | Services de longue durée qui ne peuvent pas gérer une interruption en cours de tâche |
| Tâches de calcul de courte durée où les redémarrages sont acceptables | Charges de travail dont le temps de démarrage ou d'arrêt dépasse la fenêtre de pré-libération de 5 minutes |
Fonctionnement
Lorsque vous créez une instance préemptible, spécifiez une politique d'enchère. L'instance est créée lorsque votre prix d'enchère dépasse le prix du marché en temps réel et que l'inventaire des ressources pour ce type d'instance est suffisant.
Période de protection : Après sa création, l'instance fonctionne pendant une période de protection d'une heure (par défaut), facturée au prix du marché en vigueur au moment de l'achat.
Après la période de protection : Le système vérifie le prix du marché et l'inventaire toutes les 5 minutes. Si le prix du marché dépasse votre prix d'enchère ou si l'inventaire est épuisé, l'instance est libérée. Un événement SpotToBeReleased est envoyé à la liste des événements Kubernetes environ 5 minutes avant la libération. Utilisez cette fenêtre pour arrêter le trafic entrant ou enregistrer l'état de votre charge de travail.
Continuité de la tâche : Lorsqu'un Pod est libéré avant la fin de la tâche, le contrôleur Job de Kubernetes crée automatiquement un nouveau Pod pour poursuivre l'exécution. Le Pod d'origine est conservé avec le statut BidFailed.
Limites
Par défaut, la période de protection est d'une heure.
Après la période de protection, la disponibilité de l'instance dépend du prix du marché et de l'inventaire des ressources ; aucune garantie de temps de fonctionnement n'est offerte.
L'événement
SpotToBeReleasedarrive environ 5 minutes avant la libération. Si votre charge de travail nécessite plus de 5 minutes pour s'arrêter proprement, les instances préemptibles peuvent ne pas être adaptées.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Un cluster ACK Serverless
kubectlconfiguré pour se connecter au cluster
Exécuter une tâche sur une instance préemptible
Étape 1 : Créer le manifeste de la tâche
Créez un fichier nommé spot_job.yaml avec le contenu suivant :
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
L'annotation k8s.aliyun.com/eci-spot-strategy définit la politique d'enchère :
| Valeur | Description |
|---|---|
SpotAsPriceGo |
Utilise automatiquement le prix du marché au moment de l'achat comme prix d'enchère. |
SpotWithPriceLimit |
Utilise un prix horaire maximal que vous définissez. Ajoutez l'annotation k8s.aliyun.com/eci-spot-price-limit pour spécifier le prix. |
L'annotation k8s.aliyun.com/eci-use-specs répertorie plusieurs types d'instances. La spécification de plusieurs types augmente les chances de création d'une instance préemptible lorsque l'inventaire d'un type est faible.
Étape 2 : Créer la tâche
kubectl create -f spot_job.yaml
Étape 3 : Surveiller le statut du Pod
kubectl get pod
Le Pod passe par les statuts suivants :
Running — la tâche est en cours :
NAME READY STATUS RESTARTS AGE
pi-frmr8 1/1 Running 0 35s
Completed — la tâche s'est terminée avec succès :
NAME READY STATUS RESTARTS AGE
pi-frmr8 0/1 Completed 0 2h
BidFailed — le Pod a été libéré avant la fin de la tâche. Le contrôleur Job a déjà créé un nouveau Pod (pi-kp5zx) pour poursuivre l'exécution :
NAME READY STATUS RESTARTS AGE
pi-frmr8 1/1 BidFailed 0 4h53m
pi-kp5zx 1/1 Running 0 3h45m
Un événement SpotToBeReleased est émis environ 5 minutes avant qu'un Pod ne passe au statut BidFailed. Pour afficher l'événement, exécutez kubectl get events. Pour plus de détails sur la gestion des événements de pré-libération, consultez Libération des instances préemptibles.
Étapes suivantes
Créer une instance de conteneur élastique préemptible — configurez des politiques d'enchère avancées et des stratégies de sélection de type d'instance.