docker swarmを試す(その4) サービスの確認(2)

引き続き3台のmanager,1台のworker構成でサービスの動作を色々と確認してみます。

# swarmからのノードの離脱と再参加
swarm leaveと swarm joinで再参加は簡単に出来るように思えたのですが、ちょっと癖があるようです。

#手順
どうやら、swarm leave後、node rmする前に離脱するノードを降格させて、削除することでうまくいくようです。

再度、manager03をLeaderとしてswarmクラスタを再構成してあります。

```
[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
ogd4rkazb2lybpe1zn0xtkj4o    manager01  Ready   Active        Reachable
ox88mvbml4rivgqr5f19axxga *  manager03  Ready   Active        Leader
r5gparo8g0yshkdvv92fkbmkh    manager02  Ready   Active        Reachable
y7cizbam1262otnul48ru1lr9    worker01   Ready   Active        
```

manager01を離脱してみます。

```
[root@manager01 ~]# docker swarm leave -f
Node left the swarm.

[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
ogd4rkazb2lybpe1zn0xtkj4o    manager01  Ready   Active        Reachable
ox88mvbml4rivgqr5f19axxga *  manager03  Ready   Active        Leader
r5gparo8g0yshkdvv92fkbmkh    manager02  Ready   Active        Reachable
y7cizbam1262otnul48ru1lr9    worker01   Ready   Active        

```

manager01がSTATUS:Downになったことを確認します。

```
[root@manager01 ~]# systemctl stop docker

[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
ogd4rkazb2lybpe1zn0xtkj4o    manager01  Down    Active        Unreachable
ox88mvbml4rivgqr5f19axxga *  manager03  Ready   Active        Leader
r5gparo8g0yshkdvv92fkbmkh    manager02  Ready   Active        Reachable
y7cizbam1262otnul48ru1lr9    worker01   Ready   Active        

```

manager01をswarmから削除してみます。

```
[root@manager03 ~]# docker node rm manager01
Error response from daemon: rpc error: code = 9 desc = node ogd4rkazb2lybpe1zn0xtkj4o is a cluster manager and is a member of the raft cluster. It must be demoted to worker before removal
```

どうやら一旦managerからworkerに落とす必要(demote)があるようです。

```
[root@manager03 ~]# docker node demote manager01
Manager manager01 demoted in the swarm.
```

再度、manager01をswarmから削除してみます。

```
[root@manager03 ~]# docker node rm manager01
manager01
[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
ox88mvbml4rivgqr5f19axxga *  manager03  Ready   Active        Leader
r5gparo8g0yshkdvv92fkbmkh    manager02  Ready   Active        Reachable
y7cizbam1262otnul48ru1lr9    worker01   Ready   Active        
[root@manager03 ~]# 
```

うまく削除出来たようなので、manager01を参加させてみます。

```
[root@manager01 ~]# docker swarm join     --token SWMTKN-1-2k6u94nmlevsdrmnddtfhufmmvkvz4czcygvqtriwqyk8amb4g-euetuv4hbx2js7kz6cynjle2l     192.168.28.182:2377
This node joined a swarm as a worker.

     
[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
ox88mvbml4rivgqr5f19axxga *  manager03  Ready   Active        Leader
r5gparo8g0yshkdvv92fkbmkh    manager02  Ready   Active        Reachable
y7cizbam1262otnul48ru1lr9    worker01   Ready   Active        
yotxwu2zked5wtn49yrx4psy2    manager01  Ready   Active        
```

最後にmanager01をpromoteしておきます。

```
[root@manager03 ~]# docker node promote manager01
Node manager01 promoted to a manager in the swarm.
[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
ox88mvbml4rivgqr5f19axxga *  manager03  Ready   Active        Leader
r5gparo8g0yshkdvv92fkbmkh    manager02  Ready   Active        Reachable
y7cizbam1262otnul48ru1lr9    worker01   Ready   Active        
yotxwu2zked5wtn49yrx4psy2    manager01  Ready   Active        Reachable
```

どうやら、manager01を綺麗に再度swarmに再参加できたようです。

以下のmanagerのswarmへの離脱、参加では手順が必要なようです。

1. 離脱(swarm leave -f)する
2. 離脱したノードをswarm内のmanagerノードで、workerに降格(node demote)する
3. 離脱したノードがDOWNステータスになるまで待つ
3. 離脱したノードをswarm内のmanagerノードで、swarmから削除(node rm)する 
5. 離脱したノードで、swarmに再参加する
5. swarm内のmanagerノードで、必要に応じて再参加したノードをmanagerに昇格(ndoe promote)する

 - https://docs.docker.com/engine/swarm/manage-nodes/
 - https://docs.docker.com/engine/swarm/join-nodes/

以上です。