0%

IDCFクラウドでCoreOSをディスクからインストールする

Dockerコンテナのプロダクション運用を考えると、2014-05-23にCoreOSの正式サポートを発表したGCE、
OrchardStackdockDocker-as-a-Service、DigitalOceanやVultrなどのVPSが候補になります。

特にGCEはインスタンス起動がとても速く、gcutilでuser-dataにcloud-configを渡せるのでCoreOSの作成がとても簡単です。

何回かIDCFクラウドでもCoreOSを使いたくて、ディスクISOへのインストールを試しましたが、失敗してしまいました。
BeagleBoneBlackUbuntuをインストールしている間に、ディスクにインストールする方法がわかってきたので、また試してみます。

TL;DR

IDCFクラウド上でもCoreOSが動きました!VagrantやGCEで試していたクラスタ構築も次回試します。

はじめに

ディスクへのインストール手順はいつのまにか更新されていました。
ただ、CoreOSのドキュメントは全体的にちょっとインデックスがわかりづらいです。

idcf-compute-apiを便利に使うために、非同期ジョブの終了をポーリングして待機するスクリプトを用意しました。

~/bin/waitjob
#!/usr/bin/env bash
set -eo pipefail

while :
do
json=$(idcf-compute-api queryAsyncJobResult --jobid=$1)
status=$(echo ${json} | jq '.queryasyncjobresultresponse.jobstatus')
if [ ${status} -eq 0 ]; then
echo -ne "."
sleep 10s
else
echo -e "\n"
echo ${json} | jq ".queryasyncjobresultresponse | {jobid: $1,jobresult}"
break
fi
done

実行権限をつけておきます。

$ chmod u+x ~/bin/waitjob

ディスクの準備

作成するディスクのタイプを確認します。

$ idcf-compute-api listDiskOfferings -t=id,name
+----+-------------+
| id | name |
+----+-------------+
| 10 | Custom Disk |
+----+-------------+

80GBのディスクを作成します。

$ waitjob $(idcf-compute-api createVolume \
--name=coreos_disk \
--diskofferingid=10 \
--size=80 \
--zoneid=1 | jq '.createvolumeresponse | .jobid' )
{
"jobid": 1084505
}
{
"jobresult": {
"volume": {
...
"diskofferingname": "Custom Disk",
"diskofferingid": 10,
...
"name": "coreos_disk",
"size": 85899345920,
"state": "Allocated",
...

作成したディスクを作業マシンにアタッチします。

$ waitjob $(idcf-compute-api attachVolume \
--id=xxx \
--virtualmachineid=xxx | jq '.attachvolumeresponse | .jobid')
{
"jobid": 1084507
}
{
"jobresult": {
"volume": {
...
"vmstate": "Running",
...
"type": "DATADISK",
...
"diskofferingname": "Custom Disk",
"diskofferingid": 10,
...
"name": "coreos_disk",
"size": 85899345920,
"state": "Ready"
...

一度作業マシンをrebootします。

$ sodo reboot

reboot後に、fdiskでアタッチしたディスクを確認します。80GBが2つありますが、/dev/sdaはブートディスクなので
今回追加したディスクは、/dev/sddになります。

$ sudo fdisk -l | grep Disk
....
Disk /dev/sda: 85.9 GB, 85899345920 bytes
Disk /dev/sdb: 107.4 GB, 107374182400 bytes
Disk /dev/sdc: 42.9 GB, 42949672960 bytes
Disk /dev/sdd: 85.9 GB, 85899345920 bytes

インストールスクリプトの実行

CoreOSのインストールスクリプトをダウンロードします。

$ cd ~/coreos_apps/
$ wget https://raw.githubusercontent.com/coreos/init/master/bin/coreos-install
$ chmod u+x coreos-install

cloud-configを用意します。
CoreOSはパスワード認証でSSH接続ができないため、ssh_authorized_keysに接続用の公開鍵を記述します。

~/coreos_apps/config
#cloud-config

ssh_authorized_keys:
- ssh-rsa xxx

coreos-installを実行します。-cオプションで先ほど作成したcloud-configを指定します。

$ sudo ./coreos-install -d /dev/sdd -C beta -c ./config
Downloading and verifying coreos_production_image.bin.bz2...
...
Writing coreos_production_image.bin.bz2 to /dev/sdd...
/tmp/coreos-install.wMnXNZkXfg/coreos_production_image.bin.bz2: done
Installing cloud-config...
Success! CoreOS beta current is installed on /dev/sdd

CoreOSをインストールしたディスクを作業マシンにmountして中身を確認します。

$ sudo mkdir /coremnt
$ sudo mount -o subvol=root /dev/sdd9 /coremnt/
$ ls -al /coremnt/

cloud-configは、/var/lib/coreos-install/user_dataにインストールされています。

$ sudo cat /coremnt/var/lib/coreos-install/user_data
#cloud-config

ssh_authorized_keys:
- ssh-rsa xxx

テンプレートの作成

ディスクを作業マシンからデタッチして、一度スナップショットを作成してからテンプレートを作成します。

確認のためmountしたCoreOSのディスクをumountします。

$ sudo umount /coremnt

ディスクを作業マシンからデタッチします。

$ waitjob $(idcf-compute-api detachVolume \
--id=xxx | jq '.detachvolumeresponse | .jobid')

スナップショットの取得をします。

$ waitjob $(idcf-compute-api createSnapshot \
--volumeid=xxx | jq '.createsnapshotresponse | .jobid')

事前にテンプレートを作成するときのOSタイプを確認します。
何でもよいですが、Other (64-bit)を使うことにします。

$ idcf-compute-api listOsTypes -c | grep 'Other Linux (64-bit)'
"Other Linux (64-bit)",99,7

最後に、テンプレートの作成をします。

$ waitjob $(idcf-compute-api createTemplate \
--snapshotid=xxx \
--displaytext=coreos-tpl-v2 \
--name=coreos-tpl-v2 \
--ostypeid=99 | jq '.createtemplateresponse | .jobid')

インスタンスの作成

予め作成するインスタンスのタイプを確認します。
今回はM4 ( 2CPU / 4GB )で作成します。

$ idcf-compute-api listServiceOfferings | jq '.listserviceofferingsresponse | .serviceoffering[] | select(.name == "M4") | {id,displaytext}'
{
"displaytext": "M4 ( 2CPU / 4GB )",
"id": 21
}

インスタンスの作成をします。

$ waitjob $(idcf-compute-api deployVirtualMachine \
--serviceofferingid=21 \
--templateid=xxx \
--zoneid=1 \
--name=coreos-v2 \
--displayname=coreos-v2 \
--group=mshimizu | jq '.deployvirtualmachineresponse | .jobid')

SSHでログインして確認

作業マシンからSSHで接続します。CoreOSのユーザー名はcoreです。

$ eval `ssh-agent`
$ ssh-add ~/.ssh/private_key
$ ssh -A core@coreos-v2
CoreOS (beta)
core@coreos-v2 ~ $

dockerとfleetのバージョンを確認します。

$ docker -v
Docker version 0.11.1, build fb99f99
$ fleet -version
fleet version 0.3.3

まとめ

RedHatがProject Atomicを発表して、軽量OSとコンテナクラスタの分散管理は非常におもしろくなっています。
Datacenter-as-a-Computerを目指そうとすると、ChromeOSを参考にしているCoreOSの方が楽しそうです。
DartやGoも勉強中なので。