前回までの記事
300個コンテナ作ります
前回作ったのに呼ばなかったサービス scalewebapps を実行するだけなんですけどね。
# pwd
/root/docker-host/nodes
# docker-compose up -d scalewebapps
Creating nodes_scalewebapps_1...
# docker-compose scale scalewebapps=300
どん。
...
...
Creating nodes_scalewebapps_131...
Creating nodes_scalewebapps_132...
Creating nodes_scalewebapps_133...
Creating nodes_scalewebapps_134...
Creating nodes_scalewebapps_135...
Creating nodes_scalewebapps_136...
Creating nodes_scalewebapps_137...
Creating nodes_scalewebapps_138...
Creating nodes_scalewebapps_139...
...
...
Starting nodes_scalewebapps_298...
Starting nodes_scalewebapps_299...
Starting nodes_scalewebapps_300...
メモリー的にはこれが精一杯(352個くらいで死んだのは内緒)
スケジュラーストラテジにrandomを選んでるにも関わらず、コンテナはほぼノードに均等に配置されている。
ちなみにBinPackingを選んだ時、どう設定してもノード1に寄ってしまって困り果ててた。ラウンドロビンとかもあっていいと思うんだけど。。。
ABを回してもそれなりに応答しちゃうのがすごい。
NginxとApache両方ちゃんとチューンすればよいのだろうけど、こういうのは先輩方に任せます
さてここからが本番
ノードを一つを電プチ
ここではdocker01君に犠牲になってもらおうか。
# reboot
root@ip-10-10-0-50:/root/docker-host/boot#
Broadcast message from ubuntu@ip-10-10-0-50
(/dev/pts/0) at 1:04 ...
The system is going down for reboot NOW!
この状態でも、ApacheBenchやブラウザの挙動に変化なし。
さぁ、Swarmはどうなっちゃうのだろう。
# docker-compose ps
Get http://10.10.0.50:2375/containers/8f847f7a7635cbad0b201fd85ed1acae4b13b75c1aa424c9ffbfacc120ec059c/json: dial tcp 10.10.0.50:2375: connection refused
すでに、docker-compose psでエラーを吐いている。
このままでは、どうにもならないので Dockermanのswarm managerを再起動することにした。
# unset DOCKER_HOST
# cd /root/docker-host/boot
# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
boot_registry_1 docker-registry Up 0.0.0.0:5000->5000/tcp
boot_swarmmanager_1 /swarm manage --strategy r ... Up 0.0.0.0:2380->2375/tcp
# docker-compose restart swarmmanager
Restarting boot_swarmmanager_1...
# export DOCKER_HOST=tcp://localhost:2380
# cd /root/docker-host/nodes
# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------
nodes_consul_1 /bin/start -server -bootst ... Up
nodes_consul_2 /bin/start -server -bootst ... Exit 0
nodes_consul_3 /bin/start -server -bootst ... Up
nodes_loadbalancer_1 /usr/bin/runsvdir /etc/service Exit 0
nodes_loadbalancer_2 /usr/bin/runsvdir /etc/service Up
nodes_loadbalancer_3 /usr/bin/runsvdir /etc/service Up
nodes_registrator_1 /bin/registrator consul:// ... Exit 2
...
...
...
ということで、docker-compose psは出来るようになった。
まずはキレイにして100コンテナくらいまで縮小してみる。
# docker-compose rm
Going to remove nodes_scalewebapps_299, nodes_scalewebapps_300, nodes_scalewebapps_293, nodes_scalewebapps_289, nodes_scalewebapps_290, nodes_scalewebapps_286, nodes_scalewebapps_281, nodes_scalewebapps_282, nodes_scalewebapps_278, nodes_scalewebapps_275, nodes_scalewebapps_272, nodes_scalewebapps_267, nodes_scalewebapps_268, nodes_scalewebapps_269, nodes_scalewebapps_262, nodes_scalewebapps_263, nodes_scalewebapps_256, nodes_scalewebapps_259, nodes_scalewebapps_249...............
Are you sure? [yN] y
# docker-compose scale scalewebapps=100
Stopping nodes_scalewebapps_298...
Stopping nodes_scalewebapps_297...
Stopping nodes_scalewebapps_296...
Stopping nodes_scalewebapps_295...
Stopping nodes_scalewebapps_294...
Stopping nodes_scalewebapps_292...
Stopping nodes_scalewebapps_291...
Stopping nodes_scalewebapps_288...
Stopping nodes_scalewebapps_287...
Stopping nodes_scalewebapps_285...
...
...
Removing nodes_scalewebapps_253...
Removing nodes_scalewebapps_250...
Removing nodes_scalewebapps_254...
Removing nodes_scalewebapps_252...
Removing nodes_scalewebapps_251...
Removing nodes_scalewebapps_247...
Removing nodes_scalewebapps_248...
Removing nodes_scalewebapps_242...
Removing nodes_scalewebapps_239...
...
...
さ、そろそろ再起動も終わってるころだと思うので...
ノードを復帰させてみる
まずは、電プチしてしまったDocker01でSwarmエージェントを立ち上げる
# cd /root/docker-host/boot/
# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------
boot_swarmagent_1 /swarm join --addr=10.10.0 ... Exit 2
# docker-compose rm
Going to remove boot_swarmagent_1
Are you sure? [yN] y
Removing boot_swarmagent_1...
# docker-compose up -d
Creating boot_swarmagent_1...
次にDockermanで、それぞれ順番にサービスを復旧させる
# pwd
/root/docker-host/nodes
# docker-compose scale consul=3
Creating nodes_consul_4...
Starting nodes_consul_4...
# docker-compose scale registrator=3
Creating nodes_registrator_4...
Starting nodes_registrator_4...
# docker-compose scale loadbalancer=3
Creating nodes_loadbalancer_4...
Starting nodes_loadbalancer_4...
# docker-compose scale webapps=3
Creating nodes_webapps_3...
Starting nodes_webapps_3...
# docker-compose scale scalewebapps=200
...
...
...
Starting nodes_scalewebapps_242...
Starting nodes_scalewebapps_243...
Starting nodes_scalewebapps_244...
Starting nodes_scalewebapps_245...
残念ながらscalewebappsサービスは少し偏ってしまった。
しかし、サービスは無停止でノード復帰を果たしている模様。
ELBのStatusも全ノード InService になっている。
結論
夢は叶った。
そして、SwarmとConsulの連携はもっと勉強が必要。
この構成だと、Registratorが無くてもうまくやる方法があるような気がしてる
残った課題は今後の記事で取り上げていく。
- ログはどうする
- 監視はどーなる
- 障害の自動復旧とか
Dockerは今後もっと楽しくなる。