Ubuntu Weekly Recipe

第629回数分でオールインワンなプライベートクラウドを構築できるminiONE

本連載ではこれまでにも第483回UbuntuとOpenNebulaでもういちどクラウド環境を構築してみようなどで、クラウド構築・管理ツールであるOpenNebulaを紹介してきました。今回はこのOpenNebulaをコマンド一発で導入できる「miniONE」を紹介しましょう。

OpenNebulaとminiONE

OpenNebulaはプライベートクラウドを構築・管理するためのソフトウェアです。プライベートクラウドの構築・管理ツールといえばOpenStackが有名ですが、OpenNebulaはそれよりも古くから存在し、Eucalyptusと同じぐらいの歴史を持っています。さらに、もともとはKVMベースのツールだったものの、最近ではLXDやFirecrackerをサポートしたり、Kubernetes、Docker Hubとの連携もできるようになるなど、日進月歩なクラウドインフラストラクチャーのテクノロジーに追随しています。先日には広く使われるようになったことをうけて、よりサポートを充実させたエンタープライズ版をアナウンスするなど、今ではもう単なる「OpenStackの代替」だけでは表せない存在になりました。

OpenNebulaについては大田さんが本連載でも何度か取り上げています。第484回で紹介した5.4に比べると、現在のバージョンは5.12[1]まであがってはいるものの、インストール方法や使用感はそこまで大きく変わっていません。引き続きリストアップした記事のうち、5.0以降の話が参考になるはずです。

今回紹介するのはOpenNebulaのインストーラーであるminiONEです。miniONEを実行することで、システムシステム上にバックエンドからフロントエンドに至るまでOpenNebulaに必要なパッケージ・ソフトウェアをコマンド一発で「まるっと一式」インストールしてくれます。身も蓋もない言い方をすると、OpenStackで言うところのDevStackMicroStackKubernetesで言うところのMinikubeMickroK8sみたいなものです。

miniONEを使うと、ほんの数分でOpenNebula環境が整います。しかもインストーラーそのものは単一ファイルのシェルスクリプトとして構築されているため、⁠インストーラーのインストール」も不要です。さらにKVMだけでなく、LXDやFirecrackerにも対応しています。ただしその仕組み上、プロダクション用途や大規模で柔軟な構築には向きません。あくまで「とりあえずOpenNebulaが動くマシンが欲しい」場合にのみ役に立つツールだと考えておきましょう。

今回はこのminiONEを使って、OpenNebulaをインストールしてみます。

miniONEの実行

最初にminiONEをダウンロードした上で、そのシェルスクリプトを管理者権限で実行します。

$ wget 'https://github.com/OpenNebula/minione/releases/latest/download/minione'
$ sudo bash minione --marketapp-name='Ubuntu 20.04'

少し待てばインストールを実行するかの確認メッセージが表示されるので「yes」と答えてください。

Install  augeas-tools apt-transport-https iptables-persistent netfilter-persistent

Do you agree? [yes/no]:
yes

(中略)

### Report
OpenNebula 5.12 was installed
Sunstone [the webui] is running on:
  http://192.0.2.1/
Use following to login:
  user: oneadmin
  password: BozivjTFKf

あとはしばらく放置すると、インストールが完了し、ウェブインターフェース用のURLとアカウント情報が表示されます。ウェブブラウザーからログインすれば、ウェブインターフェース(Sunstone)経由でOpenNebulaを管理できるようになります。

図1 ブラウザでアクセスするとログイン画面になるので表示されているユーザーとパスワードでログインする
画像
図2 左の「Settings」から「Language」を選択するとUIを日本語にすることも可能
画像

これだけです。これだけで、今回の記事で伝えたかった「OpenNebulaは簡単にインストールできる」の説明が完了しました。それでは皆さん、良いOpenNebulaライフを。

……と終わるわけにもいかないので、もう少し詳しく説明しましょう。まずはminioneスクリプトについて簡単に紹介したあと、遭遇しやすいトラブルとその回避方法を紹介します。まずはminiONEの実行環境についてです。仮想マシンの管理システムである以上、OpenNebulaを動かすためにはそれなりのスペックが必要です。

  • KVMを動かすなら仮想化支援機構が動くCPU
  • 4GiB以上のメモリー
  • 20GiB以上のストレージ
  • インストールするための管理者権限

上記は最低限必要なスペックとなります。KVMではなくLXDを使うならもう少し余裕はあるものの、十分なストレージ容量が必要であること自体は変わりありません。

