Chef ProvisioningとDockerでConsul Templateのテスト環境を作成する #getchef #docker #consul

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
はじめに
本稿では、Chef Provisioning と Docker を用いて Consul Template のテスト環境を作成してみます。Chef Provisioning と Docker については「Chef ProvisioningとDockerでSerfクラスタ環境を作成する」を、Consul クラスタについては「Chef ProvisioningとVagrantでConsulクラスタ環境を作成する」を参照してください。本稿で使用したソースコードはすべて https://github.com/cl-lab-k/chef-consul-docker-cluster にあります。
事前準備
実験は Debian GNU/Linux 8.1 上で行いました。以下のパッケージやプラグインをインストールしています。
- Chef-DK 0.6.2
 - Vagrant 1.7.2
- Vagrant プラグイン: vagrant-hostsupdater 0.0.11
 - Vagrant プラグイン: vagrant-cachier 1.2.0
 
 - VirtualBox 4.3.28
 
ソースコードの取得
https://github. com/cl-lab-k/chef-consul-docker-cluster/tree/sample_blog を clone します。
% git clone https://github.com/cl-lab-k/chef-consul-docker-cluster -b sample_blog
Cloning into 'chef-consul-docker-cluster'...
:
% cd chef-consul-docker-cluster
%
以降はこのツリー内で作業を行います。
VM の作成
Vagrant を用いて、今回の実験用の仮想マシンを作成します。
% ls -la
合計 28
drwxr-xr-x  5 dai  dai   240  7月  9 19:17 .
drwxrwxrwt 23 root root  680  7月 10 11:45 ..
drwxr-xr-x  8 dai  dai   300  7月  9 19:46 .git
-rw-r--r--  1 dai  dai   172  7月  6 15:20 .gitignore
-rw-r--r--  1 dai  dai   140  7月  6 15:29 Berksfile
-rw-r--r--  1 dai  dai   824  7月  6 12:50 README.md
-rw-r--r--  1 dai  dai   598  7月  1 12:50 Rakefile
-rw-r--r--  1 dai  dai   511  7月  9 14:57 Vagrantfile
-rw-r--r--  1 dai  dai  1114  6月 30 12:11 chefignore
-rw-r--r--  1 dai  dai   344  7月  6 15:54 metadata.rb
drwxr-xr-x  3 dai  dai    60  6月 30 18:26 provisioning
drwxr-xr-x  2 dai  dai    60  7月  6 12:50 recipes
%
作成する VM の設定は Vagrantfile ファイルで行えます。初期設定では、Box は chef/ubuntu-14.04、IP アドレスは 192.168.33.101、メモリは 8192M の設定となっています。一連の作業は基本的に rake タスクとして定義してあります。デフォルトでは berks vendor サブコマンドを実行して chef-dk Cookbook、docker Cookbook、git Cookbook を取得し、Vagrant によって VirtualBox VM を作成します。起動した VM には Chef Zero Provisioner を用いて chef-consul-docker-cluster::default Recipe を適用し、Docker のインストールと起動、vagrant ユーザの所属グループの変更、chef-provisioning-docker のインストールを行い、Chef Provisioner Docker 用のファイルを VM に転送します。
% rake
berks vendor cookbooks
Resolving cookbook dependencies...
:
:
:
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
:
:
:
scp -i /tmp/chef-consul-docker-cluster/.vagrant/machines/default/virtualbox/private_key -P 2222 -r /tmp/chef-consul-docker-cluster/provisioning/docker vagrant@127.0.0.1:
:
:
:
%
VM 内で Chef Provisioning Docker を実行
作成した VM にログインします。
% vagrant ssh
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-24-generic x86_64)
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Oct 21 14:52:42 2014 from 10.0.2.2
vagrant@vagrant:~$
先程 VM に scp したディレクトリがあるので、そちらに移動します。
vagrant@vagrant:~$ cd docker
vagrant@vagrant:~/docker$ ls -la
total 20
drwxr-xr-x  7 vagrant vagrant 4096 Jul 10 01:05 .
drwxr-xr-x  7 vagrant vagrant 4096 Jul 10 00:59 ..
-rw-r--r--  1 vagrant vagrant  323 Jul 10 00:58 Berksfile
-rw-r--r--  1 vagrant vagrant 2033 Jul 10 00:58 Rakefile
-rw-r--r--  1 vagrant vagrant  188 Jul 10 00:58 atlas.json
drwxr-xr-x  5 vagrant vagrant 4096 Jul 10 00:58 consul-client-config
-rw-r--r--  1 vagrant vagrant 1155 Jul 10 00:58 consul-client.rb
-rw-r--r--  1 vagrant vagrant 1004 Jul 10 00:58 consul-server.rb
vagrant@vagrant:~/docker$
ここでは chef-provisioning-docker を用いて、Docker 社の公式レポジトリの ubuntu:14.04 イメージから Consul 用イメージを作成し、それを基に 7つ Consul 用コンテナを起動します。そのうち 3つは Consul Server 用、別の 4つは Consul Client 用で、起動したコンテナは自動的にクラスタを構成します。
Consul クラスタの構成には Atlas の Auto-Join を利用しています。atlas.json には Atlas のアカウントと API トークンを記載します。Atlas を用いた Consul クラスタの自動構成についての詳細は「Consulサーバクラスタ構成手順の歴史」参照してください。
なお、この chef-consul-docker-cluster/provisioning/docker は VM 内でなくとも実機上で実行が可能ですので、興味があれば各自試してみてください。
こちらも作業は rake タスクとして定義してあります。ただし、この VM には Ubuntu 公式の rake パッケージが入っていないため、代わりに chef-dk 同梱の /opt/chefdk/embedded/bin/rake を実行してください。
vagrant@vagrant:~/docker$ /opt/chefdk/embedded/bin/rake
berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'consul' from https://github.com/johnbellone/consul-cookbook.git (at 10d582a)
Fetching 'consul-client-config' from source at consul-client-config
Fetching cookbook index from https://supermarket.chef.io...
Installing 7-zip (1.0.2)
Installing apt (2.7.0)
Installing ark (0.9.0)
Installing bluepill (2.3.1)
Installing build-essential (2.2.3)
Installing chef-provisioning (0.1.2)
Installing chef_handler (1.2.0)
Using consul (0.10.0) from https://github.com/johnbellone/consul-cookbook.git (at 10d582a)
Using consul-client-config (0.1.0) from source at consul-client-config
Installing consul-template (0.8.0)
Installing golang (1.5.1)
Installing libarchive (0.4.4)
Installing nginx (2.7.6)
Installing ohai (2.0.1)
Installing packagecloud (0.0.19)
Installing python (1.4.6)
Installing rsyslog (2.0.0)
Installing runit (1.7.2)
Installing supervisor (0.4.12)
Installing windows (1.37.0)
Installing yum (3.6.1)
Installing yum-epel (0.6.2)
Installing yum-repoforge (0.5.3)
:
:
:
まず Berkshelf を使って、必要な consul Cookbook、nginx Cookbook、supervisor Cookbook の取得を行っています。
CHEF_DRIVER=docker chef-client -z consul-server.rb
[2015-07-10T00:59:36+00:00] WARN: No config file found or specified on command line, using command line options.
Starting Chef Client, version 12.3.0
resolving cookbooks for run list: []
Synchronizing Cookbooks:
Compiling Cookbooks...
[2015-07-10T00:59:37+00:00] WARN: Node vagrant.vm has an empty run list.
Converging 4 resources
Recipe: @recipe_files::/home/vagrant/docker/consul-server.rb
* machine_image[consul-server] action create
- create node consul-server at chefzero://localhost:8889
:
:
:
chef-provisioning-docker を利用して、Consul Server 用の Docker イメージを作成します。この際、Cookbook の適用には Chef-Zero を用いています。
* machine[consul101] action converge
- create node consul101 at chefzero://localhost:8889
:
:
:
* machine[consul102] action converge
- create node consul102 at chefzero://localhost:8889
:
:
:
* machine[consul103] action converge
- create node consul103 at chefzero://localhost:8889
:
:
:
Running handlers:
Running handlers complete
Chef Client finished, 4/4 resources updated in 346.418441609 seconds
引き続き、chef-provisioning-docker を利用して、Consul Server 用の Docker イメージからコンテナを作成していきます。ここでも Chef-Zero を活用しています。
Consul Client 用の Docker コンテナは Using Supervisor with Docker を参考に、Supervisor を起動し、その管理下に複数サービスを持つ形とします。supervisord は provisioning/docker/consul-client.rb にある通り --nodaemon オプションを付与してフォアグラウンドで起動し、nginx は provisioning/docker/consul-client-config/recipes/default.rb にある通り -g "daemon off;" オプションを付与してフォアグラウンドで起動します。
4つの Consul Client 用の Docker コンテナのうち 3つは supervisor + Consul Client + Nginx で、もう 1つは Consul Template を起動しています。Consul Template とは、Consul のイベントを受けてファイルの更新とコマンドの実行を行うエージェントプログラムです。
ここでは 3つのウェブサーバへの振り分けを行うロードバランサを設置するとします。ロードバランサは Consul を通して各ウェブサーバの死活監視を行い、Consul Template を用いて設定ファイルの書き換えとサービスの再起動を行うようにしています。Consul Template は、後述する「lb.ctmpl」というファイルを使ってロードバランシング先の IP アドレスの情報を書き換えます。
Docker コンテナの確認
起動した Docker コンテナの状態を確認してみましょう。
vagrant@vagrant:~/docker$ docker ps
CONTAINER ID        IMAGE                                                                     COMMAND                CREATED             STATUS              PORTS               NAMES
a8e92ba7c3f3        db88494d511925db26ed56f9aaf647f3e44eccac98dea5f9a69583b1d00ed3d3:latest   "/usr/local/bin/supe   2 hours ago         Up 2 hours                              consul119
cc83ba6cef94        f28aa99c791d71900a7a2b9228d7272bd669694d7a148950688e113ea99b0dd3:latest   "/usr/local/bin/supe   2 hours ago         Up 2 hours                              consul113
d1080ac64af5        060d5ac515ab7a3b2aad5bb6d52f42a72c269270fe21729a2872d26dfd556613:latest   "/usr/local/bin/supe   2 hours ago         Up 2 hours                              consul112
8635f1f53cb2        3e220e8ee57fce19140de264863ed5608fc9331b8926c828f27b5fb041b73d64:latest   "/usr/local/bin/supe   2 hours ago         Up 2 hours                              consul111
495dca2561e9        861dd3d598149ce30f396d2beb11cc32d3166936e6284e93238333a4d252f7e5:latest   "/usr/local/bin/cons   2 hours ago         Up 2 hours                              consul103
0df300a44541        5bba85c070f97a65322f2cb8670095b72e7ba2ff4071f56e60eb19dd12ebeb06:latest   "/usr/local/bin/cons   2 hours ago         Up 2 hours                              consul102
603808f3229e        da15b948e41a58445caaeb3c182065571d81d34948e2681bc330964d908996a0:latest   "/usr/local/bin/cons   2 hours ago         Up 2 hours                              consul101
vagrant@vagrant:~/docker$
vagrant@vagrant:~/docker$ ps auxwwwf
:
root      4044  0.1  0.2 852812 24456 ?        Ssl  00:58   0:16 /usr/bin/docker -d --ip-forward=true --log-level=info --tls=true
root     10944  0.6  0.2 33903548 19740 ?      Ssl  01:05   0:51  \_ /usr/local/bin/consul agent -config-dir /etc/consul.d
root     11471  1.3  0.2 34043904 20184 ?      Ssl  01:05   1:49  \_ /usr/local/bin/consul agent -config-dir /etc/consul.d
root     12025  0.6  0.2 33904636 17732 ?      Ssl  01:05   0:51  \_ /usr/local/bin/consul agent -config-dir /etc/consul.d
root     20379  0.0  0.1  57828 13388 ?        Ss   01:11   0:01  \_ /usr/bin/python /usr/local/bin/supervisord --nodaemon
root     20609  0.2  0.1 287412 15276 ?        Sl   01:11   0:22  |   \_ /usr/local/bin/consul agent -config-dir /etc/consul.d
root     20610  0.0  0.0  85876  4152 ?        S    01:11   0:00  |   \_ nginx: master process /usr/sbin/nginx -g daemon off;
www-data 20616  0.0  0.0  86216  2280 ?        S    01:11   0:00  |       \_ nginx: worker process
root     20937  0.0  0.1  57828 13392 ?        Ss   01:11   0:01  \_ /usr/bin/python /usr/local/bin/supervisord --nodaemon
root     21125  0.2  0.1 352948 13208 ?        Sl   01:11   0:21  |   \_ /usr/local/bin/consul agent -config-dir /etc/consul.d
root     21126  0.0  0.0  85876  4148 ?        S    01:11   0:00  |   \_ nginx: master process /usr/sbin/nginx -g daemon off;
www-data 21132  0.0  0.0  86216  2276 ?        S    01:11   0:00  |       \_ nginx: worker process
root     21483  0.0  0.1  57828 13392 ?        Ss   01:12   0:01  \_ /usr/bin/python /usr/local/bin/supervisord --nodaemon
root     21675  0.2  0.1 352948 15188 ?        Sl   01:12   0:21  |   \_ /usr/local/bin/consul agent -config-dir /etc/consul.d
root     21676  0.0  0.0  85876  4152 ?        S    01:12   0:00  |   \_ nginx: master process /usr/sbin/nginx -g daemon off;
www-data 21683  0.0  0.0  86216  2276 ?        S    01:12   0:00  |       \_ nginx: worker process
root     22507  0.0  0.1  57848 13408 ?        Ss   01:13   0:01  \_ /usr/bin/python /usr/local/bin/supervisord --nodaemon
root     22536  0.0  0.0   8988  3796 ?        Sl   01:13   0:00      \_ /usr/local/bin/consul-template -config /etc/consul-template.d
root     22539  0.2  0.1 344752 15556 ?        Sl   01:13   0:19      \_ /usr/local/bin/consul agent -config-dir /etc/consul.d
root     22540  0.0  0.0  85876  4148 ?        S    01:13   0:00      \_ nginx: master process /usr/sbin/nginx -g daemon off;
www-data 22547  0.0  0.0  86232  2284 ?        S    01:13   0:00          \_ nginx: worker process
:
vagrant@vagrant:~/docker$
このように、Consul 用コンテナが 7つと所属する各種サービスが起動しています。
コンテナ内で consul members を行う rake タスクを用意してあるので、実行してみます。
vagrant@vagrant:~/docker$ /opt/chefdk/embedded/bin/rake members
:
:
:
docker exec 603808f3229e consul members
Node          Address           Status  Type    Build  Protocol  DC
495dca2561e9  172.17.0.37:8301  alive   server  0.5.2  2         dc1
8635f1f53cb2  172.17.0.58:8301  alive   client  0.5.2  2         dc1
d1080ac64af5  172.17.0.66:8301  alive   client  0.5.2  2         dc1
cc83ba6cef94  172.17.0.74:8301  alive   client  0.5.2  2         dc1
a8e92ba7c3f3  172.17.0.82:8301  alive   client  0.5.2  2         dc1
603808f3229e  172.17.0.21:8301  alive   server  0.5.2  2         dc1
0df300a44541  172.17.0.29:8301  alive   server  0.5.2  2         dc1
vagrant@vagrant:~/docker$
このように Consul クラスタが構成されています。
ロードバランサの状態を確認してみます。
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 cat /etc/nginx/sites-enabled/default
upstream lb_units {
server 172.17.0.58;
server 172.17.0.74;
server 172.17.0.66;
}
server {
listen 80;
server_name 4670d624aee6;
location / {
proxy_pass http://lb_units;
proxy_set_header Host $http_host;
}
}
vagrant@vagrant:~/docker$
provisioning/docker/consul-client-config/templates/lb.ctmpl.erb の server_name を Chef が置き換えて生成した lb.ctmpl のロードバランシング先の IP アドレスを Consul Template が展開し、upstream とするウェブサーバが 3台登録されています。Consul テンプレートの書式は Introducing Consul Template や hashicorp/consul-template を参照してください。
実際にアクセスしてみます。今回はポートを外に出していないので、コンテナ内で確認します。
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
2646f38ba78b
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
2646f38ba78b
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$
このように各ウェブサーバに振り分けされていることがわかります。
Consul Client コンテナの停止・起動
手動でウェブサーバ用の Consul Client コンテナを 1つ停止してみましょう。docker stop コマンドを使います。
vagrant@vagrant:~/docker$ docker stop cc83ba6cef94
cc83ba6cef94
vagrant@vagrant:~/docker$
rake members タスクを実行してみます。
vagrant@vagrant:~/docker$ rake members
:
docker exec 603808f3229e consul members
Node          Address           Status  Type    Build  Protocol  DC
a8e92ba7c3f3  172.17.0.82:8301  alive   client  0.5.2  2         dc1
603808f3229e  172.17.0.21:8301  alive   server  0.5.2  2         dc1
0df300a44541  172.17.0.29:8301  alive   server  0.5.2  2         dc1
495dca2561e9  172.17.0.37:8301  alive   server  0.5.2  2         dc1
8635f1f53cb2  172.17.0.58:8301  alive   client  0.5.2  2         dc1
d1080ac64af5  172.17.0.66:8301  alive   client  0.5.2  2         dc1
cc83ba6cef94  172.17.0.74:8301  failed  client  0.5.2  2         dc1
vagrant@vagrant:~/docker$
停止したコンテナの Status が failed になっています。
ロードバランサの状態を確認してみます。
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 cat /etc/nginx/sites-enabled/default
upstream lb_units {
server 172.17.0.58;
server 172.17.0.66;
}
server {
listen 80;
server_name 4670d624aee6;
location / {
proxy_pass http://lb_units;
proxy_set_header Host $http_host;
}
}
vagrant@vagrant:~/docker$
停止したぶん 1つ upstream が減っています。実際にアクセスしてみます。
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$
書き換えられた設定ファイルを反映するためのサービスの再起動が自動的に行われていて、振り分け先が 2つになっていることがわかります。
では、停止した Consul Client コンテナを docker start コマンドで起動します。
vagrant@vagrant:~/docker$ docker start cc83ba6cef94
cc83ba6cef94
vagrant@vagrant:~/docker$
同様の手順で確認していきます。
vagrant@vagrant:~/docker$ rake members
:
docker exec 603808f3229e consul members
Node          Address           Status  Type    Build  Protocol  DC
a8e92ba7c3f3  172.17.0.82:8301  alive   client  0.5.2  2         dc1
603808f3229e  172.17.0.21:8301  alive   server  0.5.2  2         dc1
0df300a44541  172.17.0.29:8301  alive   server  0.5.2  2         dc1
495dca2561e9  172.17.0.37:8301  alive   server  0.5.2  2         dc1
8635f1f53cb2  172.17.0.58:8301  alive   client  0.5.2  2         dc1
d1080ac64af5  172.17.0.66:8301  alive   client  0.5.2  2         dc1
cc83ba6cef94  172.17.0.83:8301  alive   client  0.5.2  2         dc1
vagrant@vagrant:~/docker$
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 cat /etc/nginx/sites-enabled/default
upstream lb_units {
server 172.17.0.58;
server 172.17.0.83;
server 172.17.0.66;
}
server {
listen 80;
server_name 4670d624aee6;
location / {
proxy_pass http://lb_units;
proxy_set_header Host $http_host;
}
}
vagrant@vagrant:~/docker$
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
2646f38ba78b
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
2646f38ba78b
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$
再び 3つの upstream に振り分けられるようになりました。
Nginx サービスの停止・起動
今度は Consul Client コンテナ自体を停止するのではなく、コンテナ内の Nginx サービスだけを停止してみます。
provisioning/docker/consul-client-config/files/web.json にある通り、Consul Client は Nginx サービスの監視を行っています。
まずコンテナ内のサービスを確認してみます。
vagrant@vagrant:~/docker$ docker exec cc83ba6cef94 supervisorctl status
consul_client                    RUNNING   pid 7, uptime 0:08:19
nginx_server                     RUNNING   pid 8, uptime 0:08:19
vagrant@vagrant:~/docker$
kill コマンドでサービスを kill することもできますが supervisord がすぐに起動し直してしまうので、supervisorctl stop でサービスを停止します。
vagrant@vagrant:~/docker$ docker exec cc83ba6cef94 supervisorctl stop nginx_server
nginx_server: stopped
vagrant@vagrant:~/docker$ 
vagrant@vagrant:~/docker$ docker exec cc83ba6cef94 supervisorctl status
consul_client                    RUNNING   pid 7, uptime 0:09:18
nginx_server                     STOPPED   Jul 10 03:57 AM
vagrant@vagrant:~/docker$
サービスを停止しました。
rake members タスクを実行してみます。
vagrant@vagrant:~/docker$ rake members
:
docker exec 603808f3229e consul members
Node          Address           Status  Type    Build  Protocol  DC
a8e92ba7c3f3  172.17.0.82:8301  alive   client  0.5.2  2         dc1
603808f3229e  172.17.0.21:8301  alive   server  0.5.2  2         dc1
0df300a44541  172.17.0.29:8301  alive   server  0.5.2  2         dc1
495dca2561e9  172.17.0.37:8301  alive   server  0.5.2  2         dc1
8635f1f53cb2  172.17.0.58:8301  alive   client  0.5.2  2         dc1
d1080ac64af5  172.17.0.66:8301  alive   client  0.5.2  2         dc1
cc83ba6cef94  172.17.0.84:8301  alive   client  0.5.2  2         dc1
vagrant@vagrant:~/docker$
コンテナ自体、あるいは Consul Client エージェントを停止したわけではなので、Consul クラスタ内に留まり続けています。
同様の手順で確認していきます。
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 cat /etc/nginx/sites-enabled/default
upstream lb_units {
server 172.17.0.58;
server 172.17.0.66;
}
server {
listen 80;
server_name 4670d624aee6;
location / {
proxy_pass http://lb_units;
proxy_set_header Host $http_host;
}
}
vagrant@vagrant:~/docker$
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$
このように Nginx サービスを停止したらクラスタから外されていることがわかります。
Nginx サービスを再開します。
vagrant@vagrant:~/docker$ docker exec cc83ba6cef94 supervisorctl start nginx_server
nginx_server: started
vagrant@vagrant:~/docker$ 
vagrant@vagrant:~/docker$ docker exec cc83ba6cef94 supervisorctl status
consul_client                    RUNNING   pid 7, uptime 0:45:39
nginx_server                     RUNNING   pid 614, uptime 0:00:10
vagrant@vagrant:~/docker$
同様の手順で確認していきます。
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 cat /etc/nginx/sites-enabled/default
upstream lb_units {
server 172.17.0.58;
server 172.17.0.84;
server 172.17.0.66;
}
server {
listen 80;
server_name 4670d624aee6;
location / {
proxy_pass http://lb_units;
proxy_set_header Host $http_host;
}
}
vagrant@vagrant:~/docker$
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
2646f38ba78b
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
2646f38ba78b
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
3c9f3015715d
vagrant@vagrant:~/docker$ docker exec a8e92ba7c3f3 curl http://127.0.0.1/ 2> /dev/null
b8f0aed7b0cd
vagrant@vagrant:~/docker$
再び 3つの upstream に振り分けられるようになりました。
まとめ
本稿では、Chef Provisioning と Docker を用いて Consul Template のテスト環境を作成しました。手軽かつ確実にサービスの構成変更が可能であることがおわかりいただけたと思います。
本実験では Consul Template の動作確認のみに焦点を絞ったので、Chef Provisioning、Docker、Consul や Consul Template そのものにも深く見ていません。それぞれの詳細考察に関しては今後の課題です。

