92
91

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Consul Cheat Sheet 日本語版

Last updated at Posted at 2014-07-01

これから Consul を使う方の参考になりましたら、というか自分のための整理です。

これは何?

"Service discovery and configuration made easy. Distributed, highly available, and datacenter-aware."
*訳:サービス検出と設定を簡単に。データセンタ間を意識した分散と高可用性。

Consul ( http://www.consul.io/ ) は、サービス検出や監視と設定を行うためのツール。VagrantPackerSerf を製作している Hashicorp 社製のツールで、Go 言語で書かれており、オープンソース(Mozilla Public license, version 2.0)で公開されている。開発は GitHub を通してオープンに行われている。

Serf と Consul の違い

Serf はノード検出が serf エージェント単位であるのに対し、Consul は HTTP や MySQL などのサービス単位で行う事ができる。また Consul はデータ冗長化の仕組みや KVS を内蔵しているほか、HTTP や DNS などのインターフェースを備えている。
一方、Consul の現行バージョン (v.0.3) では、Serf のイベントハンドラに相当する機能は無く、何か変か発生したときのアクションは自分で実装する必要がある。ロードマップによると、将来的には Serf のようなイベントハンドラも実装される模様。

インストール

前提として、Consul にはサーバとノードという二つの役割を持つ。

  • Consul サーバ ... データを保管し、ノードが収集した情報を回答するインターフェース
  • Consul ノード ... 実際に監視を行い、サーバに情報を伝えるエージェント

いずれの場合でも、単一の consul という名前のバイナリで実行可能である。起動時に付けるオプションによって、どちらの役割もこなせる。

オフィシャルのダウンロードサイトから、対応した OS のバイナリをダウンロードし、展開する。現在対応している OS は、Mac OS X、Linux、Windows である。

CentOS6/RHEL6 でのセットアップ方法

$ wget -O 0.3.0_linux_amd64.zip https://dl.bintray.com/mitchellh/consul/0.3.0_linux_amd64.zip
$ unzip ./0.3.0_linux_amd64.zip
# cp ./consul /usr/bin/consul

動作確認は、バージョン番号を確認。

$ consul -v
Consul v0.3.0
Consul Protocol: 2 (Understands back to: 1)

Web UI のセットアップ方法

Consul 本体とは別パッケージ。Web UI を使わないのであれば、入れる必要はない。

$ wget -O 0.3.0_web_ui.zip https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip
$ unzip 0.3.0_web_ui.zip
# mkdir /opt/consul
# mv ./dist /opt/consul/webui

Web UI を有効にするには、Consul Server 起動時に、-ui-dir=/opt/consul/webui/ のように指定する。あとは HTTP インターフェースのポート番号(標準:8500) に対してアクセスすると表示される( http://<ホスト>:8500/ )。

Consul の4つの特長

サービス検出

  • 'http' や 'mysql' など、任意のサービスを定義する
  • 検出対象は、JSON 形式のファイルか API で定義
  • 検出結果を HTTP API か DNS を通して取得、Web UI でも確認できる

HTTPインターフェース(標準は Port 8500)に curl で問い合わせ:

$ curl -s http://192.168.39.5:8500/v1/catalog/nodes  | jq '.'
[
   {
     "Address": "192.168.39.5",
     "Node": "consul1.pocketstudio.net“
   },
   {
     "Address": "192.168.39.6",
     "Node": "consul2.pocketstudio.net“
   }
]

DNS インターフェース ( Port 8600 が標準 ) に dig で問い合わせ:

$ dig @192.168.39.5 -p 8600 consul1.node.consul any

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>> @192.168.39.5 -p 8600 consul1.node.consul any
(snip)
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;consul1.node.consul.           IN      ANY

;; ANSWER SECTION:
consul1.node.consul.    0       IN      A       192.168.39.5

障害検知

  • Consul node がヘルスチェックを実施する
  • 検出済みのサービスに対する障害発生を検出する
  • 監視間隔や対象は、ノードが主体的に対象ホスト内部から監視
  • HTTP または DNS インターフェース、Web UI で確認できる

HTTP インターフェースで確認:

$ curl http://192.168.39.5:8500/v1/health/state/critical | jq '.'
[
  {
    "ServiceName": "web",
    "ServiceID": "web",
    "Notes": "",
    "Status": "critical",
    "Name": "Service 'web' check",
    "CheckID": "service:web",
    "Node": "consul1"
  }
]

KVS

  • HTTP API を通して RESTful に問い合わせ・操作ができる
  • Consul server 間のデータを複製・保全
  • Consul システムも内部で使用
  • ユーザによる一般的な KVS としても利用可(base64でデコードが必要)
  • ロック機能を使える(クライアントのリーダ選出は実装中)

複数データセンタ(ネットワーク)対応

  • 複数のネットワークをまたがった通信を行う
  • LAN 側と WAN 側で、別々のゴシックプールを持つ
  • ローカル側のクラスタにない問い合わせは、対象データセンタに問い合わせ

Consul の起動

Consul サーバ起動

起動例:

$ consul agent -server -bootstrap -client=192.168.39.5 -dc=local \
    -node=consul1 -data-dir=/tmp/consul  -bind=192.168.39.5

重要なのは、初回起動する Consul サーバでは -bootstrap を付ける事。
2台目以降でクラスタを形成する際には -server-join を使い、1台目のサーバを指定する。

なお、Server の障害耐性(fault tolerance)を高めるには、3台以上でクラスタを組む必要がある(参考ページの末尾 Deployment Table を参照)。

Consul ノード起動

Consul ノードとして実行したい場合は、-server オプションを明示しない。

$ consul agent -dc=local -node=consul2 -data-dir=/tmp/consul2 \
    -bind=192.168.39.6 -join=192.168.39.5

agent 起動時の出力内容

  • Node name ... ノード名(エージェント固有のもの)。-nodeフラグで指定可
  • Datacenter ... データセンタ名。-dc フラグで指定可
  • Server ... サーバかクライアント、どちらで動作しているか
  • Client Addr ... HTTP・DNS・RPC インターフェースの情報

メンバの確認

consul members コマンドを実行する事で、サーバやクライアントの一覧や、死活状況が確認出来る。

# consul members
Node     Address             Status  Type    Build  Protocol
consul3  192.168.39.13:8301  alive   client  0.3.0  2
consul1  192.168.39.11:8301  alive   server  0.3.0  2

設定

サービスの定義方法

HTTP インターフェースで API を経由して指定する方法と、ノードでのエージェント起動時、-config-file または -config-dir (対象ディレクトリ内の .json ファイルのみ対象)で指定する。

例えば、HTTP サービスのチェックを行うスクリプトの例は、次のようになる。

/etc/consul.d/httpd.json
{
  "service": {
    "name": "web",
    "tags": [ "httpd" ],
    "port": 80,
    "check": {
      "script": "curl localhost:80 >/dev/null 2>&1",
      "interval": "10s"
    }
  }
}

HTTP API

Consul は RESTful な HTTP API を持ち、ノードやサービスのチェックに関する設定や、設定変更、削除が可能。現行の API のバージョンは v1
エンドポイントには、以下の種類がある。

  • kv ... キーバリュー・ストア
  • agent ... エージェント制御
  • catalog ... ノードやサービス管理
  • health ... ヘルスチェックの管理
  • status ... Consul のシステム状態
  • session ... セッション管理やロック
  • internal ... Consul 内部で使用

キーバリュー・ストア ( kv )

  • /v1/kv/
    GET PUT DELETE などのメソッドを使い、キーバリュー・ストアとしてユーザが任意に利用可能。ただし、GET で取得したデータは base64 でデコードする必要がある。

エージェント ( agent )

ローカルの Consul エージェントと連携するために使用。

  • /v1/agent/checks ... ローカルエージェントが管理している check を返す
  • /v1/agent/services ... ローカルエージェントが管理している service を返す
  • /v1/agent/members ... ローカル serf エージェントが見えているメンバを返す
  • /v1/agent/join/<address> ... ローカルエージェントがノードに join するトリガ
  • `/v1/agent/force-leave/** ... ノードを force remove(強制削除)
  • /v1/agent/check/register ... 新しいローカル check の登録
  • /v1/agent/check/pass/<checkID> ... ローカルテストを通過(passing)したとマーク
  • /v1/agent/check/warn/<checkID> ... ローカルテストの警告(warning)をマーク
  • /v1/agent/check/fail/<checkID> ... ローカルテストの障害(critical)をマーク
  • /v1/agent/service/register ... 新しいローカル service の登録
  • /v1/agent/service/deregister/<serviceID> ... ローカル service の削除

カタログ ( catalog )

node や service などに対する監視 ( checks ) の登録や削除。

  • /v1/catalog/register ... 新しい node、service、check の登録
  • /v1/catalog/datacenters ... 既知のデータセンタ一覧
  • /v1/catalog/nodes ... 指定したデータセンタ上に存在するノード一覧
  • /v1/catalog/services ... 指定したデータセンタ上に存在するサービス一覧
  • /v1/catalog/service/<service> ... 指定したサービスが存在するノード一覧
  • /v1/catalog/node/<node> ... 指定したノード上のサービス一覧

ヘルスチェック ( health )

各サービスやノードの状態を確認。

  • /v1/health/node/<node> ... ノードのヘルス情報を返す
  • /v1/health/checks/<service> ... service のヘルス情報に関する check を返す
  • /v1/health/service/<service> ... service を持つノードのヘルス情報を返す
  • /v1/health/state/<state> ... 指定した state 状態にある check を返す

クラスタ状態 ( status )

Consul クラスタに関する情報を返す。

  • /v1/status/leader ... 現在の Raft リーダを返す
  • /v1/status/peers ... 現在の Raft ピアの一覧を返す

セッション ( session)

セッションの作成、破棄、問い合わせに使用。

  • /v1/session/create ... 新しいセッションの作成
  • /v1/session/destroy/<session> ... 指定したセッションの破棄
  • /v1/session/info/<session> ... 指定したセッションに問い合わせ
  • /v1/session/node/<node> ... 特定ノードに紐付くセッション一覧
  • `/v1/session/list:アクティブなセッションの一覧

参考

DNS インターフェース

標準で Port 8600 に問い合わせると、DNS の回答を得られる。dig であれば dig @127.0.0.1 -p 8600 のようにポートを明示する。Consul のトップレベルドメインは .consul

問い合わせの形式:

<タグ>.<サービス名>.<ノード名>.node.<データセンタ名>.consul

タグおよびサービス名は省略可能。

参考

参考

92
91
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
92
91

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?