オートスケールサンプルアプリ - Go¶
Knative Servingリビジョンのオートスケーリング機能のデモンストレーション。
前提条件¶
- Knative Serving)がインストールされたKubernetesクラスター。
hey
ロードジェネレーターがインストールされていること(go install github.com/rakyll/hey@latest
)。-
このリポジトリをクローンし、サンプルディレクトリに移動します
git clone -b "release-1.16" https://github.com/knative/docs knative-docs cd knative-docs
サービスのデプロイ¶
-
サンプル Knativeサービスをデプロイします
kubectl apply -f docs/serving/autoscaling/autoscale-go/service.yaml
-
サービスの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
サービスのロード¶
-
オートスケールアプリにリクエストを送信し、リソースを消費させます。
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.
-
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つのオートスケーラークラスが組み込まれています。
kpa.autoscaling.knative.dev
は、前述の同時実行性ベースのオートスケーラー(デフォルト)であり、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分)。
その他の実験¶
-
100の同時リクエストを維持しながら60秒間トラフィックを送信します。
hey -z 60s -c 100 \ "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=100&prime=10000&bloat=5"
-
短いリクエスト(10ミリ秒)で100 qpsを維持しながら60秒間トラフィックを送信します。
hey -z 60s -q 100 \ "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=10"
-
長いリクエスト(1秒)で100 qpsを維持しながら60秒間トラフィックを送信します。
hey -z 60s -q 100 \ "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=1000"
-
重いCPU使用率(〜1 cpu/秒/リクエスト、合計100 cpu)で60秒間トラフィックを送信します。
hey -z 60s -q 100 \ "http://autoscale-go.default.1.2.3.4.sslip.io?prime=40000000"
-
重いメモリ使用率(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