Ubuntu Weekly Recipe

第483回UbuntuとOpenNebulaでもういちどクラウド環境を構築してみよう

クラウド構築・管理ツールのOpenNebulaが、2017年7月20日にOpenNebula 5.4 'Medusa'をリリースしました[1]⁠。バージョン5系列で3回目の安定版リリースとなります。Ubuntu Weekly Recipeでは第345回346回でOpenNebula バージョン4系列での環境構築方法を取り上げました。5系列では手順に一部変更がありますので、今回は改めてUbuntuでのOpenNebula 5.4の環境構築を紹介します[2]⁠。

OpenNebula 5.4のごく簡単な紹介

OpenNebula 5.4はVMware vSphere環境向けの機能強化の他、新機能がいくつか追加されています。主要なものを取り上げてみます。

VM Groups

「仮想マシンと仮想マシン」⁠仮想マシンとホスト」というグループ化と、affinity/anti-affinityのルール付けができるようになりました。特定の仮想マシングループを特定のホストで実行する、CPUバウンドな仮想マシン同士が同じホスト割り当てられないようにする、といったルールが定義できます。

既存の類似機能としてClusterがありますが、こちらはホストとネットワークやデータストアといった粒度の大きいリソースでグループ化するもので、細かな設定に難がありました。VM Groupsはホストと仮想マシン単位でのグループ化とルール付けが可能で、利用するシーンが多そうです。

図1 仮想マシンaoi、hinataをグループ化してhost001に、kokona、honokaをグループ化してhost002に割り当て
画像

High Availability

フロントエンドの冗長構成がOpenNebulaネイティブな機能として実装されました。過去のバージョンではCorosyncとPacemakerを利用して冗長構成が組めましたが、5.4ではこれらのサードパーティーコンポーネントは不要となっています。

複数のOpenNebulaフロントエンドをゾーンとして束ねるData Center Federation機能も、バックエンドデータベースのMySQL/MariaDBによるレプリケーションが不要となっています。いずれの機能も過去のバージョンに比べて構築しやすいものとなっているようです。

OpenNebula 5.4のサポートする環境

Release Notes 5.4Platform NotesにOpenNebulaがサポートする環境の一覧がまとまっています。UbuntuについてはUbuntu Server 14.04 LTS、16.04 LTS、17.04がサポートされています[3]⁠。また、Debianは8、9が、Red Hat Enterprise LinuxとCentOSは7系列がサポートされています。

OpenNebula 5.4でクラウド環境を構築してみよう

今回は以下の構成で環境を構築します。

  • OpenNebulaデーモンの稼働する「フロントエンド⁠⁠、仮想マシンの稼働する「ホスト」の合計2台のマシンからなるインフラ構成とします。
  • フロントエンド、ホストともにUbuntu Server 16.04.2 LTSを使用します。
  • OpenNebula公式リポジトリの5.4パッケージを使用します。Ubuntu 16.04 LTSのリポジトリにはOpenNebula 4.12パッケージがありますが、こちらは使用しません。
  • データベースはデフォルトのSQLiteを使用します。
  • データストアの転送ドライバはsshを使用します。

OpenNebulaリポジトリ追加

フロントエンドとホストの両方にOpenNebulaの公式リポジトリを追加します。まずは鍵を登録します。

$ wget -q -O- https://downloads.opennebula.org/repo/repo.key | sudo apt-key add -

$ apt-key list
(略)
pub   2048R/85E16EBF 2013-06-13
uid                  OpenNebula Repository <[email protected]>
sub   2048R/01BC0188 2013-06-13

続いてUbuntu Server 16.04用のOpenNebula 5.4リポジトリを追加します。

$ sudo bash -c 'echo "deb https://downloads.opennebula.org/repo/5.4/Ubuntu/16.04 stable opennebula" > /etc/apt/sources.list.d/opennebula.list'

$ cat /etc/apt/sources.list.d/opennebula.list
deb https://downloads.opennebula.org/repo/5.4/Ubuntu/16.04 stable opennebula

apt updateした後、apt policyでインストールされるOpenNebulaパッケージを確認します。

$ sudo apt update

$ apt policy opennebula
opennebula:
  Installed: (none)
  Candidate: 5.4.0-1
  Version table:
     5.4.0-1 500
        500 https://downloads.opennebula.org/repo/5.4/Ubuntu/16.04 stable/opennebula amd64 Packages
     4.12.3+dfsg-3build1 500
        500 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial/universe amd64 Packages

Candidate: 5.4.0-1となっていますね。

フロントエンドのセットアップ

OpenNebulaデーモンの稼働するフロントエンドは、物理マシンやネットワークアドレス、イメージファイルなどのリソース情報の管理やスケジューリングを司ります。また、今回はWebインタフェースのSunstoneやCLIもフロントエンドにインストールします[4]⁠。

フロントエンド向けパッケージのインストール

