いろいろ書いていく

やってみたなど

swarm tutorialをdindでやってみる 完結編

やること

前回記事の続き

koimedenshi.hatenablog.com

以下のように,6台のdindコンテナによるswarm nodeが構築されるところまでやった

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
71jzsyefebwvmiz5va29cnhn4 *   manager1            Ready               Active              Leader              18.09.3
0e3bl408q8lufo5xczwny5l9m     manager2            Ready               Active              Reachable           18.09.3
icd4ixgyqvsc0ebrdf8w5esxy     manager3            Ready               Active              Reachable           18.09.3
woo1rgys2gsgpffjtyrec7gqe     worker1             Ready               Active                                  18.09.3
kv6dnud4pyfk0269xlqauwngd     worker2             Ready               Active                                  18.09.3
i9ygvq1nvcqqpdyatpygl39ax     worker3             Ready               Active                                  18.09.3

以下,docker swarm tutorialの後半部分をこのdind版swarmでもやってみる.

手順

manager1ノードでwebというserviceを立ち上げる.
(dockerにおけるserviceという概念に関してはこのへんとかに書いてある)

docker exec -it manager1 docker service create -p 80:80 --name web nginx:latest

ブラウザからmanager1ホストのIPへアクセスすると,立ち上がったサービスを確認できる manager1のIPはhostnameコマンドなどで確認できる

$ hostname -i
172.22.0.2

f:id:koimedenshi:20190402095746p:plain

なお,manager1以外のホストのIPへアクセスしても同様に表示される.
これはswarmのRouting Meshという機能らしい

チュートリアルにはない手順だが,docker service psコマンドでサービスの状態を見てみる

$ docker exec -it manager1 docker service ps web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
kw541zci4kni        web.1               nginx:latest        manager2            Running             Running 20 minutes ago                       
/

serviceの起動コマンドはmanager1で実行したが,実際のサービスはmanager2ノードで立ち上がっているっぽい.
80番ポートへのアクセスは,このノードへルーティングされているようだ.

次にサービスをスケーリングする.
webというサービスを合計15個になるよう複製する
この操作で端末の動作が重たくなるので注意.(メモリ1GBのVMでも動いたけど,だいぶもっさりした)

docker exec -it manager1 docker service scale web=15

docker service lsコマンドでレプリカが作成されたことを確認

$ docker exec -it manager1 docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
4x6ycl1ftacd        web                 replicated          15/15               nginx:latest        *:80->80/tcp

docker service psコマンドでwebサービスを確認すると,15個のレプリカが6台のノードに割り振られていることがわかる

$ docker exec -it manager1 docker service ps web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
kw541zci4kni        web.1               nginx:latest        manager2            Running             Running 28 minutes ago                       
3l7bfnzp1y09        web.2               nginx:latest        manager2            Running             Running 4 minutes ago                        
s20rm41zo6uw        web.3               nginx:latest        manager1            Running             Running 2 minutes ago                        
a99tv7ha01et        web.4               nginx:latest        manager3            Running             Running 2 minutes ago                        
qb38lx8ov9ge        web.5               nginx:latest        worker3             Running             Running 2 minutes ago                        
vlihahkxs9pv        web.6               nginx:latest        worker1             Running             Running 2 minutes ago                        
7yzl5f31a9rb        web.7               nginx:latest        worker2             Running             Running 2 minutes ago                        
4we17vy5xtmg        web.8               nginx:latest        worker2             Running             Running 2 minutes ago                        
yy5kn8mv8hvz        web.9               nginx:latest        worker1             Running             Running 2 minutes ago                        
aej45h59wln3        web.10              nginx:latest        worker3             Running             Running 2 minutes ago                        
dygbxzxrbuwc        web.11              nginx:latest        manager1            Running             Running 2 minutes ago                        
zbhsfnn1p5ux        web.12              nginx:latest        manager1            Running             Running 2 minutes ago                        
zlud7r6h9y1e        web.13              nginx:latest        manager3            Running             Running 2 minutes ago                        
q2xz28vesyy9        web.14              nginx:latest        manager2            Running             Running 4 minutes ago                        
vf5f395d6ydp        web.15              nginx:latest        worker3             Running             Running 2 minutes ago      

docker node update --availability drainコマンドで,指定したノードからサービスを放出できる
以下のコマンドにより,worker1ノードのサービスをdrainする.

docker exec -it manager1 docker node update --availability drain worker1

ふたたびサービスの状態を確認

