Update 2014-06-28
: IDCFクラウドにCoreOSクラスタを構築する - Part1: CoreOSの準備Update 2014-07-10
: IDCFクラウドにCoreOSクラスタを構築する - Part2: CoreOSのディスカバリUpdate 2014-07-15
: IDCFクラウドにCoreOSクラスタを構築する - Part3: クラスタをセットアップUpdate 2014-07-17
: IDCFクラウドにCoreOSクラスタを構築する - Part4: 367.1.0のissueUpdate 2014-07-19
: IDCFクラウドにCoreOSクラスタを構築する - Part5: 再セットアップ
IDCFクラウドへCoreOSをディスクへインストールできるようになったので、
GCEにCoreOSクラスタで実験した方法で、IDCFクラウド上にCoreOSクラスタを構築してみます。
CoreOSはインストールするときにcloud-config.ymlを参照して、SSH鍵の設定やsystemdの.serviceファイルを設定します。
IDCFクラウドの場合は、作業マシンと外付けのディスクを用意してインストール済みのディスクを作成します。
今回はInstalling CoreOS to Diskを読みながら、IDCFクラウドへのCoreOSディスクインストールを復習します。
TL;DR
IDCFクラウドにCoreOSクラスタを構築する - Part4: 367.1.0のissueで、/var/lib/coreos-install/user_data
を編集後にCoreOSをrebootすると、clud-config.ymlの再読込できました。
1台構成の場合
Installing CoreOS to Diskに従って、clud-config.ymlにインスタンスを構成する情報を記述していきます。
前回のcloud-config.ymlでは、必須のSSH鍵認証の設定だけ行っていました。
#cloud-config |
waitjobコマンド
idcf-compute-apiとjqを便利に使うため、スクリプトを用意します。
|
作業マシンでCoreOSインストールの準備
IDCFクラウド上に適当なインスタンスを用意して、idcf-compute-apiコマンドが利用できるようにします。
まず、listDiskOfferingsコマンドで、作成するディスクのタイプを確認します。
$ idcf-compute-api listDiskOfferings | jq '.listdiskofferingsresponse.diskoffering[0] | {name,id}' |
createVolumeコマンドで、CoreOSをインストールするための空のディスクを作成します。
- diskofferingid : 10 (ディスクのタイプ)
- size: 40 (40GB)
$ waitjob $(idcf-compute-api createVolume \ |
作業マシンのインスタンスのIDをlistVirtualMachinesコマンドで確認しておきます。
クエリの方法はいろいろありますが、今回は表示名を使ってみます。
$ idcf-compute-api listVirtualMachines | jq '.listvirtualmachinesresponse.virtualmachine[] | select(.displayname == "my-workstation").id' |
attachVolumeコマンドで、作成したディスクを作業マシンにアタッチします。
- id: 80921 (作成したディスクのID)
- virtualmachineid: 53553 (作業マシンのID)
$ waitjob $(idcf-compute-api attachVolume \ |
fdisk
でアタッチされたディスクを確認すると、/dev/sddです。
$ sudo fdisk -l | grep Disk |
CoreOSのインストールスクリプト
CoreOSのインストールスクリプトをダウンロードします。
$ mkdir -p ~/coreos_apps/cluster |
クラスタ構成のcloud-config.yml
etcdクラスタを構成するため、各ノードがお互いのサービスディスカバリが必要になります。
前回はetcdクラスタの構成情報を保存する場所として、discovery.etcd.io
の公開サービスを使いました。
discoveryAPIを使うため、最初にクラスタを識別するトークンを作成しておきます。
$ curl https://discovery.etcd.io/new |
CoreOSはパスワード認証でSSH接続ができないため、ssh_authorized_keysに接続用の公開鍵を記述します。
#cloud-config |
CoreOSのインストール
coreos-install
コマンドを使い、マウントしたディスクにCoreOSをインストールします。
CoreOSのイメージはBetaチャネルを使います。
$ sudo ./coreos-install -d /dev/sdd -C beta -c ./cloud-config.yml |
CoreOSをインストールしたディスクを作業マシンにmountして中身を確認します。
$ sudo mkdir -p /coremnt |
/var/lib/coreos-install/user_data
にインストールされているcloud-configを確認します。
$ sudo cat /coremnt/var/lib/coreos-install/user_data |
テンプレートの作成
mountしたCoreOSのディスクをumountします。
デタッチしたディスクから直接テンプレートを作成できないので、一度スナップショットを作成します。手順が面倒です。
$ sudo umount /coremnt |
detachVolumeコマンドで、ディスクを作業マシンからデタッチします。
$ waitjob $(idcf-compute-api detachVolume \ |
createSnapshotコマンドを使い、スナップショットの取得をします。今回は9分30秒かかりました。
- volumeid:80921 (デタッチしたボリュームID)
$ waitjob $(idcf-compute-api createSnapshot \ |
テンプレート作成に必要なOSタイプを確認します。今回は”Other Linux (64-bit)”を指定します。
$ idcf-compute-api listOsTypes | jq '.listostypesresponse.ostype[] | select(contains({description:"Other Linux (64-bit)"}))' |
createTemplateコマンドを使い、スナップショットからテンプレートを作成します。
- snapshotid: 157309 (作成したスナップショットID)
$ waitjob $(idcf-compute-api createTemplate \ |
listTemplatesコマンドで、作成したテンプレートを確認します。
- id: 8599 (作成したテンプレートID)
$ idcf-compute-api listTemplates \ |
インスタンスの作成は失敗
deployVirtualMachineは失敗してしまいました。。。
原因はまだわからないので、デバッグしていきます。なかなかうまく行かないものです。
$ waitjob $(idcf-compute-api deployVirtualMachine \ |
まとめ
今回はCoreOSのクラスタ作成用のテンプレートを作成しました。
CoreOSを直接ディスクにインストールしているため、テンプレートにuserdataにdiscoveryAPI用のTOKENが埋め込まれてしまっています。そのため、このテンプレートから作成するインスタンスはすべて同じクラスタ構成になってしまいます。
とりあえずテスト用なのでこのままCoreOSクラスタを構築しますが、別のクラスタを作る場合はTOKENを変更するのが面倒です。
起動後に変更できたとしても、一度古いTOKENでクラスタのノードを見てしまうので誤動作そうです。
そもそもまだインスタンスの起動に成功していないのですが。
理想はGCEのように、インスタンスの起動時にcloud-initでuserdataに指定したcloud-configを実行できると便利です。
IDCFクラウドのCloudStackが古いため、cloud-initで使っているCloudStackAPIが使えるかどうか確認する必要があります。
userdataを使い、インスタンス起動時に実行したいスクリプトや環境変数を渡せるので、いろいろ便利に使えそう。