swarm tutorialをdindでやってみる 完結編
やること
前回記事の続き
以下のように,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
なお,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やサーバの場合,起動時間は多少減らせるかもしれない.