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

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)のどれか１台に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で起動されたようです。
さらに、１つ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で任意に均等にサービスは起動するようです。

さらに、１つ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で２つのnginxが起動されました。

replicasの数を減らすことで、スケールダウンすることも可能です。

一旦、サービスを削除します。

```
[root@manager01 ~]# docker service rm mynginx
mynginx
[root@manager01 ~]# docker service ps mynginx
Error: No such service: mynginx
```

#Constraint設定
workerのみでnginxを１つ起動してみます。
どうやら、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サービスを３つに増やしてみます。
constraintが効いているので、workerのみでnginxが３つ起動します。

```
[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のみで３つの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で４つ起動した状態です。

```
[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
```

４つの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ノードはまだ２台あるのでスケールダウンは可能なはずです。

```
     
[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         
```

つづく...

#参考リンク
 * https://docs.docker.com/engine/reference/commandline/service_create/
 * http://docs.docker.jp/engine/swarm/swarm-tutorial/drain-node.html