CoreOSに入門してみる (1) インストール


# 1. はじめに
CoreOSに入門してみました。

CoreOSはミニマムな新しいOSで、etcdというものでクラスタが組めてfleetというもので分散環境が構築できるらしい。
分散環境を構築したCoreOSクラスタ上で、Dockerによってアプリケーションを動かすらしい。

という程度の知識からスタートです。

何事もまずはインストールしないと、ということで本記事ではISOイメージからCoreOSのVMを作成してみます。
また、CoreOSのCloud-Configという機能も使ってみます。

# 2. ダウンロード
まずはISOイメージをダウンロードします。

[ISOダウンロードページ](https://coreos.com/docs/running-coreos/platforms/iso/)から最新のStable版をダウンロードします。
サイズは136MBでした。

2014/11/2現在でのStable最新版はこんな感じです。

* CoreOS 444.5.0
* Kernel 3.16.2
* Docker 1.2.0
* etcd 0.4.6
* fleet 0.8.3

# 3. VM作成
VirtualBoxを使います。

VirtualBoxマネージャーを起動して、適当にVMを作っていきます。

![スクリーンショット 2014-10-26 1.28.51.png](https://qiita-image-store.s3.amazonaws.com/0/43208/71cc873b-d9e4-fa5d-308d-88689a45d28a.png "スクリーンショット 2014-10-26 1.28.51.png")

ホスト側からSSHできるようにしたいので、ネットワークアダプターにホストオンリーアダプタを追加します。
また、ISOをマウントしておきます。

設定は、こんな感じ。

![スクリーンショット 2014-10-26 1.34.37.png](https://qiita-image-store.s3.amazonaws.com/0/43208/124b81a9-f02f-ffd3-8698-83eedb0b383a.png "スクリーンショット 2014-10-26 1.34.37.png")

# 4. VM起動
起動してみます。
![スクリーンショット 2014-10-26 1.38.51.png](https://qiita-image-store.s3.amazonaws.com/0/43208/11d4c02c-0300-1808-bafc-4af420ae63a0.png "スクリーンショット 2014-10-26 1.38.51.png")

CoreOSの文字がカラフルでシャレオツです。
まだHDDにはインストールされておらず、CDからブートしている状態です。

試しにifconfigしてみました。
![スクリーンショット 2014-10-26 1.43.42.png](https://qiita-image-store.s3.amazonaws.com/0/43208/5b02de8c-65fe-4f01-540e-61f5dd74823f.png "スクリーンショット 2014-10-26 1.43.42.png")

NICが2個あることが確認できます。

# 5. インストール

では、HDDにインストールしていきたいと思います。
が、その前にCloud−Configの設定ファイルを作成します。

## Cloud-Config
CoreOSでは、標準で[Cloud-Config](https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/)という機能が利用できます。

OS起動時にYAMLの設定ファイルを読み、OSの基本設定を行う機能です。
YAMLで設定を記述しておけば、次のものが設定できます。

* ネットワーク
* ユーザ
* systemd
* など

[cloud-init](https://launchpad.net/cloud-init)プロジェクトにCoreOSの独自要素を追加したものだそうです。

とりあえず、SSHでログインできるようにネットワークとユーザの設定をしてみます。

ユーザは適当なユーザにパスワードと公開鍵を設定します。
Githubから公開鍵を取得してくる便利機能があるのでそれも使ってみます。
パスワードハッシュの生成方法など諸々公式のマニュアルに書いてあります。

https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/#users

ネットワークは[systemd-networkd](http://www.freedesktop.org/software/systemd/man/systemd-networkd.service.html)の設定ファイルを書き出す方法で設定します。
Unitsで設定すれば、systemd-networkdのリスタートも自動でやってくれるみたいです。

https://coreos.com/docs/cluster-management/setup/network-config-with-networkd/

```yaml:~/cloud-config.yml
#cloud-config

coreos:
  units:
    - name: 10-static.network
      runtime: no
      content: |
        [Match]
        Name=enp0s8
        
        [Network]
        Address=192.168.33.200/24

users:
  - name: nownabe
    passwd: ...
    groups:
      - sudo
    coreos-ssh-import-github: nownabe
```

先頭の`#cloud-config`は必須です。


## インストール

[インストール用のスクリプト](https://coreos.com/docs/running-coreos/bare-metal/installing-to-disk/)が用意されているので、それを使います。

```bash
sudo coreos-install -d /dev/sda -C stable -c cloud-config.yml
```

OSイメージをダウンロードをしてるみたいですが、数分で終わります。

![installed.png](https://qiita-image-store.s3.amazonaws.com/1225/51416/55ab1ce2-351d-1791-486b-9c6fcda70de7.png "installed.png")

cloud-config.ymlは、`/var/lib/coreos-install/user_data`に保存されます。

インストールが終わったら、ディスクをアンマウントして再起動します。

```bash
sudo reboot
```

![スクリーンショット 2014-11-02 23.04.22.png](https://qiita-image-store.s3.amazonaws.com/0/43208/6a0a7912-61bc-e01a-4925-a6f458214241.png "スクリーンショット 2014-11-02 23.04.22.png")

ネットワークの設定ができてるのと、作ったユーザでログインできることを確認してみてください。

うまくいかない時は、`coreos-cloudinit`コマンドでcloud-configファイルを指定してCoreOSを設定し直すことができるので、色々試してみます。
設定のログも出力されるので、動作を理解するのにいいかもしれません。

```bash
sudo coreos-cloudinit -from-file=cloud-config.yml
```

設定は一回リセットされるわけではないので注意が必要です。
（1回作ったユーザは残ったまま）

# 6. SSHしてみる
ホストのMacからSSHしてみます。

```
% ssh 192.168.33.200
Last login: Sun Nov  2 14:31:56 2014
CoreOS (stable)
nownabe@localhost ~ $ cat /etc/os-release
NAME=CoreOS
ID=coreos
VERSION=444.5.0
VERSION_ID=444.5.0
BUILD_ID=
PRETTY_NAME="CoreOS 444.5.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"
```

# 7. おわりに
第1回は以上です。
ネットワークまわりでなかなか苦労しました。
単にsystemd-networkdに慣れていないせいなのか、CoreOSのcloud-initの動作を理解してないのか、もうちょっと触ってみる必要がありそうです。

次回はクラスタ組んでDockerコンテナのフェイルオーバーとかやりたいです。

# 参考記事
参考にさせていただきました。
ありがとうございます！

* [CoreOS 入門](http://qiita.com/mopemope/items/fa9424b094aae3eac580)
* [CoreOS用のcloud-config.ymlを晒しておく](http://qiita.com/ma2shita/items/e069b6019688d8e848f5)