$ docker exec -it manager1 docker service ps web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
kw541zci4kni        web.1               nginx:latest        manager2            Running             Running 32 minutes ago                       
3l7bfnzp1y09        web.2               nginx:latest        manager2            Running             Running 8 minutes ago                        
s20rm41zo6uw        web.3               nginx:latest        manager1            Running             Running 6 minutes ago                        
a99tv7ha01et        web.4               nginx:latest        manager3            Running             Running 6 minutes ago                        
qb38lx8ov9ge        web.5               nginx:latest        worker3             Running             Running 6 minutes ago                        
199q9r5nicnz        web.6               nginx:latest        manager3            Running             Starting 4 seconds ago                       
vlihahkxs9pv         \_ web.6           nginx:latest        worker1             Shutdown            Shutdown 4 seconds ago                       
7yzl5f31a9rb        web.7               nginx:latest        worker2             Running             Running 6 minutes ago                        
4we17vy5xtmg        web.8               nginx:latest        worker2             Running             Running 6 minutes ago                        
vnqvozak8s7m        web.9               nginx:latest        worker2             Running             Starting 3 seconds ago                       
yy5kn8mv8hvz         \_ web.9           nginx:latest        worker1             Shutdown            Shutdown 4 seconds ago                       
aej45h59wln3        web.10              nginx:latest        worker3             Running             Running 6 minutes ago                        
dygbxzxrbuwc        web.11              nginx:latest        manager1            Running             Running 6 minutes ago                        
zbhsfnn1p5ux        web.12              nginx:latest        manager1            Running             Running 6 minutes ago                        
zlud7r6h9y1e        web.13              nginx:latest        manager3            Running             Running 6 minutes ago                        
q2xz28vesyy9        web.14              nginx:latest        manager2            Running             Running 8 minutes ago                        
vf5f395d6ydp        web.15              nginx:latest        worker3             Running             Running 6 minutes ago                        

worker1にいたweb.6とweb.9がシャットダウンされ,代わりにmanager3およびworker2ノードで実行されている

worker1の状態は,docker node lsコマンドでも確認できる

$ docker exec -it manager1 docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
71jzsyefebwvmiz5va29cnhn4 *   manager1            Ready               Active              Leader              18.09.3
0e3bl408q8lufo5xczwny5l9m     manager2            Ready               Active              Reachable           18.09.3
icd4ixgyqvsc0ebrdf8w5esxy     manager3            Ready               Active              Reachable           18.09.3
woo1rgys2gsgpffjtyrec7gqe     worker1             Ready               Drain                                   18.09.3
kv6dnud4pyfk0269xlqauwngd     worker2             Ready               Active                                  18.09.3
i9ygvq1nvcqqpdyatpygl39ax     worker3             Ready               Active                                  18.09.3

AVAILABILITYがDrainとなっている

次にサービスをスケールダウンする.
以下のコマンドでレプリカの数を15から10まで減らす

docker service scale web=10

サービスの状態確認結果がこちら

$ docker exec -it manager1 docker service ps web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
kw541zci4kni        web.1               nginx:latest        manager2            Running             Running 41 minutes ago                       
3l7bfnzp1y09        web.2               nginx:latest        manager2            Running             Running 17 minutes ago                       
s20rm41zo6uw        web.3               nginx:latest        manager1            Running             Running 15 minutes ago                       
a99tv7ha01et        web.4               nginx:latest        manager3            Running             Running 15 minutes ago                       
qb38lx8ov9ge        web.5               nginx:latest        worker3             Running             Running 15 minutes ago                       
199q9r5nicnz        web.6               nginx:latest        manager3            Running             Running 8 minutes ago                        
vlihahkxs9pv         \_ web.6           nginx:latest        worker1             Shutdown            Shutdown 8 minutes ago                       
7yzl5f31a9rb        web.7               nginx:latest        worker2             Running             Running 15 minutes ago                       
4we17vy5xtmg        web.8               nginx:latest        worker2             Running             Running 15 minutes ago                       
yy5kn8mv8hvz        web.9               nginx:latest        worker1             Shutdown            Shutdown 8 minutes ago                       
aej45h59wln3        web.10              nginx:latest        worker3             Running             Running 15 minutes ago                       
dygbxzxrbuwc        web.11              nginx:latest        manager1            Running             Running 15 minutes ago    

少しわかりにくいが,worker1のweb.9がシャットダウンされているので,確かにレプリカ数は10となっている

次にさきほど放出したworker1を再びアクティブに戻す

