仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

microstackでOpenStack + OVN環境をサクッと動かす

およそ1年半前にmicrostackを使ってOpenStackを1台のサーバーで動かしました。

tech.virtualtech.jp

今回はそのマルチノードを試したいと思います(ちなみに後半に解説する「microstackを物理ネットワークに接続する」流れはシングルノードのmicrostackでも同様に参考になると思います)。

microstackの現在のバージョンはOVNがデフォルトで使われています。ちょうどとあるお仕事で OVNベースのOpenStack環境が必要だったので動かしてみようと思ったのがきっかけでした。

マルチノードのmicrostackについては公式の手順として以下のドキュメントにまとめられています。

microstack.run

microstackのインストールを開始

まず、二台以上のUbuntu Serverがインストールされた環境にmicrostackの同じバージョンをインストールします。

$ sudo snap install microstack --devmode --beta

インストールのポイントとして、--devmodeと言うオプションを忘れないようにするということです。このオプションを忘れるとsudo microstack initがうまく動きません。

それぞれmicrostackのインストールが終わったら、「初期化」を行います。最初のノードでsudo microstack init --auto --controlを実行します。スペックによるとは思いますが、手元の環境では作業終了まで大体10分程度の時間を要しました。

$ sudo microstack init --auto --control
2021-08-10 09:10:05,670 - microstack_init - INFO - Configuring clustering ...
2021-08-10 09:10:05,864 - microstack_init - INFO - Setting up as a control node.
...
2021-08-10 09:20:40,619 - microstack_init - INFO - Complete. Marked microstack as initialized!

上記が終わったら、sudo microstack add-computeを1台目の環境で実行します。返ってきたconnection-stringをコピーしておきます。

実行例

$ sudo microstack add-compute

Use the following connection string to add a new compute node to the cluster (valid for 20 minutes from this moment):
hKhob3N0bmFtZawxNzIuMTcuMjguNjKrZmluZ2VycHJpbnTEIAhfsIjr3Dg2B6a7f6JjHbYxLr/8iKPHROTIbnrmFBgbomlk2SAyNTc1NDgzYzYzYTM0Zjk3OTRkZmQwOWZiNzAzNGM4MaZzZWNyZXTZIDkyMVlOWU1EVW50dVB1NEhjLTBIbkxvV29CT1hZcEF4

コンピュートノードにもコントローラーと同様のバージョンのmicrostackがインストールされていることを確認した後、sudo microstack init --auto --compute --join <connection-string>をコンピュートノード上で実行するようです。ドキュメントに書かれているように、追加するコンピュート毎にこの処理が必要です。

実行例

$ sudo microstack init --auto --compute --join hKhob3N0bmFtZawxNzIuMTcuMjguNjKrZmluZ2VycHJpbnTEIAhfsIjr3Dg2B6a7f6JjHbYxLr/8iKPHROTIbnrmFBgbomlk2SAyNTc1NDgzYzYzYTM0Zjk3OTRkZmQwOWZiNzAzNGM4MaZzZWNyZXTZIDkyMVlOWU1EVW50dVB1NEhjLTBIbkxvV29CT1hZcEF4

2021-08-10 09:24:57,459 - microstack_init - INFO - Configuring clustering ...
2021-08-10 09:24:57,685 - microstack_init - INFO - Setting up as a compute node.
...
2021-08-10 09:26:21,119 - microstack_init - INFO - Complete. Marked microstack as initialized!

構築したOpenStackを使ってみる

以降のコマンドはコントローラーノード(1台目)で実行します。 デプロイした環境がうまく動いているか確認してみます。

実行例

$ sudo microstack.openstack hypervisor list
+----+---------------------+-----------------+--------------+-------+
| ID | Hypervisor Hostname | Hypervisor Type | Host IP      | State |
+----+---------------------+-----------------+--------------+-------+
|  1 | bay11-gen8.maas     | QEMU            | 172.17.28.62 | up    |
|  2 | bay12-gen8.maas     | QEMU            | 172.17.28.68 | up    |
+----+---------------------+-----------------+--------------+-------+

microstackは1台でも動かせるようにするため、デフォルトでcomputeノードとしても振る舞います。

インスタンスを起動してみます。nova:の後の「bay12-gen8.maas」はハイパーバイザー名を指定します。前の手順で確認できます。指定しない場合はどちらかのノードに適当にスケジューリングされると思います。

実行例

$ microstack launch cirros --name test --availability-zone nova:bay12-gen8.maas
Launching server ...
Allocating floating ip ...
Server test launched! (status is BUILD)

Access it with `ssh -i /home/ubuntu/snap/microstack/common/.ssh/id_microstack cirros@10.20.20.155`
You can also visit the OpenStack dashboard at http://10.20.20.1:80

表示された指示にしたがって、インスタンスにSSH接続できます。ログインできますが、現時点では外部ネットワークへのアクセスはできないようです。一応回避策はあります。

$ ssh -i /home/ubuntu/snap/microstack/common/.ssh/id_microstack cirros@10.20.20.155

OVNのCLIでネットワークを確認してみる

デプロイした環境でOVNが使われているか確認してみます。ovs-vsctol show等と比べると、どのポートが何で使われているのかおおよそ判別がつくようになっています。

実行例

$ sudo microstack.ovn-nbctl show
switch 39396018-fc0e-4293-8851-3ba18b0df98a (neutron-5b718ab9-90b1-4378-b87d-09fb5a1c7cf0) (aka test)
    port 6309d609-6536-478d-98e8-42176afdbe3e
        addresses: ["fa:16:3e:c6:d8:37 192.168.222.210"]
    port 97f12c2f-05c0-4a14-b2e0-f1063e3b31f3
        type: router
        router-port: lrp-97f12c2f-05c0-4a14-b2e0-f1063e3b31f3
    port d5191a40-de98-4910-8691-492d8106e407
        type: localport
        addresses: ["fa:16:3e:35:88:4c 192.168.222.2"]
