docker swarmを試す(その1)　3台のmanagerを構成してみる。。

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台目のみ記載していますが、３台ともインストールします。(当然、クローンでも可能)
最新のつもりですが、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で初期構成
１台目を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の１台目(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のみの構成となるはずですが、どうやら、構成ノードが１台になるとコマンドを受けつけないようです。
確かマニュアルのどこかに記載があったので、これは正しい動作かと思います。

```
[root@manager03 ~]# poweroff -nf

[root@manager02 ~]# docker node ls
Error response from daemon: rpc error: code = 4 desc = context deadline exceeded
```

ここで、manager01を再起動すると、構成ノードが１台から復帰するので、コマンドを受け付けるようになります

```
[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
```

ということは、一端、３台で構成した後、全部停止した後、１台だけ起動してもコマンドは受け付けない？？・・・・

確認してみます。

一旦、３台で正しく構成させます。

```
[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
```

３台をシャットダウンで停止し、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は起動していますが、やはり、構成ノードが１台になるとコマンドを受けつけないようです。
ログがvote...がうんたら出てますので、やはり、構成ノードが足りないってことでしょうかね♪

**最後の１台の場合、サービスの制御(createなど)はできないかもしませんが、確認してみます。**

続く・・・

#参考リンク
 * https://docs.docker.com/engine/swarm/join-nodes/
 * https://docs.docker.com/engine/reference/commandline/swarm_join_token/