ども、 cloudpackかっぱ (@inokara) です。前回の続きです。

準備

サービスの登録

  • 2 つの Consul ノードで Redis を動かした状態
  • Redis を Consul には redis と redis-read というサービス名で登録

サービス名の登録は以下のように。

{
  "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)で。
今さらジローだけど Consul 0.5 をざっくり試す(2)~ consul maint ~: 動作確認 (1)

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 の出力と比べて個人的にちょっと違和感ある…(CheckIDservice:redisstatuscritical にすればいいのに…)

Atlas で確認。
今さらジローだけど Consul 0.5 をざっくり試す(2)~ consul maint ~: 動作確認 (2)
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"
    }
]

Atlas で確認。
今さらジローだけど Consul 0.5 をざっくり試す(2)~ consul maint ~: 動作確認 (3)
復旧状態。

ということで…

maint オプション

  • Consul クラスタ内のサービス、ノードを一時的にステータスを Critical 状態にする
  • メンテナンスモードのサービスやノードは DNS API や HTTP API の結果から除外する
  • -reason オプションでコメントも付けることが出来る

使いドコロ

対象となるサービスで利用しているアプリケーションのバージョンアップ等のメンテンナンスに嬉しいオプションだと思われる。

元記事はこちらです。
今さらジローだけど Consul 0.5 をざっくり試す(2)~ consul maint ~