Swarm でのノード管理

読む時間の目安: 3 分

Swarm 管理のライフサイクルの中では、以下のようなノード参照やノード更新が必要になります。

ノードの一覧表示

Swarm 内のノード一覧を表示するには、マネージャーノードからdocker node lsを実行します。

$ docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
46aqrk4e473hjbt745z53cr3t    node-5    Ready   Active        Reachable
61pi3d91s0w3b90ijw3deeb2q    node-4    Ready   Active        Reachable
a5b2m3oghd48m8eu391pefq5u    node-3    Ready   Active
e7p8btxeu3ioshyuj6lxiv6g0    node-2    Ready   Active
ehkv3bcimagdese79dn78otj5 *  node-1    Ready   Active        Leader

AVAILABILITY欄は、そのノードに対してスケジューラーがタスクを割り当てることができるかどうかを表わします。

  • Activeは、スケジューラーがノードにタスクを割り当てられることを表わします。
  • Pauseは、スケジューラーがノードに新たなタスクを割り当てられないことを表わします。 ただし既存のタスクは実行し続けることができます。
  • Drainは、スケジューラーがノードに新たなタスクを割り当てられないことを表わします。 スケジューラーは既存のタスクを停止させて、利用可能な別のノードにタスクをスケジューリングします。

MANAGER STATUS欄は、Raft 合意(Raft consensus)に従ったノードの参加状況を表わします。

  • 表示がないものはワーカーノードであり、Swarm 管理に参加していないことを表わします。
  • Leader(リーダー) は、主となるマネージャーノードであることを表わします。 Swarm において、すべての Swarm 管理操作やオーケストレーション決定を行います。
  • Reachable(到達可能)は、Raft 合意(Raft consensus)の多数票(quorum)に参加しているマネージャーノードを表わします。 リーダーノードが利用不能になったときに、新たなリーダーとして選任される資格を持つノードです。
  • Unavailable(利用不能)は、他のマネージャーとの通信ができなくなっているマネージャーを表わします。 マネージャーノードが利用不能になった場合、新たなマネージャーノードを Swarm に参加させるか、ワーカーノードをマネージャーに昇格させる必要があります。

Swarm の管理操作に関する詳細は Swarm 管理ガイド を参照してください。

ノードの詳細表示

マネージャーノード上においてdocker node inspect <NODE-ID>を実行して、個々のノードについての詳細を確認することができます。 出力はデフォルトで JSON 形式です。 --prettyフラグを指定すれば、読みやすい書式で出力することができます。 たとえば以下のとおりです。

$ docker node inspect self --pretty

ID:                     ehkv3bcimagdese79dn78otj5
Hostname:               node-1
Joined at:              2016-06-16 22:52:44.9910662 +0000 utc
Status:
 State:                 Ready
 Availability:          Active
Manager Status:
 Address:               172.17.0.2:2377
 Raft Status:           Reachable
 Leader:                Yes
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  2
 Memory:                1.954 GiB
Plugins:
  Network:              overlay, host, bridge, overlay, null
  Volume:               local
Engine Version:         1.12.0-dev

ノードの更新

ノードの属性は以下のようにして修正することができます。

ノードの利用状況の変更

ノードの利用状況(availability)は、以下のような変更を行うことができます。

  • マネージャーノードを排出(drain)することができます。 このマネージャーノードは、Swarm の管理タスクのみを実行しますが、タスク割り当ては行いません。
  • ノードを排出することで、このノードの保守を行うことができます。
  • ノードを一時停止すると、新たなタスクを受け入れることはできません。
  • 利用不能や一時停止したノードを、利用可能な状態に戻すことができます。

たとえばマネージャーノードの利用状況をDrainにするには以下を行います。

$ docker node update --availability drain node-1

node-1

別の利用状況オプションの説明については、ノードの一覧出力 を参照してください。

ラベルメタデータの追加や削除

ノードにラベルをつけておくと、ノードを構成する上で柔軟な運用が可能になります。 ノードラベルはサービスの制約を示すものとして利用することもできます。 サービスを作成するときに、スケジューラーのノードに対するタスク割り当てに制限がある場合には、制約を適用してください。

マネージャーノード上からdocker node update --label-addを実行して、ノードにラベルメタデータを追加します。 --label-addフラグは、単独の<key>、または<key>=<value>のペア表記のいずれも可です。

ラベルを追加するノードに対して、一度だけ--label-addフラグをつけて以下を実行します。

