OpenNebulaで自宅内プライベートクラウドしてみる

自宅に OpenNebula でプライベートクラウドを構築してみたので、その体験を殴り書き。

#発端
自宅にプライベートクラウド環境が欲しい

#めざすもの
* ブラウザコンソールでVMを作ったり消したりしたい
* VMのイメージバックアップを簡単に作りたい
* 2台構成で小さくはじめて、後からCPUリソースを追加していきたい

#OpenNebulaについて
##OpenNebulaとは
http://opennebula.org/
仮想データセンタマネジメントの1つです。
KVM や Xen、VMware といった VMホストを集中コントロールパネルで管理し、WEBブラウザやコマンドラインから VM の起動、終了、管理が行えます。
		
##OpenNebulaを選んだわけ
実はプライベートクラウドの構築を始めようと思って最初に手を出したのは OpenStack でした。
ご存じの通り(?) OpenStack はインストールが困難で挫けました。一応 1台のマシンに全部詰め込んだお試しまでは作ったのですが、そこからマシンを切りわけてスケールさせるのが難易度高くて…。

次に CloudStack の導入を始めこれも動作させるところまでは行ったのですが、これはデータセンタ向けっぽくて大量のマシンが必要でした。2～3台で組むにはシステムが大きくて辛かったのと、ネットワーク周りを要求通りに作るのがちょい困難だったので諦めました。
そして次にたどり着いたのが OpenNebula だったのですが、これがシンプルで私の目的には丁度良い感じだったのです。

幸いこれまで悪戦苦闘してきた 2システムのおかげで良い経験をさせて貰いました。
その結果プライベートクラウドで重要なのは「ネットワーク構築の取り回し」と「ノードの追加が容易なこと」じゃないかなあと思うに至ります。
その 2つがやりやすくて、VM管理ができる程度の抽象化というほどよさから OpenNebula に落ち着きます。

あくまで個人が自宅で使うのにやりやすかったという理由ですね。
		
##概要
OpenNebula には WebUI やコマンドラインから VM を管理する「フロントエンド」というサーバーと、実際に仮想マシンを持ち実行し管理される「ノード」というサーバーの 2つに役割が分かれます。
この「フロントエンド」と「ノード」でそれぞれ 1台ずつ、2台の構成がおおよそ最小構成となります。
ノードは後からぽこぽこ追加して行けますので、まずは 2台で始めて、行けそうだと思ったらノードを増やしていく形で良いと思います。
		
フロントエンドとノードは NFS でストレージを共有し、起動するVMイメージ(ブロックストレージ)や情報を共有しています。
新しくVMを起動するときはまずフロントエンドが元となるOSイメージをNFS上でコピーします。コピーしおえたら ssh 経由で VM の起動をリクエストします、ノードはそのイメージをNFS越しにマウントしたVMを起動します。この様に、NFS経由で共有されているため非常にシンプルな構成となるのが特徴です。
		
認証とかそのへんはどうなっているのかというと、NFS で共有されるディレクトリに SSH の秘密鍵、公開鍵を含んでいるのでそれでフロントエンドとノードの間は行き来できるようになっています。信頼性についてはボリュームのマウントを許可する部分で取ってくれという感じですね。
機密性とか問わない個人用途では扱い易くて良いです。
		
##OpenNebulaのネットワーク
OpenNebula が扱う仮想ネットワークはシンプルで、接続するブリッジ名の指定と VLAN ID、それとプールIPアドレスの払い出しのみを管理します。
VM の仮想ネットワークカードをどの名前のブリッジに接続するかでネットワーク管理を行うのですが、ブリッジの名前は個々のノードマシンが持っています。これはセットアップ時に意識して付けてやる必要があります。
ブリッジは 1つにして VLAN ID で経路を決めるとソフトウェア制御的になるでしょうが、それにしても接続する VLAN ID 対応スイッチの設計が必要になります。

#インストールノウハウ
##インストールガイド
OpenNebula のサイトにインストールガイドがあります、基本それに従ってください。
http://docs.opennebula.org/4.10/design_and_installation/index.html
このインストールガイドが良くできておりなぞることぐらいしかないので、それ以外での経験則を記していきます。

