前回のRecipeではOpenNebula 5.4でフロントエンドとホストをセットアップし、ホストを登録するところまで辿りました。今回はネットワークやイメージファイルといったリソースをOpenNebula環境に登録し、実際にインスタンスを起ち上げてみましょう。
リソースの登録や変更、インスタンスの起動停止といった操作は、WebインタフェースのSunstoneまたはターミナルからのCLIで行えます。今回は主にCLIから操作することにします。Sunstoneからのリソース登録は第346回の記事で取り上げていますので、そちらを参考にしてください。
ネットワークリソースを定義
仮想マシンに割り当てるIPアドレスのプールやデフォルトゲートウェイなどの情報を定義します。アドレスレンジやIPプロトコルバージョン(IPv4、IPv6、IPv4 IPv6デュアルスタック等)、VLAN ID、接続するブリッジインタフェースなどを組み合わせて、ネットワークリソースとして登録します。
今回は、IPv4の192.168.1.160〜167の8アドレスをプールするネットワークリソースを、mynetworkという名称で登録してみましょう。まず適当なエディタで以下のような定義ファイルを作成します。
NAME |
ネットワークリソースの名称。この例ではmynetworkとします。 |
VM_MAD |
ネットワークドライバの種類。今回はdummyドライバを使用します。 |
BRIDGE |
ブリッジインタフェース名。ホストで作成したブリッジインタフェースの名称を記載します。 |
AR |
アドレスレンジを指定します。この例ではIPv4の192.168.1.160を起点に8個のアドレスをプールします。 |
DNS |
DNSサーバのアドレスを指定します。 |
GATEWAY |
このネットワークのデフォルトゲートウェイのアドレスを指定します。 |
詳細や他に使用できる属性についてはOpenNebula 5.4のリファレンスを参照してください。
作成した定義ファイルをonevnet createコマンドの引数に指定して登録します。
onevnet listコマンドでネットワークリソースを確認できます。
イメージとテンプレートの登録
仮想マシンのディスクイメージファイルと、構成情報をまとめるテンプレートを登録します。
OpenNebulaには仮想マシンイメージの共有や配布を行うMarketPlaceというサービスが用意されています。デフォルトでOpenNebula Systemsの運営するPublicなMarketPlaceが登録されており、フロントエンドを構築した直後からSunstoneやCLIからアクセスできます[1]。
MarketPlaceでは仮想マシンのイメージファイルとテンプレートをセットにしたApp(Appliance)が公開されています。今回はMarketPlaceからUbuntu 16.04のKVM用AppをダウンロードしてOpenNebulaに登録してみます。
onemarketapp listコマンドでMarketPlace上のAppが一覧表示できるので、Ubuntu関連をgrepします。
onemarketapp exportコマンドでMarketPlace上のAppをexportして、OpenNebula環境に登録します。ID: 2の「Ubuntu 16.04 - KVM」をubuntu1604kvmという名称でダウンロードして登録してみましょう。-dオプションは登録するデータストアを指定します。ここではdefaultデータストアを指定しています。
oneimage listコマンドでイメージファイルが登録されていることを確認します。
onetemplate listコマンドでテンプレートが登録されることを確認します。
テンプレートは仮想マシンを構成する各種リソースを束ねたものです。MarketPlaceからダウンロードしてきたテンプレートには基本的な情報が記載されていますが、ネットワークリソースのような個々の環境依存のリソースは利用者が追記する必要があります。
ubuntu1604kvmテンプレートに、ネットワークリソースとしてmynetworkを追加してみましょう。これにはonetemplate updateコマンドを使用します。
エディタが立ち上がるので、末尾に以下を追記して保存します。
仮想マシン用SSH公開鍵設定
MarketPlaceからダウンロードしてきたイメージファイルにはone-contextパッケージがインストールされています。このパッケージの提供する各種スクリプトにより、仮想マシン起動時にOpenNebulaから渡された構成情報に従ってネットワーク設定やディスクサイズ拡張などが行われます。
OpenNebulaアカウントにSSH_PUBLIC_KEY属性が定義されていれば、SSHでログインするための公開鍵も仮想マシンに渡せます。例として、OpenNebulaの管理者アカウントoneadminにSSH_PUBLIC_KEY属性を設定してみましょう。これにはoneuser updateコマンドを使用します。
エディタが立ち上がるので、末尾にSSH_PUBLIC_KEY属性とSSH公開鍵を追記して保存します。
KVM仮想マシンインスタンスの作成
これで仮想マシンを作成する準備が整いました。さっそくonetemplate instantiateコマンドでubuntu1604kvmテンプレートから仮想マシンをデプロイしてみましょう。
STAT欄が「runn」になっていれば成功です。仮想マシンに割り当てられたIPアドレスはonevm showコマンドで確認できます。
毎回onevm showでIPアドレスを確認するのは面倒ですので、onevm listコマンドの一覧表示にIPアドレスの項目を追加しておきましょう。/etc/one/cli/onevm.yamlをエディタで開き、":default:"の項目に"- :IP"を追加します。
sshでログインしてみましょう。SSH_PUBLIC_KEY属性に記載した公開鍵でログインできます。ログインアカウントはAppによって異なり、「Ubuntu 16.04 - KVM」の場合はrootでログインします。
ここまでくれば、ひとまずKVMでのクラウド環境ができあがったといえるでしょう。
OpenNebulaのAdd-on
前ページまでで基本的な環境構築が終わりましたので、ここからは少し趣向を変えてOpenNebulaのAdd-on機能について紹介します。
OpenNebulaはハイパーバイザやストレージ形式などの差異をドライバスクリプトで吸収しています。ドライバスクリプトはAdd-onとして追加が可能で、様々なAdd-onが非公式のコミュニティにより開発されています。これらのAdd-onはOpenNebulaの公式サイトのAdd-ons Catalogにまとまっています。
今回はLXD用Add-onのLXDoNeをOpenNebulaに追加して、OpenNebulaでLXDコンテナを管理してみましょう。
LXDoNe
LXDはコンテナ技術を利用したソフトウェアです。Ubuntu Weekly Recipeでは第459回、479回などで取り上げられています。
LXDoNeはOpenNebulaでLXDコンテナを操作するための仮想マシンドライバスクリプトとインフォメーションドライバスクリプトをまとめたAdd-onです。ライセンスはApache License 2.0です。主要な部分はPythonで書かれており、pylxdライブラリを利用してAPIからLXDを操作します[2]。
特殊な点として、LXDoNeはLXDネイティブなイメージファイルからではなくRAW形式のイメージファイルからコンテナを起動します。
今回インストールするLXDoNe 5.2-4.1のREADMEによると、Tested versionはUbuntu 16.04、OpenNebula 5.2系となっていますが、手元で確認したところOpenNebula 5.4でも動作するようです。
フロントエンドにLXDoNe Add-onを追加する
まずはフロントエンド側の作業です。OpenNebulaフロントエンドの標準的なセッティングは終わっているものとします。
ドライバスクリプトのインストール
GitHubからリリース版のLXDoNeをフロントエンド上にダウンロードします。今回は執筆時の最新版のバージョン5.2-4.1をダウンロードしました。
tar.gzファイルを適当なディレクトリで展開します。
展開されたドライバスクリプトを/var/lib/one/remotes以下にコピーし、オーナー、グループ、パーミッションを整えます。
ネットワークリソースで802.1Qドライバを使用する場合は以下のスクリプトも差し替えます。今回作成したネットワークリソースのmynetworkはdummyドライバを使用しているので、ここはスキップしても構いません。
Add-onの有効化
フロントエンドの/etc/one/oned.confを編集し、LXDoNeのインフォメーションドライバ設定と仮想マシンドライバ設定を追記します。
Information Driver Configurationセクション内の適当な場所に以下の内容でインフォメーションドライバ設定を追記します。
また、Virtualization Driver Configurationセクション内の適当な場所に以下の内容で仮想マシンドライバ設定を追記します。
OpenNebulaサービスを再起動します。
LXD用ホストをセットアップする
続いてホスト側の作業です。こちらもOpenNebulaのKVM用ホストの標準的なセッティングが終わっているものとします。
パッケージとPythonライブラリインストール
LXDoNeのドライバスクリプトが動作するために必要なパッケージをインストールします。
pipコマンドでPythonライブラリのisoparserをインストールします。
SunstoneのVNCコンソール接続用に、svnctermをインストールします。GitHubのLXDoNeのリポジトリにUbuntu 16.04向けにコンパイルしたsvnctermパッケージが公開されているので、これをダウンロードしてインストールします。
UNIXアカウントoneadminの権限設定
UNIXアカウントoneadminがパスワード入力なしでsudoできるように設定します。強力な権限を与えることになるので気をつけましょう。あわせて、oneadminをlxdグループに所属させます。
LXDセットアップ
ホスト上でlxd initコマンドを実行し、LXDの初期設定を行います。この例は以下の内容で初期化しています[3]。
LXDoNeではOpenNebulaの管理するネットワークリソースをLXDコンテナに割り当てます。eth0デバイスもデプロイ時にコンテナごとに設定するので、defaultプロファイルのeth0デバイス設定は削除しておきます。
これでホスト側の準備が整いました。
LXD用ホストのOpenNebulaへの登録
ここから再びフロントエンド上での作業に戻ります。
OpenNebulaではホスト単位でハイパーバイザを指定します。一つのホストに複数のハイパーバイザを指定することはできません。LXDoNeを利用する場合は、LXD専用のホストを新規に登録するか、登録済みのKVM用ホストのドライバスクリプトをLXD用に変更する必要があります。
新しくLXD用ホストを登録する
LXD用にホストを新規に登録する場合は、onehost createコマンドの-i、-vオプションに「lxd」を指定します。以下はLXD用ホストとしてhost002を登録する例です。
上記により、host002がOpenNebula環境に組み込まれ、LXDoNe Add-onを含む全ドライバスクリプトがフロントエンドからscpで配布されます。
既存のKVM用ホストをLXD用に登録する
既にKVM用のホストとして登録してあるハイパーバイザをLXD用に変更することも可能です。ここでは前回のRecipeで登録したhost001をLXD用に変更してみます。
まず、onehost disableコマンドでhost001を使用不可の状態(disable)に移行させます。
onehost syncコマンドを--forceオプション付きで実行し、フロントエンド上のLXDoNe Add-onを含む全ドライバスクリプトを再配布します。
host001のハイパーバイザ、インフォメーションドライバ、仮想マシンドライバをlxdに変更します。onehost updateコマンドにhost001を指定して実行するとエディタが立ち上がります。
以下の3属性をlxdに変更し、保存してエディタを終了します。
onehost enableコマンドでhost001を使用可能状態に戻します。onehost listコマンドでSTAT欄が「on」になればホストは使用可能な状態となっています。
LXDイメージとテンプレートの登録
LXD用のイメージファイルとテンプレートを登録します。前述の通り、LXDoNeはLXDネイティブなイメージファイルではなくRAW形式のイメージファイルを使用します。MarketPlaceでLXD用のUbuntu 16.04 Appが公開されているので、今回はこれを使用します。
ID: 16の「Ubuntu 16.04 - LXD」がLXD用のUbuntu 16.04 Appです。onemarketapp exportコマンドでubuntu1604lxdという名称で登録してみましょう。
onetemplate updateコマンドでテンプレートにネットワークリソースを追加しておきましょう。KVM用Appの時と同様にmynetworkを追加することにします。
エディタが立ち上がるので、以下を追記して保存します。
LXDコンテナインスタンスの作成
これでLXDコンテナをデプロイする準備が整いました。onetemplate instantiateコマンドでデプロイしてみましょう。
STAT欄が「runn」になれば成功です。こちらもSSH_PUBLIC_KEY属性に指定した公開鍵でログインできます。ログインアカウントはrootです。
MarketPlaceのLXDoNe用Appはディスク容量が1GBしかありません。デプロイ時のイメージサイズの拡張にも対応していないため、大きなディスク領域を必要とする用途には不向きです。LXDoNe用のRAWイメージファイルを自作する方法も公開されているので、こちらを参考に大容量イメージファイルの作成に挑戦してみるのもいいでしょう。
KVM用ホストとLXD用ホストを共存させる
OpenNebulaはイメージファイルの形式とホストのドライバスクリプトの組み合わせを判断しません。このため、KVM用ホストとLXD用ホストが混在する環境では、例えばKVM用のイメージファイルがLXD用ホストにデプロイされてインスタンスの起動に失敗する、という状況が起こり得ます。これを防ぐには管理者が何らかの方法でデプロイ時のルールを決める必要があります。
大規模なクラウド環境では、データストアやネットワークリソースとホストを束ねるClusterを利用するのが便利です。ただ、今回はホストが数台程度の環境なので、OpenNebula 5.4の新機能の一つであるVM Groupsを使用してKVM用ホストとLXD用ホストを共存してみます。
VM Groups定義ファイルの作成
例として、host001(ID: 0)とhost003(ID: 2)がLXD用ホスト、host002(ID: 1)がKVM用ホスト、という環境を考えます。以下のようなVM Groups定義ファイルを作成します。
冒頭のNAME属性はこのVM Groupsルールの名称です。ここではHypervisorGroupとしています。
その下のROLEは仮想マシンの配置の制約とルールを定義します。ここではLXDロールとKVMロールを定義しています。LXDロールはID: 0、2のホストが割り当てられ(HOST_AFFINED)、逆にKVMロールにはID: 0、2以外のホストが割り当てられます(HOST_ANTI_AFFINED)。
onevmgroup createコマンドに定義ファイルを指定して実行し、VM GroupsルールをOpenNebulaに登録します。
HypervisorGroupルールがID: 3として登録されました。
続いて、どのテンプレート(から作成される仮想マシンインスタンス)がどのロールに所属するかを定義します。onetemplate updateコマンドで、所属させるVM Groupsルールとロールをテンプレートに記述します。テンプレートubuntu1604kvmをKVMロールに、テンプレートubuntu1604lxdをLXDロールに所属させるには、以下のように追記します。
各テンプレートからインスタンスを作成してみましょう。
KVM用ホストのhost002にはまだ仮想マシンを受け入れるだけのリソースの余裕がありますが、LXDインスタンスには割り当てられず、LXDインスタンスubuntu1604lxd-38はLXD用ホストのリソースが空くのを待ってペンディングとなっています。
まとめ
二回にわたってOpenNebula 5.4の環境構築を紹介しました。OpenNebulaはシンプルかつフレキシブルで信頼性の高いクラウド管理・構築ツールです。バージョンアップのたびに管理者や利用者の「こういうのがあればいいなぁ」という機能が追加されており、順調に使いやすくなっていると思います。構築も比較的簡単なので、夏休みの自由研究も兼ねて、ご家庭にUbuntuとOpenNebulaによるクラウド環境を構築してみるのはいかがでしょうか。