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も使えるらしい。試したことはないです!)
実際にやってみる
今回はサーバを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どんどん使っていきたいですね!