docker swarmを試す(その2) ノードのdemote/promote

3つのmanagerノードと1つのwokerノードで、nodeコマンドのpromote/demoteを試してみたいと思います。

#demote(workerへ降格)
 manager03がLeader(3ノードのmanagerの中の親玉制御ノード)の状態でmanager03をdemoteしてみます。

```
[root@manager02 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84    manager03  Ready   Active        Leader
kgc3dy9qkl60gakh4ixsbhbgs    manager01  Ready   Active        Reachable
t4ri8ng3bagn8jlmpq1fx8vbq *  manager02  Ready   Active        Reachable
```
 
 demoteを実行すると、他のmanagerの１つ(manager02)がLeaderになって、manager03はMANAGER STATUSがなくなりました。
 manager03はworkerに降格したということだと思います。

```
[root@manager01 ~]# docker node demote manager03
Manager manager03 demoted in the swarm.
[root@manager01 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84    manager03  Ready   Active        
kgc3dy9qkl60gakh4ixsbhbgs *  manager01  Ready   Active        Reachable
t4ri8ng3bagn8jlmpq1fx8vbq    manager02  Ready   Active        Leader
```

#poromote(managerへ昇格)

manager03はworkerのみの扱いとなったはずなので、再度、managerとする為にmanager03でpromoteしてみます。

manager03は、既にmanagerノードではないので、promoteコマンドを実行出来ません。
結果、workerのままです。

```
[root@manager03 ~]# docker node promote manager03
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.

[root@manager02 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84    manager03  Ready   Active        
kgc3dy9qkl60gakh4ixsbhbgs    manager01  Ready   Active        Reachable
t4ri8ng3bagn8jlmpq1fx8vbq *  manager02  Ready   Active        Leader
```

気を取り直して、managerノード(manager01)でpromoteしてみます。

```
[root@manager02 ~]# docker node promote manager03
Node manager03 promoted to a manager in the swarm.
[root@manager02 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84    manager03  Ready   Active        Reachable
kgc3dy9qkl60gakh4ixsbhbgs    manager01  Ready   Active        Reachable
t4ri8ng3bagn8jlmpq1fx8vbq *  manager02  Ready   Active        Leader
```

今度は、成功してmanager(Reachable状態)になりました。

promote/demoteに関しては、managerノードでの、docker node update --role [ worker | manager ] ノードIDコマンドでも実行可能です。

 - https://docs.docker.com/engine/swarm/manage-nodes/#/promote-or-demote-a-node

```
[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 *  manager03  Ready   Active        Reachable
ef4vs2ca9ujyzzrxaoflmewex    worker01   Ready   Active        
kgc3dy9qkl60gakh4ixsbhbgs    manager01  Ready   Active        Reachable
t4ri8ng3bagn8jlmpq1fx8vbq    manager02  Ready   Active        Leader
[root@manager03 ~]#  docker node update --role manager worker01
worker01
[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 *  manager03  Ready   Active        Reachable
ef4vs2ca9ujyzzrxaoflmewex    worker01   Ready   Active        Reachable
kgc3dy9qkl60gakh4ixsbhbgs    manager01  Ready   Active        Reachable
t4ri8ng3bagn8jlmpq1fx8vbq    manager02  Ready   Active        Leader
[root@manager03 ~]#  docker node update --role worker  worker01
worker01
[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 *  manager03  Ready   Active        Reachable
ef4vs2ca9ujyzzrxaoflmewex    worker01   Ready   Active        
kgc3dy9qkl60gakh4ixsbhbgs    manager01  Ready   Active        Reachable
t4ri8ng3bagn8jlmpq1fx8vbq    manager02  Ready   Active        Leader
```

# 全てdemote
swarm機能が停止してしまうので、全managerをdemoteは出来ないようで、１台はmanagerとして生き続けるようです。

```
[root@manager01 ~]# docker node demote manager01 manager02 manager03
Manager manager01 demoted in the swarm.
Manager manager02 demoted in the swarm.
Error response from daemon: rpc error: code = 9 desc = attempting to demote the last manager of the swarm

[root@manager03 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 *  manager03  Ready   Active        Leader
kgc3dy9qkl60gakh4ixsbhbgs    manager01  Ready   Active        
t4ri8ng3bagn8jlmpq1fx8vbq    manager02  Ready   Active        
```

ベストプラクティスは、どうなのか知りませんが・・・
swarmではworkerがmanagerにいつでもpromoteして昇格(候補として)可能な状態になれる為、managerでクラスタ構成中に障害でmanagerが減しても、代役を立てることは簡単なようです。

# workerをpromote

念の為、workerで追加したノードが、promoteで昇格できるのか確認してみます。

```
[root@worker01 ~]# docker swarm join \
>     --token SWMTKN-1-0dl2572g16uadcs332rvywgxiakuhj8qjy1h73wy3xbdy7sl6k-bs79rdoougdc7ry1lk8k5yuv0 \
>     192.168.28.180:2377
This node joined a swarm as a worker.

[root@manager01 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84    manager03  Ready   Active        Reachable
kgc3dy9qkl60gakh4ixsbhbgs *  manager01  Ready   Active        Leader
kldemzr3rc2jlrneq61jhg1di    worker01   Ready   Active        
t4ri8ng3bagn8jlmpq1fx8vbq    manager02  Ready   Active        Reachable

```

workerノードではnodeコマンドは実行出来ません

```
[root@worker01 ~]# docker node ls
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
```

prmoteでmanagerに昇格すると...wokerノードでもnodeコマンドが実行出来るようになります。

```
[root@manager01 ~]# docker node promote worker01
Node worker01 promoted to a manager in the swarm.

[root@worker01 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84    manager03  Ready   Active        Reachable
kgc3dy9qkl60gakh4ixsbhbgs    manager01  Ready   Active        Leader
kldemzr3rc2jlrneq61jhg1di *  worker01   Ready   Active        Reachable
t4ri8ng3bagn8jlmpq1fx8vbq    manager02  Ready   Active        Reachable
```

ということで、workerでswarmに参加したノードでも、promote出来ました。


続く・・・

#参考リンク

 * https://docs.docker.com/engine/reference/commandline/node_promote/
 * https://docs.docker.com/engine/reference/commandline/node_demote/