Pour les applications au démarrage lent, telles que les applications Java, la politique par défaut de mise à l'échelle à zéro de Knative communautaire peut entraîner une latence élevée lors du démarrage à froid. ACK propose des instances réservées qui maintiennent en fonctionnement des instances chaudes à faible coût pendant les périodes d'inactivité, permettant ainsi une réponse rapide tout en maîtrisant les coûts.
Fonctionnement
Par défaut, Knative réduit le nombre de pods d'un service à zéro lorsque le trafic s'arrête. Une nouvelle requête doit alors attendre la planification des ressources, le téléchargement de l'image et le démarrage de l'application, ce qui peut prendre plusieurs secondes.
Lorsqu'une instance réservée est activée, ce comportement change :
Arrêt du trafic — Le service Knative réduit sa capacité, mais une instance réservée reste en ligne.
-
Arrivée de la première requête — Deux actions se produisent simultanément :
L'instance réservée traite immédiatement la requête.
Knative crée des instances standard pour prendre en charge le trafic continu.
Transfert du trafic — Dès qu'une instance standard est prête, les requêtes suivantes lui sont acheminées.
Nettoyage — Après avoir traité la requête initiale, l'instance réservée est arrêtée.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Déployé Knative dans votre cluster
(Requis pour les instances réservées ECI ou ACS) Installé ACK Virtual Node. Consultez la section Composants
Activer les instances réservées
Ajoutez les annotations suivantes au manifeste de votre service Knative :
|
Annotation |
Description |
|
|
Active les instances réservées |
|
|
Type d'instance. Valeurs valides : |
Les instances réservées génèrent des frais en continu, même en l'absence de trafic. Consultez la section Facturation .
Choisir un type d'instance
Sélectionnez le type d'instance adapté à votre charge de travail :
|
Type d'instance |
Idéal pour |
Prérequis |
|
ECI (par défaut) |
Charges de travail serverless polyvalentes ; aucune gestion de nœud nécessaire |
ACK Virtual Node |
|
ACS |
Charges de travail nécessitant un contrôle précis de la classe de calcul et du niveau de qualité |
ACK Virtual Node |
|
ECS |
Charges de travail GPU ou nécessitant un type d'instance ECS spécifique |
Un nœud ECS compatible |
En cas de doute, commencez par ECI : cette option couvre la plupart des scénarios et ne nécessite que ACK Virtual Node.
Configurer des instances réservées ECI
Elastic Container Instance (ECI) est le type par défaut. Utilisez l'annotation knative.aliyun.com/reserve-instance-eci-use-specs pour spécifier les ressources, soit par type d'instance, soit par CPU et mémoire.
Spécification par type d'instance
Cet exemple utilise ecs.t6-c1m1.large et ecs.t5-lc1m2.small comme types d'instance candidats :
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello-spec-1
spec:
template:
metadata:
annotations:
knative.aliyun.com/reserve-instance: enable
knative.aliyun.com/reserve-instance-eci-use-specs: "ecs.t6-c1m1.large,ecs.t5-lc1m2.small"
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:160e4dc8
Spécification par CPU et mémoire
Si vous n'avez pas besoin d'un type d'instance spécifique, définissez plutôt le CPU et la mémoire. Cet exemple utilise une instance avec 1 cœur et 2 GiB de mémoire :
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello-spec-2
spec:
template:
metadata:
annotations:
knative.aliyun.com/reserve-instance: enable
knative.aliyun.com/reserve-instance-eci-use-specs: "1-2Gi"
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:160e4dc8
Configurer des instances réservées ACS
Les instances réservées Alibaba Cloud Container Compute Service (ACS) vous permettent de spécifier la classe de calcul et les niveaux de qualité. Pour utiliser ACS, installez ACK Virtual Node et ajoutez l'annotation knative.aliyun.com/reserve-instance-type: acs.
Spécification par classe de calcul et qualité
Utilisez knative.aliyun.com/reserve-instance-acs-compute-class pour définir la classe de calcul et knative.aliyun.com/reserve-instance-acs-compute-qos pour définir la qualité de calcul. Ces deux paramètres sont facultatifs.
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
spec:
template:
metadata:
annotations:
knative.aliyun.com/reserve-instance: enable
knative.aliyun.com/reserve-instance-type: acs
# (Optional) Compute class for the ACS pod
knative.aliyun.com/reserve-instance-acs-compute-class: "general-purpose"
# (Optional) Compute quality for the ACS pod
knative.aliyun.com/reserve-instance-acs-compute-qos: "default"
spec:
containers:
- image: registry-vpc.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
env:
- name: TARGET
value: "Knative"
Spécification par CPU et mémoire
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go-resource
spec:
template:
metadata:
annotations:
knative.aliyun.com/reserve-instance: enable
knative.aliyun.com/reserve-instance-type: acs
knative.aliyun.com/reserve-instance-cpu-resource-request: "1"
knative.aliyun.com/reserve-instance-memory-resource-request: "2Gi"
spec:
containers:
- image: registry-vpc.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
env:
- name: TARGET
value: "Knative"
Configurer des instances réservées ECS
Utilisez un type d'instance ECS moins coûteux pour réduire les coûts d'inactivité. Les instances réservées ECS sont bien adaptées aux charges de travail GPU.
Charges de travail GPU
Cet exemple configure ecs.gn6i-c4g1.xlarge comme instance réservée GPU de faible spécification pour un service d'inférence Qwen. L'instance standard utilise un GPU complet, tandis que l'instance réservée utilise une spécification plus réduite pour traiter la première requête à moindre coût.
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
labels:
release: qwen
name: qwen
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/metric: "concurrency"
# Enable and configure an ECS reserved instance. You can configure one or more instance types.
knative.aliyun.com/reserve-instance: enable
knative.aliyun.com/reserve-instance-type: ecs
knative.aliyun.com/reserve-instance-ecs-use-specs: ecs.gn6i-c4g1.xlarge
labels:
release: qwen
spec:
containers:
- command:
- sh
- -c
- python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code
--served-model-name qwen --model /mnt/models/Qwen-7B-Chat-Int8 --gpu-memory-utilization
0.95 --quantization gptq --max-model-len=6144
image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1
imagePullPolicy: IfNotPresent
name: vllm-container
resources:
# Resource configuration for the standard instance
limits:
cpu: "16"
memory: 60Gi
nvidia.com/gpu: "1"
requests:
cpu: "8"
memory: 36Gi
nvidia.com/gpu: "1"
volumeMounts:
- mountPath: /mnt/models/Qwen-7B-Chat-Int8
name: qwen-7b-chat-int8
volumes:
- name: qwen-7b-chat-int8
persistentVolumeClaim:
claimName: qwen-7b-chat-int8-dataset
Spécification par CPU et mémoire
Cet exemple spécifie une instance réservée ECS avec 1 cœur et 2 GiB de mémoire :
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-resource
spec:
template:
metadata:
annotations:
knative.aliyun.com/reserve-instance: enable
knative.aliyun.com/reserve-instance-type: ecs
knative.aliyun.com/reserve-instance-cpu-resource-request: "1"
knative.aliyun.com/reserve-instance-cpu-resource-limit: "1"
knative.aliyun.com/reserve-instance-memory-resource-request: "2Gi"
knative.aliyun.com/reserve-instance-memory-resource-limit: "2Gi"
spec:
containers:
- image: registry-vpc.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
env:
- name: TARGET
value: "Knative"
Configurer un pool d'instances réservées
Une seule instance réservée traite la première requête après une période d'inactivité. Pour les services connaissant des pics de trafic fréquents, étendez la configuration à un pool en utilisant knative.aliyun.com/reserve-instance-replicas. Lorsque le trafic arrive, les instances réservées préchauffées répondent immédiatement pendant que les instances standard montent en puissance ; dès que les instances standard peuvent supporter la charge, le trafic leur est acheminé et le pool réservé revient à zéro.
Cet exemple crée un pool de 3 instances de faible spécification :
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello-reserve-pool
spec:
template:
metadata:
annotations:
knative.aliyun.com/reserve-instance: enable
knative.aliyun.com/reserve-instance-replicas: "3"
knative.aliyun.com/reserve-instance-eci-use-specs: "ecs.t6-c1m1.large,ecs.t5-lc1m2.small"
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:160e4dc8
Application en production
Choisissez le type d'instance le moins coûteux capable d'exécuter votre application de manière fiable et de traiter au moins une requête. L'instance réservée n'a besoin de gérer le trafic que jusqu'à ce que les instances standard soient prêtes ; elle n'a pas besoin de correspondre à leurs spécifications.
Utilisez un pool réservé pour les services soumis à de fortes variations de charge. Si votre service reçoit des pics de trafic soudains, configurez plusieurs réplicas avec knative.aliyun.com/reserve-instance-replicas pour absorber la charge initiale.
Tenez compte de la facturation continue lors du dimensionnement des instances réservées. Les instances réservées génèrent des frais en permanence, y compris pendant les périodes d'inactivité. Utilisez le type d'instance le plus petit capable de traiter une seule requête afin de maintenir les coûts d'inactivité à un niveau bas.
Surveillance et alertes : Surveillez la mise à l'échelle du service Knative pour vérifier le transfert des instances réservées vers les instances standard. Définissez des alertes de latence de réponse pour les services critiques.
Facturation
Les instances réservées génèrent des frais en continu, même pendant les périodes d'inactivité. Consultez les détails de facturation pour chaque type d'instance :
Étapes suivantes
Utiliser des instances spot économiques dans Knative
Utiliser HPA dans Knative pour la mise à l'échelle automatique horizontale des pods
Mettre à l'échelle automatiquement les services en fonction des requêtes de trafic
Utiliser AHPA pour la mise à l'échelle automatique planifiée