Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定（完）

# CoreOSクラスタ構築　3台 + Worker 3台構成

## 前提

[coreosクラスタ構築 3台構成](http://qiita.com/xshsaku/items/a5b57fafa0b41740bd7f)
が出来ていること

## 目指す構成

![cluster02.png](https://qiita-image-store.s3.amazonaws.com/0/93976/0f92f77b-5ac7-4629-4337-29b3a89f3e7a.png)

## アドレッッシング

| 環境 | hostname | IPアドレス |meta|
|:-----------:|:------------:|:------------:|:------------|
|MacbookAir 4GB|hostserver|xxx.xxx.xxx.xxx|role=services,cabinet=one|
|virtualbox1|coreos-01|192.168.0.10|role=services,cabinet=one|
|virtualbox2|coreos-02|192.168.0.20|role=services,cabinet=one|
|virtualbox3|coreos-03|192.168.0.30|role=services,cabinet=one|
|virtualbox4|coreos-04|192.168.0.11|role=workers,cabinet=two|
|virtualbox5|coreos-05|192.168.0.21|role=workers,cabinet=two|
|virtualbox6|coreos-06|192.168.0.31|role=workers,cabinet=two|


## workの3台を新規に構築する

[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)](http://qiita.com/xshsaku/items/5be3837c39bb8c9bd4e7)で作成したcoreosのイメージを3台分クローンを実施していきます。
※クローンの方法については、前回記事を参照ください

## workerにcloud-config.ymlの設定を行っていきます。

```coreos:cloud-config.yml
vim cloud-config.yml

#cloud-config

hostname: coreos-04

write_files:
- path: /etc/environment
  content: |
    COREOS_PUBLIC_IPV4=192.168.0.11
    COREOS_PRIVATE_IPV4=192.168.0.11

coreos:
  update:
    reboot-strategy: 'off'
  etcd2:
    proxy: on 
    name: coreos-04
    heartbeat-interval: 1000
    election-timeout: 5000
    listen-client-urls: http://0.0.0.0:2379
    initial-cluster: coreos-01=http://192.168.0.10:2380,coreos-02=http://192.168.0.20:2380,coreos-03=http://192.168.0.30:2380

  fleet:
    etcd_servers: http://127.0.0.1:2379
    public-ip: 192.168.0.11
    metadata: "role=workers,cabinet=two"
  flannel:
    interface: 192.168.0.11
  units:
  - name: etcd2.service
    command: start
  - name: fleet.service
    command: start
  - name: docker.service
    command: start
  - name: timezone.service
    command: start
    content: |
      [Unit]
      Description=timezone
      [Service]
      Type=oneshot
      RemainAfterExit=yes
      ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime
  - name: 10-static.network
    runtime: false
    content: |
      [Match]
      Name=enp0s3

      [Network]
      Address=192.168.0.11/24
      DNS=8.8.8.8
      DNS=8.8.4.4

ssh_authorized_keys:
- ssh-rsa ※ご自身の公開鍵

users:
- name: coreuser
  passwd: $1$VIyj3wZe$HVVOEAc/H6a6YZGKCBWSD/
  groups:
  - sudo
  - docker
  ssh-authorized-keys:
  - ssh-rsa ※ご自身の公開鍵

```

#### 上記を「アドレッシング」にあるhostnameとIPアドレスを合わせます。

## cloud-config.ymlの読み込み実施

```coreos:cloud-init

sudo coreos-cloudinit -from-file=./cloud-config.yml
sudo cp -a cloud-config.yml /var/lib/coreos-install/user_data
sudo reboot

```
※cloud-initコマンドで反映されない部分があるので、直接user_dataも書き換えておきます。


## etcdctl cluster-healthの確認

```shell:cluster-health
etcdctl cluster-health
member 59d0611e956db7d1 is healthy: got healthy result from http://192.168.0.20:2379
member 6fb0d145a155e8ee is healthy: got healthy result from http://192.168.0.30:2379
member 7a0fb1a3031d4c79 is healthy: got healthy result from http://192.168.0.10:2379
```

上記の通り、クラスタ化されているIPが表示されていれば問題ありません。

## fleetctlの確認

```shell:fleetctl
ssh core@192.168.0.10

fleetctl list-machines --full
5b1639bd3cc347cf8fac0b9f597369e3	192.168.0.10	cabinet=one,role=services
6d28316711484f039eca4408627fdb0c	192.168.0.11	cabinet=two,role=workers
```

・・・本来であればクラスタ及びworkerも全部出てくるはずなのですが。。。

調べてみると以下の記事が出てきました。

[CoreOS 入門](http://qiita.com/mopemope/items/fa9424b094aae3eac580)

> また etcd の name 属性はユニークである必要があるので注意すること。
略するとマシンIDが使われる。マシンIDは /etc/machine_id で確認できる。マシンIDは環境を作成すると固定化されてしまうのでqemuのimgやvmを使いまわすとマシンIDが変わらず正しくクラスタが構築できないので注意すること。
rootをマウントして /etc/machine_id を削除し、再生成させるという方法もある。


なるほど。。。

というところで全てのサーバーにアクセスし、以下のコマンドを実行しました。

```coreos:machinid_rename
ssh 192.168.0.10
sudo mv /etc/machine-id /etc/machine-id.bk
sudo reboot
#この動作を全てのサーバーに
```

## 再度fleetctl の表示確認

```coreos:fleetctl
fleetctl list-machines --full
MACHINE					IP		METADATA
4fb30e282c004f1794df9e91e56b14fb	192.168.0.31	cabinet=two,role=workers
5b1639bd3cc347cf8fac0b9f597369e3	192.168.0.10	cabinet=one,role=services
6d28316711484f039eca4408627fdb0c	192.168.0.11	cabinet=two,role=workers
703c849bcb924af5891ca5aae95e4e89	192.168.0.21	cabinet=two,role=workers
a6776a02935e4f01857364587836e338	192.168.0.20	cabinet=one,role=services
fffe34c5dcfa4aabbb1ba684101e521e	192.168.0.30	cabinet=one,role=services

```
6台分のサーバーが表示されるようになりました！

これでCoreOS+etcd2+fleetを使用したクラスタ化の構成が完了しました。

### 今回vagarantを利用しなかったことについて

https://github.com/coreos/coreos-vagrant

にて既にvagrantのbox及びプロビジョニングファイルが配布されているのですが、当方にて以下の事象を確認しました。

1.$num_instanceを3で実行し、coreosをvagrant upで起動した場合問題なくクラスタの構成でUPされる
2.クラスタが正常になっているかの検証をするために、vagrant halt **で特定の端末を落とし、vagrant up | vagrant resumeで起動しても、IPアドレスが変わってしまう。※user_dataが保持されない
3.user_dataを作成するためにcloud-init/coreos-installしてもやはり揮発性があり検証が出来なかった。

私のvagrantの使い方がまずかったと思いますが、上記の事象がおきてしまったため断念しております。
※ただし、vagrantで利用できればcloud-config.ymlに記載されているIPアドレスなどを$public_ipv4など変数に置き換えることもできますので大変便利です。

> This was intended but we should probably revise it if folks are depending on the old contents of /etc/environment. For EC2/OpenStack instances we moved the detection of $public_ipv4 and $private_ipv4 directly into coreos-cloudinit so that it would work gracefully with both EC2-style metadata services and config drive. The old /usr/share/oem/bin/coreos-setup-environment shipped with those images hung if no metadata service was available, breaking config drive based OpenStack systems.

## 次回

本構成を基礎構成として、fleetctlを使ったUnit、dockerの配置方法やfailoverの内容に触れていきたいと思います。

## 参考

[CoreOS入門](http://qiita.com/mopemope/items/fa9424b094aae3eac580)