docker swarmがちょっと前のバージョンからdocker本体に取り込まれたとのこと・・・
Kubernetesよりもこちらの方が設定が簡単なので、試してみることにしました。
まずは、Managerノードのクラスタリングを確認してみます。
環境
- CentOS7.3(CentOS Linux release 7.3.1611を最小構成インストール、firewall停止、selinux-disabled) 3ノード
- manager01 - 192.168.28.180(管理LAN) 192.168.100.180(サービスLAN)
- manager02 - 192.168.28.181(管理LAN) 192.168.100.181(サービスLAN)
- manager03 - 192.168.28.182(管理LAN) 192.168.100.182(サービスLAN)
- worker01 - 192.168.28.183(管理LAN) 192.168.100.183(サービスLAN)
- Docker version 1.13.0-rc7, build 48a9e53
- dokcerは自動起動に設定してあります。
dockerのインストール
1台目のみ記載していますが、3台ともインストールします。(当然、クローンでも可能)
最新のつもりですが、rc7のようでした。
[root@manager01 ~]# curl -fsSL https://test.docker.com/ | sh
+ sh -c 'sleep 3; yum -y -q install docker-engine'
warning: /var/cache/yum/x86_64/7/docker-testing-repo/packages/docker-engine-selinux-1.13.0-0.7.rc7.el7.centos.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 2c52609d: NOKEY
docker-engine-selinux-1.13.0-0.7.rc7.el7.centos.noarch.rpm の公開鍵がインストールされていません
Importing GPG key 0x2C52609D:
Userid : "Docker Release Tool (releasedocker) <docker@docker.com>"
Fingerprint: 5811 8e89 f3a9 1289 7c07 0adb f762 2157 2c52 609d
From : https://yum.dockerproject.org/gpg
setsebool: SELinux is disabled.
libsemanage.semanage_direct_install_info: Overriding docker module at lower priority 100 with module at priority 400.
(snip)
[root@manager01 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@manager01 ~]# systemctl start docker
[root@manager01 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 金 2017-01-27 22:54:53 JST; 6s ago
Docs: https://docs.docker.com
Main PID: 1065 (dockerd)
Memory: 17.7M
CGroup: /system.slice/docker.service
├─1065 /usr/bin/dockerd
└─1071 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd -...
1月 27 22:54:51 manager01 dockerd[1065]: time="2017-01-27T22:54:51.067403331+09:00" level=info msg="libcontainerd: new containerd process, pid: 1071"
(snip)
[root@manager01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3台のmanagerで初期構成
1台目をmanagerでswarm initしますが、workerノードのjoinトークンは表示されますが、managerのトークンは表示されません。
[root@manager01 ~]# docker swarm init --listen-addr 0.0.0.0:2377 --advertise-addr 192.168.28.180
Swarm initialized: current node (rpt29x1yxumnj7ivl4fx68g3l) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0dl2572g16uadcs332rvywgxiakuhj8qjy1h73wy3xbdy7sl6k-bs79rdoougdc7ry1lk8k5yuv0 \
192.168.28.180:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
ということで、manager用のjoinトークンをswarm initを実行した1台目で表示させます。
[root@manager01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0dl2572g16uadcs332rvywgxiakuhj8qjy1h73wy3xbdy7sl6k-3ex2di1vcarstw0m02ut476rs \
192.168.28.180:2377
この時点では、manager01のみが参加していて、以下となっています。
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
rpt29x1yxumnj7ivl4fx68g3l * manager01 Ready Active Leader
2台目、3台目をmanagerとして起動
1台目で確認したmanagerへのjoinトークンを使って、2台目、3台目を参加させます。
まずは、2台目
[root@manager02 ~]# docker swarm join \
> --token SWMTKN-1-0dl2572g16uadcs332rvywgxiakuhj8qjy1h73wy3xbdy7sl6k-3ex2di1vcarstw0m02ut476rs \
> 192.168.28.180:2377
This node joined a swarm as a manager.
すると、以下となっています。manager02がReachableで参加しています。
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
rpt29x1yxumnj7ivl4fx68g3l * manager01 Ready Active Leader
t4ri8ng3bagn8jlmpq1fx8vbq manager02 Ready Active Reachable
さらに、3台目
[root@manager03 ~]# docker swarm join \
> --token SWMTKN-1-0dl2572g16uadcs332rvywgxiakuhj8qjy1h73wy3xbdy7sl6k-3ex2di1vcarstw0m02ut476rs \
> 192.168.28.180:2377
This node joined a swarm as a manager.
すると。。。manager03もReachableで参加しています。
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Ready Active Reachable
rpt29x1yxumnj7ivl4fx68g3l * manager01 Ready Active Leader
t4ri8ng3bagn8jlmpq1fx8vbq manager02 Ready Active Reachable
どうやら、3台でmanagerが構成できたようです。
managerの1台目(manager01)がLeaderになっています。
manager(Leader)を故障(ダウン)させてみる
manager01(Leader)を故障(ダウン)してみます。
[root@manager01 ~]# poweroff -nf
どうやら、manager03がLeaderへうまく昇格したようです。
[root@manager02 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Ready Active Leader
rpt29x1yxumnj7ivl4fx68g3l manager01 Unknown Active Unreachable
t4ri8ng3bagn8jlmpq1fx8vbq * manager02 Ready Active Reachable
[root@manager03 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 * manager03 Ready Active Leader
rpt29x1yxumnj7ivl4fx68g3l manager01 Unknown Active Unreachable
t4ri8ng3bagn8jlmpq1fx8vbq manager02 Ready Active Reachable
さらに故障を発生させてみる
さらに、manager03(Leader)を故障(ダウン)させてみます
manager02のみの構成となるはずですが、どうやら、構成ノードが1台になるとコマンドを受けつけないようです。
確かマニュアルのどこかに記載があったので、これは正しい動作かと思います。
[root@manager03 ~]# poweroff -nf
[root@manager02 ~]# docker node ls
Error response from daemon: rpc error: code = 4 desc = context deadline exceeded
ここで、manager01を再起動すると、構成ノードが1台から復帰するので、コマンドを受け付けるようになります
[root@manager02 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Ready Active Unreachable
rpt29x1yxumnj7ivl4fx68g3l manager01 Down Active Reachable
t4ri8ng3bagn8jlmpq1fx8vbq * manager02 Ready Active Leader
ということは、一端、3台で構成した後、全部停止した後、1台だけ起動してもコマンドは受け付けない??・・・・
確認してみます。
一旦、3台で正しく構成させます。
[root@manager02 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Ready Active Reachable
rpt29x1yxumnj7ivl4fx68g3l manager01 Ready Active Reachable
t4ri8ng3bagn8jlmpq1fx8vbq * manager02 Ready Active Leader
3台をシャットダウンで停止し、manager02のみを起動してみます。
[root@manager02 ~]# docker node ls
Error response from daemon: rpc error: code = 4 desc = context deadline exceeded
[root@manager02 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 金 2017-01-27 23:28:17 JST; 24s ago
Docs: https://docs.docker.com
Main PID: 897 (dockerd)
Memory: 55.4M
CGroup: /system.slice/docker.service
├─897 /usr/bin/dockerd
└─909 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --...
1月 27 23:28:36 manager02 dockerd[897]: time="2017-01-27T23:28:36.722357627+09:00" level=info msg="6b703cf843000f40 received vote from 6b703cf843000f40 at term 46"
1月 27 23:28:36 manager02 dockerd[897]: time="2017-01-27T23:28:36.722380099+09:00" level=info msg="6b703cf843000f40 [logterm: 37, index: 42] sent vote request to 774941a439e05ca9 at term 46"
1月 27 23:28:36 manager02 dockerd[897]: time="2017-01-27T23:28:36.722406174+09:00" level=info msg="6b703cf843000f40 [logterm: 37, index: 42] sent vote request to 5d0a9a8ae474065d at term 46"
1月 27 23:28:37 manager02 dockerd[897]: time="2017-01-27T23:28:37.663305003+09:00" level=error msg="Error getting nodes: rpc error: code = 4 desc = context deadline exceeded"
1月 27 23:28:37 manager02 dockerd[897]: time="2017-01-27T23:28:37.663367503+09:00" level=error msg="Handler for GET /v1.25/nodes returned error: rpc error: code = 4 desc = contex...ine exceeded"
1月 27 23:28:40 manager02 dockerd[897]: time="2017-01-27T23:28:40.722241813+09:00" level=info msg="6b703cf843000f40 is starting a new election at term 46"
1月 27 23:28:40 manager02 dockerd[897]: time="2017-01-27T23:28:40.722317671+09:00" level=info msg="6b703cf843000f40 became candidate at term 47"
1月 27 23:28:40 manager02 dockerd[897]: time="2017-01-27T23:28:40.722334987+09:00" level=info msg="6b703cf843000f40 received vote from 6b703cf843000f40 at term 47"
1月 27 23:28:40 manager02 dockerd[897]: time="2017-01-27T23:28:40.722364236+09:00" level=info msg="6b703cf843000f40 [logterm: 37, index: 42] sent vote request to 5d0a9a8ae474065d at term 47"
1月 27 23:28:40 manager02 dockerd[897]: time="2017-01-27T23:28:40.722390737+09:00" level=info msg="6b703cf843000f40 [logterm: 37, index: 42] sent vote request to 774941a439e05ca9 at term 47"
Hint: Some lines were ellipsized, use -l to show in full.
dockerは起動していますが、やはり、構成ノードが1台になるとコマンドを受けつけないようです。
ログがvote...がうんたら出てますので、やはり、構成ノードが足りないってことでしょうかね♪
最後の1台の場合、サービスの制御(createなど)はできないかもしませんが、確認してみます。
続く・・・