swarm からノードをドレイン(解放)¶
チュートリアルのこれまでのステップは、全て ACTIVE
状態で利用可能なノードでした。swarm マネージャはタスクをあらゆる ACTIVE
ノード上に割り当て可能です。つまり、これまでの全てのノードがタスクを受け取れます。
とはいえ、たまにはメンテナンス時間の計画など、 DRAIN
状態(訳者注;ドレイン=離脱、解放された状態)の指定が必要になるでしょう。 DRAIN
状態はノードが swarm マネージャから新しいタスクの受信を拒否します。また、マネージャは対象ノード上のタスクを停止し、レプリカ(複製)タスクを別の ACTIVE
状態のノードで起動します。
- 準備がまだであれば、ターミナルを開き、マネージャ・ノードを実行しているマシンに SSH で入ります。たとえば、このチュートリアルでは
manager1
という名前のマシンを使います。
- すべてのノードが利用可能(available)な状態を確認します。
$ docker node ls
ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS LEADER
1bcef6utixb0l0ca7gxuivsj0 worker2 Accepted Ready Active
38ciaotwjuritcdtn9npbnkuz worker1 Accepted Ready Active
e216jshn25ckzbvmwlnh5jr3g * manager1 Accepted Ready Active Reachable Yes
- ローリング・アップデート チュートリアルの
redis
サービスを起動していなければ、今起動します。
$ docker service create --replicas 3 --name redis --update-delay 10s --update-parallelism 1 redis:3.0.6
c5uo6kdmzpon37mgj9mwglcfw
docker service tasks redis
を実行したら、swarm マネージャが別々のノードにタスクを割り当てたのが分かります。
$ docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
7q92v0nr1hcgts2amcjyqg3pq redis.1 redis redis:3.0.6 Running 26 seconds Running manager1
7h2l8h3q3wqy5f66hlv9ddmi6 redis.2 redis redis:3.0.6 Running 26 seconds Running worker1
9bg7cezvedmkgg6c8yzvbhwsd redis.3 redis redis:3.0.6 Running 26 seconds Running worker2
このケースでは swarm マネージャはノードごとに1つのタスクを分散しました。皆さんの環境によっては、別のノードに分散されて見えるかもしれません。
docker node update --availability drain <ノードID>
を実行し、タスクが割り当てられているノードをドレイン(解放)します。
docker node update --availability drain worker1
worker1
- ノードが利用可能かどうか調べます。
$ docker node inspect --pretty worker1
ID: 38ciaotwjuritcdtn9npbnkuz
Hostname: worker1
Status:
State: Ready
Availability: Drain
...省略...
ドレインしたノードの AVAILABILITY
は Drain
です。
docker service tasks redis
を実行し、Swarm マネージャがredis
サービスのタスク割り当てを更新するのを確認します。
$ docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
7q92v0nr1hcgts2amcjyqg3pq redis.1 redis redis:3.0.6 Running 4 minutes Running manager1
b4hovzed7id8irg1to42egue8 redis.2 redis redis:3.0.6 Running About a minute Running worker2
9bg7cezvedmkgg6c8yzvbhwsd redis.3 redis redis:3.0.6 Running 4 minutes Running worker2
swarm マネージャは期待状態を維持するため、 Drain
状態のノードでタスクを終了したら、 Active
状態のノードで新しいタスクを作成します。
docker node update --availability active <ノードID>
を実行し、ドレイン(解放)したノードをアクティブ状態に戻します。
$ docker node update --availability active worker1
worker1
- ノードを調べ、状態の更新を確認します。
$ docker node inspect --pretty worker1
ID: 38ciaotwjuritcdtn9npbnkuz
Hostname: worker1
Status:
State: Ready
Availability: Active
...省略...
ノードが Active
状態に戻れば、新しいタスクを受信できます。
- サービスの更新をスケールアップするため
- ローリング・アップデートするため
- 他のノードを
Drain
状態にした場合 - 他のアクティブ・ノードでタスクに失敗した場合
参考
- Drain a node on the swarm
- https://docs.docker.com/engine/swarm/swarm-tutorial/drain-node/