さらにminiONEには各種コマンドラインオプションによって、インストール時の挙動を変更できます。

$ bash minione --help
-h --help                           List of supported arguments
-v --verbose                        Be verbose
-f --force                          Skip non-fatal validation errors
--yes                               Don't ask

--version [5.12]                    OpenNebula version to install
--lxd                               Setup host to run LXD containers
--firecracker                       Setup host to run Firecracker micro-VMs
--frontend                          Install only frontend, skip node setup,
                                    no networking configuration
--node                              Install only node, edge(Packet) only

--password [random generated]       Initial password for oneadmin
--ssh-pubkey /.ssh/id_rsa.pub]    User ssh public key
--vm-password [opennebula]          Root password for virtual machine
--sunstone-port [80]                Setup sunstone port
--marketapp-name [CentOS 7]         Name of Marketplace appliance to import
--fc-marketapp-name [alpine]        Dockerhub image for Firecracker
--fc-kernel-name [Kernel 5.4 x86_64 - Firecracker] Market app kernel name for Firecracker

--bridge-interface [minionebr]      Bridge interface for private networking
--nat-interface [first net device]  Interface to configure for NAT
--vnet-address [172.16.100.0]       Virtual Network address
--vnet-netmask [255.255.255.0]      Virtual Network netmask
--vnet-gateway [172.16.100.1]       Virtual Network gateway (i.e. bridge IP)
--vnet-ar-ip-start [172.16.100.2]   Virtual Network AR start IP
--vnet-ar-ip-count [100]            Virtual Network AR size

--edge [packet]                     Edge provider
--edge-packet-token [<token>]       Packet token (required with '--edge packet')
--edge-packet-project [<project>]   Packet project (required with '--edge packet')
--edge-host-num [1]                 Number of edge hosts
--edge-packet-facility [ams1]       Packet facility
--edge-packet-plan [t1.small]       Packet plan
--edge-packet-os [ubuntu_18_04]     Packet OS
--edge-marketapp-name [Service WordPress - KVM]
                                    Market app name for Packet

--purge                             Only uninstall and exit
--preserve-user                     Dont't delete oneadmin user when purge

ヘルプメッセージに初期設定値も含めて記述してあるので、どのような設定かはおおよそイメージできるでしょう。

前述の例だと--marketapp-name='Ubuntu 20.04'を指定していました。これは何かと言うと、構築時にダウンロードするMarketPlaceの仮想マシンイメージです。OpenNebulaでは構築済みのイメージをMarketPlaceとして公開しています。OpenNebulaでインスタンスを構築する際は、多種多様なアプリ(構築済みイメージ)から必要なものを選択し、それをベースにすることが一般的です。miniONEでは、構築時に必ずアプリをひとつダウンロードすることになっているようです。

初期設定値はCentOS 7です。ただしこれは8GiB強と若干サイズが大きいため、先ほどのコマンドでは2GiB程度で済むUbuntu 20.04を選択しています。

インストール中は特に何もすることはありません。ただひたすらホストにパッケージをインストールしたり、ネットワーク設定をしたりする様を眺めているだけです。最初のほうで一度確認メッセージが表示されますが、これすらも--yesオプションを付けておけば、問い合わせが来ることすらなくなります。

インストール時の完全なログは次のとおりです。おおよそどんなことをしているかが把握できるでしょう。

$ sudo bash minione --marketapp-name='Ubuntu 20.04'

### Checks & detection
Checking augeas is installed  SKIP will try to install
Checking apt-transport-https is installed  SKIP will try to install
Checking AppArmor  SKIP will try to modify
Checking for present ssh key  SKIP
Checking (iptables|netfilter)-persistent are installed  SKIP will try to install

### Main deployment steps:
Install OpenNebula frontend version 5.12
Configure bridge minionebr with IP 172.16.100.1/24
Enable NAT over enp0s31f6
Modify AppArmor
Install OpenNebula KVM node
Export appliance and update VM template
Install  augeas-tools apt-transport-https iptables-persistent netfilter-persistent

Do you agree? [yes/no]:
yes

