Ubuntu Weekly Recipe

第484回UbuntuとOpenNebulaでKVMとLXDのインスタンスを起ち上げてみよう

前回の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"
VN_MAD  = "dummy"
BRIDGE  = "br0"
AR=[
    TYPE = "IP4",
    IP   = "192.168.1.160",
    SIZE = "8" ]
DNS     = "192.168.1.14"
GATEWAY = "192.168.1.254"
属性名
NAME ネットワークリソースの名称。この例ではmynetworkとします。
VM_MAD ネットワークドライバの種類。今回はdummyドライバを使用します。
BRIDGE ブリッジインタフェース名。ホストで作成したブリッジインタフェースの名称を記載します。
AR アドレスレンジを指定します。この例ではIPv4の192.168.1.160を起点に8個のアドレスをプールします。
DNS DNSサーバのアドレスを指定します。
GATEWAY このネットワークのデフォルトゲートウェイのアドレスを指定します。

詳細や他に使用できる属性についてはOpenNebula 5.4のリファレンスを参照してください。

作成した定義ファイルをonevnet createコマンドの引数に指定して登録します。

$ onevnet create mynetwork.txt
ID: 0

onevnet listコマンドでネットワークリソースを確認できます。

oneadmin@mogami:~$ onevnet list
  ID USER            GROUP        NAME                CLUSTERS   BRIDGE   LEASES
   0 oneadmin        oneadmin     mynetwork           0          br0           0

イメージとテンプレートの登録

仮想マシンのディスクイメージファイルと、構成情報をまとめるテンプレートを登録します。

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 list | egrep -i 'ubuntu|^..ID'
  ID NAME                         VERSION  SIZE STAT TYPE  REGTIME MARKET               ZONE
   2 Ubuntu 16.04 - KVM             5.4.0  2.2G  rdy  img 06/14/16 OpenNebula Public       0
   5 Ubuntu 17.04 - KVM             5.4.0  2.2G  rdy  img 06/14/16 OpenNebula Public       0
  10 Ubuntu for Docker Machine    0.6.0-2   10G  rdy  img 02/23/16 OpenNebula Public       0
  11 Ubuntu 14.04 - KVM             5.4.0  2.2G  rdy  img 08/11/14 OpenNebula Public       0
  16 Ubuntu 16.04 - LXD                 2 1024M  rdy  img 07/25/17 OpenNebula Public       0

onemarketapp exportコマンドでMarketPlace上のAppをexportして、OpenNebula環境に登録します。ID: 2の「Ubuntu 16.04 - KVM」をubuntu1604kvmという名称でダウンロードして登録してみましょう。-dオプションは登録するデータストアを指定します。ここではdefaultデータストアを指定しています。

$ onemarketapp export 2 ubuntu1604kvm -d default
IMAGE
    ID: 0
VMTEMPLATE
    ID: 0

oneimage listコマンドでイメージファイルが登録されていることを確認します。

$ oneimage list
  ID USER       GROUP      NAME            DATASTORE     SIZE TYPE PER STAT RVMS
   0 oneadmin   oneadmin   ubuntu1604kvm   default       2.2G OS    No rdy     0

onetemplate listコマンドでテンプレートが登録されることを確認します。

$ onetemplate list
  ID USER            GROUP           NAME                                REGTIME
   0 oneadmin        oneadmin        ubuntu1604kvm                08/04 23:41:46

テンプレートは仮想マシンを構成する各種リソースを束ねたものです。MarketPlaceからダウンロードしてきたテンプレートには基本的な情報が記載されていますが、ネットワークリソースのような個々の環境依存のリソースは利用者が追記する必要があります。

ubuntu1604kvmテンプレートに、ネットワークリソースとしてmynetworkを追加してみましょう。これにはonetemplate updateコマンドを使用します。

$ onetemplate update ubuntu1604kvm

エディタが立ち上がるので、末尾に以下を追記して保存します。

NIC = [ NETWORK = "mynetwork", NETWORK_UNAME="oneadmin", MODEL="virtio" ]

仮想マシン用SSH公開鍵設定

MarketPlaceからダウンロードしてきたイメージファイルにはone-contextパッケージがインストールされています。このパッケージの提供する各種スクリプトにより、仮想マシン起動時にOpenNebulaから渡された構成情報に従ってネットワーク設定やディスクサイズ拡張などが行われます。

OpenNebulaアカウントにSSH_PUBLIC_KEY属性が定義されていれば、SSHでログインするための公開鍵も仮想マシンに渡せます。例として、OpenNebulaの管理者アカウントoneadminにSSH_PUBLIC_KEY属性を設定してみましょう。これにはoneuser updateコマンドを使用します。

$ oneuser update oneadmin

