CentOS7

Docker : Docker Swarm を利用する

Docker Swarm を利用して、複数の Docker ホストでクラスター環境を構成します。

当例では以下の 3台の Docker ホストを使用して設定します。

Swarm クラスターではマネージャーノード [Manager nodes] とワーカーノード [Worker nodes] の二つの役割がありますが、 いずれの役割も複数ノード設定可能ですが、当例では以下のように node01 をマネージャーノード、その他をワーカーノードとして設定します。

-----------+---------------------------+--------------------------+------------
           |                           |                          |
       eth0|10.0.0.51              eth0|10.0.0.52             eth0|10.0.0.53
+----------+-----------+   +-----------+----------+   +-----------+----------+
| [ node01.hoge.com ] |   | [ node02.hoge.com ] |   | [ node03.hoge.com ] |
|       Manager        |   |        Worker        |   |        Worker        |
+----------------------+   +----------------------+   +----------------------+

こちらを参照して全ノードで Docker サービスを起動しておきます。

なお、当例では Docker Engine 内蔵の Swarm モード機能を利用します。よって、Docker Engine のバージョンが v1.12 以降であることが前提です。 Docker のバージョンを確認し、v1.12 以前の場合は [yum update docker] してください。CentOS Extras リポジトリから更新可能です。

[root@node01 ~]# docker -v
Docker version 1.12.6, build 96d83a5/1.12.6

全ノードでライブリストアオプションを無効にしておきます。(Swarm モードと共存不可のため)

[root@node01 ~]# vi /etc/docker/daemon.json
{
"live-restore": false
}
[root@node01 ~]# systemctl restart docker

マネージャーノードで Swarm クラスターの設定をします。

[root@node01 ~]# docker swarm init
Swarm initialized: current node (2f7pmmoilf753g7wfctcik7yh) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join \
--token SWMTKN-1-1l6o776w0ktvg6vw4cony5et76gkrjzw4xke0cmas3ftl6ghnm-8ppur7wbl9bej6fjcrdtaufsg \
10.0.0.51:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

ワーカーノードから Swarm クラスターへの参加を実行します。

実行コマンドはマネージャーノードで swarm init した際に表示されたコマンドをそのまま実行すれば OK です。

[root@node02 ~]# docker swarm join \
--token SWMTKN-1-1l6o776w0ktvg6vw4cony5et76gkrjzw4xke0cmas3ftl6ghnm-8ppur7wbl9bej6fjcrdtaufsg \
10.0.0.51:2377
This node joined a swarm as a worker.

ワーカーノードが正常に Swarm クラスターに参加できていれば、マネージャーノードで node ls するとクラスター参加ノードの一覧が表示されます。

[root@node01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
2f7pmmoilf753g7wfctcik7yh * node01.hoge.com Ready Active Leader
6ok99v3dkt9mg4jvzg7qi4zqb node02.hoge.com Ready Active
a3dtuaqibnrym3u3wg32cuq7p node03.hoge.com Ready Active

Swarm クラスターが正常に設定できたら、次に Swarm クラスターで提供するサービスを設定します。 当例では、こちらの例で作成したような httpd サービスを提供するコンテナイメージを利用して設定します。 コンテナイメージは全ノードで準備しておきます。ただし、当例では動作確認のため HTTP アクセス時の表示メッセージはノード毎に異なるものを設定しています。

コンテナイメージが準備できたら、マネージャーノードでサービスを定義します。

サービス起動後は、マネージャーノードの設定したポート宛てにアクセスすると、サービスに設定したレプリカのノード数分の Dockerノードが応答します。 クラスター内のノードへのアクセスはラウンドロビン方式で振り分けられるため、アクセスごとに応答ノードが切り替わります。

[root@node01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
web_server latest b7cf7440922c 4 minutes ago 306.4 MB
docker.io/centos latest 98d35105a391 3 weeks ago 192.5 MB
# レプリカ数 2 でサービスを新規作成する
[root@node01 ~]# docker service create --name swarm_cluster --replicas=2 -p 80:80 web_server:latest
7xg4yssy516xwgkjx2vxbw05d
# サービスの一覧を表示する
[root@node01 ~]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
7xg4yssy516x swarm_cluster 2/2 web_server:latest
# サービスを調査する
[root@node01 ~]# docker service inspect swarm_cluster --pretty
ID: 7xg4yssy516xwgkjx2vxbw05d
Name: swarm_cluster
Mode: Replicated
Replicas: 2
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: web_server:latest
Resources:
Ports:
Protocol = tcp
TargetPort = 80
PublishedPort = 80
# サービスの稼働状況を表示する
[root@node01 ~]# docker service ps swarm_cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
78lh... swarm_cluster.1 web_server:latest node01.hoge.com Running Running about..
4ag7... swarm_cluster.2 web_server:latest node03.hoge.com Running Running about..
# マネージャーノードにアクセスして動作確認
# ラウンドロビン方式で各ノードへ振り分けられる
[root@node01 ~]# curl http://node01.hoge.com/
Docker Node : node03.hoge.com
[root@node01 ~]# curl http://node01.hoge.com/
Docker Node : node01.hoge.com
[root@node01 ~]# curl http://node01.hoge.com/
Docker Node : node03.hoge.com
[root@node01 ~]# curl http://node01.hoge.com/
Docker Node : node01.hoge.com

設定したサービスのレプリカ数を変更したい場合は以下のように設定します。

# レプリカ数を 3 に変更する
[root@node01 ~]# docker service scale swarm_cluster=3
swarm_cluster scaled to 3
[root@node01 ~]# docker service ps swarm_cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
78l... swarm_cluster.1 web_server:latest node01.hoge.com Running Running 34 mi..
4ag... swarm_cluster.2 web_server:latest node03.hoge.com Running Running 34 mi..
46e... swarm_cluster.3 web_server:latest node02.hoge.com Running Running 13 se..
# アクセスして動作確認
[root@node01 ~]# curl http://node01.hoge.com/
Docker Node : node01.hoge.com
[root@node01 ~]# curl http://node01.hoge.com/
Docker Node : node02.hoge.com
[root@node01 ~]# curl http://node01.hoge.com/
Docker Node : node03.hoge.com

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-31 (金) 09:51:48