Permalink
Fetching contributors…
Cannot retrieve contributors at this time
389 lines (227 sloc) 14.6 KB

Docker Swarm ディスカバリ

Docker Swarm は複数のディスカバリ・バックエンドに対応しています。Docker Swarm はホステット・ディスカバリ・サービス(hosted discovery service)が利用可能です。このサービスは クラスタ上の IP アドレスの一覧を保持します。このページでは利用可能な様々なホステット・ディスカバリを紹介します。

分散キーバリュー・ストアの利用

Swarm でノードをディスカバリ(発見)するのに推奨される方法は、Docker による libkv プロジェクトの利用です。libkv プロジェクトとは既存の分散キーバリュー・ストア上の抽象化レイヤです。この原稿を書いている時点で、プロジェクトがサポートしているのは次の通りです。

  • Consul 0.5.1 以上
  • Etcd 2.0 以上
  • ZooKeeper 3.4.5 以上

libkv についてやサポートしているバックエンドに対する技術的な詳細は、 libkv プロジェクト をご覧ください。

ホステット・ディスカバリ・キーストアを使用

  1. 各ノードで Swarm エージェントを起動します。

ノード の IP アドレスは Swarm マネージャがアクセス可能であれば十分であり、パブリックな IP アドレスを持つ必要はありません。大きなクラスタになれば、Swarm に対するノードの参加が、ディスカバリ時に過負荷となる可能性があります。例えば、沢山のノードをスクリプトで登録する場合や、ネットワーク障害から復旧する時です。この影響によりディスカバリが失敗するかもしれません。そのような場合は、 --delay オプションで遅延上限を指定できます。そうすると、Swarm への登録がランダムに遅延して行われますが、指定した時間を上回ることはありません。

Etcd:

swarm join --advertise=<node_ip:2375> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>

Consul:

swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>

ZooKeeper:

swarm join --advertise=<node_ip:2375> zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
  1. Swarm マネージャをサーバもしくはノート PC 上で起動します。

Etcd:

swarm manage -H tcp://<swarm_ip:swarm_port> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>

Consul:

swarm manage -H tcp://<swarm_ip:swarm_port> consul://<consul_addr>/<optional path prefix>

ZooKeeper:

swarm manage -H tcp://<swarm_ip:swarm_port> zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
  1. 通常の Docker コマンドを実行します。
docker -H tcp://<swarm_ip:swarm_port> info
docker -H tcp://<swarm_ip:swarm_port> run ...
docker -H tcp://<swarm_ip:swarm_port> ps
docker -H tcp://<swarm_ip:swarm_port> logs ...
...
  1. クラスタ上のノード一覧を表示します。

Etcd:

swarm list etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
<node_ip:2375>

Consul:

swarm list consul://<consul_addr>/<optional path prefix>
<node_ip:2375>

ZooKeeper:

swarm list zk://<zookeeper_addr1>,<zookeeper_addr2>/<optional path prefix>
<node_ip:2375>

分散キーバリュー・ディスカバリに TLS を使う

分散キーバリュー・ストアと安全に通信できるようにするため、TLS を利用できます。ストアへ安全に接続するには、Swarm クラスタにノードが join (参加)する時に使う証明書を生成しなくてはいけません。証明書に対応しているのは Consul と Etcd のみです。以下は Consul を使う例です。

swarm join \
    --advertise=<node_ip:2375> \
    --discovery-opt kv.cacertfile=/path/to/mycacert.pem \
    --discovery-opt kv.certfile=/path/to/mycert.pem \
    --discovery-opt kv.keyfile=/path/to/mykey.pem \
    consul://<consul_addr>/<optional path prefix>

これは Swarm の managelist コマンドを使う場合も同様です。

静的なファイルまたはノード・リスト

ディスカバリ・バックエンドとして静的なファイルもしくはノードのリストを使えます。このファイルは Swarm マネージャがアクセス可能なホスト上に置く必要があります。あるいは、Swarm 起動時にオプションでノードのリストを指定することもできます。

静的なファイルあるいは nodes オプションは IP アドレスの範囲指定をサポートしています。特定のパターンで範囲を指定するには、例えば 10.0.0.[10:200] を指定したら、 10.0.0.10 から 10.0.0.200 までのノードを探そうとします。以下は file(ファイル) ディスカバリ手法を使う例です。