エディタが立ち上がるので、末尾にSSH_PUBLIC_KEY属性とSSH公開鍵を追記して保存します。

SSH_PUBLIC_KEY = "ssh-rsa AAAAB3NzaC(略)"

KVM仮想マシンインスタンスの作成

これで仮想マシンを作成する準備が整いました。さっそくonetemplate instantiateコマンドでubuntu1604kvmテンプレートから仮想マシンをデプロイしてみましょう。

$ onetemplate instantiate ubuntu1604kvm
VM ID: 0
$ onevm list
    ID USER     GROUP    NAME            STAT UCPU    UMEM HOST             TIME
     0 oneadmin oneadmin ubuntu1604kvm-0 runn  0.0    768M host001      0d 00h03

STAT欄が「runn」になっていれば成功です。仮想マシンに割り当てられたIPアドレスはonevm showコマンドで確認できます。

$ onevm show 0
(略)
VM NICS                                                                         
 ID NETWORK              BRIDGE       IP              MAC               PCI_ID  
  0 mynetwork            br0          192.168.1.160   02:00:c0:a8:01:a0
(略)

毎回onevm showでIPアドレスを確認するのは面倒ですので、onevm listコマンドの一覧表示にIPアドレスの項目を追加しておきましょう。/etc/one/cli/onevm.yamlをエディタで開き、":default:"の項目に"- :IP"を追加します。

:default:
- :ID
- :USER
- :GROUP
- :NAME
- :STAT
- :UCPU
- :UMEM
- :IP    (←追加)
- :HOST
- :TIME
$ onevm list
    ID USER     GROUP    NAME            STAT UCPU    UMEM IP              HOST             TIME
     0 oneadmin oneadmin ubuntu1604kvm-0 runn  0.0    768M 192.168.1.160   host001      0d 00h12

sshでログインしてみましょう。SSH_PUBLIC_KEY属性に記載した公開鍵でログインできます。ログインアカウントはAppによって異なり、⁠Ubuntu 16.04 - KVM」の場合はrootでログインします。

図1 KVM仮想マシンインスタンスにログイン
画像

ここまでくれば、ひとまず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をダウンロードしました。

$ wget https://github.com/OpenNebula/addon-lxdone/archive/v5.2-4.1.tar.gz

tar.gzファイルを適当なディレクトリで展開します。

$ tar xvzpf v5.2-4.1.tar.gz

展開されたドライバスクリプトを/var/lib/one/remotes以下にコピーし、オーナー、グループ、パーミッションを整えます。

$ cd addon-lxdone-5.2-4.1
$ sudo cp -rp src/remotes /var/lib/one
$ sudo chown -R oneadmin:oneadmin /var/lib/one/remotes/

$ cd /var/lib/one/remotes/
$ sudo chmod 755 -R vmm/lxd im/lxd*
$ sudo chmod 644 im/lxd.d/collectd-client.rb

ネットワークリソースで802.1Qドライバを使用する場合は以下のスクリプトも差し替えます。今回作成したネットワークリソースのmynetworkはdummyドライバを使用しているので、ここはスキップしても構いません。

$ sudo cp -p src/one_wait/nic.rb /var/lib/one/remotes/vnm/nic.rb
$ chown oneadmin:oneadmin /var/lib/one/remotes/vnm/nic.rb
$ chmod 755 /var/lib/one/remotes/vnm/nic.rb

Add-onの有効化

フロントエンドの/etc/one/oned.confを編集し、LXDoNeのインフォメーションドライバ設定と仮想マシンドライバ設定を追記します。

$ sudo vi /etc/one/oned.conf

Information Driver Configurationセクション内の適当な場所に以下の内容でインフォメーションドライバ設定を追記します。

#-------------------------------------------------------------------------------
# lxd Information Driver Manager Configuration
# -r number of retries when monitoring a host
# -t number of threads, i.e. number of hosts monitored at the same time
#-------------------------------------------------------------------------------
IM_MAD = [ NAME = "lxd",
      EXECUTABLE = "one_im_ssh",
      ARGUMENTS = "-r 3 -t 15 lxd" ]
#-------------------------------------------------------------------------------

また、Virtualization Driver Configurationセクション内の適当な場所に以下の内容で仮想マシンドライバ設定を追記します。

#-------------------------------------------------------------------------------
# lxd Virtualization Driver Manager Configuration
# -r number of retries when monitoring a host
# -t number of threads, i.e. number of actions performed at the same time
#-------------------------------------------------------------------------------
VM_MAD = [ NAME = "lxd",
    EXECUTABLE = "one_vmm_exec",
    ARGUMENTS = "-t 15 -r 0 lxd",
    KEEP_SNAPSHOTS = "yes",
    TYPE = "xml",
    IMPORTED_VMS_ACTIONS = "migrate, live-migrate, terminate, terminate-hard,
        undeploy, undeploy-hard, hold, release, stop, suspend, resume, delete,
        delete-recreate, reboot, reboot-hard, resched, unresched, poweroff,
        poweroff-hard, disk-attach, disk-detach, nic-attach, nic-detach,
        snap-create, snap-delete"
]
#-------------------------------------------------------------------------------

