すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:オートスケーリングを有効にしてトラフィックの変動に対応する

最終更新日:Jun 17, 2026

Knative Pod Autoscaler (KPA) を設定して、ACK 上で同時実行数または 1 秒あたりのリクエスト数 (RPS) に基づいて Knative Serving の Pod をスケーリングします。

前提条件

開始する前に、次の条件を満たしていることを確認してください。

仕組み

Knative Serving は各 Pod に queue-proxy サイドカーコンテナを注入します。サイドカーは同時実行のメトリクスを KPA にレポートし、KPA はこれらのメトリクスと設定されたアルゴリズムに基づいて Pod 数を調整します。

image

スケーリングアルゴリズム

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-percentage100 の場合:常に 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.devhpa.autoscaling.knative.devaha.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-autoscalerscale-down-delay を使用してください。Pod は遅延後に最終的にスケールインします。

例 1:同時実行ターゲットによるスケーリング

同時実行ターゲット 10 でオートスケーリングアプリケーションをデプロイし、50 件の同時実行リクエストでテストします。

  1. ACK クラスターに Knative をデプロイするか、ACK サーバーレスクラスターにデプロイします。

  2. 次の内容で 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
  3. マニフェストを適用します。

    kubectl apply -f autoscale-go.yaml
  4. イングレスゲートウェイアドレスを取得します。ALB:

    kubectl get albconfig knative-internet

    想定される出力:

    NAME               ALBID                    DNSNAME                                              PORT&PROTOCOL   CERTID   AGE
    knative-internet   alb-hvd8nngl0lsdra15g0   alb-hvd8nng******.cn-beijing.alb.aliyuncs.com                            2

    MSE:

    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      15d

    ASM:

    kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"

    想定される出力:

    121.XX.XX.XX

    Kourier:

    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
  5. 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。

    hey

例 2:範囲を指定したスケーリング

min-scale: 1max-scale: 3 を追加して、1 つの Pod を実行し続け、デプロイメントを 3 つの Pod に制限します。

  1. ACK クラスターに Knative をデプロイするか、ACK サーバーレスクラスターにデプロイします。

  2. 次の内容で 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
  3. マニフェストを適用します。

    kubectl apply -f autoscale-go.yaml
  4. イングレスゲートウェイアドレスを取得します(例 1 の手順 4 を参照してください)。

  5. 30 秒間 50 件の同時実行リクエストを送信します。

    hey -z 30s -c 50 \
      -host "autoscale-go.default.example.com" \
      "http://121.199.XXX.XXX"  # イングレスゲートウェイアドレスに置き換えてください

    想定される出力:KPA は負荷時に 3 つの Pod (最大) にスケールし、その後 1 つの Pod (最小) に戻ります。次のリクエストでコールドスタートは発生しません。

    scale bounds

次のステップ