### Installation
Updating APT cache  OK
Install  augeas-tools apt-transport-https iptables-persistent netfilter-persistent  OK
Creating bridge interface minionebr  OK
Bring bridge interfaces up  OK
Enabling IPv4 forward  OK
Configuring NAT using iptables  OK
Saving iptables changes  OK
Installing DNSMasq  retry 1 OK
Starting DNSMasq  OK
Configuring repositories  OK
Updating APT cache  OK
Installing OpenNebula packages  OK
Installing OpenNebula kvm node packages  OK
Updating AppArmor  OK
Disable default libvirtd networking  OK
Restart libvirtd  OK

### Configuration
Switching OneGate endpoint in oned.conf  OK
Switching OneGate endpoint in onegate-server.conf  OK
Switching keep_empty_bridge on in OpenNebulaNetwork.conf  OK
Switching scheduler interval in oned.conf  OK
Setting initial password for current user and oneadmin  OK
Changing WebUI to listen on port 80  OK
Starting OpenNebula services  OK
Enabling OpenNebula services  OK
Add ssh key to oneadmin user  OK
Update ssh configs to allow VM addresses reusig  OK
Ensure own hostname is resolvable  OK
Checking OpenNebula is working  OK
Disabling ssh from virtual network  OK
Adding localhost ssh key to known_hosts  OK
Testing ssh connection to localhost  OK
Updating datastores template  OK
Creating KVM host  OK
Creating virtual network  OK
Exporting [Ubuntu 20.04] from Marketplace to local datastore  OK
Waiting until the image is ready  OK
Updating VM template  OK

### Report
OpenNebula 5.12 was installed
Sunstone [the webui] is running on:
  http://192.0.2.1/
Use following to login:
  user: oneadmin
  password: BozivjTFKf

oneadminアカウント

miniONEでインストールした場合、OpenNebulaの管理ユーザーとして「oneadminユーザー」が作成されます。CLIからOpenNebulaを操作するためのコマンド(だいたい「oneXXX」な名前)は、このユーザー経由で実行することになります。

たとえばダウンロード済みのイメージを表示するoneimage listは一般ユーザーで実行すると次のようにエラーになります。

$ oneimage list
ONE_AUTH file not present

それに対して、oneadminアカウント経由だと次のように表示されます。

$ sudo -i -u oneadmin oneimage list
  ID USER     GROUP    NAME            DATASTORE     SIZE TYPE PER STAT RVMS
   1 oneadmin oneadmin Ubuntu 18.04    default       2.2G OS    No rdy     0
   0 oneadmin oneadmin Ubuntu 20.04    default       2.2G OS    No used    1

また作成した仮想マシンインスタンスにログインする際のSSH鍵もoneadminアカウントに紐付けられています。インスタンス作成後、とりあえずログインしたい場合は次のように実行すると良いでしょう。

$ sudo -i -u oneadmin ssh root@インスタンスのIPアドレス

OpenNebulaをCLIから操作するのであれば、ターミナルマルチプレクサーなどのウィンドウでsudo -i -u openadmin bashなどと実行して、openadminアカウントのシェルインスタンスを作っておくと便利です。

ちなみにウェブインターフェース(Sunstone)からであれば、VNC経由のコンソールログインも可能です。そちらの場合、rootアカウントのパスワードはminioneコマンドの--vm-passwordで指定された値となります。

図3 ウェブ版VNCからログインした例
画像

もちろん、パスワードなどの設定はインスタンス作成時に調整可能です。

OpenNebulaのアンインストール

--purgeオプションで、インストールした環境をまっさらにできます。

$ sudo bash minione --purge
Really uninstall? [yes/no]:
yes

### Uninstalling
Stopping OpenNebula  SKIP
Uninstalling OpenNebula packages  OK
Stopping DNSMasq  OK
Unconfiguring repositories  OK
Unconfiguring NAT using iptables  OK
Deleting bridge interface minionebr  OK
Deleting /etc/one  OK
Deleting oneadmin user  SKIP
Deleting /var/lib/one  OK

おおよそは元通りにしてくれるのですが、すべてキレイになるというわけでもなさそうです。たとえばapt-keyで追加したOpenNebulaのリポジトリ鍵はそのまま残るため、必要に応じて手動で削除してください。具体的にはapt-key listコマンドで表示される「OpenNebula Repository」の鍵ID(pubとuidの間の行に現れる十六進文字列)sudo apt-key del "鍵ID"とします。表示される鍵IDは空白を含んでいるためダブルクオーテーションでくくる必要があります。

もしminiONEによるインストール途中で失敗した場合などは、そのまま再実行するとエラー終了するようになります。--forceオプションによる強制再実行も可能ではあるのですが、--purgeで一度クリーンにしておいたほうが安全でしょう。

