Ubuntu Weekly Recipe

第341回OpenStack環境を30分で構築する

今回はOpenStack installerを使って、そこそこのスペックだけれどもNICが1枚しかないPCに、OpenStack環境をコマンド1つ、たった30分で構築する方法をご紹介します。

OpenStackをインストールするということ

OpenStackと言えば、現在のクラウドコンピューティング世界を支えるクラウドプラットフォーム構築ソフトウェアの1つで、フリーソフトウェアというだけでなく、豊富な機能と活発な開発コミュニティによって幅広く利用されています。

そんな「クラウド」を語るうえで欠かせない存在になりつつあるOpenStackですが、そのインストールは難解です。Ubuntuは比較的初期の段階からインストールしやすいほうではありましたが、それでもJujuだのJuju Deployerだの続々とインストールアシストツールが出る程には難しい状態でした。

ただソフトウェアのインストールと設定が複雑というだけでなく、その性質上複数台のコンピューターが必要だったり、NICを複数用意しなくてはいけなかったりと、一般的なPCで「ちょっと試してみよう」というにはハードルが高かったのです。

そんな中、新しいインストールアシストツールとしてUbuntu OpenStack installerが公開されました。これを使えば、それなりのスペックを持った1台のPC(NICは1枚)に、OpenStackのNova、Glance、Neutron、Keystone、Horizonをコマンド1つで構築できます[1]⁠。それなりのスペックとは、次のような構成になります[2]⁠。

  • 仮想化支援機能がついた8コアのCPU
  • 12GバイトのRAM
  • 20Gバイト程度のHDD

NICは1枚でかまいません。いくつかのサービスをKVM上で動かすために、ハードウェアの仮想化支援機能は必須です。上記より多少劣るスペックのPCでも動くことは動きますが、いろいろと動作が重くなります。

設定の柔軟性もほとんどありませんので、次のような方向けのツールです。

  • なんでもいいからとりあえず動くOpenStack環境が欲しい
  • 一般的なご家庭なのでPCなんてメインの1台しかない
  • ハイスペックな1台をイベント会場に持ち込んでデモしたい

マシンを用意する

実際にUbuntu OpenStack installerを使って、インストールしてみましょう。と言っても、そんなにハイスペックなPCがそこら辺に転がっているはずもありません[3]⁠。デモ向けやお試しと言う用途を考えると、ハイスペックマシンを新規購入するよりはクラウドリソースを使った方が安上がりです。

OpenStack installerはKVMを利用します[4]⁠。このためクラウドリソース上でKVMを使えることが必須要件となります。残念ながらAmazon EC2やさくらのクラウド、Windows AzureはKVM on XenやNested KVMなどを許容していないようです。それに対してVPSである、CloudCore VPSやConoHaはNested KVMに対応しています。EC2などに比べると月額料金になってしまうため高くなりがちですが、それでも一時的な目的のために物理マシンを買うよりはお得です。

今回はConoHaの「4GB/4コア/400GB」プランを契約し、Ubuntu 14.04 LTSをインストールして確認しています。ちなみに、このプランではOpenStackがなんとか動いていると言った具合です。メモリはスワップを3Gバイトほど使っていますし、OpenStackのDashboardも表示までにそれなりに時間がかかっています。お財布に余裕があるならもう少し上のプランにしても良いでしょう[5]⁠。

インストールしてみる

OSとしてあらかじめUbuntu 14.04 LTSをインストールし、最新状態にアップデートしておいてください。

まずはOpenStack installerのPPAを追加し、パッケージをインストールします。ちなみにPPAにはDevelとStableとExperimentalがありますが、Stableは若干機能が古く、Experimentalはたまに使われる程度ですので、今回はDevelを使います。このDevelはリポジトリのコードをデイリービルドしていますので、試すタイミングによってはこの記事と状況が変わっている可能性があることに注意してください。

$ sudo apt-add-repository ppa:cloud-installer/ppa
$ sudo apt update
$ sudo apt install cloud-installer

次にcloud-installコマンドでOpenStackのインストールを開始します。ただしその前に、cloud-installコマンドを編集してタイムアウト時間を変更しておきましょう。このコマンドはLXCを使ってOpenStack用のインスタンスを作成するのですが、ネットワーク環境によってはこの処理に時間がかかり過ぎてしまい、コマンドがタイムアウトになってしまうことが多いためです[6]⁠。タイムアウト時間の初期値は50秒なので、これを大きくしておきます。ちなみに大きくしたところで、他の処理に時間がかかるなど悪影響が出るわけではありませんので、好きなだけ大きくしておくと良いでしょう。

$ sudo editor /usr/share/cloud-installer/cloud-install

