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の1つ(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コマンドでも実行可能です。
[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は出来ないようで、1台は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出来ました。
続く・・・