OpenNebulaサービスを再起動します。

$ sudo systemctl restart opennebula.service

LXD用ホストをセットアップする

続いてホスト側の作業です。こちらもOpenNebulaのKVM用ホストの標準的なセッティングが終わっているものとします。

パッケージとPythonライブラリインストール

LXDoNeのドライバスクリプトが動作するために必要なパッケージをインストールします。

$ sudo apt install lxd lxd-tools python-pylxd/xenial-updates criu bridge-utils python-ws4py python-pip

pipコマンドでPythonライブラリのisoparserをインストールします。

$ sudo pip install isoparser

SunstoneのVNCコンソール接続用に、svnctermをインストールします。GitHubのLXDoNeのリポジトリにUbuntu 16.04向けにコンパイルしたsvnctermパッケージが公開されているので、これをダウンロードしてインストールします。

$ wget https://github.com/OpenNebula/addon-lxdone/releases/download/v5.2-4.1/svncterm_1.2-1ubuntu_amd64.deb
$ sudo apt install ./svncterm_1.2-1ubuntu_amd64.deb

UNIXアカウントoneadminの権限設定

UNIXアカウントoneadminがパスワード入力なしでsudoできるように設定します。強力な権限を与えることになるので気をつけましょう。あわせて、oneadminをlxdグループに所属させます。

$ sudo bash -c 'echo "oneadmin ALL= NOPASSWD: ALL" >> /etc/sudoers.d/lxdone'
$ sudo usermod -a -G lxd oneadmin

LXDセットアップ

ホスト上でlxd initコマンドを実行し、LXDの初期設定を行います。この例は以下の内容で初期化しています[3]⁠。

$ sudo lxd init --auto \
--storage-backend dir \
--network-address 0.0.0.0 \
--network-port 8443 \
--trust-password password

LXDoNeではOpenNebulaの管理するネットワークリソースをLXDコンテナに割り当てます。eth0デバイスもデプロイ時にコンテナごとに設定するので、defaultプロファイルのeth0デバイス設定は削除しておきます。

$ lxc profile device remove default eth0

これでホスト側の準備が整いました。

LXD用ホストのOpenNebulaへの登録

ここから再びフロントエンド上での作業に戻ります。

OpenNebulaではホスト単位でハイパーバイザを指定します。一つのホストに複数のハイパーバイザを指定することはできません。LXDoNeを利用する場合は、LXD専用のホストを新規に登録するか、登録済みのKVM用ホストのドライバスクリプトをLXD用に変更する必要があります。

新しくLXD用ホストを登録する

LXD用にホストを新規に登録する場合は、onehost createコマンドの-i、-vオプションに「lxd」を指定します。以下はLXD用ホストとしてhost002を登録する例です。

$ onehost create host002 -i lxd -v lxd

上記により、host002がOpenNebula環境に組み込まれ、LXDoNe Add-onを含む全ドライバスクリプトがフロントエンドからscpで配布されます。

既存のKVM用ホストをLXD用に登録する

既にKVM用のホストとして登録してあるハイパーバイザをLXD用に変更することも可能です。ここでは前回のRecipeで登録したhost001をLXD用に変更してみます。

まず、onehost disableコマンドでhost001を使用不可の状態(disable)に移行させます。

$ onehost disable host001

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

onehost syncコマンドを--forceオプション付きで実行し、フロントエンド上のLXDoNe Add-onを含む全ドライバスクリプトを再配布します。

$ onehost sync host001 --force
* Adding host001 to upgrade
[========================================] 1/1 host001
All hosts updated successfully.

host001のハイパーバイザ、インフォメーションドライバ、仮想マシンドライバをlxdに変更します。onehost updateコマンドにhost001を指定して実行するとエディタが立ち上がります。

$ onehost update host001

以下の3属性をlxdに変更し、保存してエディタを終了します。

(変更前)
HYPERVISOR="kvm"
IM_MAD="kvm"
VM_MAD="kvm"
(変更後)
HYPERVISOR="lxd"
IM_MAD="lxd"
VM_MAD="lxd"

onehost enableコマンドでhost001を使用可能状態に戻します。onehost listコマンドでSTAT欄が「on」になればホストは使用可能な状態となっています。

$ onehost enable host001

LXDイメージとテンプレートの登録

