Consul 0.5の新機能 Atlas連携を試してみる

2015.02.20

ども、大瀧です。
今朝かた、HashiCorpのクラスタオーケストレーションツールConsulバージョン0.5がリリースされました。多くの新機能が追加されていますが、ここではAtlasとの連携を紹介してみます。

Atlasとは

AtlasはHashiCorpのツールを連携させるクラウドサービスです。Atlasの概要については、こちらの記事を参照ください。従来AtlasはVagrant、Packer、Terraformとの連携機能を持っていたのですが、かねて予告されていたConsulとの連携が今回の新機能です。

連携1: Auto Join

ConsulのAltas連携機能としてAuto Joinが利用できます。Consulでは、既存クラスタに加わるためにクラスタメンバーのIPアドレスを特定し、接続する必要がありました。Auto Joinを利用すると、新規メンバーはAtlasのAPIにメンバー情報をリクエストし、メンバーのIPアドレスを指定することなくクラスタに加わることができます。

Atlasトークンの準備

ConsulからAtlasに接続するための認証情報としてトークンをあらかじめ取得、セットしておきます。Atlasのプロフィール画面の[Tokens]にある[Generate Token]で発行します。

atlas-consul01

生成されたトークンを控えておきます。

atlas-consul02

Consulを実行するマシンでは、トークンを環境変数ATLAS_TOKENもしくはconsul agentコマンドの実行時の-atlas-tokenオプションで指定します。今回は環境変数を設定しました。

$ export ATLAS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXX

これで準備OKです。

ConsulからAtlasへの接続

Consulノードを構成するconsul agentコマンドでAtlasのAuto Joinを実行するためには、-atlas-joinオプションとともに-atlasオプションでAtlasの/を指定します。Organization名は既定ではユーザー名、Infrastructure名は新規作成であれば任意で構いません。2台目以降は同じパラメータを指定することで、同一クラスタへのJoinになります。

$ ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul \
  -atlas takipone/cluster1 -atlas-join
==> WARNING: BootstrapExpect Mode is specified as 1; this is the same as Bootstrap mode.
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'ip-172-31-20-221'
        Datacenter: 'dc1'
            Server: true (bootstrap: true)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 172.31.20.221 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: (Infrastructure: 'takipone/cluster1' Join: true)

==> Log data will now stream in as it occurs:

    2015/02/19 22:37:02 [INFO] serf: EventMemberJoin: ip-172-31-20-221 172.31.20.221
    2015/02/19 22:37:02 [INFO] serf: EventMemberJoin: ip-172-31-20-221.dc1 172.31.20.221
    2015/02/19 22:37:02 [INFO] raft: Node at 172.31.20.221:8300 [Follower] entering Follower state
    2015/02/19 22:37:02 [INFO] consul: adding server ip-172-31-20-221 (Addr: 172.31.20.221:8300) (DC: dc1)
    2015/02/19 22:37:02 [INFO] consul: adding server ip-172-31-20-221.dc1 (Addr: 172.31.20.221:8300) (DC: dc1)
    2015/02/19 22:37:02 [ERR] agent: failed to sync remote state: No cluster leader
    2015/02/19 22:37:04 [WARN] raft: Heartbeat timeout reached, starting election
    2015/02/19 22:37:04 [INFO] raft: Node at 172.31.20.221:8300 [Candidate] entering Candidate state
    2015/02/19 22:37:04 [INFO] raft: Election won. Tally: 1
    2015/02/19 22:37:04 [INFO] raft: Node at 172.31.20.221:8300 [Leader] entering Leader state
    2015/02/19 22:37:04 [INFO] consul: cluster leadership acquired
    2015/02/19 22:37:04 [INFO] consul: New leader elected: ip-172-31-20-221
    2015/02/19 22:37:04 [INFO] raft: Disabling EnableSingleNode (bootstrap)
    2015/02/19 22:37:13 [ERR] scada-client: failed to handshake: i/o deadline reached
    2015/02/19 22:37:31 [INFO] agent.rpc: Accepted client: 127.0.0.1:45376
    2015/02/19 22:39:14 [INFO] scada-client: connect requested (capability: http)
    2015/02/19 22:39:15 [INFO] scada-client: connect requested (capability: http)

