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 promote
とdocker node demote
は、それぞれdocker node update --role manager
とdocker node update --role worker
の省略形です。
Swarm ノードへのプラグインのインストール
Swarm サービスが プラグイン をいくつか必要としている場合は、サービスがデプロイされる可能性のあるすべてのノード上において、そのプラグインが利用できることが必要です。
プラグインのインストールは、各ノード上において手動で行うか、スクリプトを用意して行うことになります。
Docker API を利用するグローバルサービスと同様の方法により、プラグインをデプロイすることができます。
その際にはContainerSpec
ではなくPluginSpec
を利用します。
メモ
今のところ、Docker CLI や Docker Compose を使って、プラグインを Swarm にデプロイする手段はありません。 さらにプライベートリポジトリからプラグインをインストールすることもできません。
プラグイン開発者が PluginSpec
というものを定義しています。
Docker ノードすべてにプラグインをインストールするには、TaskTemplate
内にPluginSpec
JSON を定義して 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