Java サービスなど、起動に時間がかかるアプリケーションの場合、community Knative のデフォルトのスケールトゥゼロポリシーでは、コールドスタートレイテンシが高くなります。ACK Knative は、リザーブドインスタンス (標準インスタンスが起動する間、リクエストを即座に処理する低コストで常時稼働する Pod) を使用してこれを解決します。
仕組み
Knative Service がスケールトゥゼロになると、最初に着信するリクエストがコールドスタートをトリガーします。リクエストが処理される前に、リソーススケジューリング、イメージプル、アプリケーションの起動がすべて完了する必要があります。
リザーブドインスタンスは、アイドル期間中に 1 つ以上の低仕様 Pod を実行し続けることで、この動作を変更します。
セーフティネット付きのスケールイン。 トラフィックが停止すると、Service はスケールインしますが、潜在的な新しいリクエストを処理するために、少なくとも 1 つのリザーブドインスタンスがオンライン状態を維持します。
並行応答とスケールアウト。 リクエストが到着すると、2 つのことが同時に発生します。
リクエストは、即時処理のためにアクティブなリザーブドインスタンスにルーティングされます (コールドスタートなし)。
Knative は、継続的なトラフィックを処理するために標準仕様のインスタンスを作成します。
トラフィックの引き渡し。 最初の標準インスタンスの準備が整うと、以降のすべてのトラフィックはそれにルーティングされます。
クリーンアップ。 リザーブドインスタンスが初期リクエストの処理を完了すると、自動的に終了されます。
前提条件
開始する前に、以下を確認してください。
Knative のデプロイ がお使いの ACK クラスターにデプロイされています。
ACK Virtual Node がインストールされていること (ECI および ACS リザーブドインスタンスには必須、ECS には不要)。詳細については、「コンポーネント」をご参照ください。
アノテーションリファレンス
Knative Service マニフェストにアノテーションを追加して、リザーブドインスタンスを有効にします。次の表に、サポートされているすべてのアノテーションを示します。
| アノテーション | 説明 | デフォルト |
|---|---|---|
knative.aliyun.com/reserve-instance | リザーブドインスタンスを有効または無効にします。"enable" に設定します。 | 無効 |
knative.aliyun.com/reserve-instance-type | リザーブドインスタンスのリソースタイプ。サポートされている値: eci、ecs、acs。 | eci |
knative.aliyun.com/reserve-instance-replicas | 維持するリザーブドインスタンスの数。 | 1 |
knative.aliyun.com/reserve-instance-eci-use-specs | ECI のインスタンスタイプまたは CPU-メモリ仕様。インスタンスタイプ名 (例: ecs.t6-c1m1.large) または CPU-メモリ形式 (例: 1-2Gi) を受け入れます。複数のインスタンスタイプはコンマで区切ります。 | - |
knative.aliyun.com/reserve-instance-ecs-use-specs | リザーブドインスタンスの ECS インスタンスタイプ (例: ecs.gn6i-c4g1.xlarge)。 | - |
knative.aliyun.com/reserve-instance-acs-compute-class | ACS Pod のコンピューティングクラス (例: general-purpose)。 | - |
knative.aliyun.com/reserve-instance-acs-compute-qos | ACS Pod のコンピューティング品質 (例: デフォルト)。 | - |
knative.aliyun.com/reserve-instance-cpu-resource-request | リザーブドインスタンスの CPU リクエスト (例: "1")。 | - |
knative.aliyun.com/reserve-instance-cpu-resource-limit | リザーブドインスタンスの CPU 制限 (例: "1")。 | - |
knative.aliyun.com/reserve-instance-memory-resource-request | リザーブドインスタンスのメモリリクエスト (例: "2Gi")。 | - |
knative.aliyun.com/reserve-instance-memory-resource-limit | リザーブドインスタンスのメモリ制限 (例: "2Gi")。 | - |
ECI リザーブドインスタンスの構成
Elastic Container Instance (ECI) は、リザーブドインスタンスのデフォルトのリソースタイプです。ECI Pod はサーバーレスインフラストラクチャで実行されるため、ノードの容量計画は不要です。
インスタンスタイプによる指定
基盤となる ECI に特定の ECS インスタンスタイプ を使用するには、knative.aliyun.com/reserve-instance-eci-use-specs アノテーションを追加します。複数のインスタンスタイプをコンマで区切って指定できます。
次の例では、ecs.t6-c1m1.large および ecs.t5-lc1m2.small インスタンスタイプを指定しています。
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:160e4dc8CPU とメモリによる指定
特定のインスタンスタイプが不明な場合は、必要な CPU とメモリリソースを定義します。
次の例では、1 コア、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:160e4dc8ACS リザーブドインスタンスの構成
Alibaba Cloud Container Compute Service (ACS) をリザーブドインスタンスに使用するには、まず ACK Virtual Node をインストールします。詳細については、「コンポーネント」をご参照ください。その後、knative.aliyun.com/reserve-instance-type: acs アノテーションを追加します。
コンピューティングクラスと品質による指定
以下は、ACS リザーブドインスタンスの基本的な構成です。 コンピューティングクラス と コンピューティング品質 を指定できます。
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"CPU とメモリによる指定
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"ECS リザーブドインスタンスの構成
アイドル期間中のコストを削減するために、リザーブドインスタンスに低コストの Elastic Compute Service (ECS) インスタンスタイプ を指定します。
GPU ワークロード
次の例では、GPU 推論サービスのリザーブドインスタンスとして、低仕様の GPU インスタンスを構成します。
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-datasetCPU ワークロード
次の例では、1 コア、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"リザーブドインスタンスプールの設定
高いバーストトラフィックを処理するために、knative.aliyun.com/reserve-instance-replicas アノテーションでレプリカ数を指定することにより、単一のリザーブドインスタンスをリソースプールに拡張します。
次の例では、3つの低仕様インスタンスのリザーブドインスタンスプールを作成します。
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構成の検証
Service マニフェストを適用した後、リザーブドインスタンスが実行中であることを確認します。
# リザーブドインスタンスの Pod が実行中であるかを確認します
kubectl get pods -l serving.knative.dev/service=<your-service-name>
# Knative サービスのアノテーションを表示します
kubectl get ksvc <your-service-name> -o yaml | grep reserve-instance正しく構成されたリザーブドインスタンスは、トラフィックが処理されていない場合でも Running 状態を維持します。
本番環境での適用
適切な仕様を選択します。 ご利用のリザーブドインスタンスで、アプリケーションを確実に実行し、少なくとも1つのリクエストを処理できる、最も低コストのインスタンスタイプを選択します。
高いバーストに備えてリザーブドインスタンスプールを使用します。 ご利用のサービスで突然の高トラフィックイベントが発生する可能性が高い場合は、初期負荷をより適切に吸収するためにリザーブドインスタンスプールを設定します。
課金
リザーブドインスタンスは継続的に実行され、課金が発生します。詳細については、以下をご参照ください。
関連ドキュメント
Knative でワークロードの自動スケーリングを実装するには、「Knative での HPA の使用」、「トラフィックリクエスト数に基づくサービスの自動スケーリング」、および「AHPA を使用したスケジュールベースのオートスケーリングの実装」をご参照ください。