(ファイルの最後のほうにあるmax_triesの数を50から任意の値に増やす)

    wait_for_running()
    max_tries = 500
    while not cloud_init_finished() and max_tries != 0:
        print("* Waiting for container to finalize, please wait ...")
        max_tries = max_tries - 1
        time.sleep(1)

あとはcloud-installコマンドを実行するだけです。

$ sudo cloud-install

そのまま数分待つと、インストールタイプ選択画面が出ます。今回は「Single system」を選択します。⁠Multi-system」「Landscape」はMAASを使った構築方法で、NICなど設定項目が増えます。

「Single system」の場合はあとは「OpenStack admin user password」でOpenStackの管理者のパスワードを設定するだけです。推奨環境を満たしていない場合は警告が表示されますが、気にせずOKを押しましょう。30分から1時間ほど待てば、すべてのインストールが完了します。

環境のアンインストール

OpenStack installerはまずその環境にLXCでOpenStack用のコンテナー(コンテナー名:uoi-bootstrap)を作成します。以降はuoi-bootstrapコンテナーの中で、再度OpenStack installerやJujuの最新版をインストールして、そこでインストールステップを開始するのです。このため、uoi-bootstrapさえ破棄すれば、cloud-installで実行した作業を巻き戻せます。具体的にはcloud-installコマンドに-uオプションを渡して実行すれば、アンインストールになります。

$ sudo cloud-install -u

もし、cloud-installコマンドに失敗した場合は、一度-uオプションで環境を戻してからやり直すと良いでしょう。

状態表示とマシンの管理を行うcloud-statusコマンド

OpenStackのインストールジョブ投入が一通り終わると、OpenStack installerはcloud-statusコマンドを実行し、ジョブの完了を待ちます。

図1 すべてのサービスが立ち上がったあとのcloud-statusの画面
図1 すべてのサービスが立ち上がったあとのcloud-statusの画面

もし数十分待ってもcloud-statusが上記のような画面にならない場合は、一度Ctrl+Cなどで強制終了させたあとに、uoi-bootstrapコンテナーの中で、cloud-statusを実行してみてください。

$ sudo lxc-attach -n uoi-bootstrap -- cloud-status

インストールしたあとは

cloud-statusの画面を見るとわかるとおり、cloud-installコマンドだけで、一通りのサービスがインストールされ、起動しています。試しにOpenStackそのものを操作する場合、このうちDashboardにアクセスしてブラウザーから操作する方法が一般的でしょう。この場合、cloud-statusに表示されているURIにアクセスすれば良いだけです。ちなみにJuju GUIも使えるようになっています。Juju GUIについての詳しいことは第307回を参照してください。

図2 OpenStack DashboardのURIとJuju GUIのURI
図2 OpenStack DashboardのURIとJuju GUIのURI

さらに計算ノードを追加する場合も、このcloud-statusから行えます。シングルインストールの場合はそのマシン上に仮想マシンが追加されるだけなのであまり恩恵はありませんが、マルチインストールを構築した場合は、試してみると良いでしょう。

インストールマシンの外からDashboardにアクセスする

OpenStack installerの場合、LXCで作成したuoi-bootstrapコンテナーの中で各種サービスを立ち上げている都合上、OpenStack installerを実行した「マシンの外」からアクセスしたい場合は一手間必要です。特にWebサーバーとしてOpenStack Dashboardだけでなく、Juju GUIも立ち上がっているため、単純に80番ポートを転送すれば良いというわけではないことに注意してください。

iptablesでポート転送する、リバースプロキシを利用するなどいくつかの方法が考えられます。ここではnginxを使ったリバースプロキシの設定方法を紹介しておきましょう。

