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

# 前回までの記事

* <a href="http://qiita.com/zERobYTe/items/dd9b2365c93da2638221">ELB+Swarm+Compose+Consul+Registratorで夢は叶うのか(1)</a>
* <a href="http://qiita.com/zERobYTe/items/c37904c20546b3092371">ELB+Swarm+Compose+Consul+Registratorで夢は叶うのか(2)</a>

# 300個コンテナ作ります

前回作ったのに呼ばなかったサービス scalewebapps を実行するだけなんですけどね。

```bash
# pwd
/root/docker-host/nodes
# docker-compose up -d scalewebapps
Creating nodes_scalewebapps_1...
# docker-compose scale scalewebapps=300
```

どん。

```logs
...
...
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君に犠牲になってもらおうか。

```bash
# 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はどうなっちゃうのだろう。

```bash
# 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を再起動することにした。

```bash
# 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コンテナくらいまで縮小してみる。

```bash
# 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エージェントを立ち上げる

```bash
# 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で、それぞれ順番にサービスを復旧させる

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