$ docker node update --label-add foo --label-add bar=baz node-1

node-1

docker node update を使ってノード用に設定するラベルは、Swarm 内のノードにしか適用されません。 Docker デーモン dockerd におけるラベルと混同しないように注意してください。

そこで特定要件を満たすノードには、重要タスクのみを限定して割り当てるように、ノードラベルを活用することができます。 特別な処理を実行させるマシン、たとえば PCI-SS コンプライアンス を満たすマシンだけをスケジュールするような場合です。

ワーカーが侵害されても、そもそもノードラベルの変更はできないので、その特別な処理が侵害されることはありえません。

Engine ラベルは今でも活用できます。 コンテナーの機能の中には、オーケストレーションの安全性に影響を及ぼさない機能もあるので、そういった機能は分散化されることの方がよい場合があるので、Engine ラベルを利用できます。 たとえばノードに特定のディスクデバイスがあることを示すために、ラベルを設定します。 これを行ったからといって、おそらくセキュリティに直接関係しないはずです。 こういったラベルなら Swarm オーケストレーターは、より「安心して」利用することができます。

サービスの制約に関する詳細は CLI リファレンスのdocker service create を参照してください。

ノードの昇格と降格

ワーカーノードはマネージャーに昇格させることができます。 マネージャーノードの 1 つが利用不能になるとか、マネージャーをオフラインにしてメンテナンスを行いたいといったときに、昇格操作を活用します。 同様にマネージャーノードをワーカーへと降格させることもできます。

メモ: ノードの昇格や降格の理由がどのようなものであっても、Swarm 内のマネージャーノードの quorum は常に維持しておかなければなりません。 詳しくは Swarm 管理ガイド を参照してください。

1 つあるいは複数のノードを昇格させるには、マネージャーノードからdocker node promoteを実行します。

$ docker node promote node-3 node-2

Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.
$ docker node promote node-3 node-2

ノード node-3 がこの Swarm においてマネージャーに昇格しました。
ノード node-2 がこの Swarm においてマネージャーに昇格しました。

1 つあるいは複数のノードを降格させるには、マネージャーノードからdocker node demoteを実行します。

$ docker node demote node-3 node-2

Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.
$ docker node demote node-3 node-2

ノード node-3 がこの Swarm において降格しました。
ノード node-2 がこの Swarm において降格しました。

docker node promotedocker node demoteは、それぞれdocker node update --role managerdocker node update --role workerの省略形です。

Swarm ノードへのプラグインのインストール

Swarm サービスが プラグイン をいくつか必要としている場合は、サービスがデプロイされる可能性のあるすべてのノード上において、そのプラグインが利用できることが必要です。 プラグインのインストールは、各ノード上において手動で行うか、スクリプトを用意して行うことになります。 Docker API を利用するグローバルサービスと同様の方法により、プラグインをデプロイすることができます。 その際にはContainerSpecではなくPluginSpecを利用します。

メモ

今のところ、Docker CLI や Docker Compose を使って、プラグインを Swarm にデプロイする手段はありません。 さらにプライベートリポジトリからプラグインをインストールすることもできません。

プラグイン開発者が PluginSpec というものを定義しています。 Docker ノードすべてにプラグインをインストールするには、TaskTemplate内にPluginSpecJSON を定義して service/create API を利用します。

Swarm からのノード除外

ノード上においてdocker swarm leaveコマンドを実行すると、Swarm からそのノードが除外されます。

たとえばワーカーノードを Swarm から除外します。

$ docker swarm leave

Node left the swarm.
$ docker swarm leave

ノードが Swarm から除外されました。

ノードが Swarm から除外されると、Docker Engine は Swarm モードを停止させます。 オーケストレーターは、そのノードに対してタスクをスケジュールすることはなくなります。

除外するノードがマネージャーノードの場合、quorum を維持することを警告するメッセージが表示されます。 警告表示をなくすには--forceフラグをつけます。 最後に残ったマネージャーノードが除外されてしまうと、Swarm は利用不能になります。 これに対しては障害復旧の手段を講じるしかありません。

quorum の維持や障害復旧に関する詳細は Swarm 管理ガイド を参照してください。

ノードを Swarm から除外した後に、マネージャーノード上においてdocker node rmコマンドを実行すれば、ノード一覧からそのノードを削除することができます。

たとえば以下のとおりです。

$ docker node rm node-2

さらに詳しく

guide, swarm mode, node