トラブルシューティング

miniONEはシェルスクリプトとして作成されています。中身は比較的シンプルですので、何か問題があればとりあえずスクリプトを読むと良いでしょう。また、場合によっては自分で挙動を変更してしまう手もあります。

デバッグログを仕込む際に注意すべきなのは、miniONEは各処理を関数化した上で、check関数経由で実行しているという点です。

check() {
    (中略)
    STDERR_TMP_FILE=$(mktemp)
    STDOUT_TMP_FILE=$(mktemp)

    [[ ${VERBOSE} = 'yes' ]] && echo -ne "${TEXT}  "

    I=1
    while [[ $I -le $TRIES && $RC -gt 0 ]]; do
        eval "${COMMAND}" 2>"${STDERR_TMP_FILE}" >"${STDOUT_TMP_FILE}"
        RC=$?
        if [ $RC -gt 0 ]; then
            [[ "$ON_FAIL" = "" && $TRIES -gt 1 ]] &&  echo -ne "retry $I "
            sleep 1
        fi
        I=$((I + 1))
    done
    (後略)
}

この関数はコマンド(miniONE内の関数)の実行をリトライしながら、それにに伴う標準出力・標準エラー出力を一時ファイルに記録した上で、状況に応じて出力するかどうかを判断しています。結果としてスクリプト内部のコマンドやデバッグログはリアルタイムでは表示されませんし、スクリプトが途中で失敗すると状況を把握しづらくなります。

どうしても「うまく動かない」場合は、まずこのcheck関数の挙動を把握した上で、目的に合わせてよりデバッグしやすい形に変更すると良いでしょう[2]⁠。

また、ネットワーク環境によっては次のふたつのケースで常に失敗する可能性があります。

  • 「Image download reached timeout」と表示されてエラー終了する
  • 「Exporting [XXX] from Marketplace to local datastore」が表示されたあとに無言で終了する

前者は、MarketPlaceの仮想マシンイメージのダウンロードが5分(300秒)以上かかった場合に発生します。Ubuntuだと2GiB程度、CentOSだと8GiB程度になるためネットワークによってはここでタイムアウトエラーが発生します。インストール時にダウンロードしない選択肢はないようなので、より小さなイメージを選択するか、スクリプトの中の次の変数の値をより大きな数字に変更して回避してください。

IMAGE_WAIT_TIMEOUT=300

後者はMarketPlaceのメタデータの同期待ちで発生するようです。具体的には次のコードの部分です。

poll_for_marketplace() {
    APP_COUNT=$(onemarketapp list | wc -l)
    for I in $(seq 30); do
        sleep 5
        NEW_APP_COUNT=$(onemarketapp list | wc -l)

        if [[ "${NEW_APP_COUNT}" = "${APP_COUNT}" && "${APP_COUNT}" -gt 20 ]]; then
            return 0
        fi
        APP_COUNT=${NEW_APP_COUNT}
    done
    return 1
}

OpenNebulaのインストール直後はメタデータの同期ができていないのか、openmarketapp listで表示されるアプリの数が少なく表示されます。時間が経つごとに増えていって、最終的に400個ぐらいで安定します。スクリプトの中では、その同期待ちの時間の上限を30秒と決め打ちしていますが、環境に寄ってはもう少しかかることもあるようです。

「Exporting [XXX] from Marketplace to local datastore」が表示されたあとに無言で終了する場合は、ここのseq 30をもう少し長めに取ると良いでしょう。

LXDのGUIとしてOpenNebulaを使えるのか

miniONEにはLXD実行環境を用意するための--lxdオプションも用意されています。これはminiONEはLXDの公式サイトでも紹介されている手順です。ただ、試してみたところ、⁠そのまま」だとうまく動くようには作られていないようでした。

OpenNebulaのLXD対応は、第484回UbuntuとOpenNebulaでKVMとLXDのインスタンスを起ち上げてみようでも紹介されています。miniONEも、そこに説明された方法をほぼ踏襲してはいるものの、すべてが同じというわけではありません。そもそも、第484回でも言及しているように、OpenNebulaのLXD対応はrootfsイメージをダウンロードしてきてそれを使うというタイプのものなので、通常のLXDの挙動を期待するといろいろとはまります。

現時点ではあくまで「そういうものがある」ぐらいに受け取っておいたほうがいいでしょう[3]⁠。

おすすめ記事

記事・ニュース一覧