Ubuntu Weekly Recipe

第345回UbuntuとOpenNebulaでクラウド環境を構築してみよう(前編)

2016年7月6日:記事を更新しました

2014年10月15日の掲載時、インストール時に必要な手順が一部不足している状態でしたので、不足部分を追記いたしました。追記部分は3ページ目、⁠フロントエンドセットアップ」内の「Rubyライブラリのインストール」です。

KVMやXenなどの仮想化技術を使って物理マシン上に複数の仮想マシンを作成し、用途に応じて使い分ける、と言った運用は珍しくなくなってきました。仮想化支援機能を持つCPUが広く出まわるようになり、メモリも大容量化しているため、私用でも日常的に仮想マシンを立ち上げている、と言う方も多いと思います。

管理する物理マシンや仮想マシンが少ないうちは、各物理マシンにログインしてvirshコマンド等から個々の仮想マシンを操作する、という運用でも困りません。 しかし利用者や物理マシンが増えてくると、どの物理マシン上に誰の仮想マシンが稼働しているかと言った情報や、新しく仮想マシンを作成する際にどの物理マシンのCPUやメモリが空いているかと言った情報を、人力で管理することが加速度的に難しくなって行きます。

管理者の視点からは、CPUやメモリ搭載量と言ったハードウェアリソースを人間に代わって掌握し、利用者の要求に応じて適切な物理マシン上に仮想マシンを作成する管理機能が欲しくなります。利用者の視点からは、ハードウェアリソースを意識することなく、自分の好きなときに簡単に仮想マシンを作成し、使い終わったら返却するインターフェースが欲しくなります。 このような、いわゆるクラウド的な要望を実現する管理ツールとして、有名所ではOpenStack、CloudStack、Eucalyptusなどがあります。

今回紹介するOpenNebulaもクラウドを構築・管理するツールの1つです。

図1 OpenNebula環境で仮想マシンを作成しVNCコンソールからアクセスしたところ
図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 コマンドラインインターフェース
図2 コマンドラインインターフェース
図3 WebインターフェースSunstone
図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ビュー
図4 Sunstone adminビュー
図5 Sunstone cloudビュー
図5 Sunstone cloudビュー
図6 Sunstone vdcadminビュー
図6 Sunstone vdcadminビュー

CLIでのコマンド出力フォーマットやSunstoneのボタン配置などは、YAML形式のコンフィグファイルでカスタマイズできます図7⁠。

図7 Sunstone cloudビューのコンフィグファイル
図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 ユーザー単位でクォータを設定中
図8 ユーザー単位でクォータを設定中

アカウンティング

各仮想マシンの作成時刻/破棄時刻や使用CPU数、メモリサイズ、ネットワーク送受信量など、課金の際に必要となるリソース使用量情報を、CLI、Webインターフェースから一通り取得可能です。

管理者はすべてのユーザーのリソース使用量を図9⁠、ユーザーは自分のリソース使用量を図10随時確認できます。

図9 管理者が全ユーザーのリソース使用量をCLIから取得したところ
図9 管理者が全ユーザーのリソース使用量をCLIから取得したところ
図10 ユーザーが自分のリソース使用量をSunstoneから取得したところ
図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サーバーのセットアップも行います。

  1. OpenNebulaインストール
  2. OpenNebula Sunstoneインストール
  3. Rubyライブラリインストール
  4. 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ログイン画面
図11 OpenNebula Sunstoneログイン画面

oneadminユーザーでログインしてみましょう。パスワードはoneadminユーザーのホームディレクトリの.one/one_authに記載されています。

% sudo -i -u oneadmin
$ cat ~/.one/one_auth
oneadmin:Ojhymlypish7

“:⁠で区切られた左側がユーザー名(上記の例ではoneadmin⁠⁠、右側がパスワード(上記の例ではOjhymlypish7)です。パスワードはインストール時にランダムで作成されますので、適宜読み替えてください。 ログインするとダッシュボードが表示されます図12⁠。

図12 ダッシュボード
図12 OpenNebula ダッシュボード

この時点ではまだホストのセットアップやリソース設定が終わっていないので、これといっておもしろいことはできません。

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

ホストセットアップ

「ホスト」は仮想マシンが稼働する物理マシンです。ホストでは下記の設定を行います。

  1. qemu-kvm/libvirtなどの依存パッケージのインストール
  2. NFSクライアント設定
  3. 仮想マシンにネットワークを提供するための設定

依存パッケージのインストール

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環境で実際に仮想マシンを起動してログインしてみます。

おすすめ記事

記事・ニュース一覧