LXD用のイメージファイルとテンプレートを登録します。前述の通り、LXDoNeはLXDネイティブなイメージファイルではなくRAW形式のイメージファイルを使用します。MarketPlaceでLXD用のUbuntu 16.04 Appが公開されているので、今回はこれを使用します。

$ onemarketapp list | egrep -i 'ubuntu|^..ID'
  ID NAME                         VERSION  SIZE STAT TYPE  REGTIME MARKET               ZONE
   2 Ubuntu 16.04 - KVM             5.4.0  2.2G  rdy  img 06/14/16 OpenNebula Public       0
   5 Ubuntu 17.04 - KVM             5.4.0  2.2G  rdy  img 06/14/16 OpenNebula Public       0
  10 Ubuntu for Docker Machine    0.6.0-2   10G  rdy  img 02/23/16 OpenNebula Public       0
  11 Ubuntu 14.04 - KVM             5.4.0  2.2G  rdy  img 08/11/14 OpenNebula Public       0
  16 Ubuntu 16.04 - LXD                 2 1024M  rdy  img 07/25/17 OpenNebula Public       0

ID: 16の「Ubuntu 16.04 - LXD」がLXD用のUbuntu 16.04 Appです。onemarketapp exportコマンドでubuntu1604lxdという名称で登録してみましょう。

$ onemarketapp export 16 ubuntu1604lxd -d default
IMAGE
    ID: 1
VMTEMPLATE
    ID: 1

onetemplate updateコマンドでテンプレートにネットワークリソースを追加しておきましょう。KVM用Appの時と同様にmynetworkを追加することにします。

$ onetemplate update ubuntu1604lxd

エディタが立ち上がるので、以下を追記して保存します。

NIC = [ NETWORK = "mynetwork", NETWORK_UNAME = "oneadmin" ]

LXDコンテナインスタンスの作成

これでLXDコンテナをデプロイする準備が整いました。onetemplate instantiateコマンドでデプロイしてみましょう。

$ onetemplate instantiate ubuntu1604lxd                                                                          
VM ID: 26

$ onevm list
    ID USER     GROUP    NAME             STAT UCPU    UMEM IP              HOST             TIME
    26 oneadmin oneadmin ubuntu1604lxd-26 runn    0      0K 192.168.1.160   host001      0d 00h01

STAT欄が「runn」になれば成功です。こちらもSSH_PUBLIC_KEY属性に指定した公開鍵でログインできます。ログインアカウントはrootです。

図2 LXDコンテナインスタンスにログイン
画像

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 = "HypervisorGroup"
ROLE = [
  NAME = "LXD",
  HOST_AFFINED = "0, 2" ]
ROLE = [
  NAME = "KVM",
  HOST_ANTI_AFFINED = "0, 2" ]

冒頭の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に登録します。

$ onevmgroup create hypervisorgroup.txt                                                                   
ID: 3

$ onevmgroup list
  ID USER     GROUP    NAME            VMS  ROLES                               
   0 oneadmin oneadmin Yama            0    AoHina, KokoHono
   3 oneadmin oneadmin HypervisorGroup 0    LXD, KVM

HypervisorGroupルールがID: 3として登録されました。

続いて、どのテンプレート(から作成される仮想マシンインスタンス)がどのロールに所属するかを定義します。onetemplate updateコマンドで、所属させるVM Groupsルールとロールをテンプレートに記述します。テンプレートubuntu1604kvmをKVMロールに、テンプレートubuntu1604lxdをLXDロールに所属させるには、以下のように追記します。

$ onetemplate update ubuntu1604kvm
(以下を追記)
VMGROUP=[
  VMGROUP_NAME="HypervisorGroup",
  ROLE="KVM" ]
$ onetemplate update ubuntu1604lxd
(以下を追記)
VMGROUP=[
  VMGROUP_NAME="HypervisorGroup",
  ROLE="LXD" ]

各テンプレートからインスタンスを作成してみましょう。

図3 KVMインスタンスとLXDインスタンスのデプロイ
画像
図4 Sunstone上の表示
画像

KVM用ホストのhost002にはまだ仮想マシンを受け入れるだけのリソースの余裕がありますが、LXDインスタンスには割り当てられず、LXDインスタンスubuntu1604lxd-38はLXD用ホストのリソースが空くのを待ってペンディングとなっています。

まとめ

二回にわたってOpenNebula 5.4の環境構築を紹介しました。OpenNebulaはシンプルかつフレキシブルで信頼性の高いクラウド管理・構築ツールです。バージョンアップのたびに管理者や利用者の「こういうのがあればいいなぁ」という機能が追加されており、順調に使いやすくなっていると思います。構築も比較的簡単なので、夏休みの自由研究も兼ねて、ご家庭にUbuntuとOpenNebulaによるクラウド環境を構築してみるのはいかがでしょうか。

おすすめ記事

記事・ニュース一覧