docker exec -it manager1 docker node update --availability active worker1

ノードの状態を確認する

$ docker exec -it manager1 docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
71jzsyefebwvmiz5va29cnhn4 *   manager1            Ready               Active              Leader              18.09.3
0e3bl408q8lufo5xczwny5l9m     manager2            Ready               Active              Reachable           18.09.3
icd4ixgyqvsc0ebrdf8w5esxy     manager3            Ready               Active              Reachable           18.09.3
woo1rgys2gsgpffjtyrec7gqe     worker1             Ready               Active                                  18.09.3
kv6dnud4pyfk0269xlqauwngd     worker2             Ready               Active                                  18.09.3
i9ygvq1nvcqqpdyatpygl39ax     worker3             Ready               Active                                  18.09.3

worker1の状態がDrain -> Activeと変化した

サービスの状態を確認する

$ docker exec -it manager1 docker service ps web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE               ERROR               PORTS
kw541zci4kni        web.1               nginx:latest        manager2            Running             Running about an hour ago                       
3l7bfnzp1y09        web.2               nginx:latest        manager2            Running             Running 25 minutes ago                          
s20rm41zo6uw        web.3               nginx:latest        manager1            Running             Running 23 minutes ago                          
a99tv7ha01et        web.4               nginx:latest        manager3            Running             Running 23 minutes ago                          
qb38lx8ov9ge        web.5               nginx:latest        worker3             Running             Running 23 minutes ago                          
199q9r5nicnz        web.6               nginx:latest        manager3            Running             Running 17 minutes ago                          
vlihahkxs9pv         \_ web.6           nginx:latest        worker1             Shutdown            Shutdown 17 minutes ago                         
7yzl5f31a9rb        web.7               nginx:latest        worker2             Running             Running 23 minutes ago                          
4we17vy5xtmg        web.8               nginx:latest        worker2             Running             Running 23 minutes ago                          
yy5kn8mv8hvz        web.9               nginx:latest        worker1             Shutdown            Shutdown 17 minutes ago                         
aej45h59wln3        web.10              nginx:latest        worker3             Running             Running 23 minutes ago                          
dygbxzxrbuwc        web.11              nginx:latest        manager1            Running             Running 23 minutes ago   

worker1ノードをクラスタに復帰させたが,中のサービスは停止しており,レプリカ数に変化はない

次にmanager1ノードをクラスタから退出させる.

docker exec -it manager1 docker swarm leave --force

クラスタからリーダーを退出させた.これによりswarmは,次のリーダーを自動的に立ててくれる
manager2でdocker node lsコマンドを実行し,ノードの状態を確認する

$ docker exec -it manager2 docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
71jzsyefebwvmiz5va29cnhn4     manager1            Down                Active              Unreachable         18.09.3
0e3bl408q8lufo5xczwny5l9m *   manager2            Ready               Active              Leader              18.09.3
icd4ixgyqvsc0ebrdf8w5esxy     manager3            Ready               Active              Reachable           18.09.3
woo1rgys2gsgpffjtyrec7gqe     worker1             Ready               Active                                  18.09.3
kv6dnud4pyfk0269xlqauwngd     worker2             Ready               Active                                  18.09.3
i9ygvq1nvcqqpdyatpygl39ax     worker3             Ready               Active                                  18.09.3

manager1の状態がDownとなっており,MANAGER STATUSもUnreachableとなっている.
manager2が代わりのリーダーとなっている.

最後にサービスを削除する
サービスの削除は以下のコマンドで行う

docker exec -it manager2 docker service rm web

各ノードに分散していたサービスを一括削除できる.

このチュートリアルはこれで終了となる.
不要となったコンテンツを削除する場合は以下のコマンドを実行する

docker stop manager1 manager2 manager3 worker1 worker2 worker3
docker rm manager1 manager2 manager3 worker1 worker2 worker3
docker network rm dind-net

おわりに

docker swarm tutorialを試してみた.
この分野に全く詳しくないので,便利だなーくらいの感想しかない.
きっとk8sはもっと便利なのだろう.
なお今回のチュートリアルではdindコンテナを使ってみた.
ほとんど同じような挙動をしているので,雰囲気をつかむくらいであればdindでもできそうではある.
VMを立てるのと比べてリソースを減らせたかというとよくわからない.スケールした時に動作がもっさりしたりする.
試してはいないが,低スペックなPCやサーバの場合,起動時間は多少減らせるかもしれない.