swarm からノードをドレイン(解放)

チュートリアルのこれまでのステップは、全て ACTIVE 状態で利用可能なノードでした。swarm マネージャはタスクをあらゆる ACTIVE ノード上に割り当て可能です。つまり、これまでの全てのノードがタスクを受け取れます。

とはいえ、たまにはメンテナンス時間の計画など、 DRAIN 状態(訳者注;ドレイン=離脱、解放された状態)の指定が必要になるでしょう。 DRAIN 状態はノードが swarm マネージャから新しいタスクの受信を拒否します。また、マネージャは対象ノード上のタスクを停止し、レプリカ(複製)タスクを別の ACTIVE 状態のノードで起動します。

  1. 準備がまだであれば、ターミナルを開き、マネージャ・ノードを実行しているマシンに SSH で入ります。たとえば、このチュートリアルでは manager1 という名前のマシンを使います。
  1. すべてのノードが利用可能(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
  1. ローリング・アップデート チュートリアルの redis サービスを起動していなければ、今起動します。
$ docker service create --replicas 3 --name redis --update-delay 10s --update-parallelism 1 redis:3.0.6

c5uo6kdmzpon37mgj9mwglcfw
  1. 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つのタスクを分散しました。皆さんの環境によっては、別のノードに分散されて見えるかもしれません。

  1. docker node update --availability drain <ノードID> を実行し、タスクが割り当てられているノードをドレイン(解放)します。
docker node update --availability drain worker1

worker1
  1. ノードが利用可能かどうか調べます。
$ docker node inspect --pretty worker1

ID:         38ciaotwjuritcdtn9npbnkuz
Hostname:       worker1
Status:
 State:         Ready
 Availability:      Drain
...省略...

ドレインしたノードの AVAILABILITYDrain です。

  1. 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 状態のノードで新しいタスクを作成します。

  1. docker node update --availability active <ノードID> を実行し、ドレイン(解放)したノードをアクティブ状態に戻します。
$ docker node update --availability active worker1

worker1
  1. ノードを調べ、状態の更新を確認します。
$ docker node inspect --pretty worker1

ID:          38ciaotwjuritcdtn9npbnkuz
Hostname:        worker1
Status:
State:          Ready
Availability:       Active
...省略...

ノードが Active 状態に戻れば、新しいタスクを受信できます。

  • サービスの更新をスケールアップするため
  • ローリング・アップデートするため
  • 他のノードを Drain 状態にした場合
  • 他のアクティブ・ノードでタスクに失敗した場合