Edited at

docker serviceのリバランス(再配置)の仕方

More than 1 year has passed since last update.


やり方

docker service update --detach=false --force foo_service という感じにアップデートするパラメータは何も指定せず --force だけを付けて docker sercice update すれば良いらしい。

すべてのサービスでリバランスしたければ↓こんな感じか(--detachは本質的には関係ないが纏めて実行する時はfalseにしておけば待たずに済む)。

for s in $(docker service ls -q); do

docker service update --detach=false --force "$s"
done


利用シーン

例えば2ノードに対してレプリカ数6で docker service create --replicas=6 foo_service のような感じにサービスを作成した場合、各ノードには3つずつのタスクが作成される。

ここで新たなノードが docker swarm join で追加されて3ノードになった時はタスク数が各ノードに2つずつになるよう、既存ノードからは1個ずつ停止して新ノードでは2つ起動する、ということをやってほしいが自動的にはこれは行われない。つまり何もしなければ親ノードにはいつまでたっても何のタスクも起動せず旧ノードもずっと3タスクずつ起動しっぱなしということになる。

もちろん既存ノードがサーバ再起動などしてタスク実行が出来なくなったりすれば数を保つために新ノードの方にもタスクが起動し始めてくれるが、この挙動はサーバリソースを公平に使ってほしい場合は嬉しくない。

タスクを各ノードにリバランスする為のコマンドが無いかと思ってひと通り見てみたが、どうやらサブコマンド名やオプション名からそれらしいものは無いっぽいと分かる。が、ググったら #24103 のIssueに答えが書いてあって、試したら期待通りに動作してくれたのでここにメモを残す。