エラーっぽい表示も出ますが、ひとまずAtlasの画面の様子を見ます。[Runtime] - [Infrastructures]に先ほど指定した項目が追加されていれば、登録できています。

atlas-consul03

続いて、もう1台ノードを用意し、同様にコマンドを実行してみます。

$ ./consul agent -server -data-dir /tmp/consul \
  -atlas takipone/cluster1 -atlas-join
==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'ip-172-31-20-106'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 172.31.20.106 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: (Infrastructure: 'takipone/cluster1' Join: true)

==> Log data will now stream in as it occurs:

    2015/02/20 00:24:43 [INFO] serf: EventMemberJoin: ip-172-31-20-106 172.31.20.106
    2015/02/20 00:24:43 [INFO] serf: EventMemberJoin: ip-172-31-20-106.dc1 172.31.20.106
    2015/02/20 00:24:43 [INFO] raft: Node at 172.31.20.106:8300 [Follower] entering Follower state
    2015/02/20 00:24:43 [INFO] consul: adding server ip-172-31-20-106 (Addr: 172.31.20.106:8300) (DC: dc1)
    2015/02/20 00:24:43 [INFO] consul: adding server ip-172-31-20-106.dc1 (Addr: 172.31.20.106:8300) (DC: dc1)
    2015/02/20 00:24:43 [ERR] agent: failed to sync remote state: No cluster leader
    2015/02/20 00:24:44 [INFO] scada-client: connect requested (capability: http)
    2015/02/20 00:24:45 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
    2015/02/20 00:24:45 [INFO] scada-client: auto-joining LAN with [172.31.20.221]
    2015/02/20 00:24:45 [INFO] agent: (LAN) joining: [172.31.20.221]
    2015/02/20 00:24:45 [INFO] serf: EventMemberJoin: ip-172-31-20-221 172.31.20.221
    2015/02/20 00:24:45 [INFO] agent: (LAN) joined: 1 Err: <nil>
    2015/02/20 00:24:45 [INFO] consul: adding server ip-172-31-20-221 (Addr: 172.31.20.221:8300) (DC: dc1)
    2015/02/20 00:24:45 [WARN] raft: Failed to get previous log: 119 log not found (last: 5)
    2015/02/20 00:24:45 [INFO] scada-client: auto-joining WAN with [172.31.20.221]
    2015/02/20 00:24:46 [INFO] agent: (WAN) joining: [172.31.20.221]
    2015/02/20 00:24:46 [INFO] serf: EventMemberJoin: ip-172-31-20-221.dc1 172.31.20.221
    2015/02/20 00:24:46 [INFO] agent: (WAN) joined: 1 Err: <nil>
    2015/02/20 00:24:46 [INFO] consul: adding server ip-172-31-20-221.dc1 (Addr: 172.31.20.221:8300) (DC: dc1)
    2015/02/20 00:25:01 [INFO] agent: Synced service 'consul'

どちらかのノードにログインし、consul membersを実行してクラスタのノード一覧を確認してみます。

$ ./consul members
Node              Address             Status  Type    Build  Protocol
ip-172-31-20-221  172.31.20.221:8301  alive   server  0.5.0  2
ip-172-31-20-106  172.31.20.106:8301  alive   server  0.5.0  2
$

クラスタメンバーとして登録できていますね!

連携2: Hosted Consul UI

もう一つ、AtlasではConsul UIをAtlasの管理画面から参照することができます。Atlasの先ほどの画面にあるInfrastructure名をクリックすると、Consul UIの画面に遷移します。

atlas-consul04

[Overview]でクラスタの概要が見られます。

atlas-consul05

[Nodes]は各Consulのメンバーの様子です。

atlas-consul06

Hosted Consul UIは、以下のツイートの通りデモが公開されています。触ってみたい方はこちらをどうぞ。

まとめ

Consul 0.5の新機能の一つとして、Atlas連携の様子をご紹介しました。Atlasの対応ラインナップは出揃った感じなので、そろそろAtlas独自の便利機能やプロダクト同士の連携機能が待ち遠しくなっちゃいますね。TerraformのConsul連携と今回のAtlas連携で何かすごいことができそうな気がしなくもないでしょうかね?(妄想