概要
ECSはコンテナのスケールアウトとインスタンスのスケールアウトのタイミングが重要です。
よく起きる問題としては
で、こういった事が起きないようにしないといけません。
スケールアウトの方針
対象 | 方針 |
---|---|
インスタンス | インスタンスの空きリソースがコンテナ1台分だけの状態がn分間続いたら |
コンテナ | コンテナの使用率がn%を超えたら |
インスタンスはもう1台もコンテナを追加するリソースがない状況になったら早めにスケールアウトします。
コンテナは一般的なやり方で使用率が高くなったらスケールアウトすればOKです。
スケールインの方針
対象 | 方針 |
---|---|
インスタンス | コンテナがn分間ずっと1台を下回ったら |
コンテナ | コンテナの使用率がn%以下の状態がm分続いたら |
インスタンスは1台もコンテナが載っていなければスケールインします。不要ですからね。 コンテナは一般的なやり方で使用率が低くなったらスケールインすればOKです。
具体的な設定
コンテナはCPUやメモリの使用率を使えばいいのであまり難しくありませんが、インスタンスはちょっと複雑です。
ここで利用するメトリクスがCPUReservationやMemoryReservationです。
ECSではtask definitionでcpu
, memory
, memoryReservation
といったパラメータであらかじめ使用するリソースを確保できます。
これらの数値はUtilizationと異なり確保した量なので、確保したリソース量を超えた使用量でなければ一定です。なのでコンテナ数の計算に向いています。
CPUUtilizationとCPUReservationの比較
MemoryUtilizationとMemoryReservationの比較
どちらのReservationも基本的に一定ですね。
スケールアウト
コンテナが増えた時のリソースの遷移
CPU Unitが2048
で、そこで実行するコンテナのタスクのcpu割当が768
だとします。この場合
コンテナ数 | 残りリソース | CPU Reservation |
---|---|---|
1 | 1280 | 768 / 2048 = 37.5% |
2 | 512 | 1536 / 2048 = 75% |
3 | -256 | 2304 / 2048 = 112.5% |
と、3台目で枯渇してしまいます。つまり75%
のときにはすでにインスタンスを増やさなければいけません。
算出式
ただこのような数値は環境によって異なるため、統一して算出できる数式が欲しいです。それが以下です。
※英語なのは日本語だとtexの表示が変になるためです。
先程の例で算出
今回のケースだと、
で62.5%
がインスタンススケールアウトのしきい値となります。
この設定にすれば先程の例でも
コンテナ数 | 残りリソース | CPU Reservation | スケールアウトするか |
---|---|---|---|
1 | 1280 | 768 / 2048 = 37.5% | しない |
2 | 512 | 1536 / 2048 = 75% | する |
と、コンテナが2台になったらスケールアウトしてくれるので3台めのコンテナも生成することができるようになります。
複数のサービスが混在する場合
先程の例は1サービスのみ考えればいい例ですが、複数のサービスが混在してcpu割当もそれぞれ異なるケースも当然あります。その場合は以下の方針で考えればいいです。
算出式
最もReservationの高いタスクを元に算出する、という方針です。
具体例
例えばcpu割当が
- web-server: 256
- batch-server: 512
- proxy-server: 128
みたいなケースでは、最大であるbatch-server
の512
を使います。
75%
になりました。これをしきい値として設定しておけば、どのコンテナであってもスケールできます。
web数 | batch数 | proxy数 | 残りリソース | CPU Reservation | スケールアウトするか |
---|---|---|---|---|---|
1 | 1 | 1 | 1152 | 896 / 2048 = 43.75% | しない |
1 | 2 | 1 | 640 | 1408 / 2048 = 68.75% | しない |
2 | 2 | 2 | 256 | 1792 / 2048 = 87.5% | する |
NG例
これがもしproxy-server
の128
に合わせてしきい値を設定すると
と93.75%
となり、
web数 | batch数 | proxy数 | 残りリソース | CPU Reservation | スケールアウトするか |
---|---|---|---|---|---|
1 | 1 | 1 | 1152 | 896 / 2048 = 43.75% | しない |
2 | 2 | 2 | 256 | 1792 / 2048 = 87.5% | しない |
と、残りリソースが256
になってもインスタンスがスケールしないため、batch
コンテナが次にスケールアウトしたくてもこれ以上増えることはできません。
なので最もReservationの高いタスクを元に算出することが重要です。
スケールイン
インスタンスをスケールインしたいのはタスクによるコンテナが1つもない状態です。
ただecs-agentや監視用エージェントが動いているため、単純に0
とか固定値にすることはできません。
算出式
なので最もReservationの低いタスクを元に算出する方針が良いです。
先程の例で算出
先程のweb, batch, proxyがある環境であれば、
と6.25%
になります。
web数 | batch数 | proxy数 | 残りリソース | CPU Reservation | スケールインするか |
---|---|---|---|---|---|
2 | 2 | 2 | 256 | 1792 / 2048 = 87.5% | しない |
1 | 1 | 1 | 1152 | 896 / 2048 = 43.75% | しない |
0 | 0 | 1 | 1920 | 128 / 2048 = 6.25% | しない |
0 | 0 | 0 | 2048 | 0 / 2048 = 0% (実際は他プロセスで0にはならないはず) |
する |
となります。問題なくスケールインできますね。
NG例
もしこれがweb
を元に算出すると、
と12.5%
がしきい値になります。この場合
web数 | batch数 | proxy数 | 残りリソース | CPU Reservation | スケールインするか |
---|---|---|---|---|---|
2 | 2 | 2 | 256 | 1792 / 2048 = 87.5% | しない |
1 | 1 | 1 | 1152 | 896 / 2048 = 43.75% | しない |
0 | 0 | 1 | 1920 | 128 / 2048 = 6.25% | する |
となり、proxyが残っているのにサーバがシャットダウンしてしまうという事になります。
まとめ
ECSのインスタンスをスケールアウトする時は
スケールインする時は
で算出したしきい値で設定すると問題なくスケールできます。