swarm からノードをドレイン(解放)¶
チュートリアルのこれまでのステップは、全て ACTIVE
状態で利用可能なノードでした。swarm マネージャはタスクをあらゆる ACTIVE
ノード上に割り当て可能です。つまり、これまでの全てのノードがタスクを受け取れます。
とはいえ、たまにはメンテナンス時間の計画など、 DRAIN
状態(訳者注;ドレイン=離脱、解放された状態)の指定が必要になるでしょう。 DRAIN
状態はノードが swarm マネージャから新しいタスクの受信を拒否します。また、マネージャは対象ノード上のタスクを停止し、レプリカ(複製)タスクを別の ACTIVE
状態のノードで起動します。
重要
ノードに対して DRAIN
を設定しても、ノード上で docker run
や docker-compose up
や他の Docker Engine API で作成したスタンドアロン・コンテナは削除しません。 DRAIN
を含むノードの状態が影響を与えているのは、 swarm サービスのワークロードとしてスケジュールされたものだけです。
- 準備がまだであれば、ターミナルを開き、 manager ノードを実行しているマシンに SSH で入ります。たとえば、このチュートリアルでは
manager1
という名前のマシンを使います。
すべてのノードが利用可能(available)な状態を確認します。
$ 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 tasks 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 manager はノードごとに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 ...snip...
ドレインしたノードの AVAILABILITY
は Drain
です。
docker service ps redis
を実行し、swarm manager が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 ...省略...
次は何をしますか?¶
swarm モード・ルーティング・メッシュを使う を学びましょう。
参考
- Drain a node on the swarm
- https://docs.docker.com/engine/swarm/swarm-tutorial/drain-node/