コンテンツへスキップ

オートスケールサンプルアプリ - Go

Knative Servingリビジョンのオートスケーリング機能のデモンストレーション。

前提条件

  1. Knative Serving)がインストールされたKubernetesクラスター。
  2. heyロードジェネレーターがインストールされていること(go install github.com/rakyll/hey@latest)。
  3. このリポジトリをクローンし、サンプルディレクトリに移動します

    git clone -b "release-1.16" https://github.com/knative/docs knative-docs
    cd knative-docs
    

サービスのデプロイ

  1. サンプル Knativeサービスをデプロイします

    kubectl apply -f docs/serving/autoscaling/autoscale-go/service.yaml
    
  2. サービスのURLを取得します(Readyになったら)

    $ kubectl get ksvc autoscale-go
    NAME            URL                                                LATESTCREATED         LATESTREADY           READY   REASON
    autoscale-go    http://autoscale-go.default.1.2.3.4.sslip.io    autoscale-go-96dtk    autoscale-go-96dtk    True
    

サービスのロード

  1. オートスケールアプリにリクエストを送信し、リソースを消費させます。

    curl "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=100&prime=10000&bloat=5"
    
    Allocated 5 Mb of memory.
    The largest prime less than 10000 is 9973.
    Slept for 100.13 milliseconds.
    
  2. 50のインフライトリクエストを維持しながら30秒間トラフィックを送信します。

    hey -z 30s -c 50 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=100&prime=10000&bloat=5" \
      && kubectl get pods
    
    Summary:
      Total:        30.3379 secs
      Slowest:      0.7433 secs
      Fastest:      0.1672 secs
      Average:      0.2778 secs
      Requests/sec: 178.7861
    
      Total data:   542038 bytes
      Size/request: 99 bytes
    
    Response time histogram:
      0.167 [1]     |
      0.225 [1462]  |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.282 [1303]  |■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.340 [1894]  |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.398 [471]   |■■■■■■■■■■
      0.455 [159]   |■■■
      0.513 [68]    |  0.570 [18]    |
      0.628 [14]    |
      0.686 [21]    |
      0.743 [13]    |
    
    Latency distribution:
      10% in 0.1805 secs
      25% in 0.2197 secs
      50% in 0.2801 secs
      75% in 0.3129 secs
      90% in 0.3596 secs
      95% in 0.4020 secs
      99% in 0.5457 secs
    
    Details (average, fastest, slowest):
      DNS+dialup:   0.0007 secs, 0.1672 secs, 0.7433 secs
      DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0000 secs
      req write:    0.0001 secs, 0.0000 secs, 0.0045 secs
      resp wait:    0.2766 secs, 0.1669 secs, 0.6633 secs
      resp read:    0.0002 secs, 0.0000 secs, 0.0065 secs
    
    Status code distribution:
      [200] 5424 responses
    
    NAME                                             READY   STATUS    RESTARTS   AGE
    autoscale-go-00001-deployment-78cdc67bf4-2w4sk   3/3     Running   0          26s
    autoscale-go-00001-deployment-78cdc67bf4-dd2zb   3/3     Running   0          24s
    autoscale-go-00001-deployment-78cdc67bf4-pg55p   3/3     Running   0          18s
    autoscale-go-00001-deployment-78cdc67bf4-q8bf9   3/3     Running   0          1m
    autoscale-go-00001-deployment-78cdc67bf4-thjbq   3/3     Running   0          26s
    

分析

アルゴリズム

Knative Servingのオートスケーリングは、ポッドあたりの平均インフライトリクエスト数(同時実行性)に基づいています。システムにはデフォルトの同時実行性のターゲットが100(container-concurrency-target-defaultを検索)ありますが、ここではサービスに10を使用しました。50の同時リクエストでサービスをロードしたので、オートスケーラーは5つのポッドを作成しました(50同時リクエスト / ターゲット10 = 5ポッド)。