apt installで以下のパッケージをインストールします。今回の記事では触れないOneGateやOneFlowといった関連パッケージも一緒にインストールしています。

$ sudo apt install opennebula opennebula-sunstone opennebula-gate opennebula-flow

続いてinstall_gemsスクリプトを実行します。install_gemsスクリプトはビルドに必要なパッケージをインストールした後に依存するRubyライブラリをインストールします。

$ sudo /usr/share/one/install_gems
(略)
About to install these dependencies:
* gcc
* rake
* libxml2-dev
* libxslt1-dev
* patch
* g++
* libsqlite3-dev
* libcurl4-openssl-dev
* libmysqlclient-dev
* ruby-dev
* make

Press enter to continue... (Enterキーを押下)
(略)

OpenNebulaサービスの開始

フロントエンドでOpenNebulaサービスを開始できる状態となりました。さっそくsystemctlコマンドで起動してみましょう。

$ sudo systemctl start opennebula.service
$ sudo systemctl start opennebula-sunstone.service

確認のためUNIXアカウントのoneadmin権限でoneuserコマンドを実行してみます。以下のような出力があれば、OpenNebulaデーモンのonedは問題なく起動できています。

$ sudo -u oneadmin oneuser show
USER 0 INFORMATION
ID              : 0
NAME            : oneadmin
GROUP           : oneadmin
(略)

Webブラウザでフロントエンドマシンのポート9869番にアクセスし、Sunstoneが起動していることを確認します。

http://(フロントエンドのアドレス):9869/
図2 Sunstoneのログイン画面
画像

この時点でSunstoneにはOpenNebulaの管理者アカウントoneadminでログインできます。パスワードはフロントエンドの/var/lib/one/.one/one_authに記載されています。":"で区切られた右側がOpenNebulaデーモン初回起動時にランダムで作成されたoneadminアカウントのパスワードです。

$ cat /var/lib/one/.one/one_auth
oneadmin:(パスワード文字列)

問題なければsystemdから自動起動するよう設定しておきましょう。

$ sudo systemctl enable opennebula.service
$ sudo systemctl enable opennebula-sunstone.service

ホストのセットアップ

仮想マシンインスタンスが稼働するホストをセットアップします[5]⁠。

Linux環境ではハイパーバイザはKVMを使用します。バージョン4系列まではXen用のドライバスクリプトが用意されていましたが、5系列からはAdd-onとして別途追加する形式になっています。その他にもLXDを使用するAdd-onなどがコミュニティにより提供されています。

ホスト向けパッケージのインストール

ホストはopennebula-nodeパッケージをインストールします。これによりqemu関連やlibvirt関連等の依存パッケージのインストール、UNIXアカウントのoneadminの作成、OpenNebula用の設定ファイルの配置などが行われます。

apt policyでインストール候補が5.4.0-1となっていることを確認します。

$ apt policy opennebula-node
opennebula-node:
  Installed: (none)
  Candidate: 5.4.0-1
  Version table:
     5.4.0-1 500
        500 https://downloads.opennebula.org/repo/5.4/Ubuntu/16.04 stable/opennebula amd64 Packages
        500 https://downloads.opennebula.org/repo/5.4/Ubuntu/16.04 stable/opennebula i386 Packages
     4.12.3+dfsg-3build1 500
        500 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial/universe amd64 Packages
        500 http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial/universe i386 Packages
$ sudo apt install opennebula-node

opennebula-nodeパッケージがインストールされるタイミングでlibvirt関連の設定ファイルがOpenNebula用に書き換わるため、libvirt-binを再起動します。

$ sudo systemctl restart libvirt-bin.service

ブリッジインタフェース設定

仮想マシンへのネットワーク提供用にブリッジインターフェースを作成します。今回はbridge-utilsを使用します。

$ sudo apt install bridge-utils

Ubuntu Server 16.04はデフォルトでは/etc/network/interfaceにインタフェース設定が記述されています。これをコメントアウトします。

$ sudo vi /etc/network/interfaces
(以下をコメントアウト)
# The primary network interface
#auto enp3s0
#iface enp3s0 inet dhcp

次に/etc/network/interfaces.d/以下にブリッジインタフェース用の設定ファイルを作成します。ブリッジインタフェース名は任意で構いませんが、ホスト間で統一しておく必要があります。この例では「br0」としています。

$ sudo vi /etc/network/interfaces.d/bridge.cfg
auto enp3s0
iface enp3s0 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
    dns-nameservers 192.168.1.14
    dns-search example.org
    bridge_ports enp3s0
    bridge_fd 9
    bridge_hello 2
    bridge_maxage 12
    bridge_stp off

なお、NICのインタフェース名(この例ではenp3s0)は環境によって異なりますので、適宜読み替えてください。

上記を設定後、ホストマシンを再起動します。