$ echo "10.0.0.[11:100]:2375"   >> /tmp/my_cluster
$ echo "10.0.1.[15:20]:2375"    >> /tmp/my_cluster
$ echo "192.168.1.2:[2:20]375"  >> /tmp/my_cluster

あるいはノードの直接指定でディスカバリするには、次のように実行します。

swarm manage -H <swarm_ip:swarm_port> "nodes://10.0.0.[10:200]:2375,10.0.1.[2:250]:2375"

ファイルを作成する場合

  1. ファイルを編集し、各行にノードの情報を追加します。
echo <node_ip1:2375> >> /opt/my_cluster
echo <node_ip2:2375> >> /opt/my_cluster
echo <node_ip3:2375> >> /opt/my_cluster

この例では /opt/my_cluster というファイルを作成しています。任意のファイル名を指定できます。

  1. Swarm マネージャを何らかのマシン上で実行します。
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
  1. 通常の Docker コマンドを使います。
docker -H tcp://<swarm_ip:swarm_port> info
docker -H tcp://<swarm_ip:swarm_port> run ...
docker -H tcp://<swarm_ip:swarm_port> ps
docker -H tcp://<swarm_ip:swarm_port> logs ...
...
  1. クラスタ上のノード一覧を表示します。

    $ swarm list file:///tmp/my_cluster <node_ip1:2375> <node_ip2:2375> <node_ip3:2375>

ノード・リストを指定する場合

  1. マシンもしくはノート PC 上でマネージャを起動します。
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>

あるいは

swarm manage -H <swarm_ip:swarm_port> <node_ip1:2375>,<node_ip2:2375>
  1. 通常の Docker コマンドを実行します。
docker -H <swarm_ip:swarm_port> info
docker -H <swarm_ip:swarm_port> run ...
docker -H <swarm_ip:swarm_port> ps
docker -H <swarm_ip:swarm_port> logs ...
  1. クラスタ上のノード一覧を表示します。
$ swarm list file:///tmp/my_cluster
<node_ip1:2375>
<node_ip2:2375>
<node_ip3:2375>

Warning

Docker Hub ホステット・ディスカバリ・サービスはプロダクションでの利用が 推奨されていません 。これはテストや開発環境での利用を想定しています。プロダクション環境においては、ディスカバリ・バックエンドの項目をご覧ください。

Docker Hub のホステッド・ディスカバリ

この例は Docker Hub のホステッド・ディスカバリ・サービスを使います。Docker Hub のホステッド・ディスカバリ・サービスを使うには、インターネットに接続している必要があります。次のようにして Swarm クラスタを作成します。

  1. まずクラスタを作成します。
# クラスタを作成
$ swarm create
6856663cdefdec325839a4b7e1de38e8 # <- これが各自の <クラスタID> です
  1. 各ノードを作成し、クラスタに追加します。

各ノードで Swarm エージェントを起動します。Swarm Manager がアクセス可能であれば、<node_ip> はパブリックである必要はありません(例:192.168.0.x)。

$ swarm join --advertise=<node_ip:2375> token://<cluster_id>
  1. Swarm マネージャを起動します。

これはあらゆるマシン上だけでなく、自分のノート PC 上でも実行できます。

$ swarm manage -H tcp://<swarm_ip:swarm_port> token://<cluster_id>
  1. 通常の Docker コマンドでクラスタと通信します。
docker -H tcp://<swarm_ip:swarm_port> info
docker -H tcp://<swarm_ip:swarm_port> run ...
docker -H tcp://<swarm_ip:swarm_port> ps
docker -H tcp://<swarm_ip:swarm_port> logs ...
...
  1. クラスタのノード情報一覧を表示します。
swarm list token://<cluster_id>
<node_ip:2375>

新しいディスカバリ・バックエンドに貢献

あなたも Swarm 向けに新しいディスカバリ・バックエンドに貢献できます。どのようにするかは、 Docker Swarm リポジトリにある discovery README をお読みください。

Docker Swarm ドキュメント目次

.. seealso::

   Docker Swarm Discovery
      https://docs.docker.com/swarm/discovery/