2016年7月6日:記事を更新しました
2014年10月15日の掲載時、インストール時に必要な手順が一部不足している状態でしたので、不足部分を追記いたしました。追記部分は3ページ目、「 フロントエンドセットアップ」内の「Rubyライブラリのインストール」です。
KVMやXenなどの仮想化技術を使って物理マシン上に複数の仮想マシンを作成し、用途に応じて使い分ける、と言った運用は珍しくなくなってきました。仮想化支援機能を持つCPUが広く出まわるようになり、メモリも大容量化しているため、私用でも日常的に仮想マシンを立ち上げている、と言う方も多いと思います。
管理する物理マシンや仮想マシンが少ないうちは、各物理マシンにログインしてvirshコマンド等から個々の仮想マシンを操作する、という運用でも困りません。 しかし利用者や物理マシンが増えてくると、どの物理マシン上に誰の仮想マシンが稼働しているかと言った情報や、新しく仮想マシンを作成する際にどの物理マシンのCPUやメモリが空いているかと言った情報を、人力で管理することが加速度的に難しくなって行きます。
管理者の視点からは、CPUやメモリ搭載量と言ったハードウェアリソースを人間に代わって掌握し、利用者の要求に応じて適切な物理マシン上に仮想マシンを作成する管理機能が欲しくなります。利用者の視点からは、ハードウェアリソースを意識することなく、自分の好きなときに簡単に仮想マシンを作成し、使い終わったら返却するインターフェースが欲しくなります。 このような、いわゆるクラウド的な要望を実現する管理ツールとして、有名所ではOpenStack、CloudStack、Eucalyptusなどがあります。
今回紹介するOpenNebulaもクラウドを構築・管理するツールの1つです。
図1 OpenNebula環境で仮想マシンを作成しVNCコンソールからアクセスしたところ
OpenNebulaってどんなもの?
OpenNebula.org[1] で開発しているクラウド構築管理ツールです。データセンターのような多数の物理マシン/マルチユーザー環境での仮想マシン管理、と言う観点から開発が進んでいます。
先に名前を挙げたOpenStack、CloudStack、Eucalyptusは、全体的にどことなく商用クラウドサービスのAWS(Amazon Web Service、とりわけAmazon EC2やS3)に似た雰囲気を持ちますが、OpenNebulaの場合はあまりAWSっぽくありません。 だからと言って使いにくいということはなく、仮想マシンの管理に必要な機能を骨格に、利用者と管理者にとっての「あると便利な機能」を肉付けして、独自の進化を遂げている感があります。
OpenNebulaの最初のパブリックリリースは2008年3月で、このジャンルのソフトウェアの中では意外と古株だったりします。
使われ方としては、企業や研究所、大学などの学術機関で、組織内の利用者にプライベートクラウドとして提供する、という用途が多いようです。 Ubuntuでの使用実績も充分あり、2014年にOpenNebula.orgの公式サイトでアンケートを取った結果、OpenNebulaの構築に使用しているディストリビューションの比率ではUbuntuが36%という結果になっています[2] 。
開発はコミュニティベースで進められており、ソースはApache License Version 2.0で公開されています。 対応しているハイパーバイザはKVM、Xen、VMwareです。
特徴
OpenNebulaはシンプルでフレキシブルなクラウド管理ツールです。「 シンプル」は少機能の意味ではなく(むしろ一度に紹介しきないくらい多機能です) 、構築の簡易さ、システム構成の見通しの良さなどを意味します。
ここではOpenNebulaの特徴をいくつかピックアップします。
実装
コアとなるOpenNebulaデーモン(oned)はC++で実装されています。
各種リソースに対する処理は、bashやRubyで書かれたドライバスクリプトを介して行います。使用するハイパーバイザ(KVM、Xen、VMware) 、ネットワーク制御(802.1Q、iptables、Open vSwitchなど) 、ストレージ(NFS共有、ローカルストレージ、Cephなど)の差異は、このドライバスクリプトで吸収しています。
onedから物理マシン上の仮想マシンに対する操作はSSH経由で行います[3] 。物理マシンをOpenNebulaに登録した際にドライバスクリプトが物理マシン上にコピーされ、以降はonedがSSHで物理マシン上のドライバスクリプトを実行して仮想マシンの操作を行います。
OpenNebulaに公式では実装されていない機能をアドオンで追加することが可能です。コミュニティの手によるアドオンも公開されています[4] 。
CLIとSunstone
OpenNebulaはコマンドラインインターフェース(CLI)( 図2 )とWebインターフェースのSunstone(図3 )を持ちます。CLI、Sunstoneのどちらもほぼ同等の操作が可能です。
図2 コマンドラインインターフェース
図3 WebインターフェースSunstone
CLI、Sunstoneは共にRubyで実装されています。
Sunstoneは独立したデーモンプロセスとして稼働します。onedとCLIおよびSunstone間の通信はXML-RPCを使用します。 これにより、onedとは別のマシンにCLIやSunstoneをインストールし、ユーザーがアクセスするマシンとonedが稼働するマシンを分離することも可能です。
Sunstoneは用途によってadmin, vdcadmin, user, cloudの4つのビューを切り替えることができます。 管理者はフルコントロール可能なadminビューを使用し(図4 ) 、一般ユーザー向けには仮想マシンの起動停止など基本的な操作を提供するcloudビュー(図5 ) 、一般ユーザーの中でもグループのリーダー的なユーザーにはグループメンバーの利用状況が把握できるvdcadminビューを提供する(図6 ) 、と言った使い分けが可能です。
図4 Sunstone adminビュー
図5 Sunstone cloudビュー
図6 Sunstone vdcadminビュー
CLIでのコマンド出力フォーマットやSunstoneのボタン配置などは、YAML形式のコンフィグファイルでカスタマイズできます(図7 ) 。
図7 Sunstone cloudビューのコンフィグファイル
権限管理
OSのユーザーアカウントとは別に、OpenNebula上で独立したユーザー管理機能を持ちます。
OpenNebulaのユーザー管理機能はUNIXライクな設計になっています。ユーザーは1つ以上のグループに属し、仮想マシン、ネットワーク、ストレージ等のリソースはOWNER、GROUP、OTHERでパーミッション設定ができます。このためたとえば、
自分の作成した仮想マシンのディスクイメージを全ユーザーに公開したい
あるIPアドレスレンジのネットワークを特定のグループに属するユーザーだけで使用したい
と言った制御が直観的に可能です。
オーナー、グループの変更やパーミッションの変更の方法もUNIXライクです。たとえば、ネットワークリソース“ network1” をグループ“ group1” に所属するユーザーのみが利用できるようCLIから設定するには、下記のコマンドを実行します[5] 。
$ onevnet chgrp "network1" "group1"
$ onevnet chmod "network1" 660
onevnetがネットワークリソースの操作コマンドで、そのサブコマンドのchgrp、chmodで権限を設定しています。UNIXライクなOSを触っている人なら何となく何をしているかわかるのではないかと思います。
クォータ
ユーザー単位、グループ単位で各種リソースにクォータを設定でき、リソース使用量を柔軟に制御できます(図8 ) 。
図8 ユーザー単位でクォータを設定中
アカウンティング
各仮想マシンの作成時刻/破棄時刻や使用CPU数、メモリサイズ、ネットワーク送受信量など、課金の際に必要となるリソース使用量情報を、CLI、Webインターフェースから一通り取得可能です。
管理者はすべてのユーザーのリソース使用量を(図9 ) 、ユーザーは自分のリソース使用量を(図10 )随時確認できます。
図9 管理者が全ユーザーのリソース使用量をCLIから取得したところ
図10 ユーザーが自分のリソース使用量をSunstoneから取得したところ
OpenNebulaのインストールと環境構築
今回は物理マシンを2台使ってOpenNeubla環境を構築してみます。 OpenNebulaデーモンの稼働するマシンを「フロントエンド」 、仮想マシンの稼働するマシンを「ホスト」と呼称します。今回構築する環境は、フロントエンド1台、ホスト1台という構成になります。 フロントエンド、ホストともにOSはUbuntu 14.04 LTS Serverとし、インストールするOpenNebulaパッケージはOpenNebula.orgが公開しているUbuntu 14.04用パッケージを使用します。 使用するハイパーバイザはKVMです。
OpenNebulaではフロントエンド/ホスト間のストレージアクセス方法として複数の手段が選択できます。今回はフロントエンドとホスト間でNFSによりストレージを共有し、ディスクイメージにアクセスする方法を取ります[6] 。
バックエンドのデータベースはデフォルトのSQLiteを使用します[7] 。
準備
Ubuntu 14.04のリポジトリにはOpenNebulaのパッケージが登録されていますが、バージョンが3.4.1-4.1ubuntu1と非常に古いです(OpenNebula 3.4.1は2012年5月リリース) 。 最新バージョン4.8.0を使用するため、フロントエンドとホストの両方にOpenNebula.orgのリポジトリを追加します。
% wget - q - O - http : //downloads.opennebula.org/repo/Ubuntu/repo.key | sudo apt-key add -
OK
% sudo vi / etc / apt / sources . list . d / opennebula . list
opennebula.listの内容は以下のとおりです。
deb http : //downloads.opennebula.org/repo/4.8/Ubuntu/14.04/ stable opennebula
apt-get updateを実行し、エラーが出ないことを確認します。
% sudo apt - get update
apt-cache policy opennebulaを実行し、インストール候補が4.8.0-1となっていることを確認します。
% apt - cache policy opennebula
opennebula :
インストールされているバージョン: (なし)
候補: 4.8 . 0 - 1
バージョンテーブル:
4.8 . 0 - 1 0
500 http : //downloads.opennebula.org/repo/4.8/Ubuntu/14.04/ stable/opennebula amd64 Packages
3.4 . 1 - 4.1ubuntu1 0
500 http : //jp.archive.ubuntu.com/ubuntu/ trusty/universe amd64 Packages
フロントエンドセットアップ
今回はフロントエンドにOpenNebulaデーモン“ oned” と、Webインターフェース“ Sunstone” をインストールします。 また、今回の例ではNFSでストレージを共有しますので、フロントエンドでNFSサーバーのセットアップも行います。
OpenNebulaインストール
OpenNebula Sunstoneインストール
Rubyライブラリインストール
SSH鍵設定とNFSサーバ設定
と言う作業にになります。
OpenNebulaインストール
opennebulaパッケージをインストールします。
% sudo apt - get install opennebula
依存関係でそれなりの数のパッケージがインストールされます。インストールが終わるとonedが起動した状態となります。 インストールの際にoneadminというUNIXアカウントが作成されます。ホームディレクトリは/var/lib/oneです。 onedはoneadminユーザー権限で稼働します。onedが実行するコマンドのうち一部root権限が必要なもののために、/etc/sudoers.d/opennebulaが作成されています。 また、oneadminのSSH鍵ペア作成とOpenNebula初期パスワードの設定もこの段階で終わっています。
oneadminユーザーにスイッチし、CLIでonedにアクセスできるか確認します。onevm listコマンドを実行し、下記の出力結果であれば問題ありません。
% sudo - i - u oneadmin
$ onevm list
ID USER GROUP NAME STAT UCPU UMEM HOST TIME
$ exit
OpenNebula Sunstoneインストール
WebインターフェースのSunstoneをインストールします。
% sudo apt - get install opennebula - sunstone
インストールが終わるとSunstoneが起動した状態となります。 Sunstoneはデフォルトではループバックインターフェース127.0.0.1のみをリッスンします。リモートからのアクセスを受け付けるために、/etc/one/sunstone-server.confの「:host:」の値をリッスンしたいネットワークインターフェースのIPアドレスに変更しします。 今回はフロントエンドのeth0に振られたアドレスでリッスンすることにします。筆者の環境では192.168.1.50ですが、アドレスなどは適宜変更してください。
% ifconfig eth0
eth0 Link encap :イーサネット ハードウェアアドレス 52 : 54 : 00 : d9 : ec : 36
inet アドレス: 192.168 . 1.50 ブロードキャスト: 192.168 . 1.255 マスク: 255.255 . 255.0
(省略)
% sudo vi / etc / one / sunstone - server . conf
変更内容は以下になります。
: host : 192.168 . 1.50
変更後にSunstoneを再起動して設定を反映させます。
% sudo service opennebula - sunstone restart
リモートのマシンから“ http://(フロントエンドのIPアドレス):9869/” にアクセスし、ログイン画面(図11 )が表示されれば問題ありません。
図11 OpenNebula Sunstoneログイン画面
oneadminユーザーでログインしてみましょう。パスワードはoneadminユーザーのホームディレクトリの.one/one_authに記載されています。
% sudo - i - u oneadmin
$ cat ~ /.one/ one_auth
oneadmin : Ojhymlypish7
“:” で区切られた左側がユーザー名(上記の例ではoneadmin) 、右側がパスワード(上記の例ではOjhymlypish7)です。パスワードはインストール時にランダムで作成されますので、適宜読み替えてください。 ログインするとダッシュボードが表示されます(図12 ) 。
図12 ダッシュボード
この時点ではまだホストのセットアップやリソース設定が終わっていないので、これといっておもしろいことはできません。
Rubyライブラリインストール
OpenNebulaのいくつかのコンポーネントは複数のRubyライブラリを使用します。OpenNebulaはこれらのライブラリや依存パッケージをインストールするinstall_gemsスクリプトを用意しています[8] 。
install_gemsスクリプトはroot権限で実行します。
% sudo /usr/share/one/install_gems
依存するパッケージがインストールされた後、OpenNebulaが使用するgemがインストールされます。インストール終了後にOpenNebula関連のデーモンを再起動してください。
% sudo service opennebula restart
% sudo service opennebula-sunstone restart
SSH鍵設定とNFSサーバ設定
OpenNebulaはフロントエンドとホスト間の操作などをSSH経由で行います。そのためフロントエンドとホスト間でoneadminユーザーがノーパスフレーズでログインできる必要があります。 oneadminユーザーが作成された際に、oneadminユーザーのノーパスフレーズSSH鍵ペアが自動的に作成されています。 このSSH鍵ペアを、フロントエンドを含むすべてのマシンで共有する必要があります。これには、
oneadminのホームディレクトリを全ホストでNFSマウントする
oneadminの~/.sshをtarなどでアーカイブして全てのホストにコピーする
などの方法を取ります。 今回はフロントエンドのoneadminのホームディレクトリをNFSで共有することにします。
まず、oneadminのSSH公開鍵をoneadminのauthorized_keysに追加し、~/.ssh/configを編集します。
% sudo - i - u oneadmin
$ cat ~ /.ssh/ id_rsa . pub >> ~ /.ssh/ authorized_keys
$ vi ~ /.ssh/ config
$ chmod 600 . ssh / config
~/.ssh/configの内容は下記になります。
Host *
StrictHostKeyChecking no
UserKnownHostsFile / dev / null
NFSサーバをインストールし、/etc/exportsを編集してoneadminのホームディレクトリをエクポートします。
% sudo apt - get install nfs - kernel - server
% sudo vi / etc / exports
% sudo exportfs - av
/etc/exportsは下記の内容とします。
/var/ lib / one / *( rw , sync , no_subtree_check , root_squash )
OpenNebulaが管理する仮想マシンのディスクイメージは、oneadminのホームディレクトリ/var/lib/one以下に置かれます。 ファイルシステムに充分な余裕がない場合には、この時点で/var/lib/oneを別の大きなファイルシステムにmvし、シンボリックリンクを貼っておきましょう。
以下は/var/lib/oneをより大容量のファイルシステム/workに移動する場合の例です。
% sudo service opennebula - sunstone stop
% sudo service opennebula stop
% sudo mv / var / lib / one / work
% sudo ln - s / work / one / var / lib / one
% sudo service nfs - kernel - server restart
% sudo service opennebula start
% sudo service opennebula - sunstone start
ホストセットアップ
「ホスト」は仮想マシンが稼働する物理マシンです。ホストでは下記の設定を行います。
qemu-kvm/libvirtなどの依存パッケージのインストール
NFSクライアント設定
仮想マシンにネットワークを提供するための設定
依存パッケージのインストール
opennebula-nodeパッケージをインストールすると依存パッケージもまとめてインストールされます。 OpenNebula.orgのリポジトリが追加されていることを確認し、opennebula-nodeをインストールします。
% cat / etc / apt / sources . list . d / opennebula . list
deb http : //downloads.opennebula.org/repo/4.8/Ubuntu/14.04/ stable opennebula
% apt - cache policy opennebula - node
opennebula - node :
インストールされているバージョン: (なし)
候補: 4.8 . 0 - 1
バージョンテーブル:
4.8 . 0 - 1 0
500 http : //downloads.opennebula.org/repo/4.8/Ubuntu/14.04/ stable/opennebula amd64 Packages
3.4 . 1 - 4.1ubuntu1 0
500 http : //jp.archive.ubuntu.com/ubuntu/ trusty/universe amd64 Packages
% sudo apt - get install opennebula - node
oneadminユーザーが自動的に作成されます。 また、/etc/libvirt/qemu.confが変更され、仮想マシンを起動するユーザーがoneadminに設定されます。 /etc/sudoers.d/opennebulaが作成され、OpenNebulaで必要なコマンドがoneadminユーザーからNOPASSWDのsudoで実行できるようになります。
共有ストレージの種類や仮想マシンに提供するネットワークの種類など、選択の余地があるパッケージはopennebula-nodeの依存関係ではインストールされません。別途、明示的に指定してインストールする必要があります。
NFSクライアント設定
今回はフロントエンドのoneadminホームディレクトリをNFSで共有する方法を取ります。 nfs-commonパッケージをインストールし、/etc/fstabを編集します。
% sudo apt - get install nfs - common
% sudo vi / etc / fstab
% sudo mount - a
/etc/fstabには下記の行を追記します。IPアドレスは筆者の環境のフロントエンドのものですので、適宜変更してください。
192.168 . 1.50 : /var/ lib / one / / var / lib / one / nfs hard , intr , rsize = 32768 , wsize = 32768 , async 0 0
フロントエンドの/var/lib/one/がNFSマウントされていることを確認してください。 また、oneadminユーザーにスイッチしてフロントエンドとホストの双方向にノーパスフレーズでSSHログインできることを確認しておきましょう。
ブリッジインターフェース設定
仮想マシンにネットワークを提供するため、ブリッジインターフェースを作成します。 Ubuntu 14.04 Serverの場合、ネットワーク設定はNetworkManagerではなく/etc/network/interfaceでのマニュアル設定になっていると思います。これを編集してブリッジインターフェースを作成します。
まずはbridge-utilsをインストールします。
% sudo apt - get install bridge - utils
次に/etc/network/interfaceを編集します。
% sudo vi / etc / network / interfaces
今回はinterfacesに直接ブリッジ設定を書かず、interfaces.d/bridge.cfgに設定を書いてsourceスタンザで読み込むことにします。 eth0の設定部分をコメントアウトし、sourceスタンザを追記します。
auto lo
iface lo inet loopback
# The primary network interface
#auto eth0
#iface eth0 inet dhcp
source interfaces . d / bridge . cfg
/etc/network/interfaces.d/bridge.cfgを作成し、ブリッジの設定を記述します。
% sudo vi / etc / network / interfaces . d / bridge . cfg
今回はstaticにアドレスを振ることにします。下記は筆者の環境の例です。アドレスは適宜変更してください。
auto eth0
iface eth0 inet static
address 0.0 . 0.0
auto br0
iface br0 inet static
address 192.168 . 1.33
netmask 255.255 . 255.0
network 192.168 . 1.0
broadcast 192.168 . 1.255
gateway 192.168 . 1.254
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
編集後、マシンを再起動するなどして設定を反映させてください。
後編では
フロントエンドとホストの準備が整いましたが、この時点ではフロントエンド上のonedはホストを認識していません。
後編では、ホストやネットワークやディスクイメージなどのリソース情報をonedに登録し、OpenNebula環境を組み立てて行きます。また、組み上がったOpenNebula環境で実際に仮想マシンを起動してログインしてみます。