tjinjin's blog

自分用のメモです

ConsulでEC2のtagを使ってclusterを形成する

About

Consulのv0.7.1からAWSのtagを使ってクラスタを組めるようになったので、試したという内容です!

Before

サーバが起動したタイミングでconsulクラスタを組んで欲しいので、userdataを使ってあるマスターノードをに対してstart_joinするような仕組みを取っていた。

マスターノードが死んだらジョインできない感じでした。とはいえAutoScaling環境下だったので、IPを固定してのconsul joinができなかったので当時悩んでました。内部DNSとかAtlasとか手段はありそうでしたが、きっとそんなに頻繁に入れ替わりないので大丈夫だろうと後回しにしていました。

After

AWSのtagベースでのjoinが可能になりました(現時点ではGCEのtagも使えるらしい。試したことはないです!)

github.com

実際にやってみる

今回はサーバを2つ用意して実際にクラスタが形成できるか試します。

準備

適当なインスタンスを立てておきます。(IAM roleがあたっていればよい)

The only required IAM permission is ec2:DescribeInstances, and it is recommended you make a dedicated key used only for auto-joining.

とドキュメントにあるので、ec2:DescribeInstancesがあたっていればよいです。zipファイルがダウンロードページにあるので適当なフォルダにダウンロードして解凍しておきます。

$ cd 
$ wget https://releases.hashicorp.com/consul/0.7.4/consul_0.7.4_linux_amd64.zip
$ unzip consul_0.7.4_linux_amd64.zip
$ ./consul -v
Consul v0.7.4
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically useprotocol >2 when speaking to compatible agents)

各サーバを起動する

今回tagを使うので適当に設定しておきます。

わかりやすくserverモードで起動する方をserver、clientモード(joinする側)をclientという名前にします。

まずserver側を起動します。

$ ./consul agent -server -data-dir=/tmp -bootstrap

次にclient側を起動します。AWSのtagを利用してjoinするように指定します。

$ ./consul agent -data-dir /tmp -retry-join-ec2-tag-key Name -retry-join-ec2-tag-value server 

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

    2017/02/15 13:36:21 [INFO] serf: EventMemberJoin: ip-10-0-4-69 10.0.4.69
    2017/02/15 13:36:21 [WARN] manager: No servers available
    2017/02/15 13:36:21 [ERR] agent: failed to sync remote state: No known Consul servers
    2017/02/15 13:36:21 [INFO] agent: Joining cluster...
    2017/02/15 13:36:21 [INFO] agent: No EC2 region provided, querying instance metadata endpoint...
    2017/02/15 13:36:21 [INFO] agent: Discovered 1 servers from EC2
    2017/02/15 13:36:21 [INFO] agent: (LAN) joining: [10.0.4.116]
    2017/02/15 13:36:21 [INFO] serf: EventMemberJoin: ip-10-0-4-116 10.0.4.116

...

-retry-join-ec2-tag-key でTagのkeyを、 -retry-join-ec2-tag-value でTagのvalueを指定しています。

ここで確認すると、

$ ./consul members
Node           Address          Status  Type    Build  Protocol  DC
ip-10-0-4-116  10.0.4.116:8301  alive   server  0.7.4  2         dc1
ip-10-0-4-69   10.0.4.69:8301   alive   client  0.7.4  2         dc1

というようにクラスタに参加していることが確認できました。

今回はコマンドラインで実行していますが設定ファイルにすると下記のようになります。

{
  "data_dir": "/tmp",
  "retry_join_ec2": {
    "tag_key": "Name",
    "tag_value": "server"
  }
}

ネストするので注意が必要です。

まとめ

動的にjoinが可能なので便利そうかなーと思っています!Consulどんどん使っていきたいですね!

参考

github.com