switch d267e34a-70d6-4dbd-bf62-592e570b048b (neutron-a8efd06f-a1f1-4070-8249-971086339d76) (aka external)
    port provnet-4751fd12-ae3c-4716-9a2e-c64bc1874e07
        type: localnet
        addresses: ["unknown"]
    port 9b0866cf-5fd7-417b-acd2-2add6564f265
        type: router
        router-port: lrp-9b0866cf-5fd7-417b-acd2-2add6564f265
    port d73387c0-dde2-49f4-8e09-71c92d2770df
        type: localport
        addresses: ["fa:16:3e:73:c0:49"]
router 51b84297-8cf4-446c-9a80-157e9a4a28fe (neutron-d5d17725-4075-406d-b861-7bf96096651f) (aka test-router)
    port lrp-97f12c2f-05c0-4a14-b2e0-f1063e3b31f3
        mac: "fa:16:3e:87:f9:f8"
        networks: ["192.168.222.1/24"]
    port lrp-9b0866cf-5fd7-417b-acd2-2add6564f265
        mac: "fa:16:3e:ed:25:b5"
        networks: ["10.20.20.164/24"]
        gateway chassis: [2540f620-adbe-41d5-aa22-9b3ad61313fe cbc75bcd-4755-458a-be46-2c0d31f53128]
    nat 66638880-1b2c-42ab-8054-dea0bd3298aa
        external ip: "10.20.20.164"
        logical ip: "192.168.222.0/24"
        type: "snat"
    nat f08c3124-a648-4f14-a7b9-a91da3b85b24
        external ip: "10.20.20.155"
        logical ip: "192.168.222.210"
        type: "dnat_and_snat"

次のコマンドを実行すると、デフォルトでは3つの項目が表示されるはずです。一つはexternalネットワーク、一つはテストネットワーク、一つは仮想ルーターです。

実行例

$ sudo microstack.ovn-sbctl list datapath_bindin
_uuid               : c25c68d8-7c70-4254-90aa-1a49244e4cc4
external_ids        : {logical-switch="d267e34a-70d6-4dbd-bf62-592e570b048b", name=neutron-a8efd06f-a1f1-4070-8249-971086339d76, name2=external}
tunnel_key          : 2

_uuid               : f9268b41-e070-4eaa-a5b6-715bb599cc4c
external_ids        : {logical-router="51b84297-8cf4-446c-9a80-157e9a4a28fe", name=neutron-d5d17725-4075-406d-b861-7bf96096651f, name2=test-router}
tunnel_key          : 3

_uuid               : 45de9d5a-b77b-4217-843c-14638375edae
external_ids        : {logical-switch="39396018-fc0e-4293-8851-3ba18b0df98a", name=neutron-5b718ab9-90b1-4378-b87d-09fb5a1c7cf0, name2=test}
tunnel_key          : 1

microstackノードを物理ネットワークに接続する

前の手順でOpenStackクラスターをサクッと動かすことができましたが、microstackのデフォルト構成では物理ネットワークに接続はされていません。つまりインスタンスにアクセスはできますが、インスタンスから外へはアクセスができない状況です(SSH経由でクラスターの外からもアクセスできない)。

このままではちょっと使いにくいので、物理ネットワークに接続してインスタンスからインターネットにでられるようにしたいと思います。

手順はこちらのガイドに書かれています。

https://connection.rnascimento.com/2021/03/08/openstack-single-node-microstack/

現在のmicrostackはOVNをバックエンドに使っています。br-exと言うブリッジデバイスが作られた状態になっています。つまり、このbr-exにインターネットにでられる設定をしたNICを追加するだけで問題解決という話のようです。

OpenStack Dashboardにアクセスする

OpenStack Dashboardにアクセスするため、多段SSHを仕込みます。実行例で指定している10.20.20.1は、ブリッジbr-exに デフォルトで仕込まれたIPアドレスです。

ssh -i <ssh-key> -N -L 8001:10.20.20.1:80 <user>@<server-ip>

次のコマンドでadminユーザーのパスワードを確認します。

sudo snap get microstack config.credentials.keystone-password

ブラウザーで次のURLを開くとアクセスできます: http://localhost:8001

デフォルトユーザー admin、パスワードはコマンドを実行して確認した長いパスワードを入力します。

bridge-mappingsデバイスを確認

次のコマンドで、bridge-mappingsデバイスを確認します。physnet1のようです。

$ sudo microstack.ovs-vsctl get open . external_ids:ovn-bridge-mappings | awk -F: '{gsub("\"","");; print $1}
physnet1'

ポートの追加

各コンピュート(1台目も含む)で以下を実施します。 eno2はサーバーの2つめのNICを指定します。管理用ネットワークとは別のVLANが設定されていると良いと思います。

$ sudo microstack.ovs-vsctl add-port br-ex eno2
$ sudo ip link set br-ex up

あとは参考サイトに書かれたとおり、すでに作られているdemo用の既存のルーター、ネットワークを全部消して仮想ルーターと外向けおよび内向けのネットワークを作り直し、仮想ルーターにそれぞれのネットワークを接続するだけです。

f:id:virtualtech:20210812094519p:plain

なお、このコマンドを実行した後は多段SSHを仕込むこと無く、OpenStack Dashboardに直接アクセスできるようになります。

f:id:virtualtech:20210812094138p:plain