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

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

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

重要

ノードに対して DRAIN を設定しても、ノード上で docker rundocker-compose up や他の 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. 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つのタスクを分散しました。皆さんの環境によっては、別のノードに分散されて見えるかもしれません。

  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
    ...snip...
    

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

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

  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
    ...省略...