3台のmanager,1台の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
プライベートレジストリを立ててないので、ノード(manager01~03,worker)のどれか1台にnginxのイメージをpullしておきます。
※全台にpullする必要はないようで、必要なイメージは存在しているノードから転送されるようですが、起動が遅くなる為、今回は全ノードにpullしておきました。
[root@manager01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest cc1b61406712 9 days ago 182 MB
サービスの生成・変更(スケールアップ、スケールダウン)
3つのnginxサービスを生成してみます
[root@manager01 ~]# docker service create --replicas 3 --name mynginx -p 80:80 nginx
igzlsky5eiy6fvpry5fdo7j17
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pwojlad4u9hy mynginx.1 nginx:latest manager03 Running Running 49 seconds ago
8xsudm75vhma mynginx.2 nginx:latest manager01 Running Running 49 seconds ago
bbvuk5juyzak mynginx.3 nginx:latest manager02 Running Running 48 seconds ago
※一部、swarmの少し前のドキュメントなどでは、「docker service tasks xxxxx」の記述がありますが、確認した1.13では、利用出来ないので注意してください。
3つとも、managerで起動されたようです。
さらに、1つnginxサービスを増やしてみます。
[root@manager01 ~]# docker service update --replicas 4 mynginx
mynginx
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pwojlad4u9hy mynginx.1 nginx:latest manager03 Running Running about a minute ago
8xsudm75vhma mynginx.2 nginx:latest manager01 Running Running about a minute ago
bbvuk5juyzak mynginx.3 nginx:latest manager02 Running Running about a minute ago
85aaf33hmvqt mynginx.4 nginx:latest worker01 Running Running 8 seconds ago
workerでもnginxが起動されました。
どうやら、特に指定しない場合、worker,managerで任意に均等にサービスは起動するようです。
さらに、1つnginxサービスを増やしてみます。
[root@manager01 ~]# docker service update --replicas 5 mynginx
mynginx
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pwojlad4u9hy mynginx.1 nginx:latest manager03 Running Running 2 minutes ago
8xsudm75vhma mynginx.2 nginx:latest manager01 Running Running 2 minutes ago
bbvuk5juyzak mynginx.3 nginx:latest manager02 Running Running 2 minutes ago
85aaf33hmvqt mynginx.4 nginx:latest worker01 Running Running 46 seconds ago
yk3fpy3ofjh3 mynginx.5 nginx:latest manager03 Running Running less than a second ago
manager03で2つのnginxが起動されました。
replicasの数を減らすことで、スケールダウンすることも可能です。
一旦、サービスを削除します。
[root@manager01 ~]# docker service rm mynginx
mynginx
[root@manager01 ~]# docker service ps mynginx
Error: No such service: mynginx
Constraint設定
workerのみでnginxを1つ起動してみます。
どうやら、constraintで指定できるようです。
[root@manager01 ~]# docker service create --replicas 1 --constraint 'node.role == worker' --name mynginx -p 80:80 nginx
z6aptdc2frumu8gu6u29bmtgr
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
l5l8ra9fiqvx mynginx.1 nginx:latest worker01 Running Starting less than a second ago
さらに、nginxサービスを3つに増やしてみます。
constraintが効いているので、workerのみでnginxが3つ起動します。
[root@manager01 ~]# docker service update --replicas 3 mynginx
mynginx
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
l5l8ra9fiqvx mynginx.1 nginx:latest worker01 Running Running 43 seconds ago
zpcg22m92ap1 mynginx.2 nginx:latest worker01 Running Running 15 seconds ago
52qbrn3kiw8m mynginx.3 nginx:latest worker01 Running Running 16 seconds ago
一旦、サービスを削除して、今度は、constraintでmanagerを指定して、managerのみで3つのnginxサービスを起動してみます。
[root@manager01 ~]# docker service rm mynginx
mynginx
[root@manager01 ~]# docker service create --replicas 3 --constraint 'node.role == manager' --name mynginx -p 80:80 nginx
zryhajzs47nk27l3z25oevib2
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
dcqk74esfhs2 mynginx.1 nginx:latest manager01 Running Starting 1 second ago
sayr4uame4ui mynginx.2 nginx:latest manager02 Running Starting less than a second ago
xdnhf4h14eon mynginx.3 nginx:latest manager03 Running Starting 1 second ago
うまく、managerのみでサービスが起動しました。
他にもconstraintには、node.id,node.hostname,node.labels,engine.labelsなどが指定できるようです。
Drain設定
managerノードはデフォルトではworker兼用となる為、constraintでworkerを指定しない場合にサービスが起動したようです。
3台のmanagerノードをmanager専用(制御専用)として設定してみます。
[root@manager01 ~]# docker node update --availability drain manager01
manager01
[root@manager01 ~]# docker node update --availability drain manager02
manager02
[root@manager01 ~]# docker node update --availability drain manager03
manager03
[root@manager02 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Ready Drain Reachable
ef4vs2ca9ujyzzrxaoflmewex worker01 Ready Active
kgc3dy9qkl60gakh4ixsbhbgs manager01 Ready Drain Reachable
t4ri8ng3bagn8jlmpq1fx8vbq * manager02 Ready Drain Leader
constraintを指定せずに、4つのnginxサービスを起動してみます。
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ldgkga82phld mynginx.1 nginx:latest worker01 Running Running about a minute ago
8o9jw905uowh mynginx.2 nginx:latest worker01 Running Running about a minute ago
u32f2b3d21cy mynginx.3 nginx:latest worker01 Running Running about a minute ago
aketgc4wsadh mynginx.4 nginx:latest worker01 Running Running about a minute ago
全てworkerで起動しました。
drain設定によって、managerではリソースが起動しなくなるようです。
drainを元に戻すには、activeに戻します。
[root@manager01 ~]# docker node update --availability active manager01
manager01
[root@manager01 ~]# docker node update --availability active manager02
manager02
[root@manager01 ~]# docker node update --availability active manager03
manager03
[root@manager02 ~]# 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
availabilityには、他にもpause設定が出来るようです。
pauseを設定した場合には、新しいタスクは受け付けないようです。
本来はメンテナンス目的なのかも知れないdrain設定なので、constraint指定を行う方が運用的には、正しいのかも知れません。
→以下とあるので、drain設定でmanagerノード専用(サービス配置不可)のみとするのは正しいらしい。
- https://docs.docker.com/engine/swarm/admin_guide/#/run-manager-only-nodes
自動復旧
サービスの自動復旧を確認してみます。
サービスはworker01で4つ起動した状態です。
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ldgkga82phld mynginx.1 nginx:latest worker01 Running Running about a minute ago
8o9jw905uowh mynginx.2 nginx:latest worker01 Running Running about a minute ago
u32f2b3d21cy mynginx.3 nginx:latest worker01 Running Running about a minute ago
aketgc4wsadh mynginx.4 nginx:latest worker01 Running Running about a minute ago
worker01のdockerを停止します。
[root@worker01 ~]# systemctl stop docker
暫くすると、worker01がDown状態となり、nginxサービスがmanager02のみで起動します。
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Ready Active Reachable
ef4vs2ca9ujyzzrxaoflmewex worker01 Down Active
kgc3dy9qkl60gakh4ixsbhbgs * manager01 Ready Active Reachable
t4ri8ng3bagn8jlmpq1fx8vbq manager02 Ready Active Leader
[root@manager02 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
4cudaqlcbghu mynginx.1 nginx:latest manager02 Running Running 49 seconds ago
ldgkga82phld \_ mynginx.1 nginx:latest worker01 Shutdown Running about a minute ago
78pcorqz0vkp mynginx.2 nginx:latest manager02 Running Running 48 seconds ago
8o9jw905uowh \_ mynginx.2 nginx:latest worker01 Shutdown Running about a minute ago
rvngyd8v64we mynginx.3 nginx:latest manager02 Running Running 49 seconds ago
u32f2b3d21cy \_ mynginx.3 nginx:latest worker01 Shutdown Running about a minute ago
x26fcyvofrnr mynginx.4 nginx:latest manager02 Running Running 49 seconds ago
aketgc4wsadh \_ mynginx.4 nginx:latest worker01 Shutdown Running about a minute ago
[root@manager02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2faf57609a5 nginx@sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645 "nginx -g 'daemon ..." 4 minutes ago Up 4 minutes 80/tcp, 443/tcp mynginx.3.rvngyd8v64wewywgqj2dgzy0p
456de2ad6b14 nginx@sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645 "nginx -g 'daemon ..." 4 minutes ago Up 4 minutes 80/tcp, 443/tcp mynginx.4.x26fcyvofrnr8so3wwruar695
9a2341ce1aca nginx@sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645 "nginx -g 'daemon ..." 4 minutes ago Up 4 minutes 80/tcp, 443/tcp mynginx.1.4cudaqlcbghu0lax14cw72ync
0167b8c62d05 nginx@sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645 "nginx -g 'daemon ..." 4 minutes ago Up 4 minutes 80/tcp, 443/tcp mynginx.2.78pcorqz0vkp8ezoz7jc3v2bw
4つのnginxがmanager01~manager03で分散して配置されるかと思いましたが、どうやら、そうではないようです。
manager減少時の動作(QUORUMの制御)
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9mu7mqbuosag mynginx.1 nginx:latest manager03 Running Starting less than a second ago
jgwqdrbfff6j mynginx.2 nginx:latest manager01 Running Starting less than a second ago
xuf1s121c1c2 mynginx.3 nginx:latest worker01 Running Starting less than a second ago
[root@manager01 ~]# 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
manager03ノードを停止します。
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Down Active Unreachable
ef4vs2ca9ujyzzrxaoflmewex worker01 Ready Active
kgc3dy9qkl60gakh4ixsbhbgs * manager01 Ready Active Reachable
t4ri8ng3bagn8jlmpq1fx8vbq manager02 Ready Active Leader
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
zgcdcmgwi5i1 mynginx.1 nginx:latest manager02 Running Running 8 seconds ago
9mu7mqbuosag \_ mynginx.1 nginx:latest manager03 Shutdown Running 26 seconds ago
jgwqdrbfff6j mynginx.2 nginx:latest manager01 Running Running about a minute ago
xuf1s121c1c2 mynginx.3 nginx:latest worker01 Running Running about a minute ago
managerノードはまだ2台あるのでスケールダウンは可能なはずです。
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Down Active Unreachable
ef4vs2ca9ujyzzrxaoflmewex worker01 Ready Active
kgc3dy9qkl60gakh4ixsbhbgs * manager01 Ready Active Reachable
t4ri8ng3bagn8jlmpq1fx8vbq manager02 Ready Active Leader
[root@manager01 ~]#
[root@manager01 ~]# docker service update --replicas 2 mynginx
mynginx
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jgwqdrbfff6j mynginx.2 nginx:latest manager01 Running Running 2 minutes ago
xuf1s121c1c2 mynginx.3 nginx:latest worker01 Running Running 2 minutes ago
manager02ノードを停止します。
manager01ノードでのnodeコマンド、serviceコマンド(スケールの再ダウンも不可)は受け付けれらなくなります。
※3ノードでswarmのクラスタを構成していたので、1ノードではQUORUMを消失してこのような動作になるようです。
[root@manager01 ~]# docker node ls
Error response from daemon: rpc error: code = 4 desc = context deadline exceeded
[root@manager01 ~]# docker service ps mynginx
Error response from daemon: rpc error: code = 4 desc = context deadline exceeded
[root@manager01 ~]# docker service update --replicas 1 mynginx
Error response from daemon: rpc error: code = 4 desc = context deadline exceeded
ただし、起動しているサービスについてはそのままのようです。
[root@manager01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f065920bcd8 nginx@sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645 "nginx -g 'daemon ..." 7 minutes ago Up 6 minutes 80/tcp, 443/tcp mynginx.2.jgwqdrbfff6j25wafhd942kbl
[root@worker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ea808788998 nginx@sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645 "nginx -g 'daemon ..." 7 minutes ago Up 7 minutes 80/tcp, 443/tcp mynginx.3.xuf1s121c1c27x2lfwhgu9mkf
manager02を再起動してみます。
QUORUMが回復してコマンドが実行可能になりました。
[root@manager01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
53n8pcstw7sgwgcvklj1m8u84 manager03 Down Active Unreachable
ef4vs2ca9ujyzzrxaoflmewex worker01 Ready Active
kgc3dy9qkl60gakh4ixsbhbgs * manager01 Ready Active Leader
t4ri8ng3bagn8jlmpq1fx8vbq manager02 Ready Active Reachable
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jgwqdrbfff6j mynginx.2 nginx:latest manager01 Running Running 2 seconds ago
xuf1s121c1c2 mynginx.3 nginx:latest worker01 Running Running 13 seconds ago
[root@manager01 ~]# docker service update --replicas 1 mynginx
mynginx
[root@manager01 ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jgwqdrbfff6j mynginx.2 nginx:latest manager01 Running Running 9 seconds ago
つづく...