Edited at

Tech-circle #4 Consul勉強会 -ハンズオン編-

More than 3 years have passed since last update.


ハンズオン手順

実施予定時間

項目1・2「Consulインストールから起動まで」

19:50-20:10

項目3「Consul Client障害検知~自動復旧体験」

20:10-20:30

[Link]

準備編

ハンズオン編

Extra Stage


1 Master Container作成


  • イメージのダウンロード

※準備編の「5. Containerベースダウンロード」にて実施済み

sudo: unable to resolve host consul

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
bsmile/consul-handson latest a4f420dc2b88 6 hours ago 292 MB


2 Consul Agent起動


2.1 Consul-Server立ち上げ


2.1.1 Consul Server設定


  • consulサーバ用コンテナ立ち上げ

$ sudo docker run --name consul-sv1 -p 8500:8500 -i -t bsmile/consul-handson /bin/bash

ここからはコンテナ(consul-server)上の設定となります。


2.1.2 Consulサーバ IP確認

eth0のIPアドレスをメモして下さい。

consul-clientから接続する際に必要となります。

root@64e2fd981f5e:/# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
4: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 5e:b1:51:6a:88:da brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5cb1:51ff:fe6a:88da/64 scope link
valid_lft forever preferred_lft forever


2.1.3 Consul Agent Server起動前準備

後半で使用する、フェイルオーバ時のスクリプトを編集しておきます。

下記スクリプトの「172.17.0.2」を、先ほど確認したconsul serverのeth0IPアドレスへ置き換えて使用して下さい。

# sed -i -e "s/consul-sv1/172.17.0.2/g" -e "s/techcircle\:consul/bsmile\/consul-handson/g" /opt/consul/scripts/consul_http_recovery.sh


2.1.4 Consul Agent( Server / WebUI )起動

# consul agent \

-bootstrap-expect 1 \
-server \
-node=consul-sv \
-data-dir=/opt/consul/dat \
-ui-dir=/opt/consul/webui/dist \
-client="0.0.0.0" &

完了後、Ctrl+P → Ctrl+Qでコンテナから抜けて下さい。

以上でConsul-server設定終わり


2.2 Consul-Client立ち上げ


2.2.1 Consul Client設定


  • consul コンテナ(client) 立ち上げ

下記スクリプトの「172.17.0.2」を、先ほど確認したconsul serverのeth0 IPアドレスへ置き換えて使用して下さい。

今回の起動は、[/bin/bash]ではなく、consul agent(client)を起動するスクリプトを実行させます。

$ sudo docker run --name consul-cl1 -p 10080:80 -i -t bsmile/consul-handson sh /opt/consul/scripts/consul-client-start.sh 172.17.0.2

consulを実行した際エンター等を押下しても応答がありませんが、フォアグラウンドで実行されるアプリケーションなので問題ありません。

完了後、Ctrl+P → Ctrl+Qでコンテナから抜けて下さい。


  • webブラウザから確認

http://dockerサーバIP:10080/

Welcome to [コンテナID]が表示される。


  • consulノード確認

http://dockerサーバIP:8500/

NODESタブにコンテナIDが追加されている。


試しにwebサーバダウンさせてみましょう

$ sudo docker exec consul-cl1 service nginx stop



consulサーバのweb-uiをリロードすると、httpチェックがcriticalとなっている事がわかります。

この制御を利用してconsulサーバから新しいコンテナを作成します。


  • 再度nginx起動

$ sudo docker exec consul-cl1 service nginx start


3 Nginx停止時の自動フェイルオーバー


3.1 Consul Server設定


  • 実行権限付与とconsulサーバによる監視処理実行

consul serverへ接続します。

$ sudo docker attach consul-sv1

consul watchコマンドにて、nginx監視に変化があった場合、[http_watch.sh]というスクリプトを実行させます。

# consul watch -http-addr=127.0.0.1:8500 -type=service -service=http /opt/consul/scripts/http_watch.sh &

完了後、Ctrl+P → Ctrl+Qでコンテナから抜けて下さい。


3.2 フェイルオーバー確認

もう一度nginxサービスを停止させてみましょう。

今度は、consul watchにてnginxサービスステータスがpassing以外になった場合

1. 問題のconsulクライアントをメンバから除外

2. 上記クライアントコンテナ停止

3. 新規クライアントコンテナ作成

4. nginx起動

5. consulメンバーに参加

と流れるスクリプトが実行されます。

$ sudo docker exec consul-cl1 /usr/sbin/service nginx stop

約1分以内にフェイルオーバ用のwebサーバが立ち上がります。


  • webブラウザから確認

http://dockerサーバIP:10080/

Welcome to コンテナIDが表示される。


  • consulノード確認

http://dockerサーバIP:8500/


おまけ


dockerコンテナを扱う為のコマンド


/bin/bashで起動時、コンテナを停止させずに抜ける

# Ctrl+P の後に Ctrl+Q


/bin/bashが実行中のコンテナに再接続する

※ run実行時に、-i -t オプションが有効になっている場合

# docker attach コンテナ名(ID)