Swarm ノードの解放

読む時間の目安: 2 分

このチュートリアルの初めの方では、実行されているノードの利用状態(availability)はACTIVEになっていました。 Swarm マネージャーはACTIVEなノードであるからこそ、タスクを割り振ることができます。 ここまでのところは、ノードがすべて利用可能であったから、タスクを受け取ることができたわけです。

たとえば定期メンテナンスの時などでは、ノードの利用状態を DRAIN、つまり解放状態にしておくことが必要な場合があります。 DRAINという状態にあるノードは Swarm マネージャーから、新たなタスクを受け取ることができません。 またそのノード上に実行されていたタスクは、マネージャーによって停止され、ACTIVE状態にある別のノードに複製タスクが割り振られます。

重要: スタンドアロンコンテナーは docker rundocker-compose up、あるいは Docker Engine API を使って生成されますが、ノードの状態をDRAINにするということは、そのノードからスタンドアロンコンテナーを削除するという意味ではありません。 DRAINも含めてノードの状態というものは、Swarm サービスによる処理スケジューリングにあたり、ノードの利用能力の有無を決めるものでしかありません。

  1. マシンへの接続ができていなければ、端末画面を開いて SSH により接続します。 接続先はマネージャーノードを起動したマシンです。 たとえばこのチュートリアルではmanager1というマシンを利用します。

  2. ノードがすべてアクティブであって利用可能であることを確認します。

    $ docker node ls
    
    ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    1bcef6utixb0l0ca7gxuivsj0    worker2   Ready   Active
    38ciaotwjuritcdtn9npbnkuz    worker1   Ready   Active
    e216jshn25ckzbvmwlnh5jr3g *  manager1  Ready   Active        Leader
    
  3. チュートリアルの ローリングアップデート におけるredisを停止してしまっている場合は、ここで起動します。

    $ docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
    
    c5uo6kdmzpon37mgj9mwglcfw
    
  4. 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 つのタスクを各ノードに分散しています。 実行環境によっては、複数ノード間でのタスク分散の仕方が異なっているかもしれません。

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

    $ docker node update --availability drain worker1
    
    worker1
    
  6. ノードが利用可能であるか(availability)を確認します。

    $ docker node inspect --pretty worker1
    
    ID:			38ciaotwjuritcdtn9npbnkuz
    Hostname:		worker1
    Status:
     State:			Ready
     Availability:		Drain
    ...snip...
    

    解放したノードのAVAILABILITYDrainと示されています。

  7. 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状態にあるノード上に新たなタスクを生成します。

  8. docker node update --availability active <ノードID>を実行すれば、解放状態にあったノードをアクティブ状態に戻すことができます。

    $ docker node update --availability active worker1
    
    worker1
    
  9. ノードの状態が更新されていることを確認します。

    $ docker node inspect --pretty worker1
    
    ID:			38ciaotwjuritcdtn9npbnkuz
    Hostname:		worker1
    Status:
     State:			Ready
     Availability:		Active
    ...snip...
    

    ノードの状態をActiveに戻した場合、新たなタスクを受け取るようになるのは、以下のときです。

    • サービスがスケールアップするために更新されたとき。
    • ローリングアップデートのとき。
    • 別のノードの状態をDrainにしたとき。
    • 別のアクティブなノードにおいてタスクが失敗したとき。

次にすることは

Swarm モードでのルーティングメッシュの利用 について学びます。

tutorial, cluster management, swarm, service, drain