Docker Swarm の高可用性

Docker Swarm の Swarm マネージャ は、クラスタ全体に対する責任を持ち、スケール時は複数 Docker ホスト のリソースを管理します。もし Swarm マネージャが停止したら、新しいマネージャを作成し、サービス中断に対処しなくてはいけません。

高可用性 (High Availability ) 機能により、Docker Swarm は管理インスタンスのフェイルオーバを丁寧に処理します。この機能を使うには、 プライマリ・マネージャ (primary manager) を作成し、複数の レプリカ (replica) インスタンスを作成できます。

プライマリ・マネージャは、Docker Swarm クラスタとの主な接点です。また、バックアップに用いるレプリカ・インスタンスの作成・通信もできます。レプリカにリクエストすると、プライマリ・マネージャを自動的にプロキシします。プライマリ・マネージャで障害が起これば、レプリカが主導権を取ります。このような方法で、クラスタと通信し続けられます。

プライマリとレプリカのセットアップ

このセクションは、複数の マネージャ を使って Docker Swarm をセットアップする方法を説明します。

前提条件

ここでは ConsuletcdZookeeper クラスタのいずれかが必要です。今回の手順では、 Consul サーバが 192.168.42.10:8500 で動作しているものと想定します。サンプルの Swarm は3台のマシンで構成されているものとします。

  • manager-1192.168.42.200 上で動作
  • manager-2192.168.42.201 上で動作
  • manager-3192.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-Ckill を実行したら、現在のプライマリ・マネージャ( 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/