パニック

オートスケーラーは60秒間のウィンドウで平均同時実行性を計算するため、システムが望ましいレベルの同時実行性で安定するまで1分かかります。ただし、オートスケーラーは6秒のパニックウィンドウも計算し、そのウィンドウがターゲット同時実行性の2倍に達した場合、パニックモードに入ります。パニックモードでは、オートスケーラーはより短い、より敏感なパニックウィンドウで動作します。パニック条件が60秒間満たされなくなると、オートスケーラーは初期の60秒間の安定ウィンドウに戻ります。

                                                       |
                                  Panic Target--->  +--| 20
                                                    |  |
                                                    | <------Panic Window
                                                    |  |
       Stable Target--->  +-------------------------|--| 10   CONCURRENCY
                          |                         |  |
                          |                      <-----------Stable Window
                          |                         |  |
--------------------------+-------------------------+--+ 0
120                       60                           0
                     TIME

カスタマイズ

オートスケーラーはアノテーションを介してカスタマイズをサポートしています。Knativeには2つのオートスケーラークラスが組み込まれています。

  1. kpa.autoscaling.knative.devは、前述の同時実行性ベースのオートスケーラー(デフォルト)であり、
  2. hpa.autoscaling.knative.devは、CPU使用率に基づいてオートスケールするKubernetes HPAに委譲します。

CPUでスケーリングされるサービスの例

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: autoscale-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        # Standard Kubernetes CPU-based autoscaling.
        autoscaling.knative.dev/class: hpa.autoscaling.knative.dev
        autoscaling.knative.dev/metric: cpu
    spec:
      containers:
        - image: ghcr.io/knative/autoscale-go:latest

さらに、オートスケーラーのターゲットとスケーリング範囲はアノテーションで指定できます。カスタムターゲットとスケール範囲を持つサービスの例

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: autoscale-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        # Knative concurrency-based autoscaling (default).
        autoscaling.knative.dev/class: kpa.autoscaling.knative.dev
        autoscaling.knative.dev/metric: concurrency
        # Target 10 requests in-flight per pod.
        autoscaling.knative.dev/target: "10"
        # Disable scale to zero with a min scale of 1.
        autoscaling.knative.dev/min-scale: "1"
        # Limit scaling to 100 pods.
        autoscaling.knative.dev/max-scale: "100"
    spec:
      containers:
        - image: ghcr.io/knative/autoscale-go:latest

hpa.autoscaling.knative.devクラスのサービスの場合、autoscaling.knative.dev/targetはCPU使用率のターゲット(デフォルト"80")を指定します。

デモ

KnativeオートスケーラーのカスタマイズのKubeconデモをご覧ください(32分)。

その他の実験

  1. 100の同時リクエストを維持しながら60秒間トラフィックを送信します。

    hey -z 60s -c 100 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=100&prime=10000&bloat=5"
    
  2. 短いリクエスト(10ミリ秒)で100 qpsを維持しながら60秒間トラフィックを送信します。

    hey -z 60s -q 100 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=10"
    
  3. 長いリクエスト(1秒)で100 qpsを維持しながら60秒間トラフィックを送信します。

    hey -z 60s -q 100 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=1000"
    
  4. 重いCPU使用率(〜1 cpu/秒/リクエスト、合計100 cpu)で60秒間トラフィックを送信します。

    hey -z 60s -q 100 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?prime=40000000"
    
  5. 重いメモリ使用率(1 gb/リクエスト、合計5 gb)で60秒間トラフィックを送信します。

    hey -z 60s -c 5 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?bloat=1000"
    

クリーンアップ

kubectl delete -f docs/serving/autoscaling/autoscale-go/service.yaml

さらに読む

オートスケーリングの開発者向けドキュメント

当社は、サイトのトラフィックを理解するために分析とCookieを使用します。当社のサイトの使用に関する情報は、その目的のためにGoogleと共有されます。詳細はこちら。