ノーパスフレーズSSH公開鍵認証設定

OpenNebulaはフロントエンドとホスト間のやりとりをUNIXアカウントのoneadmin権限のSSHで行います。フロントエンド上の各種ドライバスクリプトのホストへの配布や、仮想マシンの起動・停止等の操作、デフォルトのイメージファイル転送もSSHです。

フロントエンドでOpenNebulaをインストールしたタイミングで、/var/lib/one/.sshにノーパスフレーズのSSH鍵ペアが作成され、authorized_keysに公開鍵が登録されています。これらを何らかの方法ですべてのホストに配布します。今回はホスト上で一時的にパスワード認証を有効にしてscpで配布する方法を採ります[6]⁠。

ホスト側設定

ホスト側の/etc/ssh/sshd_configでパスワード認証を有効にします。

PasswordAuthentication yes

sshdを再起動します。

$ sudo systemctl restart ssh.service

UNIXアカウントoneadminにパスワードを設定します。

$ sudo passwd oneadmin
Enter new UNIX password:  (パスワード文字列を入力)
Retype new UNIX password: (もう一度パスワード文字列を入力)
passwd: password updated successfully

フロントエンド側設定

ssh-keyscanコマンドでUNIXアカウントoneadminのknown_hostsにフロントエンドと全ホストマシンのホスト鍵を登録します。この例ではフロントエンドにmogami.example.org、ホストにhost001.example.orgを登録します。FQDNとショートネームの両方で登録しておくとホスト名絡みのトラブルを事前に防げるのでおすすめです。

$ ssh-keyscan mogami mogami.example.org host001 host001.example.org  >> /var/lib/one/.ssh/known_hosts

SSH鍵ペアとauthorized_keys、known_hostsを.sshディレクトリごとホストにscpします。

$ scp -rp /var/lib/one/.ssh host001:/var/lib/one
oneadmin@host001's password: (ホスト上のoneadminアカウントのパスワードを入力)

UNIXアカウントoneadminがホストにノーパスフレーズのSSH公開鍵認証でログインできること、ホストからフロントエンドにもノーパスフレーズでログインできることを確認します。

oneadmin@mogami:~$ ssh host001
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-87-generic x86_64)
(略)
oneadmin@host001:~$ ssh mogami
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-87-generic x86_64)
(略)

以降は公開鍵認証でログインできるので、ホスト側のsshdのパスワード認証は無効にして構いません。

ホストをOpenNebula環境に登録

フロントエンドとホストでノーパスフレーズでのSSHが可能になったことで、ホストをOpenNebula環境に登録する準備が整いました。

バージョン4系列までのOpenNebulaは、フロントエンドとホスト間のイメージファイル受け渡し方法がデフォルトではNFSとなっていました。これに対し、バージョン5系列からはデフォルトのイメージファイル受け渡しがSSHに変更されました[7]⁠。

SSHでのファイル転送(scp)によるイメージファイル受け渡しは、仮想マシンのデプロイ開始からインスタンス起動までに転送によるタイムラグが生じる、KVMのライブマイグレーションが利用できないといったデメリットはあるものの[8]⁠、ホストのローカルファイルシステムからインスタンスを起動するためディスクI/Oスループットや信頼性が高く、フロントエンドの負荷も低い上に管理が容易です。

ホストを含む各種リソースのOpenNebulaへの登録は、SunstoneまたはCLIから行います。今回はターミナルからCLIで登録してみましょう。フロントエンドにログインし、UNIXアカウントoneadminにスイッチします。

$ sudo -i -u oneadmin

onehost createコマンドでホストを登録します。ここではhost001をOpenNebula環境に登録します[9]⁠。

$ onehost create host001 -i kvm -v kvm
ID: 0

-iオプションはインフォメーションドライバスクリプト、-vは仮想マシンドライバスクリプトの指定です。Linux環境では通常ハイパーバイザにKVMを使用するため、-i、-vオプションはどちらも"kvm"を指定します[10]⁠。

onehost listコマンドで登録されたホストの一覧を表示します。STATがonになっていれば正常に登録されています。

$ onehost list
  ID NAME            CLUSTER   RVM      ALLOCATED_CPU      ALLOCATED_MEM STAT
   0 host001         default     0       0 / 200 (0%)     0K / 7.7G (0%) on

STAT欄が「err」と表示された場合はトラブルシュートの時間です。フロントエンドの/var/log/one/oned.logに、ドライバスクリプト実行中にエラーとなったコマンドとその標準エラー出力メッセージが記録されているので、障害の原因の当たりが付けやすいと思います。

まとめ

今回はフロントエンドとホストのセットアップ、OpenNebula環境へのホストの登録までを辿りました。次回のRecipeではネットワークやイメージといったリソースをOpenNebula環境に登録し、仮想マシンインスタンスを起動してみる予定です。

おすすめ記事

記事・ニュース一覧