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 minutesSwarm マネージャーは求められる状態を維持するために、
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