Knative Pod Autoscaler (KPA) を設定して、ACK 上で同時実行数または 1 秒あたりのリクエスト数 (RPS) に基づいて Knative Serving の Pod をスケーリングします。
前提条件
開始する前に、次の条件を満たしていることを確認してください。
-
Kubernetes 1.20 以降を実行する ACK マネージドクラスター または ACK サーバーレスクラスター が作成されていること。
-
クラスターに Knative がデプロイされていること。
仕組み
Knative Serving は各 Pod に queue-proxy サイドカーコンテナを注入します。サイドカーは同時実行のメトリクスを KPA にレポートし、KPA はこれらのメトリクスと設定されたアルゴリズムに基づいて Pod 数を調整します。
スケーリングアルゴリズム
KPA は次の式でターゲット Pod 数を計算します。
Pod 数 = 同時実行リクエスト数 / (Pod 最大同時実行数 × ターゲット使用率)
例: containerConcurrency を 10 に設定し、ターゲット使用率を 70% にした場合、100 件の同時実行リクエストに対して:100 / (10 × 0.7) = 15 個の Pod (切り上げ)。
安定モードとパニックモード
KPA はトラフィックパターンに応じて 2 つのモードを使用します。
安定モード — デフォルトです。KPA は安定ウィンドウ (デフォルト:60s) にわたって Pod 全体の同時実行数を平均化し、それに合わせて Pod 数を調整します。
パニックモード — トラフィックバースト時にトリガーされます。KPA はより短いパニックウィンドウ (デフォルト:6s、安定ウィンドウ × panic-window-percentage) を使用してスパイクを検出します。パニックモードの Pod 数 ≥ panic-threshold-percentage / 100 × 準備完了 Pod 数 (デフォルト:2×) の場合、KPA は安定カウントではなくパニックカウントを使用します。
config-autoscaler ConfigMap の設定
KPA のグローバルデフォルト設定は、knative-serving ネームスペース内の config-autoscaler ConfigMap にあります。リビジョンごとのアノテーションはこれらのデフォルトを上書きします。
現在の設定を確認します。
kubectl -n knative-serving describe cm config-autoscaler
次の表に主要なパラメータを示します。すべての値はデフォルトです。
| パラメータ | デフォルト | 説明 |
|---|---|---|
container-concurrency-target-default |
100 |
Pod あたりの最大同時実行リクエスト数 (ソフト上限、グローバル) |
container-concurrency-target-percentage |
70 |
同時実行数ベースのスケーリングにおけるターゲット使用率 (パーセンテージ) |
requests-per-second-target-default |
200 |
Pod あたりのターゲット RPS |
target-burst-capacity |
211 |
Activator がリクエストをバッファリングする前のバースト容量。0:スケールトゥゼロ時のみ Activator を使用。0 より大きく、container-concurrency-target-percentage が 100 の場合:常に Activator を使用。-1:無制限。 |
stable-window |
60s |
安定モードの平均化のための時間ウィンドウ |
panic-window-percentage |
10.0 |
安定ウィンドウのパーセンテージとしてのパニックウィンドウ (デフォルト:6s) |
panic-threshold-percentage |
200.0 |
希望 Pod 数 ≥ panic-threshold-percentage / 100 × 準備完了 Pod 数の場合にパニックがトリガーされます |
max-scale-up-rate |
1000.0 |
スケールアウトイベントごとの希望 Pod 数の最大比率:ceil(max-scale-up-rate × readyPodsCount) |
max-scale-down-rate |
2.0 |
Pod はアクティビティごとに現在の数の最大半分までスケールインします |
enable-scale-to-zero |
true |
アイドル状態のサービスを Pod 数 0 にスケールするかどうか |
scale-to-zero-grace-period |
30s |
スケールトゥゼロ時のネットワーク切断の最大時間 |
scale-to-zero-pod-retention-period |
0s |
トラフィック停止後、最後の Pod が保持される最小時間 |
pod-autoscaler-class |
kpa.autoscaling.knative.dev |
オートスケーラーのタイプ。サポートされる値は kpa.autoscaling.knative.dev、hpa.autoscaling.knative.dev、aha.autoscaling.knative.dev です。なお、ACK Serverless クラスターで MSE を使用してゼロにスケールする場合は、mpa を使用します。 |
activator-capacity |
100.0 |
Activator サービスのリクエスト容量 |
initial-scale |
1 |
リビジョンごとの初期 Pod 数 |
allow-zero-initial-scale |
false |
リビジョンを Pod 数 0 で開始できるかどうか |
min-scale |
0 |
リビジョンごとの最小 Pod 数 (0 = 下限なし) |
max-scale |
0 |
リビジョンごとの最大 Pod 数 (0 = 無制限) |
scale-down-delay |
0s |
同時実行数が減少してからスケールインまでの時間。min-scale とは異なり、Pod は遅延後に最終的にスケールインします。短いトラフィック低下時のコールドスタートを回避します。 |
scale-to-zero-grace-period は、スケールトゥゼロ時にネットワークプログラミングにかかる時間を制限します。スケールトゥゼロ時にリクエストが失われる場合にのみ調整してください。これは最後の Pod が生存する時間を制御するものではありません。トラフィック終了後に最後の Pod を保持するには、代わりに scale-to-zero-pod-retention-period を使用してください。
スケーリングメトリクスの設定
autoscaling.knative.dev/metric アノテーションを使用して、リビジョンごとにスケーリングメトリクスを設定します。デフォルト:concurrency。
| メトリクス | 必要なオートスケーラークラス | 説明 |
|---|---|---|
concurrency |
kpa.autoscaling.knative.dev (デフォルト) |
Pod あたりの同時実行中のリクエスト数 |
rps |
kpa.autoscaling.knative.dev (デフォルト) |
Pod あたりの 1 秒あたりのリクエスト数 |
cpu |
hpa.autoscaling.knative.dev |
CPU 使用率 |
memory |
hpa.autoscaling.knative.dev |
メモリ使用率 |
| カスタムメトリクス | 異なります | アプリケーション要件ごとのカスタムメトリクス |
同時実行メトリクス (デフォルト)
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/metric: "concurrency"
RPS メトリクス
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/metric: "rps"
CPU メトリクス
CPU ベースのスケーリングには HPA オートスケーラークラスが必要です。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"
autoscaling.knative.dev/metric: "cpu"
メモリメトリクス
メモリベースのスケーリングにも HPA オートスケーラークラスが必要です。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"
autoscaling.knative.dev/metric: "memory"
スケーリングターゲットの設定
スケーリングターゲットは、KPA が Pod ごとに維持するメトリクス値を設定します。リビジョンごと、またはグローバルに設定します。
同時実行ターゲット
リビジョンごと — autoscaling.knative.dev/target を使用します。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/target: "50"
グローバル — config-autoscaler ConfigMap を更新します。
apiVersion: v1
kind: ConfigMap
metadata:
name: config-autoscaler
namespace: knative-serving
data:
container-concurrency-target-default: "200"
RPS ターゲット
リビジョンごと:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/target: "150"
autoscaling.knative.dev/metric: "rps"
グローバル:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-autoscaler
namespace: knative-serving
data:
requests-per-second-target-default: "150"
同時実行上限の設定
同時実行上限は Pod あたりの同時実行リクエスト数を制限します。KPA は 2 つのタイプをサポートします。
ソフト同時実行数上限
ソフト上限は、KPA がスケールする際のターゲットです。厳密には強制されません。バーストは一時的に上限を超えることができます。
リビジョンごと:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/target: "200"
グローバル:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-autoscaler
namespace: knative-serving
data:
container-concurrency-target-default: "200"
ハード同時実行数上限
ハード上限は厳密に強制されます。超過したリクエストはバッファリングされます。アプリケーションに厳格な同時実行の上限がある場合にのみハード上限を設定してください。低い値はスループットを低下させ、レイテンシを増加させます。
リビジョンごと — containerConcurrency spec フィールドを使用します (アノテーションではありません)。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
spec:
containerConcurrency: 50
ターゲット使用率
ターゲット使用率は、KPA がスケールアウトする前に Pod がどの程度稼働するかを制御します。containerConcurrency: 10 で使用率 70% の場合、既存の Pod 全体の平均同時実行数が 7 に達すると、KPA は新しい Pod を作成します。値を低くすると、KPA は早期にスケールアウトし、コールドスタートのレイテンシを削減します。
リビジョンごと:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/target-utilization-percentage: "70"
グローバル:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-autoscaler
namespace: knative-serving
data:
container-concurrency-target-percentage: "70"
スケールトゥゼロの設定
スケールトゥゼロのグローバルな有効化または無効化
enable-scale-to-zero を "false" に設定すると、サービスがアイドル状態のときに少なくとも 1 つの Pod を実行し続けます。
apiVersion: v1
kind: ConfigMap
metadata:
name: config-autoscaler
namespace: knative-serving
data:
enable-scale-to-zero: "false"
スケールトゥゼロの猶予期間の設定
scale-to-zero-grace-period は、スケールトゥゼロ時にネットワークプログラミングにかかる時間を制限します。
スケールトゥゼロ時にリクエストが失われる場合にのみ増やしてください。これは最後の Pod が生存する時間を制御するものではありません。最後の Pod を保持するには、代わりに scale-to-zero-pod-retention-period を使用してください。
apiVersion: v1
kind: ConfigMap
metadata:
name: config-autoscaler
namespace: knative-serving
data:
scale-to-zero-grace-period: "40s"
Pod 保持期間の設定
scale-to-zero-pod-retention-period は、トラフィック停止後、最後の Pod を最小期間保持し、断続的なトラフィックを持つサービスでのコールドスタートを回避します。
リビジョンごと:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/scale-to-zero-pod-retention-period: "1m5s"
グローバル:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-autoscaler
namespace: knative-serving
data:
scale-to-zero-pod-retention-period: "42s"
スケール範囲の設定
スケール範囲は、リビジョンの最小および最大レプリカ数を設定します。
| アノテーション | パラメータ (グローバル) | 目的 |
|---|---|---|
autoscaling.knative.dev/min-scale |
min-scale |
下限 — KPA はこの数を下回ることはありません |
autoscaling.knative.dev/max-scale |
max-scale |
上限 — KPA はこの数を上回ることはありません (0 = 無制限) |
min-scaleは永続的な Pod の下限を維持します。永続的な下限なしでスケールインを遅延させるには、代わりにconfig-autoscalerのscale-down-delayを使用してください。Pod は遅延後に最終的にスケールインします。
例
例 1:同時実行ターゲットによるスケーリング
同時実行ターゲット 10 でオートスケーリングアプリケーションをデプロイし、50 件の同時実行リクエストでテストします。
-
次の内容で
autoscale-go.yamlを作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: autoscale-go namespace: default spec: template: metadata: labels: app: autoscale-go annotations: autoscaling.knative.dev/target: "10" # 同時実行ターゲット: Pod あたり 10 リクエスト spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1 -
マニフェストを適用します。
kubectl apply -f autoscale-go.yaml -
イングレスゲートウェイアドレスを取得します。ALB:
kubectl get albconfig knative-internet想定される出力:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE knative-internet alb-hvd8nngl0lsdra15g0 alb-hvd8nng******.cn-beijing.alb.aliyuncs.com 2MSE:
kubectl -n knative-serving get ing stats-ingress想定される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE stats-ingress knative-ingressclass * 101.201.XX.XX,192.168.XX.XX 80 15dASM:
kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"想定される出力:
121.XX.XX.XXKourier:
kubectl -n knative-serving get svc kourier想定される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kourier LoadBalancer 10.0.XX.XX 39.104.XX.XX 80:31133/TCP,443:32515/TCP 49m -
hey を使用して 30 秒間 50 件の同時実行リクエストを送信します。
hey -z 30s -c 50 \ -host "autoscale-go.default.example.com" \ "http://121.199.XXX.XXX" # イングレスゲートウェイアドレスに置き換えてください想定される出力:KPA は 5 つの Pod を追加します:50 件の同時実行リクエスト ÷ ターゲット 10 = 5 個の Pod。

例 2:範囲を指定したスケーリング
min-scale: 1 と max-scale: 3 を追加して、1 つの Pod を実行し続け、デプロイメントを 3 つの Pod に制限します。
-
次の内容で
autoscale-go.yamlを作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: autoscale-go namespace: default spec: template: metadata: labels: app: autoscale-go annotations: autoscaling.knative.dev/target: "10" autoscaling.knative.dev/min-scale: "1" # 少なくとも 1 つの Pod を実行し続けます autoscaling.knative.dev/max-scale: "3" # 3 つの Pod に制限します spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1 -
マニフェストを適用します。
kubectl apply -f autoscale-go.yaml -
イングレスゲートウェイアドレスを取得します(例 1 の手順 4 を参照してください)。
-
30 秒間 50 件の同時実行リクエストを送信します。
hey -z 30s -c 50 \ -host "autoscale-go.default.example.com" \ "http://121.199.XXX.XXX" # イングレスゲートウェイアドレスに置き換えてください想定される出力:KPA は負荷時に 3 つの Pod (最大) にスケールし、その後 1 つの Pod (最小) に戻ります。次のリクエストでコールドスタートは発生しません。
