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

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

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

重要

ノードに対して DRAIN を設定しても、ノード上で dockerrundocker-composeup や他の Docker Engine API で作成したスタンドアロン・コンテナは削除しません。 DRAIN を含むノードの状態が影響を与えているのは、 swarm サービスのワークロードとしてスケジュールされたものだけです。

  1. 準備がまだであれば、ターミナルを開き、 manager ノードを実行しているマシンに SSH で入ります。たとえば、このチュートリアルでは manager1 という名前のマシンを使います。

  1. すべてのノードが利用可能(available)な状態を確認します。

    $ docker node ls
    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    1bcef6utixb0l0ca7gxuivsj0 worker2 Ready Active
    38ciaotwjuritcdtn9npbnkuz worker1 Ready Active
    e216jshn25ckzbvmwlnh5jr3g * manager1 Ready Active Leader
  1. ローリング・アップデート チュートリアルの redis サービスを起動していなければ、今起動します。

    $ docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
    c5uo6kdmzpon37mgj9mwglcfw
  1. dockerservicetasksredis を実行したら、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つのタスクを分散しました。皆さんの環境によっては、別のノードに分散されて見えるかもしれません。

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

    docker node update --availability drain worker1
    worker1
  1. ノードが利用可能かどうか調べます。

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

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

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

  1. dockernodeupdate--availabilityactive<ノードID> を実行し、ドレイン(解放)したノードをアクティブ状態に戻します。

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

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

次は何をしますか?

swarm モード・ルーティング・メッシュを使う を学びましょう。