LoginSignup
11

More than 5 years have passed since last update.

ELB+Swarm+Compose+Consul+Registratorで夢は叶うのか(3)

Posted at

前回までの記事

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は今後もっと楽しくなる。

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
11