25
Automated a workflow of the release using Consul @koudaiii

Automated a workflow of the release using consul

  • Upload
    -

  • View
    1.677

  • Download
    0

Embed Size (px)

Citation preview

Automated a workflow of the release using Consul@koudaiii

Profile

• id: koudaiii

• fullname: Kodai Sakabe

Agenda

• What is Consul?

• 今日のハンズオンのおさらい

• Automated a workflow of the release

• Maintenance

• まとめ

Consul

What is Consul?

• サーバとクライアントで構成され、クラスタを形成

• DNSとHTTPを提供

• サービスの検出と設定を自動化するためのツール

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に参加※ハンズオンでは処理を簡略化させるためにコンテナからホストにアクセスしてコンテナを起動

Automated a workflow of the release

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}}}

Maintenance

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

• 一括でOpenssl のVersionが知りたいとか

• ちょっとした調査

• リリース作業

• メンテナンスする際に役に立つ

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 で範囲を指定して一括コマンドの実行

思ったところ

• 一度にたくさんのことをしようとすると大変

• リリース対応や障害対応のワークフローを洗い出しが大事かも

• 洗い出しからConsulの価値を当てはめると導入しやすいかも

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