インストールしたマシン上で、nginxをインストールします(uoi-bootstrapコンテナーの中ではありません⁠⁠。

$ sudo apt install nginx

Juju GUIも使いたい場合はSSLを有効にする必要があります。よってサーバーの証明書や秘密鍵も用意しておいてください。テスト目的ならとりあえず次のように作っておけば良いでしょう。

$ openssl req -new -days 365 -x509 -nodes -keyout cert.key -out cert.crt
$ sudo install -m 400 cert.key /etc/nginx/
$ sudo install -m 644 cert.crt /etc/nginx/

nginxのドキュメントを参考にリバースプロキシの設定を行います。Juju GUIを使う場合は、WebSocketをSSL経由で使えるようにしておく必要もあります。今回は「/etc/nginx/sites-available/cloudinstaller」を新規作成してそこに次のような設定を書いておきましょう。

server {
    listen 80;

    location / {
        proxy_pass http://10.0.4.169;
        proxy_set_header Host $http_host;
    }
}

server {
    listen 8080;

    location / {
        proxy_pass http://10.0.4.170;
        proxy_set_header Host $http_host;
    }
}

server {
       listen 443 ssl;

       ssl on;
       ssl_certificate /etc/nginx/cert.crt;
       ssl_certificate_key /etc/nginx/cert.key;

       location / {
             proxy_pass https://10.0.4.169;
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
       }
}

設定を変更したら、有効化して再読み込みします。またdefault設定ファイルは削除しておきましょう。

$ sudo rm /etc/nginx/sites-enabled/default
$ sudo ln -s /etc/nginx/sites-available/cloudinstaller /etc/nginx/sites-enabled/
$ sudo service nginx configtest
$ sudo service nginx reload

OpenStack Dashboardには8080番ポートでアクセスするようにしています。Juju GUIを使わない場合は、80番ポートと443番ポートの設定は不要です。proxy_passのIPアドレスはそれぞれcloud-statusで表示されるDashboardとJuju GUIのIPアドレスに変更してください。

あとは外から、⁠http://(cloud-installしたマシンのIPアドレス):8080/horizon」にアクセスすればOpenStack Dashboardにアクセスできますし、⁠https://(cloud-installしたマシンのIPアドレス⁠⁠」にアクセスすればJuju GUIになります。なおOpenStack Dashboardのアカウント名は「ubuntu⁠⁠、パスワードはcloud-installで設定したパスワードです。

ちなみに、UbuntuのクラウドイメージをGlanceに同期させる「Simplestreams Image Sync」サービスも、HTTPを経由しています。設定の仕方によってはこのサービスが同期できなくなりますので、注意してください。

図3 OpenStack Dashboardのログイン画面
図3 OpenStack Dashboardのログイン画面
図4 OpenStack Dashboardにログインした状態
図4 OpenStack Dashboardにログインした状態
図5 ネットワークトポロジー
図5 ネットワークトポロジー
図6 Juju GUIの画面
図6 Juju GUIの画面

インスタンスを起動する

試しにDashboardからインスタンスを起動してみましょう。コンピュートのインスタンスから「インスタンスの起動」をクリックします。

最低でも詳細タブとネットワークタブの設定を行ってください。あとは「起動」ボタンを押せば、インスタンスが起動します。

図7 インスタンスの設定
図7 インスタンスの設定
図8 起動処理の開始
図8 起動処理の開始

もし「No valid host was found」と表示されてインスタンスの起動に失敗する場合は、おそらくリソースが足りていない状態です。

LXCの上でOpenStack installerを動かす

今回はUbuntu 14.04 LTSをインストールしたホスト上に直接OpenStack installerをインストールしました。OpenStack installer自身がコンテナーを作ってその上でいろいろ設定するとは言え、ホストに直接PPAを追加したくない場合もあるでしょう。

Ubuntu 14.04 LTSの上にコンテナーを作ってその上でOpenStack installerをインストールすることも可能です。この場合、Nested LXCが動くようにすることと、コンテナー内部からKVMが実行できるようにする必要があります。まずはLXCをインストールした上で、OpenStack installer用のコンテナーを作成しましょう。

$ sudo apt install lxc
$ sudo lxc-create -t ubuntu-cloud -n openstack -- --auth-key=/home/`id -u -n`/.ssh/authorized_keys

次にopenstackコンテナーの中でLXCを使えるようにします。

$ sudo editor /var/lib/lxc/openstack/config
(以下の2行を追加します)
lxc.mount.auto = cgroup
lxc.aa_profile = lxc-container-default-with-nesting

さらにopenstackコンテナーの中でKVMを使えるようにします。

$ sudo editor /var/lib/lxc/openstack/rootfs/etc/rc.local
(exit 0;より前の行に次の3行を追加します)
mkdir -p /dev/net || true
mknod /dev/kvm c 10 232
mknod /dev/net/tun c 10 200

あとはopenstackコンテナーを起動し、そこにログインさえすれば、これまでの説明と同じ方法でインストールできます。

$ sudo lxc-start -n openstack -d
$ sudo lxc-attach -n openstack

この方法の場合、外からDashboardやJuju GUIにアクセスする際は、ホストマシンとopenstackコンテナーの間のポート転送設定も行わなくてはいけません。基本的にuoi-bootstrapコンテナーへの転送と手順は同じです。

まとめ

このようにUbuntu OpenStack installerを使えば、既存のUbuntuのオーケストレーションツールを駆使して、OpenStack環境をコマンド1つで構築できます。もし「ちょっとOpenStack環境作ってくれない?」なんて無茶ぶりされたときは、DevStackやPackstackの次ぐらいの選択肢の1つとして心の片隅にとどめておいてもらえれば嬉しいです。

すみません、コマンド1つは言い過ぎでした。

おすすめ記事

記事・ニュース一覧