概要
IstioのwarmupDurationSecsを利用する機会がありましたが,どういったweightの変更を行っているのかが気になったので本記事でまとめます。
warmupDurationSecsとは
warmupDurationSecsは,Istioで新しいPodがデプロイされた際にwarmup期間を指定するパラメータです.このパラメータはDestinationRuleのLoadBalancerSettingsで行います.
弊社ではFlaggerを用いているので,canaryリソースでは以下のような設定で行います
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: tmp
spec:
service:
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
warmupDurationSecs: 60s
warmupDurationSecsのweight変更
warmupDurationSecsはEnvoyのSlow Start Modeの仕組みをラッピングした機能です.
ちゃんとした数式を元にweightが求められており、それが以下になります。
NewWeight = Weight * max(MinWeightPercent, TimeFactor^{1/Aggregation})
さらにTimeFactorは以下のように求められます.
TimeFactor = max(TimeSinceStartInSeconds, 1) / SlowStartWindowInSeconds
パラメータ | 説明 | 備考 |
---|---|---|
SlowStartWindowInSeconds | warmup期間(秒) | |
TimeSinceStartInSeconds | 開始からの経過時間(秒) | |
TimeFactor | 経過時間の割合 | |
MinWeightPercent | 最小重み付け | デフォルト値は0.1 |
Aggregation | 重み付け曲線の調整パラメータ | デフォルト値は1.0 |
NewWeight | 新しい重み付け |
デフォルト値のみで計算し、warmupDurationSecsを60sと設定すると、以下のように線形的にNewWeightが増えていき、最終的に100%になります。最初の7秒ほどはTimeFactorが0.1を下回るので、MinWeightPercentが最大値となるため10%固定です。
これによりHPA等で作られたPodは安全に暖気をしてからユーザのリクエストを受け入れる準備ができます。
まとめ
本記事ではwarmupDurationSecsのweight値の変更について調べました。
ちゃんとした式を用いられていることにびっくりしましたが、もっとEnvoyがどのようなネットワークでリクエストをうまく振り分けているのかも調べたいと思いました。