Docker Swarm の高可用性¶
Docker Swarm の Swarm マネージャ は、クラスタ全体に対する責任を持ち、スケール時は複数 Docker ホスト のリソースを管理します。もし Swarm マネージャが停止したら、新しいマネージャを作成し、サービス中断に対処しなくてはいけません。
高可用性 (High Availability ) 機能により、Docker Swarm は管理インスタンスのフェイルオーバを丁寧に処理します。この機能を使うには、 プライマリ・マネージャ (primary manager) を作成し、複数の レプリカ (replica) インスタンスを作成できます。
プライマリ・マネージャは、Docker Swarm クラスタとの主な接点です。また、バックアップに用いるレプリカ・インスタンスの作成・通信もできます。レプリカにリクエストすると、プライマリ・マネージャを自動的にプロキシします。プライマリ・マネージャで障害が起これば、レプリカが主導権を取ります。このような方法で、クラスタと通信し続けられます。
プライマリとレプリカのセットアップ¶
このセクションは、複数の マネージャ を使って Docker Swarm をセットアップする方法を説明します。
前提条件¶
ここでは Consul
、 etcd
、Zookeeper
クラスタのいずれかが必要です。今回の手順では、 Consul
サーバが 192.168.42.10:8500
で動作しているものと想定します。サンプルの Swarm は3台のマシンで構成されているものとします。
manager-1
は192.168.42.200
上で動作manager-2
は192.168.42.201
上で動作manager-3
は192.168.42.202
上で動作
プライマリ・マネージャの作成¶
swarm manager
コマンドで --replication
と --advertise
フラグを指定し、プライマリ・マネージャを作成します。
user@manager-1 $ swarm manage -H :4000 <tls-config-flags> --replication --advertise 192.168.42.200:4000 consul://192.168.42.10:8500/nodes
INFO[0000] Listening for HTTP addr=:4000 proto=tcp
INFO[0000] Cluster leadership acquired
INFO[0000] New leader elected: 192.168.42.200:4000
[...]
--replication
フラグは、Swarm に対して複数のマネージャ設定における一部であると伝えます。また、このプライマリ・マネージャは、他のプライマリの役割を持つマネージャ・インスタンスと競合します。プライマリ・マネージャとは、クラスタ管理の権限を持ち、ログを複製し、クラスタ内で発生したイベントを複製します。
--advertise
オプションは、プライマリ・マネージャのアドレスを指定します。ノードがプライマリに選ばれた時、Swarm はこのアドレスをクラスタの通知用(advertise)に使います。先ほどのコマンド出力から分かるように、新しく選ばれたプライマリ・マネージャは指定したアドレスを使います。
2つのレプリカ(複製)を作成¶
プライマリ・マネージャを作ったら、次はレプリカを作成できます。
user@manager-2 $ swarm manage -H :4000 <tls-config-flags> --replication --advertise 192.168.42.201:4000 consul://192.168.42.10:8500/nodes
INFO[0000] Listening for HTTP addr=:4000 proto=tcp
INFO[0000] Cluster leadership lost
INFO[0000] New leader elected: 192.168.42.200:4000
[...]
このコマンドは 192.168.42.201:4000
上にレプリカ・マネージャを作成します。これは 192.168.42.200:4000
をプライマリ・マネージャとみなしています。
追加で、 3つめ のマネージャ・インスタンスを作成します。
user@manager-3 $ swarm manage -H :4000 <tls-config-flags> --replication --advertise 192.168.42.202:4000 consul://192.168.42.10:8500/nodes
INFO[0000] Listening for HTTP addr=:4000 proto=tcp
INFO[0000] Cluster leadership lost
INFO[0000] New leader elected: 192.168.42.200:4000
[...]
プライマリ・マネージャとレプリカを構成した後は、通常通りに Swarm エージェント を作成できます。
クラスタ内のマシン一覧¶
docker info
を実行したら、次のような出力が得られます。
user@my-machine $ export DOCKER_HOST=192.168.42.200:4000 # manager-1 を指し示す
user@my-machine $ docker info
Containers: 0
Images: 25
Storage Driver:
Role: Primary <--------- manager-1 is the Primary manager
Primary: 192.168.42.200
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 3
swarm-agent-0: 192.168.42.100:2375
└ Containers: 0
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.053 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.13.0-49-generic, operatingsystem=Ubuntu 14.04.2 LTS, storagedriver=aufs
swarm-agent-1: 192.168.42.101:2375
└ Containers: 0
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.053 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.13.0-49-generic, operatingsystem=Ubuntu 14.04.2 LTS, storagedriver=aufs
swarm-agent-2: 192.168.42.102:2375
└ Containers: 0
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.053 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.13.0-49-generic, operatingsystem=Ubuntu 14.04.2 LTS, storagedriver=aufs
Execution Driver:
Kernel Version:
Operating System:
CPUs: 3
Total Memory: 6.158 GiB
Name:
ID:
Http Proxy:
Https Proxy:
No Proxy:
この情報は manager-1
が現在のプライマリであると示しています。そして、このプライマリへ接続するのに使うアドレスが表示されています。
フェイルオーバ動作のテスト¶
フェイルオーバ動作をテストするには、特定のプライマリ・マネージャを停止します。 Ctrl-C
や kill
を実行したら、現在のプライマリ・マネージャ( manager-1
)は停止します。
自動フェイルオーバを待つ¶
直後に、他のインスタンスが障害を検出し、レプリカがプライマリ・マネージャの主導権を得ます。
例えば、 manager-2
のログを確認します。
user@manager-2 $ swarm manage -H :4000 <tls-config-flags> --replication --advertise 192.168.42.201:4000 consul://192.168.42.10:8500/nodes
INFO[0000] Listening for HTTP addr=:4000 proto=tcp
INFO[0000] Cluster leadership lost
INFO[0000] New leader elected: 192.168.42.200:4000
INFO[0038] New leader elected: 192.168.42.201:4000
INFO[0038] Cluster leadership acquired <--- 新しいプライマリ・マネージャに選出された
[...]
これはプライマリ・マネージャ manager-1
で障害が発生しました。その後、 192.168.42.201:4000
のアドレスを持つ manager-2
のレプリカが障害を検出したため、主導権を(manager-1から)取り上げてリーダーに選出されました。理由は manager-2
は十分な速さで、プライマリ・マネージャとして選出手続きを実質的に行ったからです。その結果、 manager-2
がクラスタ上のプライマリ・マネージャになりました。
manager-3
を見れば、次のような ログが表示されるでしょう。
user@manager-3 $ swarm manage -H :4000 <tls-config-flags> --replication --advertise 192.168.42.202:4000 consul://192.168.42.10:8500/nodes
INFO[0000] Listening for HTTP addr=:4000 proto=tcp
INFO[0000] Cluster leadership lost
INFO[0000] New leader elected: 192.168.42.200:4000
INFO[0036] New leader elected: 192.168.42.201:4000 <--- manager-2 が新しいプライマリ・マネージャに
[...]
この時点で、新しい DOCKER_HOST
の値を指定する必要があります。
プライマリに切り替え¶
DOCKER_HOST
をプライマリとしての manager-2
に切り替えるには、次のようにします。
user@my-machine $ export DOCKER_HOST=192.168.42.201:4000 # manager-2 を指定
user@my-machine $ docker info
Containers: 0
Images: 25
Storage Driver:
Role: Replica <--------- manager-2 はレプリカ
Primary: 192.168.42.200
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 3
docker
コマンドは Docker Swarm プライマリ・マネージャ、あるいは、あらゆるレプリカ上で実行できます。
好みによって、 何らかの仕組みを使うことにより、DOCKER_HOST
が現在のプライマリ・マネージャを常に示すよう にも可能です。そうしておけば、フェイルオーバ発生の度に、Docker Swarm に対する接続を失うことは無いでしょう。
参考
- High availability in Docker Swarm
- https://docs.docker.com/swarm/multi-manager-setup/