ども、 cloudpack の かっぱ (@inokara) です。前回の続きです。
準備
サービスの登録
サービス名の登録は以下のように。
{ "service": { "name": "redis", "port": 6379, "check": { "script": "/opt/bin/check_redis.sh", "interval": "10s" } } }
{ "service": { "name": "redis-read", "port": 6379, "check": { "script": "/opt/bin/check_redis.sh", "interval": "10s" } } }
consul を起動
consul agent -atlas-join -atlas-token=${your_token} -atlas=inokappa/cluster1 -bootstrap-expect 1 -server -data-dir /opt/consul -config-dir=/etc/consul.d &
サービスの確認
dig
で。
$ dig @localhost -p 8600 redis.service.consul ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-x.20.rc1.el6 <<>> @localhost -p 8600 redis.service.consul ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48759 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;redis.service.consul. IN A ;; ANSWER SECTION: redis.service.consul. 0 IN A 172.17.x.2 redis.service.consul. 0 IN A 172.17.x.1 ;; Query time: 4 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Sun Mar 1 01:10:39 2015 ;; MSG SIZE rcvd: 110
HTTP API で。
$ curl -s http://127.0.0.1:8500/v1/health/checks/redis | python -m json.tool [ { "CheckID": "service:redis", "Name": "Service 'redis' check", "Node": "5535cc6b806e", "Notes": "", "Output": "", "ServiceID": "redis", "ServiceName": "redis", "Status": "passing" }, { "CheckID": "service:redis", "Name": "Service 'redis' check", "Node": "be9b37845581", "Notes": "", "Output": "", "ServiceID": "redis", "ServiceName": "redis", "Status": "passing" } ]
Atlas(Consul UI)で。
maint を試す
メンテナンス有効
consul maint -service redis -enable
以下のように出力される。
2015/03/01 01:17:59 [INFO] agent: Service "redis" entered maintenance mode Service maintenance is now enabled for "redis" 2015/03/01 01:17:59 [INFO] agent: Synced check '_service_maintenance:redis'
メンテナンス状態の確認
consul maint
以下のように出力される。
Service: ID: redis Reason: Maintenance mode is enabled for this service, but no reason was provided. This is a default message.
dig
で確認。
$ dig @localhost -p 8600 redis.service.consul 2015/03/01 01:20:16 [WARN] dns: node 'be9b37845581' failing health check '_service_maintenance:redis: Service Maintenance Mode', dropping from service 'redis' ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-x.20.rc1.el6 <<>> @localhost -p 8600 redis.service.consul ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64847 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;redis.service.consul. IN A ;; ANSWER SECTION: redis.service.consul. 0 IN A 172.17.x.2 ;; Query time: 4 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Sun Mar 1 01:20:16 2015 ;; MSG SIZE rcvd: 74
上記のように redis.service.consul
からメンテナンスを有効にしたノードが切り離されている。
HTTP API で確認。
$ curl -s http://127.0.0.1:8500/v1/health/checks/redis | python -m json.tool [ { "CheckID": "service:redis", "Name": "Service 'redis' check", "Node": "5535cc6b806e", "Notes": "", "Output": "", "ServiceID": "redis", "ServiceName": "redis", "Status": "passing" }, { "CheckID": "service:redis", "Name": "Service 'redis' check", "Node": "be9b37845581", "Notes": "", "Output": "", "ServiceID": "redis", "ServiceName": "redis", "Status": "passing" }, { "CheckID": "_service_maintenance:redis", "Name": "Service Maintenance Mode", "Node": "be9b37845581", "Notes": "Maintenance mode is enabled for this service, but no reason was provided. This is a default message.", "Output": "", "ServiceID": "redis", "ServiceName": "redis", "Status": "critical" } ]
CheckID
が _service_maintenance:redis
というレスポンスが追加されているが dig
の出力と比べて個人的にちょっと違和感ある…(CheckID
が service:redis
の status
を critical
にすればいいのに…)
Atlas で確認。
Critical として検出されている。
メンテナンス無効
consul maint -service redis -disable
以下のように出力される。
2015/03/01 01:37:47 [INFO] agent: Service "redis" left maintenance mode Service maintenance is now disabled for "redis" 2015/03/01 01:37:47 [INFO] agent: Deregistered check '_service_maintenance:redis'
メンテナンス状態の確認
consul maint
なにも表示されない。
dig
で確認。
$ dig @localhost -p 8600 redis.service.consul ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-x.20.rc1.el6 <<>> @localhost -p 8600 redis.service.consul ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1660 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;redis.service.consul. IN A ;; ANSWER SECTION: redis.service.consul. 0 IN A 172.17.x.1 redis.service.consul. 0 IN A 172.17.x.2 ;; Query time: 7 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Sun Mar 1 01:40:53 2015 ;; MSG SIZE rcvd: 110
HTTP API で確認。
$ curl -s http://127.0.0.1:8500/v1/health/checks/redis | python -m json.tool [ { "CheckID": "service:redis", "Name": "Service 'redis' check", "Node": "5535cc6b806e", "Notes": "", "Output": "", "ServiceID": "redis", "ServiceName": "redis", "Status": "passing" }, { "CheckID": "service:redis", "Name": "Service 'redis' check", "Node": "be9b37845581", "Notes": "", "Output": "", "ServiceID": "redis", "ServiceName": "redis", "Status": "passing" } ]
ということで…
maint オプション
- Consul クラスタ内のサービス、ノードを一時的にステータスを Critical 状態にする
- メンテナンスモードのサービスやノードは DNS API や HTTP API の結果から除外する
-reason
オプションでコメントも付けることが出来る
使いドコロ
対象となるサービスで利用しているアプリケーションのバージョンアップ等のメンテンナンスに嬉しいオプションだと思われる。
元記事はこちらです。
「今さらジローだけど Consul 0.5 をざっくり試す(2)~ consul maint ~」