automated a workflow of the release using consul
TRANSCRIPT
What is Consul?
• Service Discovery:
• Consul クライアントは、api や mysql 等の ‘service’ を提供し、他のクライアントはこれらサービスを検出するために Consul を用いることが出来る。
• Health Checking:
• サービスの状態(Webであれば200)やサーバーの状態(Memoryの使用90%)をチェックすることが出来る。
What is Consul?
• Key/Value Store:
• シンプルな HTTP API で設定、フラグを取得でき、様々な目的に利用出来る
• Multi Datacenter:
• 複数のデータセンタにまたがって成長しても、Consul はスケールできる。
ハンズオンの内容
• 障害を検知(※1)して、新しくコンテナを起動(※2)
※1 consul watchコマンドにて、nginx監視に変化があった場合、スクリプトを実行
※2 ハンズオン内容(@_BSmile_) http://qiita.com/_BSmile_/items/fa6e6c19e05fec1bb52a
Consul Server WebWeb Web
Consul ServerからDocker
APIを使ってコンテナ起動
_人人人人人人_ > 突然の死 < ‾Y^Y^Y^Y^Y‾
_人人人人人人_ > 復活 < ‾Y^Y^Y^Y^Y‾
検知
自動復旧というアプローチ
• 突然の死(Statusがpassing以外)をConsul
Serverが検知
• 新しくコンテナを起動※
• 設定を変更する(htmlを変更)
• consulのmemberに参加※ハンズオンでは処理を簡略化させるためにコンテナからホストにアクセスしてコンテナを起動
LoadBalancer切替
• consul-templateとconsul watchコマンドを使って簡単なblue-green deploymentをする
Web Web
LB Consul Server
consul-templateで設定書き換え
Consul Agent
リリース後にEvent発行して切替
*Sample code https://github.com/koudaiii/switch-sample-service
やっていること
• consul watchコマンドでconsul-templateを実行するようにeventを登録
• consul-templateでLoadBalancerの設定を書き換えて、プロセス再起動
• リリースが終わったらconsul エージェント側でevent発報
Event登録と発行
* set event in consul-server# /vagrant/consul watch -type=event -name=“switch-green" ./green.service &# /vagrant/consul watch -type=event -name=“switch-blue" ./blue.service &
* switch in consul-client # /vagrant/consul event -name=“switch-green” # /vagrant/consul event -name=“switch-blue"
※-type=eventは任意で実行。-type=serviceでStatusの変更でイベント発行することも可能。
中身もシンプル
$ cat green.service #!/bin/sh
exec /vagrant/consul-template \ -consul 127.0.0.1:8500 \ -template "/vagrant/tmpl/green.conf:/etc/nginx/conf.d/app.conf:service nginx restart" \ -once※onceを付けないとDaemonで動いてしまうため$ cat tmpl/green.conf upstream app { least_conn; {{range service "green"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 192.168.33.10:80; # force a 502{{end}}}
maint
• Consul 0.5のmaint オプション
• このServerだけおかしいとか
• ちょっと調査したいから切り離したいとか
• Openssl対応とかで意図的にサービス落とすとか
• メンテナンスする際に役に立つ
※このコマンドでサービス自体を落とすわけではない
新しくメンテナンス情報が追加
# /vagrant/consul maint -service blue -enable #Maintenance ON# curl -s http://127.0.0.1:8500/v1/health/checks/blue | jq .[・・・・・・ { "Node": "blue", "CheckID": "_service_maintenance:blue", "Name": "Service Maintenance Mode", "Status": "critical", "Notes": "Maintenance mode is enabled for this service, but no reason was provided. This is a default message.", "Output": "", "ServiceID": "blue", "ServiceName": "blue" }]
サービスから切り離される
# dig blue.service.consul 2015/03/24 11:09:28 [WARN] dns: node 'blue' failing health check '_service_maintenance:blue: Service Maintenance Mode', dropping from service 'blue'
; <<>> DiG 9.9.5-3-Ubuntu <<>> blue.service.consul;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59887;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:;blue.service.consul. IN A・・・・・・・・# /vagrant/consul maint -service blue -disable #Maintenance OFF
execで一括コマンド実行
consul exec [ -datacenter | -node | -service | -tag ] “Your commnad”
# consul exec “uname -a”⇒メンバー全員
# consul exec -node=“node01” “uname -a”⇒node01サーバーのみ
# consul exec -service=“web” “openssl version” ⇒WebサービスにOpensslのVerisionを聞く
まとめ
• Consul watchでサービスの検知と作業の自動化
• Consul-templateで設定内容の変更、実行
• 0.5のmaintでサービスから一時的に外せる
• consul exec で範囲を指定して一括コマンドの実行
Reference
• consul https://www.consul.io/
• Go http://golang.org/doc/install
• consul-template
• https://github.com/hashicorp/consul-template
• https://github.com/hashicorp/consul-template/releases
• consul watch command
• http://www.consul.io/docs/commands/watch.html
• consul exec http://www.consul.io/docs/commands/exec.html
• 今さらジローだけど Consul 0.5 をざっくり試す
• http://qiita.com/inokappa/items/e4a373a26f0ecea0dda9