Swarm ノードの解放
読む時間の目安: 2 分
このチュートリアルの初めの方では、実行されているノードの利用状態(availability)はACTIVE
になっていました。
Swarm マネージャーはACTIVE
なノードであるからこそ、タスクを割り振ることができます。
ここまでのところは、ノードがすべて利用可能であったから、タスクを受け取ることができたわけです。
たとえば定期メンテナンスの時などでは、ノードの利用状態を DRAIN
、つまり解放状態にしておくことが必要な場合があります。
DRAIN
という状態にあるノードは Swarm マネージャーから、新たなタスクを受け取ることができません。
またそのノード上に実行されていたタスクは、マネージャーによって停止され、ACTIVE
状態にある別のノードに複製タスクが割り振られます。
重要: スタンドアロンコンテナーは
docker run
、docker-compose up
、あるいは Docker Engine API を使って生成されますが、ノードの状態をDRAIN
にするということは、そのノードからスタンドアロンコンテナーを削除するという意味ではありません。DRAIN
も含めてノードの状態というものは、Swarm サービスによる処理スケジューリングにあたり、ノードの利用能力の有無を決めるものでしかありません。
-
マシンへの接続ができていなければ、端末画面を開いて SSH により接続します。 接続先はマネージャーノードを起動したマシンです。 たとえばこのチュートリアルでは
manager1
というマシンを利用します。 -
ノードがすべてアクティブであって利用可能であることを確認します。
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1bcef6utixb0l0ca7gxuivsj0 worker2 Ready Active 38ciaotwjuritcdtn9npbnkuz worker1 Ready Active e216jshn25ckzbvmwlnh5jr3g * manager1 Ready Active Leader
-
チュートリアルの ローリングアップデート における
redis
を停止してしまっている場合は、ここで起動します。$ docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6 c5uo6kdmzpon37mgj9mwglcfw
-
docker service ps redis
を実行して、Swarm マネージャーがさまざまなノードに対して、タスクを割り当てている様子を確認します。$ docker service ps redis NAME IMAGE NODE DESIRED STATE CURRENT STATE redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:3.0.6 manager1 Running Running 26 seconds redis.2.7h2l8h3q3wqy5f66hlv9ddmi6 redis:3.0.6 worker1 Running Running 26 seconds redis.3.9bg7cezvedmkgg6c8yzvbhwsd redis:3.0.6 worker2 Running Running 26 seconds
この例では、Swarm マネージャーが 1 つのタスクを各ノードに分散しています。 実行環境によっては、複数ノード間でのタスク分散の仕方が異なっているかもしれません。
-
docker node update --availability drain <ノードID>
を実行して、1 つのタスクが割り当てられているノードを解放(drain)します。$ docker node update --availability drain worker1 worker1
-
ノードが利用可能であるか(availability)を確認します。
$ docker node inspect --pretty worker1 ID: 38ciaotwjuritcdtn9npbnkuz Hostname: worker1 Status: State: Ready Availability: Drain ...snip...
解放したノードの
AVAILABILITY
はDrain
と示されています。 -
docker service ps redis
を実行して、Swarm マネージャーがredis
サービスに対して、どのようにタスク割り当てを更新しているかを確認します。$ docker service ps redis NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:3.0.6 manager1 Running Running 4 minutes redis.2.b4hovzed7id8irg1to42egue8 redis:3.0.6 worker2 Running Running About a minute \_ redis.2.7h2l8h3q3wqy5f66hlv9ddmi6 redis:3.0.6 worker1 Shutdown Shutdown 2 minutes ago redis.3.9bg7cezvedmkgg6c8yzvbhwsd redis:3.0.6 worker2 Running Running 4 minutes
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 ...snip...
ノードの状態を
Active
に戻した場合、新たなタスクを受け取るようになるのは、以下のときです。- サービスがスケールアップするために更新されたとき。
- ローリングアップデートのとき。
- 別のノードの状態を
Drain
にしたとき。 - 別のアクティブなノードにおいてタスクが失敗したとき。
次にすることは
Swarm モードでのルーティングメッシュの利用 について学びます。
tutorial, cluster management, swarm, service, drain