Vagrant上のCoreOSでetcdを動かして別の3台でクラスタリングしてみた

# 2014-04-13追記 お手軽に試したい方は @yungsang さんのVagrantfileをお勧めします

[コメント](http://qiita.com/hnakamur/items/bccac980bef68642a814#comment-04b954fdd00c2288e6ca)にも書きましたが、現時点でCoreOSをvagrantで試すには、公式のVagrantfileを使うより[YungSang/coreos-cluster](https://github.com/YungSang/coreos-cluster)を使うのがお勧めです！

# 今度は動くところまでこぎつけました

[「CoreOS + Vagrant に etcd を使ってクラスタを構築する」を試してみた - Qiita](http://qiita.com/hnakamur/items/edfea2f52f83494d891f)の記事の後、[CoreOS 入門 - Qiita](http://qiita.com/mopemope/items/fa9424b094aae3eac580)という素晴らしい記事が書かれました。よくわかってないまま試したら出来ませんでしたーという記事に対して、見るに見かねて書いて下さりありがとうございます。識者の知識を共有してもらえたという意味では、結果的には良かったです。

で、もうそのままでいいかなーとも思ったのですが、やっぱりVagrantで試してみたいと思って再挑戦してみました。元記事ではetcdはホストマシン(OSX)で動かしてCoreOS 3台をVagrantで動かすという構成だったのですが、etcdもVagrant上のCoreOSで動かせば簡単なのでは、と思いついたのでそれで試しました。

core-00というホスト名のVMで172.17.8.100:4001でetcdを動かして、core-01〜core-03の3台はcore-00のetcdに繋ぎに行きます。

IPアドレスは以下のように設定しています。

* core-00: 172.17.8.100
* core-01: 172.17.8.101
* core-02: 172.17.8.102
* core-03: 172.17.8.103

# Vagrant上のCoreOSでetcdを動かす

簡単に試せるようにGitHubにプロジェクト[hnakamur/coreos-etcd-vagrant](https://github.com/hnakamur/coreos-etcd-vagrant)を作りました。作ったと言っても[coreos/coreos-vagrant](https://github.com/coreos/coreos-vagrant)をフォークしてちょっと変更しただけです。Cloud-Configの設定方法は[Customize with Cloud-Config](https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/)を参照しました。

起動手順は以下の通りです。

```shell-session
git clone https://github.com/hnakamur/coreos-etcd-vagrant/
cd coreos-etcd-vagrant
vagrant up
```

# Vagrantでさらに3台のVMを立ち上げてクラスタリングする

user-dataではcoreos.etcd.discoveryにcore-00のetcdのURLを指定しています。それ以外はuser-data.sampleから変更なしです。

```
git clone https://github.com/coreos/coreos-vagrant
cd coreos-vagrant
cat <<'EOF' > user-data
#cloud-config

coreos:
  etcd:
      discovery: http://172.17.8.100:4001/v2/keys/machines
      addr: $public_ipv4:4001
      peer-addr: $public_ipv4:7001
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
      runtime: no
      content: |
        [Unit]
        Description=fleet

        [Service]
        Environment=FLEET_PUBLIC_IP=$public_ipv4
        ExecStart=/usr/bin/fleet
EOF
NUM_INSTANCES=3 vagrant up
```

3台起動したら以下のようにfleetctlを実行してクラスタリングされていることを確認します。

```shell-session
$ vagrant ssh core-01
   ______                ____  _____
  / ____/___  ________  / __ \/ ___/
 / /   / __ \/ ___/ _ \/ / / /\__ \
/ /___/ /_/ / /  /  __/ /_/ /___/ /
\____/\____/_/   \___/\____//____/
core@core-01 ~ $ fleetctl list-machines -l
MACHINE                 IP      METADATA
b4e79fb3-a093-421e-a06d-7ae2f63cf7a8    172.17.8.103    -
681af189-b016-4d25-bd1b-fba970db540a    172.17.8.102    -
e436a060-0859-46c6-8ade-a5fc2ac508e5    172.17.8.101    -
```

うまく行きました！

# 試行錯誤したメモ

## etcdを起動するVagrantfileではoverride-plugin.rbを古いバージョンに戻す必要があった

今回の再挑戦は、前回の記事[「CoreOS + Vagrant に etcd を使ってクラスタを構築する」を試してみた - Qiita](http://qiita.com/hnakamur/items/edfea2f52f83494d891f)のときにgit cloneした[coreos/coreos-vagrant](https://github.com/coreos/coreos-vagrant)を使って作業していました。その後vagrant destroy -fでVMを削除して、フレッシュな環境でgit cloneもやり直して[coreos/coreos-vagrant](https://github.com/coreos/coreos-vagrant)の最新版にしたらCoreOSを起動してもetcdが起動されなくなってしまいました。

[コミットaf12c67c7169ff303aa143346833fe1259a83013のoverride-plugin.rb](https://github.com/coreos/coreos-vagrant/blob/af12c67c7169ff303aa143346833fe1259a83013/override-plugin.rb)ではだめで、[コミットadbbcef1af235336b9df7faf944764100e4cae2fのoverride-plugin.rb](https://github.com/coreos/coreos-vagrant/blob/adbbcef1af235336b9df7faf944764100e4cae2f/override-plugin.rb)に戻せば動きました。ということで、https://github.com/hnakamur/coreos-etcd-vagrant/commit/65d3c79c8f5a123f793d9a7cbe9579ce68c94138 で古いバージョンに戻しています。

差分をきちんと理解したほうがいいのでしょうが、私の動機はCoreOSをちょっと触ってみたかっただけなので、そこまでは踏み込まないことにします。

## vagrant upで起動しない時があった

vagrant upしたときにcore-01, core-02はすんなり起動したのにcore-03で接続タイムアウトになるという謎な現象も一度発生しました。

```
==> core-03: Waiting for machine to boot. This may take a few minutes...
    core-03: SSH address: 127.0.0.1:2204
    core-03: SSH username: core
    core-03: SSH auth method: private key
    core-03: Error: Connection timeout. Retrying...
    core-03: Error: Connection timeout. Retrying...
    core-03: Error: Connection timeout. Retrying...
    core-03: Error: Connection timeout. Retrying...
    core-03: Error: Connection timeout. Retrying...
    core-03: Error: Connection timeout. Retrying...
    core-03: Error: Connection timeout. Retrying...
```

あとしばらく放置していると勝手に？シャットダウンすることもありました。まあCoreOSはアルファ版ということで、私個人はすぐに使う予定もないので深追いしないことにします。

とりあえず変になった時はcore-00とcore01〜03の両方でvagrant destroy -fでVMを破棄して、core-00でvagrant up、core-01〜03でvagrant upで作りなおせばうまく行きました。