LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-02

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         

つづく...

参考リンク

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2