##フロントエンド
VMやホストマシン(ノード)をWebUIで管理するフロントエンド部分には Sunstone という名前が付いています。この Sunstone とコマンドラインツール、OpenNebula コントロールのコア部分をまとめてフロントエンドと呼び、通常一台のサーバーが受け持ちます。

私はこのフロントエンドに小型PCである LIVA(Mem2GB/ストレージ32GB)を割り当てて使っています。
フロントエンドは主に WebUI なので非力な LIVA でも十分賄えるのですが、メインメモリの 2GB は正直ギリギリです。それと非力な CPU は NFS 越しのファイルコピーなどに響き、新規VM準備時などコピー操作が入るときは WebUI が重くなるようです。
フロントエンドではVM準備時やスナップショット作成時にイメージファイルのコピーをしまくりますので、インストールガイドにあるよう、フロントエンドがシステムストレージになって NFS サーバーを兼ねる方が快適なのかもしれません。
		
インストールガイドには CentOS6/7、Ubuntu14.04 と二種類のディストリビューションが用意されていますが、パッケージリポジトリには Debian7 も存在しています。
私は普段 Debian を使いたがるのですが、OpenNebula のインストールに際しては Ubuntu を選択しました。理由はノードの方にて。
		
インストールガイドではパッケージリポジトリを追加しインストールする、と書いてあるのですがこのリポジトリ URI が古くなっています。
どんなパッケージがあるのかといった確認や、最新版を確認するためには現在のリポジトリを覗くのが一番でしょう。
http://downloads.opennebula.org/repo/
ちなみにこれを書いている時で最新の Ubuntu 向けリポジトリは
http://downloads.opennebula.org/repo/4.12/Ubuntu/14.04/
となっています。

フロントエンド自身が NFS サーバーになるのではなく、外部の NFS ストレージを利用するのであれば最初にそれをマウントしてからパッケージをインストールする形になります。
/var/lib/one/ を最初にマウントしてからインストール作業を開始してください。
私は自宅内ファイルサーバーとして使っている QNAP を NFS サーバーにして使っています。既に RAID5 構成されているストレージなので冗長性管理はそっちにお任せ＆容量は気にしないで済んでいます。

##ノード
実際に VM を実行するホストであり、CPU＆メモリリソースとなるマシンをノードと言います。ここでは仮想化ホストに KVM を用いた場合で説明をします。

ノードは KVM を動作させるのである程度アーキテクチャが揃っている必要があります。Intelアーキテクチャの 64bit ですね。ARM や 32bit の混在はできません。
AMD と Intel atom コアの混在くらいは大丈夫です、実際混ぜてます。
今回の目的が低消費電力サーバーにリプレースするということでもあったので、3万円くらいで揃えられる低消費電力小型 PC を寄せ集めています。
流行のスティックPCやタブレットPCなどは Windows8.1 with bing の搭載レギュレーションのために、32bit しかブートできない UEFI を積んでいます。そういったマシンには Linux 64bit を載せるのが困難なのでさすがにそこまでけちるのは筋が良くありません。

ノードで VM が動作するためマシンパワーがあったに越したことはないのですが、VM のブロックストレージは NFS で共有する形で提供されるためノード内部のストレージは基本必要としません。このため、ノードが積む HDD なり SSD なりは小さくて構いません。10GB とか 20GB とかいった容量で十分です。
いっその事、通常の HDD や SSDといったストレージデバイスを積まずに USBサムメモリで起動とかにしてしまっても良いのでは無いかとも思うのですが、そこまでは試せていません。
昨今では普通になった 500GB や 1TB といったストレージを割り当てるとちょっと勿体ないです。そういった場合 OpenNebula のノード用とは別に空いたところを GlasterFS かなにかに割り当てると VM から利用できて便利なのでは無いかと思います。

VM は NFS 越しでマウントされるブロックイメージで動作するのでストレージ速度には期待ができません。
それだと困る場合には NFS 共有ではなく scp で VMイメージをノードに送り込んで実行する IM_MAD(ドライバ)があるらしいのですが、使ってみたことはありません。

インストールの前準備として必要になるのが、NFS 共有ディレクトリのマウントとブリッジネットワークの設定です。
NFS のマウントはフロントエンドと同じです、もしくはフロントエンドがサーブする NFS エントリを /var/lib/one にマウントします。

