クラスタ・リソースのセットアップ¶
基礎となるネットワーク基盤を構築 できましたので、Swarm クラスタの構築と設定を行う準備が整いました。以後、Swarm クラスタ上のホストを ノード と呼びます。そのため、AWS EC2 インスタンスをノードとして言及し、それぞれのノードを EC2 ダッシュボード上に表示されるノードの 名前 で呼びます。
Swarm クラスタの構築は、以下の手順で進めます。
- Consul をディスカバリ・バックエンドに使います。
frontend
とworker
を追加します。store
EC2 インスタンスをクラスタに追加します。spread
スケジューリング・ストラテジを使います。
すべての作業は Swarm マネージャ・ノード上で行います。マネージャ・ノードはクラスタ上の全てのインスタンスにアクセス可能です。
ステップ1:クラスタの構築¶
このステップでは Consul コンテナを使い Swarm ディスカバリ・サービスを作成します。また、Consul バックエンドをコンテナ・ネットワーク用のキーバリュー・ストアとしても使います。これは後ろの方のステップで、Swarm クラスタをオーバレイします(覆います)。Consul コンテナを起動した後、Swarm マネージャ用コンテナを起動します。
manager
ノードを選び、 Connect を押すと``ssh`` に必要なコマンドが表示されます。
- ターミナルを開き、
manager
ノードにssh
コマンドで接続します。
- TCP ポート
8500
をリッスンする Consul コンテナを起動します。
$ docker run --restart=unless-stopped -d -p 8500:8500 -h consul progrium/consul -server -bootstrap
Unable to find image 'progrium/consul:latest' locally
latest: Pulling from progrium/consul
3b4d28ce80e4: Pull complete
...<output snip>...
d9125e9e799b: Pull complete
Digest: sha256:8cc8023462905929df9a79ff67ee435a36848ce7a10f18d6d0faba9306b97274
Status: Downloaded newer image for progrium/consul:latest
6136de6829916430ee911cc14e3f067624fcf6d3041d404930f6dbcbf5399f7d
- コンテナが実行中なのを確認します。
$ docker ps
IMAGE COMMAND CREATED STATUS PORTS NAMES
6136de682991 progrium/consul "/bin/start -server -" About a minute ago Up About a minute 53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 0.0.0.0:8500->8500/tcp, 8301-8302/udp goofy_jepsen
- Swarm マネージャ・コンテナを起動します。
次のコマンドは manager
ノード上のポート 3375
に Swarm マネージャ・コンテナのポート 2375
を割り当てます。
$ docker run --restart=unless-stopped -d -p 3375:2375 swarm manage consul://192.168.33.11:8500/
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
887115b43fc0: Pull complete
...<output snip>...
f3f134eb6413: Pull complete
Digest: sha256:51a8eba9502f1f89eef83e10b9f457cfc67193efc3edf88b45b1e910dc48c906
Status: Downloaded newer image for swarm:latest
f5f093aa9679410bee74b7f3833fb01a3610b184a530da7585c990274bd65e7e
Swarm マネージャ・コンテナは Swarm クラスタの中心です。クラスタに送信された全ての Docker コマンドを受信する役割を持ちます。また、クラスタに対してリソースをスケジューリングする役割もあります。プロダクション環境へ実際にデプロイする場合は、高可用性(HA)のためにセカンダリとしての複製(replica) Swarm マネージャを設定すべきでしょう。
- Docker のインストール情報を確認します。
$ docker info
Containers: 2
Images: 26
Server Version: 1.9.1
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 30
Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.16.0-57-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 1
Total Memory: 992.2 MiB
Name: manager
ID: IISM:V4KJ:VXCT:ONN3:MFIJ:2ZLD:VI6I:UYB3:FJZ4:3O7J:FHKA:P3XS
WARNING: No swap limit support
Cluster store: consul://192.168.33.11:8500
Cluster advertise: 192.168.33.11:2375
コマンドを実行すると Docker Engine とデーモンに関する情報を返します。
consul
とswarm manage
コンテナの実行を確認します。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5f093aa9679 swarm "/swarm manage consul" About a minute ago Up About a minute 0.0.0.0:3375->2375/tcp sad_goldstine
6136de682991 progrium/consul "/bin/start -server -" 9 minutes ago Up 9 minutes 53/tcp, 53/udp, 8300-8302/tcp, 8301-8302/udp, 8400/tcp, 0.0.0.0:8500->8500/tcp goofy_jepsen
DOCKER_HOST
環境変数をセットします。
これは Docker Engine CLI コマンド実行時のデフォルト・エンドポイントを、 manager
ノード上で実行している Engine デーモンに変更します。
$ export DOCKER_HOST="tcp://192.168.33.11:3375"
- これでターミナル環境が Swarm のポートにセットされました。
docker info
コマンドの結果を確認します。
$ docker info
Containers: 0
Images: 0
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 0
Kernel Version: 3.16.0-57-generic
Operating System: linux
CPUs: 0
Total Memory: 0 B
Name: f5f093aa9679
コマンドは Swarm のポートに対して処理しまし。つまり、ここで表示されたのはクラスタ全体の情報です。管理するマネージャはありますが、ノードはまだありません。
master
ノード上で、クラスタ上の各ノードを1つ1つクラスタに追加します。
manager
ノードのコマンドライン上で、各ノード向けのコマンドを実行します。 docker
コマンドで -H
フラグを使いノードの IP アドレスと Engine のポート番号を指定できます。各コマンドは各ノード上の Docker デーモンをクラスタに追加します。 join
コマンドはクラスタにノードを追加・登録します。これを Consul ディスカバリ・サービスを使って行います。
frontend01:
docker -H=tcp://192.168.33.20:2375 run -d swarm join --advertise=192.168.33.20:2375 consul://192.168.33.11:8500/
frontend02:
docker -H=tcp://192.168.33.21:2375 run -d swarm join --advertise=192.168.33.21:2375 consul://192.168.33.11:8500/
worker01:
docker -H=tcp://192.168.33.200:2375 run -d swarm join --advertise=192.168.33.200:2375 consul://192.168.33.11:8500/
store:
docker -H=tcp://192.168.33.250:2375 run -d swarm join --advertise=192.168.33.250:2375 consul://192.168.33.11:8500/
docker info
コマンドをもう一度実行し、クラスタ内の全てのノード情報を表示します。
$ docker info
Containers: 4
Images: 4
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 4
frontend01: 192.168.33.20:2375
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.017 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-57-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-02-14T19:02:53Z
frontend02: 192.168.33.21:2375
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.017 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-57-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-02-14T19:02:58Z
store: 192.168.33.250:2375
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 3.86 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-57-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-02-14T19:02:58Z
worker01: 192.168.33.200:2375
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.017 GiB
└ Labels: executiondriver=native-0.2, kernelversion=3.16.0-57-generic, operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-02-14T19:03:21Z
Kernel Version: 3.16.0-57-generic
Operating System: linux
CPUs: 4
Total Memory: 6.912 GiB
Name: f5f093aa9679
ステップ2:作業内容の確認¶
次の図は、これまでに作成した Swarm クラスタです。
manager
ノードで consul
と swarm
という2つのコンテナを実行しています。 consul
コンテナは Swarm ディスカバリ・サービスを提供します。これはどこにノードやサービスがあるかお互いに登録するもので、お互いを発見できるようにします。 swarm
コンテナは swarm manage
プロセスとして実行されます。これはクラスタ・マネージャとして動作する状態です。マネージャはクラスタに対する Docker コマンドの実行を受付、クラスタ上のリソースに対してスケジューリングする役割です。
..You mapped port 3375 on the manager node to port 2375 inside the swarm container. As a result, Docker clients (for example the CLI) wishing to issue commands against the cluster must send them to the manager node on port 3375. The swarm container then executes those commands against the relevant node(s) in the cluster over port 2375.
先ほど manager
ノード上のポート 3375 を swarm
コンテナ内の 2375 に割り当てました。そのため、Docker クライアント(例えば CLI )でクラスタに対してコマンドを実行しようとする時は、 manager
ノード上のポート 3375 に送信する必要があります。 swarm
コンテナはクラスタ上の適切なノードに対し、ポート 2375 を通してコマンドを実行します。
これで Swarm クラスタの設定は完了です。アプリケーション・コンテナの一部として使うコンテナ・ネットワークを被せましょう。
ステップ2:コンテナ・ネットワークを被せる¶
全てのコンテナは投票アプリケーションの一部であり、 mynet
という名前のコンテナ・ネットワークに所属しています。コンテナのネットワークは Docker Engine の機能です。 mynet
ネットワークはオーバレイ・ネットワーク・タイプであり、ネットワーク通信上に構築します。
コンテナのネットワークは、複数ネットワーク上の複数ホストを横断できます。そのため、投票アプリケーション用コンテナは、 mynet
コンテナ・ネットワークを通して、どのノード上に存在していても簡単に通信できるようにします。
ネットワークを作成し、Docker Engine が動くあらゆる VPC ノート上のコンテナを追加できます。しかしながら、Docker Swarm に対してコマンドを実行するベスト・プラクティスは、 manager
ノードから全ての管理タスクが実行されることです。
manager
ノードにssh
のターミナルで接続していなければ、接続します。
manager
ノード上でネットワークの情報を確認します。
CLI がマネージャ・ノードの Engine を参照するように、 -H
フラグを使います。
$ docker -H=tcp://192.168.33.11:2375 network ls
NETWORK ID NAME DRIVER
d01e8f0303a9 none null
bab7a9c42a23 host host
12fd2a115d85 bridge bridge
- 同様にクラスタの情報を取得します。
export DOCKER_HOST="tcp://192.168.33.11:3375"
を実行します。このコマンドで Swarm のポートに接続すると、クラスタ上にある各ノードの情報を返します。
$ docker network ls
NETWORK ID NAME DRIVER
82ce2adce6a7 store/bridge bridge
c3ca43d2622d store/host host
d126c4b1e092 frontend01/host host
6ea89a1a5b6a frontend01/bridge bridge
d3ddb830d7f5 frontend02/host host
44f238353c14 frontend02/bridge bridge
c500baec447e frontend02/none null
77897352f138 store/none null
8060bd575770 frontend01/none null
429e4b8c2c8d worker01/bridge bridge
57c5001aca83 worker01/none null
2101103b8494 worker01/host host
docker network
コマンドでオーバレイ・ネットワークを作成します。
$ docker network create --driver overlay mynet
- 2つのネットワークコマンドを実行して、どのようにネットワークが変わったのかを確認します。
docker network ls
docker -H=tcp://192.168.33.11:2375 network ls
Swarm ノードの全てが consul://192.168.33.11:8500
の Consul ディスカバリ・サービスを使って設定されたものです。これらは新しいオーバレイ・ネットワーク上でも見えます。詳細は次のステップで確認します。
- 個々のノード上で network コマンドを試してみましょう。例えば、
frontend01
ノード上で実行するには、次のようにします。
docker -H=tcp://192.168.33.20:2375 network ls
出力結果から mynet
ネットワークは overlay
ドライバを使っているのが分かります。どのノードでコマンドを実行しても、同じオーバレイ・ネットワークが有効なことが分かるでしょう。
ステップ4:作業内容の確認¶
以下の図は mynet``オーバレイ・コンテナ・ネットワーク設定が行われ、クラスタ設定が完了した状態です。 ``mynet
は図中の赤いマークとして確認できるところで、Docker ホストは Consul ディスカバリ・バックエンドを使っています。後の手順でコンテナをこのネットワークに接続します。
manager
ノード上の swarm
と consul
コンテナは mynet
オーバレイ・ネットワークに接続していません。これらのコンテナは manager
ノード上のデフォルト・ブリッジ・ネットワーク上で動作しています。この状態を確認するには2つのコマンドを実行します。
docker -H=tcp://192.168.33.11:2375 network inspect bridge
docker -H=tcp://192.168.33.11:2375 network inspect mynet
2つのコンテナは manager
ノード上の bridge
ネットワークで動いていますが、まだ mynet
ネットワークには所属していません。
次のステップ¶
Swarm クラスタの構築が終わりましたので、ここに 投票アプリケーションを構築・実行 する準備が整いました。
参考
- Setup cluster resources
- https://docs.docker.com/swarm/swarm_at_scale/03-create-cluster/