免責事項: このプロジェクトはベータ版です - API は変更される可能性があります。
ウォーターマーク ポッド オートスケーラー (WPA) コントローラーは、水平ポッド オートスケーラー (HPA) を拡張するカスタム コントローラーです。
ウォーターマーク ポッド オートスケーラー コントローラーは、アップストリームの水平ポッド オートスケーラー コントローラーの代替コントローラーです。
一部のアプリケーションを自動スケーリングしたい場合:
例えば
apiVersion : datadoghq.com/v1alpha1
kind : WatermarkPodAutoscaler
[...]
spec :
algorithm : absolute
[...]
必要なレプリカ数を計算するには 2 つのオプションがあります。
average
コントローラーは、 value from the external metrics provider
/ current number of replicas
を使用し、それをウォーターマークと比較します。推奨されるレプリカの数はvalue from the external metrics provider
/ watermark
からの値です (現在の値に応じて低または高)。
レプリカの数に依存しないメトリックを使用する場合は、 average
アルゴリズムが適しています。通常、単一の Web サーバーがn
rq/s を処理する必要があることがわかっている場合、ELB が受信するリクエストの数は、必要な Web サーバーの数を示します。レプリカを追加しても、ロード バランサーが受信するリクエストの数は増減しません。
absolute
デフォルト値はabsolute
です。平均的なメトリックを使用する必要があります。推奨されるレプリカ数はcurrent number of replicas
* value from the external metrics provider
/ watermark
からの値として計算されます。
absolute
アルゴリズムは最も一般的な使用例を表すため、デフォルトです。たとえば、アプリケーションを CPU の 60% から 80% の間で実行する必要があり、 avg:cpu.usage
が 85% である場合は、スケールアップする必要があります。メトリックはレプリカの数と相関している必要があります。
注: アップストリーム コントローラーでは、レプリカの推奨数を切り上げるためにmath.Ceil
関数のみが使用されます。
これは、しきい値が 10 の場合、レプリカを 1 つダウンスケールするには、外部メトリック プロバイダーからの使用率が 8.999... に達する必要があることを意味します。ただし、使用率が 10.001 の場合は、レプリカ 1 つずつスケールアップします。
値が下限ウォーターマークを下回る場合、WPA コントローラーはmath.Floor
を使用します。これにより、対称的な動作が保証されます。他のスケーリング オプションと組み合わせると、いつダウンスケールするかをより細かく制御できます。
Watermark Pod Autoscaler を使用するには、それを Kubernetes クラスターにデプロイします。
Watermark Pod Autoscaler プロジェクトの zip ファイルをダウンロードします。ソース コードはDataDog/watermarkpodautoscaler
にあります。
プロジェクトを解凍し、 ./watermarkpodautoscaler
フォルダーに移動します。
名前空間とウォーターマーク ポッド オートスケーラー コントローラーを定義します。
DD_NAMESPACE= " datadog "
DD_NAMEWPA= " wpacontroller "
名前空間を作成します。
kubectl create ns $DD_NAMESPACE
Helm を使用して Watermark Pod Autoscaler コントローラーをインストールします。
helm install $DD_NAMEWPA -n $DD_NAMESPACE ./chart/watermarkpodautoscaler
WatermarkPodAutoscaler コントローラーには、一連のヘルパー ユーティリティを提供する kubectl プラグインが付属しています。詳細については、専用のドキュメント ページ: docs/kubectl-plugin.md を参照してください。
ターゲット展開と同じ名前空間に WPA を作成します。
Datadog Cluster Agent は作成/更新/削除イベントを取得します。 WPA 仕様を解析してメトリクスとスコープを抽出し、Datadog から取得します。
この例では、次の仕様構成を使用しています。
apiVersion : datadoghq.com/v1alpha1
kind : WatermarkPodAutoscaler
metadata :
name : example-watermarkpodautoscaler
spec :
downscaleForbiddenWindowSeconds : 60
downscaleDelayBelowWatermarkSeconds : 300
upscaleForbiddenWindowSeconds : 30
upscaleDelayAboveWatermarkSeconds : 30
scaleDownLimitFactor : 30
scaleUpLimitFactor : 50
minReplicas : 4
maxReplicas : 9
scaleTargetRef :
kind : " Deployment "
name : " some_app "
apiVersion : " apps/v1 "
metrics :
- external :
highWatermark : 400m
lowWatermark : 150m
metricName : custom.request_duration.max
metricSelector :
matchLabels :
kubernetes_cluster : mycluster
service : billing
short_image : billing-app
type : External
tolerance : " 0.01 "
External
メトリック タイプとResource
メトリック タイプの両方がサポートされています。 WPA コントローラーは HPA と同じ形式を使用します。詳細については、こちらをご覧ください。
ウォーターマークから始めて、境界 ( watermarkpodautoscaler.wpa_controller_low_watermark
とwatermarkpodautoscaler.wpa_controller_high_watermark
) の間にある場合、Datadog から収集されたメトリクスの値 ( watermarkpodautoscaler.wpa_controller_value
) が紫色で表示され、スケーリング イベントをトリガーしないようにコントローラーに指示されます。これらはQuantities
として指定されるため、 m | "" | k | M | G | T | P | E
使用できます。 m | "" | k | M | G | T | P | E
すると、使用する値を簡単に表すことができます。
メトリクスwatermarkpodautoscaler.wpa_controller_restricted_scaling{reason:within_bounds}
を使用して、実際に制限されていることを確認できます。注: この期間中にコントローラーによってスケーリング イベントがトリガーされなかったことをより明確にするために、メトリックは 1000 倍になっています。
構成オプションの 2 番目のセットは、デプロイメントのスケーリング速度に関連しており、 scaleDownLimitFactor
およびscaleUpLimitFactor
によって制御されます。これらは 0 ~ 100 の整数です。これらは、現在のレプリカ数を考慮した場合のダウンスケーリングとアップスケーリングの最大比率を表します。
この場合、レプリカが 10 個あり、 scaleUpFactor
が 30 (%) でレプリカの推奨数が 14 (推奨の詳細についてはアルゴリズムのセクションを参照) である場合、レプリカの上限は 13 になります。
次のグラフでは、メトリックwatermarkpodautoscaler.wpa_controller_replicas_scaling_proposal
で表される推奨レプリカ数 (紫色) が、現在のレプリカ数と比較して多すぎることがわかります。これにより、アップスケール キャッピング ロジックがトリガーされます。これは、メトリクスwatermarkpodautoscaler.wpa_controller_restricted_scaling{reason:upscale_capping}
を使用して監視できます (注: 上記と同様、より明示的にするためにメトリクスが乗算されています)。したがって、 watermarkpodautoscaler.wpa_controller_replicas_scaling_effective
の有効数は、 scaleUpLimitFactor
に従ってスケールアップされます。
この同様の例では、過度のダウンスケールを避け、同じメトリクスのセットを使用して、適切な数のレプリカだけをスケールダウンすることを保証できます。
私たちは常に保守的なスケーリング決定を行っていることに注意することが重要です。
scaleUpLimitFactor
が 29% の場合: レプリカが 10 個あり、13 が推奨されている場合、12 にアップスケールします。scaleDownLimitFactor
が 29% の場合: レプリカが 10 個あり、7 が推奨されている場合、8 にダウンスケールします。minReplicas
およびmaxReplicas
優先されることに注意してください。 「優先順位」セクションを参照してください。最後に、利用可能な最後のオプションは、 downscaleForbiddenWindowSeconds
とupscaleForbiddenWindowSeconds
です。これらは、それぞれ、スケーリング イベント後、スケールダウンとスケールアップまでに待機する時間 (秒単位) を表します。最後のスケーリング イベントのみを保持し、 upscaleForbiddenWindowSeconds
を最後にアップスケールしたときと比較しません。
次の例では、クールダウン期間中の場合、推奨されるレプリカ数が無視されることがわかります。ダウンスケールのクールダウン期間は、 watermarkpodautoscaler.wpa_controller_transition_countdown{transition:downscale}
で視覚化でき、以下のグラフでは黄色で表示されます。グラフ上のオレンジ色のアップスケールのクールダウン期間 ( transition:upscale
) よりも大幅に高いことがわかります。スケーリングを推奨されると、適切なクールダウン期間が終了した場合にのみスケーリングを行います。これにより、両方のカウントダウンがリセットされます。
バーストによるスケーリングを回避するには、 downscaleDelayBelowWatermarkSeconds
および/またはupscaleDelayAboveWatermarkSeconds
の機能を使用できます。これらのオプションは整数として指定します。メトリクスは、設定された期間中、それぞれのウォーターマークの上または下に留まる必要があります。 WPA のステータスの残り時間を追跡できます。
- lastTransitionTime: "2022-11-15T02:02:09Z"
message: Allow downscaling if the value stays under the Watermark
reason: Value below Low Watermark
status: "False"
type: BelowLowWatermark
またはコントローラーのログで:
{"level":"info","ts":1668481092517.446,"logger":"controllers.WatermarkPodAutoscaler","msg":"Will not scale: value has not been out of bounds for long enough","watermarkpodautoscaler":"datadog/example-watermarkpodautoscaler","wpa_name":"example-watermarkpodautoscaler","wpa_namespace":"datadog","time_left":3209}
注:この機能で複数のメトリクスを使用している場合は、メトリクスのOR
を使用して上記/以下の条件が考慮されます。
たとえば、2 つのメトリクス M1 と M2 を持つ 60 秒のupscaleDelay
があるとします。 M1 が 40 秒間その最高水準点を上回った場合[t0; t40]
、M2 は 30 秒間最高水準点を超え、最後の 10 秒間は M1 と重なります[t30; t60]
、これによりupscaleDelay
条件が検証され、アップスケーリング イベントが許可されます。
外部メトリックの値を取得するとき、最初にその値をhighWatermark
+ tolerance
の合計と、その差lowWatermark
- tolerance
と比較します。範囲外の場合は、レプリカの推奨数を計算します。次に、この値を現在のレプリカ数と比較し、 minReplicas
とmaxReplicas
に従って推奨レプリカ数を制限する可能性があります。最後に、 downscaleForbiddenWindowSeconds
とupscaleForbiddenWindowSeconds
を指定して、スケーリングが許可されているかどうかを確認します。
ターゲットをスケーリングできる条件をより詳細に制御するには、次の機能を使用できます。
minAvailableReplicaPercentage
: コントローラーがターゲットを自動スケールするために使用できる必要があるレプリカの最小パーセンテージを示します。たとえば、50 に設定され、ターゲットの背後にあるポッドの半分未満が利用可能な状態にある場合、ターゲットはコントローラーによってスケーリングされません。
readinessDelaySeconds
: スケーリングの決定で考慮される前に、レプリカを実行する必要がある時間を指定します。
すべての条件が満たされた場合、 dryRun
フラグがtrue
に設定されていない場合にのみ、コントローラーは、 scaleTargetRef
内のターゲット オブジェクトを推奨レプリカ数にスケールします。これはログによって示されます。
{ "level" : " info " , "ts" : 1566327479.866722 , "logger" : " wpa_controller " , "msg" : " DryRun mode: scaling change was inhibited currentReplicas:8 desiredReplicas:12 " }
Cluster Agent は WPA リソースに対してインフォーマーを実行しており、HPA と同様に、作成/更新/削除時に仕様を解析して Datadog からメトリクスをクエリします。
クラスター エージェントは、デフォルトでは WPA リスナーを実行しません。クラスター エージェントで WPA を有効にするには、環境変数DD_EXTERNAL_METRICS_PROVIDER_WPA_CONTROLLER=true
を設定し、クラスター エージェント サービス アカウントに割り当てられた ClusterRole を更新して、WatermarkPodAutoscaler オブジェクトにアクセスできるようにします。
[...]
- apiGroups : ["datadoghq.com"]
resources :
- watermarkpodautoscalers
verbs :
- get
- list
- watch
[...]
注: datadog helm チャートを使用してクラスター エージェントで WPA を有効にするには、 clusterAgent.metricsProvider.wpaController
true
に設定します。 ClusterRole は自動的に更新されます。
これらの変更を適用して WPA オブジェクトを作成したら、Datadog Cluster Agent ポッドで実行してagent status
を実行すると、解析されたオートスケーラーの仕様に関するより具体的な詳細を確認できるようになります (水平または水平であるかどうか)。ウォーターマーク ポッド オートスケーラー)。
* watermark pod autoscaler: default/example2-watermarkpodautoscaler
- name : example2-watermarkpodautoscaler
- namespace : default
- type : watermark
- uid : ff09b7d8-d99b-11e9-a8c1-42010a8001c4
Metric name : sinus
Labels :
- foo : bar
Value : 75.1297378540039
Timestamp : 15688259400
Valid : true
* horizontal pod autoscaler: default/nginxext
- name : nginxext
- namespace : default
- type : horizontal
- uid : 61ef3f6e-af32-11e9-a8c1-42010a8001c4
Metric name : docker.mem.rss
Labels :
- cluster-location : us-central1-a
- cluster-name : charly
Value : 263888700952
Timestamp : 15688259400
Valid : true
上記のメトリクスに加えて、これらは WPA の適切な機能をより深く理解するのに役立つログです。
15 秒ごとに、仕様のmetrics
セクションにリストされているメトリクスを Datadog から取得します。
{ "level" : " info " , "ts" : 1668484420515.7678 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Metrics from the External Metrics Provider " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "metrics" :[ 33959 ]}
{ "level" : " info " , "ts" : 1668484420515.8203 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Value is below lowMark " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "usage" : " 33959m " , "replicaCount" : 7 , "currentReadyReplicas" : 8 , "tolerance (%)" : 1 , "adjustedLM" : 34650 , "adjustedUsage" : 33959 }
{ "level" : " info " , "ts" : 1668484420515.8906 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Proposing replicas " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "proposedReplicas" : 7 , "metricName" : " datadogmetric@datadog:example-watermarkpodautoscaler-utilization-metric{map[kube_container_name:my-container service:my-target]} " , "reference" : " Deployment/datadog/example-watermarkpodautoscaler " , "metric timestamp" : " Tue, 15 Nov 2022 03:53:20 UTC " }
{ "level" : " info " , "ts" : 1668484420515.9324 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Normalized Desired replicas " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "desiredReplicas" : 7 }
{ "level" : " info " , "ts" : 1668484420515.946 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Cooldown status " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "backoffUp" : false , "backoffDown" : false , "desiredReplicas" : 7 , "currentReplicas" : 8 }
{ "level" : " info " , "ts" : 1668484420515.9563 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Will not scale: value has not been out of bounds for long enough " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "time_left" : 2335 }
ここで、ターゲット展開内に見られるレプリカの現在の数は 6 です。次に、外部メトリック プロバイダーから取得した生の値を確認し、それを最高および最低水準点と比較します。この比較の結果を考慮して、推奨されるレプリカ数を出力します。この場合は5つです。
外部メトリック プロバイダーに直接クエリを実行する場合は、次のコマンドを使用できます。
kubectl get --raw " /apis/external.metrics.k8s.io/v1beta1/namespaces// | jq ."
オプションで、 ?labelSelector=key%3Dvalue
を追加することで、ラベル セレクターを追加することもできます。この場合、メトリクスを取得したい場合は、以下を使用できます。
kubectl get --raw " /apis/external.metrics.k8s.io/v1beta1/namespaces// | jq .?labelSelector=key%3Dvalue%2Cotherkey%3Dothervalue%2Cshort_image%3Dimage "
次のようなログが表示された場合:
{ "level" : " info " , "ts" : 1566397216.8918724 , "logger" : " wpa_controller " , "msg" : " failed to compute desired number of replicas based on listed metrics for Deployment/datadog/propjoe-green: failed to get external metric dd.propjoe.request_duration.max: unable to get external metric datadog/propjoe-green/&LabelSelector{MatchLabels:map[string]string{fooa: bar,},MatchExpressions:[],}: no metrics returned from external metrics API " }
その後、このメトリクスが実際に外部メトリクス プロバイダーから利用できないことを確認できます。これは、ラベルのタイプミス、または Datadog からメトリクスを取得できないことが原因である可能性があります (これは、スパースすぎる、API のダウン、レート制限のヒットなど、さまざまな要因が原因である可能性があります)。さらに詳しく調査するには、外部メトリック プロバイダーのログを参照してください。
次に、スケーリング速度の上限とクールダウン ウィンドウを検証します。スケーリング キャッピングの場合は、次のようになります。
{ "level" : " info " , "ts" : 1566327268.8839815 , "logger" : " wpa_controller " , "msg" : " Upscaling rate higher than limit of 50.0% up to 9 replicas. Capping the maximum upscale to 9 replicas " }
{ "level" : " info " , "ts" : 1566327268.884001 , "logger" : " wpa_controller " , "msg" : " Returning 9 replicas, condition: ScaleUpLimit reason the desired replica count is increasing faster than the maximum scale rate " }
{ "level" : " info " , "ts" : 1566327479.8845513 , "logger" : " wpa_controller " , "msg" : " -> after normalization: 9 " }
次にクールダウン期間について考えます。最後のスケーリング イベントがいつ行われたか、および次のアップスケール イベントとダウンスケール イベントが次の時点まで禁止された時期を示すログが記録されます。
{ "level" : " info " , "ts" : 1566327479.8845847 , "logger" : " wpa_controller " , "msg" : " Too early to downscale. Last scale was at 2019-08-20 18:57:44 +0000 UTC, next downscale will be at 2019-08-20 18:58:44 +0000 UTC, last metrics timestamp: 2019-08-20 18:57:59 +0000 UTC " }
{ "level" : " info " , "ts" : 1566327479.8846018 , "logger" : " wpa_controller " , "msg" : " Too early to upscale. Last scale was at 2019-08-20 18:57:44 +0000 UTC, next upscale will be at 2019-08-20 18:58:14 +0000 UTC, last metrics timestamp: 2019-08-20 18:57:59 +0000 UTC " }
{ "level" : " info " , "ts" : 1566327479.884608 , "logger" : " wpa_controller " , "msg" : " backoffUp: true, backoffDown: true, desiredReplicas 5, currentReplicas: 6 " }
最後に、デプロイメントが正しく自動スケールされたことを確認します。
{ "level" : " info " , "ts" : 1566327253.7887673 , "logger" : " wpa_controller " , "msg" : " Successful rescale of watermarkpodautoscaler, old size: 8, new size: 9, reason: cutom_metric.max{map[kubernetes_cluster:my-cluster service:my-service short_image:my-image]} above target " }
wpa.datadoghq.com/logs-attributes
を使用して、基礎となる WPA オブジェクトに関連付けられたログに追加のキー値を追加できます。例: apiVersion: datadoghq.com/v1alpha1
kind: WatermarkPodAutoscaler
metadata:
annotations:
wpa.datadoghq.com/logs-attributes: '{"mywpa": "isgreat"}'
name: watermarkpodautoscaler-sinus
namespace: default
[...]
得られるもの:
{"level":"info","ts":1643642642091.062,"logger":"controllers.WatermarkPodAutoscaler","msg":"getReadyPodsCount","watermarkpodautoscaler":"default/watermarkpodautoscaler-sinus","mywpa":"isgreat","full podList length":2,"toleratedAsReadyPodCount":2,"incorrectly targeted pods":0}
デプロイメントを手動でスケールするとどうなりますか?
次の調整ループでは、レプリカの新しい数が考慮されて、必要なレプリカ数が計算されます。リソースが他の人によって変更されたことを示すログが表示される場合があります。ただし、構成されたレプリカの数が範囲外の場合、コントローラーは許容範囲内のレプリカの数にスケールバックします。
WPA を一時的に無効にして展開を手動でスケールアップ/スケールダウンするにはどうすればよいですか?
推奨される方法は、WPA をドライ ラン モードに設定し、必要なレプリカ数にスケールすることです。次のパッチ コマンドを使用して、予行演習で WPA を設定できます。
kubectl patch wpa --type='json' -p='[{"op": "replace", "path": "/spec/dryRun", "value":true}]'
一時的なオーバーライドが終了したら、WPA が再びアクティブになるように、ドライラン モードをfalse
に戻すことを忘れないでください。
コントローラーの設置面積はどれくらいですか?
私たちのテストによると、これはクラスター内のデプロイメント数の要因です。
コントローラーはステートレスですか?
はい。
WPA は複数のメトリックをサポートしていますか?
はい、WPA は複数のメトリックに基づいて拡張でき、HPA と同様に機能します。 WPA は各メトリックを個別に評価し、最大の数を必要とするメトリックに関連付けられたレプリカの数を提案します。たとえば、WPA が metric1、metric2、metric3 を評価し、それぞれについて 10、20、30 個のレプリカ プロポーザルを計算する場合、最終的なプロポーザルは 30 になります。
すべての WPA 定義をクラスター全体で監視するため、クラスターロールを使用します。
便利なオプションは、ユーザーになりすまして権利を確認することです。たとえば、WPA コントローラーのサービス アカウントとして展開を取得する権利があることを確認するには、次のようにします。
kubectl get deploy < your_deploy > --as system:serviceaccount:datadog:watermarkpodautoscaler -n < your_ns >
または、外部メトリクス プロバイダーにクエリを実行します。
kubectl get --raw " /apis/external.metrics.k8s.io/v1beta1/namespaces//metric --as system:serviceaccount::watermarkpodautoscaler
要件:
リポジトリhttps://github.com/DataDog/watermarkpodautoscaler
のクローンを作成した後、いくつかの環境変数を設定します。
export GO111MODULE=on
unset GOPATH
export PATH= $PATH : $( pwd ) /bin
次に、いくつかのツールの依存関係をインストールするには、 make install-tools
実行します。
make install-tools
: オペレーター SDK を使用するためのツールをインストールします。make build
: コントローラーをローカルでビルドします。make generate
: コントローラーとインフォーマーの登録用のコードを生成する複数のオペレーター SDK ジェネレーターを実行します。make test
: 単体テストを実行します。make validate
: 一般的な Golang リンター ( golangci-lint
) を実行します。make e2e
: 現在構成されている Kubernetes クラスターでエンドツーエンドのテストを実行します。make container
: オペレーター SDK を使用してコントローラー Docker イメージをビルドします。make container-ci
: 多段階の Dockerfile を使用してコントローラーの Docker イメージを構築します。リリースプロセスのドキュメントはここから入手できます。
一部の機能は、構成可能な HPA または CHPA からインスピレーションを得ています。 CRD の全体的なパッケージ化はオペレーター SDK を使用して行われましたが、コード構造の大部分はウォーターマーク ポッド オートスケーラーにも使用されました。