Intel Edison と Ubuntuでconsulクラスタ構築

Intel EdisonとUbuntuに[consul](https://www.consul.io/)を導入し、クラスタを構築する。
Intel Edisonはx86アーキテクチャのため、公式サイトが配布している **32bitバイナリ** を配置するだけで動作する。

# Ubuntuの準備
consulクラスタに参加するUbuntuを準備する。

<table>
<tbody>
<tr><th>Ubuntu</th><td>15.04</td></tr>
<tr><th>kernel</th><td>3.19.0-15-generic</td></tr>
<tr><th>arch</th><td>x86_64</td></tr>
<tr><th>consul</th><td>0.5.0(amd64)</td></tr>
<tr><th>IPaddr</th><td>192.168.0.9/24</td></tr>
</table>

## consul(linux 64bit)のインストール

```text:consulインストール
nmatsui@develop:~$ wget https://dl.bintray.com/mitchellh/consul/0.5.0_linux_amd64.zip -qO /tmp/consul_0.5.0_amd64.zip
nmatsui@develop:~$ unzip /tmp/consul_0.5.0_amd64.zip -d ~/bin
nmatsui@develop:~$ chmod +x ~/bin/consul 
nmatsui@develop:~$ consul version
Consul v0.5.0
Consul Protocol: 2 (Understands back to: 1)
```

# Intel Edisonの準備

consulクラスタに参加するIntel Edisonを準備する。

http://tech-sketch.jp/2014/12/edison-setup.html 等のセットアップ手順に従い、Edisonに最新イメージをインストールする。今回インストールしたイメージは[edison-image-ww05-15.zip](http://downloadmirror.intel.com/24698/eng/edison-image-ww05-15.zip)

<table>
<tbody>
<tr><th>Intel Edison</th><td>weekly-120</td></tr>
<tr><th>kernel</th><td>3.10.17-poky-edison+</td></tr>
<tr><th>arch</th><td>i686</td></tr>
<tr><th>consul</th><td>0.5.0(386)</td></tr>
<tr><th>IPaddr</th><td>192.168.0.10/24</td></tr>
</table>

## Intel Edisonのセットアップ

```text:Edisonセットアップ
nmatsui@develop:~$ sudo screen /dev/ttyUSB0 115200

Poky (Yocto Project Reference Distro) 1.6 edison ttyMFD2

edison login: root
[  126.834432] systemd-fsck[233]: /dev/mmcblk0p10: recovering journal
[  126.881414] systemd-fsck[233]: /dev/mmcblk0p10: clean, 13/152608 files, 26868/610299 blocks
root@edison:~# 
root@edison:~# reboot ota
root@edison:~# configure_edison --setup

Configure Edison: Device Password
Configure Edison: Device Name
Configure Edison: WiFi Connection

root@edison01:~# opkg update
root@edison01:~# opkg upgrade
```
## consul(linux 32bit)のインストール

```text:consulインストール
root@edison01:~# mkdir -p /usr/local/bin
root@edison01:~# wget https://dl.bintray.com/mitchellh/consul/0.5.0_linux_386.zi
p -qO /tmp/consul_0.5.0_386.zip --no-check-certificate
root@edison01:~# unzip /tmp/consul_0.5.0_386.zip -d /usr/local/bin
root@edison01:~# chmod +x /usr/local/bin/consul
root@edison01:~# consul version
Consul v0.5.0
Consul Protocol: 2 (Understands back to: 1)
```

# consulクラスタの構築

## Ubuntuのconsulをbootstrapとして起動

```text:consul起動
nmatsui@develop:~$ consul agent -data-dir /tmp -server -bootstrap-expect 2 &
```

## Intel Edisonのconsulを起動してUbuntuにJOIN

```text:consul起動
root@edison01:~# consul agent -data-dir /tmp -server -join 192.168.0.9 &
```

## consulクラスタの状態

```text:ubuntuからメンバー確認
nmatsui@develop:~$ consul members
    2015/04/29 09:32:19 [INFO] agent.rpc: Accepted client: 127.0.0.1:35648
Node      Address            Status  Type    Build  Protocol
develop   192.168.0.9:8301   alive   server  0.5.0  2
edison01  192.168.0.10:8301  alive   server  0.5.0  2
```

```text:edisonからメンバー確認
root@edison01:~# consul members
    2015/04/29 00:40:35 [INFO] agent.rpc: Accepted client: 127.0.0.1:54706
Node      Address            Status  Type    Build  Protocol
edison01  192.168.0.10:8301  alive   server  0.5.0  2
develop   192.168.0.9:8301   alive   server  0.5.0  2
```

## consulによる名前解決

```text:digで確認
nmatsui@develop:~$ dig @127.0.0.1 -p 8600 develop.node.consul ANY
...
;; ANSWER SECTION:
develop.node.consul.	0	IN	A	192.168.0.9
...
nmatsui@develop:~$ dig @127.0.0.1 -p 8600 edison01.node.consul ANY
edison01.node.consul.	0	IN	A	192.168.0.10
...
```

```text:APIで確認
root@edison01:~# curl localhost:8500/v1/catalog/nodes
[{"Node":"develop","Address":"192.168.0.9"},{"Node":"edison01","Address":"192.168.0.10"}]
```

## KVSの利用

Consul KVSに値（{'foo'=>'bar'}）を登録すると、すべてのクラスタメンバーで共有される。
（Consul KVSに登録される値はbase64エンコードされていることに注意）

```text:EdisonからKVSにキーと値を登録
root@edison01:~# curl -X PUT -d 'hello world' http://localhost:8500/v1/kv/hoge
true
```

```text:KVSの確認
root@edison01:~# curl -s http://localhost:8500/v1/kv/hoge
[{"CreateIndex":35,"ModifyIndex":35,"LockIndex":0,"Key":"hoge","Flags":0,"Value":"aGVsbG8gd29ybGQ="}]
nmatsui@develop:~$ curl -s http://localhost:8500/v1/kv/hoge
[{"CreateIndex":35,"ModifyIndex":35,"LockIndex":0,"Key":"hoge","Flags":0,"Value":"aGVsbG8gd29ybGQ="}]
```

```text:base64デコードして値を確認
nmatsui@develop:~$ curl -s http://localhost:8500/v1/kv/hoge | jq -r ".[0].Value" | base64 -d
hello world
```

# まとめ
公式サイトが配布している**32bitバイナリ**を配置するだけでIntel Edison上でconsulが動作し、PC上で動作するconsulとクラスタを構築することができた。