En aplicaciones con inicio lento, como las desarrolladas en Java, la política predeterminada de escalamiento a cero de Knative de la comunidad puede generar una alta latencia de arranque en frío. ACK ofrece reserved instances que mantienen instancias cálidas de bajo costo ejecutándose durante los periodos de inactividad. Esto permite responder rápidamente y controlar el gasto al mismo tiempo.
Funcionamiento
De forma predeterminada, Knative escala un Service a cero pods cuando se detiene el tráfico. Cada solicitud nueva debe esperar a que se programen los recursos, se descargue la imagen y se inicie la aplicación, lo cual puede tardar varios segundos.
Al habilitar una reserved instance, este comportamiento cambia:
El tráfico se detiene: el Knative Service reduce su escala, pero una reserved instance permanece en línea.
-
Llega la primera solicitud: ocurren dos acciones de manera simultánea:
La reserved instance procesa la solicitud de inmediato.
Knative crea instancias estándar para asumir el tráfico continuo.
Transferencia del tráfico: en cuanto una instancia estándar está lista, las solicitudes posteriores se enrutan hacia ella.
Limpieza: después de procesar la solicitud inicial, la reserved instance se finaliza.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Knative deployed in your cluster
(Obligatorio para reserved instances de ECI o ACS) ACK Virtual Node instalado. Consulte Components
Habilitar reserved instances
Agregue estas anotaciones al manifiesto de su Knative Service:
|
Annotation |
Description |
|
|
Habilita las reserved instances |
|
|
El tipo de instancia. Valores válidos: |
Las reserved instances generan cargos de forma continua, incluso sin tráfico. Consulte Billing .
Elegir un tipo de instancia
Seleccione el tipo de instancia adecuado para su carga de trabajo:
|
Instance type |
Best for |
Requires |
|
ECI (predeterminado) |
Cargas de trabajo serverless de propósito general; no requiere gestión de nodos |
ACK Virtual Node |
|
ACS |
Cargas de trabajo que necesitan un control detallado de la clase de cómputo y el nivel de calidad |
ACK Virtual Node |
|
ECS |
Cargas de trabajo con GPU o aquellas que requieren un tipo de instancia de ECS específico |
Un nodo de ECS compatible |
Si tiene dudas, comience con ECI. Este tipo cubre la mayoría de los escenarios y solo requiere ACK Virtual Node.
Configurar reserved instances de ECI
Elastic Container Instance (ECI) es el tipo predeterminado. Use la anotación knative.aliyun.com/reserve-instance-eci-use-specs para especificar los recursos por tipo de instancia o por CPU y memoria.
Especificar por tipo de instancia
Este ejemplo utiliza ecs.t6-c1m1.large y ecs.t5-lc1m2.small como instance types candidatos:
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
Especificar por CPU y memoria
Si no necesita un tipo de instancia específico, defina la CPU y la memoria. Este ejemplo usa una instancia de 1 núcleo y 2 GiB:
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
Configurar reserved instances de ACS
Las reserved instances de Alibaba Cloud Container Compute Service (ACS) le permiten especificar clases de cómputo y niveles de calidad. Para usar ACS, instale ACK Virtual Node y agregue la anotación knative.aliyun.com/reserve-instance-type: acs.
Especificar por clase de cómputo y calidad
Use knative.aliyun.com/reserve-instance-acs-compute-class para establecer la compute class y knative.aliyun.com/reserve-instance-acs-compute-qos para establecer la compute quality. Ambos parámetros son opcionales.
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"
Especificar por CPU y memoria
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"
Configurar reserved instances de ECS
Utilice un tipo de instancia de ECS de menor costo para reducir los gastos durante la inactividad. Las reserved instances de ECS funcionan bien para cargas de trabajo con GPU.
Cargas de trabajo con GPU
Este ejemplo configura ecs.gn6i-c4g1.xlarge como una reserved instance de GPU con especificaciones reducidas para un servicio de inference de Qwen. La instancia estándar utiliza una GPU completa, mientras que la reserved instance emplea especificaciones menores para procesar la primera solicitud a un costo más bajo.
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
Especificar por CPU y memoria
Este ejemplo especifica una reserved instance de ECS de 1 núcleo y 2 GiB:
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"
Configurar un pool de reserved instances
Una sola reserved instance procesa la primera solicitud tras un periodo de inactividad. En servicios con picos de tráfico frecuentes, amplíe la configuración a un pool mediante knative.aliyun.com/reserve-instance-replicas. Cuando llega el tráfico, las reserved instances ya preparadas responden de inmediato mientras las instancias estándar escalan horizontalmente. Una vez que las instancias estándar asumen la carga, el tráfico se enruta hacia ellas y el pool reservado reduce su escala a cero.
Este ejemplo crea un pool de 3 instancias con especificaciones reducidas:
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
Aplicar en producción
Elija el tipo de instancia de menor costo que ejecute su aplicación de forma confiable y procese como mínimo una solicitud. La reserved instance solo necesita manejar el tráfico hasta que las instancias estándar estén listas, por lo que no requiere coincidir con sus especificaciones.
Utilice un pool reservado para servicios con ráfagas intensas. Si su servicio recibe picos de tráfico repentinos, configure varias réplicas con knative.aliyun.com/reserve-instance-replicas para absorber la carga inicial.
Considere la facturación continua al dimensionar las reserved instances. Estas instancias generan cargos en todo momento, incluidos los periodos de inactividad. Utilice el tipo de instancia más pequeño capaz de procesar una sola solicitud para mantener bajos los costos por inactividad.
Monitoreo y alertas: supervise el escalamiento del Knative Service para comprobar la transferencia de las reserved instances a las instancias estándar. Configure alertas de latencia de respuesta para los servicios críticos.
Facturación
Las reserved instances generan cargos de forma continua, incluso durante los periodos de inactividad. Consulte los detalles de facturación de cada tipo de instancia:
Siguientes pasos
Use cost-effective spot instances en Knative
Use HPA in Knative para el escalamiento automático horizontal de pods