KVM は VM を作成するとその仮想ネットワークアダプタをホストのブリッジにぶら下げますので、ホスト側にブリッジの作成が必須となります。ブリッジとはソフトウエアで作られたネットワークHUBのようなものです。
OpenNebula のノードをインストールする前にブリッジを設定します。
OpenNebula のフロントエンドでは新しく作る VM をどういったネットワークに接続するかをブリッジ名と VLAN ID で指定します。なのでフロントエンドに登録するブリッジ名とノードが実際に持っているブリッジ名が一致していなくてはなりません。またそのブリッジ名がノード毎に異なっていると面倒なことになるので統一してあげます。
つまりブリッジ名と接続するネットワークは予め設計して決めておく必要があるわけです。

KVM ホストでブリッジを作成する方法として bridge-utils を使ったカーネルブリッジ設定と、openvswitch-switch を使った openvswitch 設定の 2種類がざっくり存在します。
インストールガイドに記されているのは bridge-utils を使った方法ですが、わたしは OpenVSwitch を使用しました。
この OpenVSwitch をホストOSにインストール部分で Debian ではなく Ubuntu を選択しています。Debian7 では OpenVSwitch のパッケージがありませんし、Debian8 では systemd になった関係でサービス起動順がまだ不完全らしく(OVS起動はinit.dだった)networkサービスとOpenVSwitchの起動が連携していないように見えます。ちなみに OpenNebula 自体のインストールはどちらも問題ありませんし、Debian7 のリポジトリで Debian8 にインストールしても正常に完了します。

OpenVSwitch を使ってブリッジを作成し、イーサネットカードに割り当てます。
宅内LAN ネットワークを br0、外部公開用インターネットを br1 という名前にしています。

```
ovs-vsctl add-br br0
ovs-vsctl add-br br1
ovs-vsctl add-port br0 eth0
ovs-vsctl add-port br1 eth1
```

ブリッジの準備はこれでおしまいです。OpenVSwitchの場合VLANの設定は特にしなくてもフロントエンド側からの操作で利用できます。
ただこれだとノード自身が IP アドレスを持たずネットワークアクセスできなくなってしまいます。当然、フロントエンドからも操作ができません。なので、ブリッジにIPアドレスを割り当てます。

``` /etc/network/interfaces
auto eth0
iface eth0 inet manual
		
auto eth1
iface eth1 inet manual
		
auto br1
iface br1 inet manual
		
auto br0
iface br0 inet static
  address 192.168.0.9
  netmask 255.255.255.0
  gateway 192.168.0.254
```
		
ノード内部からネットワークアクセスができることと、フロントエンド側からノード(ここでは 192.168.0.9)に向けて ssh ログインができることなどを確認してください。
		
ブリッジの設定ができたらあとは opennebula-node をインストールするだけです。
インストールし終えたらさっそくフロントエンドからホスト追加でノードをクラウドの一員に加えましょう。

ブリッジの設定があるので一見難しそうですが、実際のところそれ以外手数は少ないのでノードの準備と追加は容易です。
		
	
#使い方ざっくり
* one-sunstone(WEBコンソール)が起動する様になった後使い始めるまでに必要なものは、ホストの追加(node)とバーチャルネットワークの追加です
* バーチャルネットワークはブリッジ名とそこに割り振るIPアドレス範囲を指定します
* Images にはKVMのVMイメージを追加することができます、手っ取り早く起動するにはこれでしょう
* Images には CDイメージも追加することができます、空っぽのデータイメージを作ってそれと CDイメージをあてがった VM を起動すれば OSインストールができます
* OpenNebula には CONTEXT と呼ばれるファイルや設定を起動時に外部から与える機能があります、使用する OSイメージは予め CONTEXT マネージャをインストールしておきます(Debian/Ubuntu なら apt-get install opennebula-context)
* OSインストールが終わったらスナップショットイメージを作成し、起動OSイメージにします
* VM起動にはイメージ、テンプレート、の2つが必要です、VMは起動したいVMのテンプレートを指定して作成する形となります
* テンプレートは vCPU数、メモリ数、起動する node の指定などといった VM 作成に必要な情報を設定しておきます