MicroStack を Hyper-V 上で動かしてみた

# MicroStack とは
[MicroStack](https://microstack.run/) とは IaaS 構築時によく使用される [OpenStack](https://www.openstack.org/) を、 [Microk8s](https://microk8s.io/) の Kubernetes クラスタ上で動かすソフトウェアです。
通常 OpenStack を構築する際は Nova や Glance などのコンポーネントの構築やデータベースのセットアップを行う必要があり、大きな手間がかかります。しかし、MicroStack を使用するとたった数コマンドの実行によってこの OpenStack 環境を簡易的に作成することができます。
今回は Hyper-V で作成した Ubuntu VM 上でこの MicroStack を使用して OpenStack 環境を構築してみたので、その内容について紹介します。

# 手順
## Hyper-V で Ubuntu VM を作成
今回は Ubuntu VM 1台の上に All-in-One 構成の OpenStack を構築するのですが、VM の要件は下記のようになっています。

 - OS：Ubuntu 22.04 LTS
 - CPU：4コア以上のamd64 processor CPU
 - メモリ：16 GB 以上
 - ストレージ：50 GB 以上ルートディレクトリに使用可能領域がある SSD

https://microstack.run/docs/single-node

この要件を参考に、筆者は下記の内容で VM を作成しました。
 - OS：Ubuntu 22.04.4 Server
 - 割当リソース
    - CPU：VCPU 8 コア
    - メモリ：24 GB
    - ストレージ：256 GB
 - ユーザー名：ubuntu
 - ホスト名：microstack01
 - ネットワーク：内部スイッチを使用
    - 筆者の環境ではホストと同じネットワークを使用するためにブリッジネットワークを設定すると、原因は不明ですが下記の「Bootstrap the cloud」の項にてタイムアウトが発生してしまいました。

## OpenStack のデプロイ
ここからは先ほど作成した VM 上で https://microstack.run/docs/single-node の 「Deploy the cloud」の手順を順に実施します。

### Install the openstack snap
まずは下記コマンドを実行して openstack を snap install します。
```
sudo snap install openstack --channel 2024.1/edge
```

### Prepare the machine
続いてノード上で OpenStack が正常に動作できるように、下記コマンドを実行してノードのセットアップを行うスクリプトを実行します。
```
sunbeam prepare-node-script | bash -x && newgrp snap_daemon
```

### Bootstrap the cloud
筆者の環境では、この次に
```
sunbeam configure --accept-defaults --openrc demo-openrc
```
というコマンドを実行するのですが、下記のようにエラーが出てしまいました。
```
ubuntu@microstack01:~$ sunbeam cluster bootstrap --accept-defaults
Error: Host FQDN and Hypervisor hostname perceived by libvirt are different, check `hostname -f` and `/etc/hosts` file
```

ここで、下記の記事を参考に ``/etc/hosts`` を

```
 - 127.0.1.1 microstack01
 + 127.0.1.1 microstack01.multipass microstack01
```
のように修正するとコマンドが通るようになりました。

https://zenn.dev/link/comments/8f67786c07324a

### Configure the cloud and obtain credentials
続いて下記コマンドを実行して ``demo-openrc`` ユーザーを有効化します。
```
sunbeam configure --accept-defaults --openrc demo-openrc
```

ここで、少し脱線しますが https://microstack.run/docs/dashboard を参考にダッシュボードをデプロイしてみます。下記のコマンドを実行します。
```
sunbeam dashboard-url
```

すると、下記のようにダッシュボードの URL が表示されます。
```
ubuntu@microstack01:~$ sunbeam dashboard-url
http://10.20.21.13:80/openstack-horizon
```

ポートフォワーディングを使用して Web ブラウザからダッシュボードをアクセスすると下記のログイン画面が表示されます。

![スクリーンショット 2024-08-02 001503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993924/845a5e1e-6796-9a1b-74a7-fbfbb70c68e5.png)

ログイン情報は ``sunbeam configure`` コマンドで作成された demo-rc ファイルに記載されています。
```
ubuntu@microstack01:~$ cat demo-openrc
# openrc for demo
export OS_AUTH_URL=http://10.20.21.13/openstack-keystone/v3
export OS_USERNAME=demo
export OS_PASSWORD=xxxxxxxx
export OS_USER_DOMAIN_NAME=users
export OS_PROJECT_DOMAIN_NAME=users
export OS_PROJECT_NAME=demo
export OS_AUTH_VERSION=3
export OS_IDENTITY_API_VERSION=3
```

ログインにはそれぞれ下記の情報を使用します。
 - ユーザー名：OS_USERNAME の値
 - パスワード：OS_PASSWORD の値
 - ドメイン：OS_PROJECT_DOMAIN_NAME の値

正常にログインできた場合、下記のようにダッシュボードが表示されます。

![スクリーンショット 2024-07-30 220352.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993924/8a0d9e4a-444c-2044-59e4-24873c38e8a2.png)

### Launch a VM
最後にインスタンスを起動します。下記コマンドを実行します。
```
sunbeam launch ubuntu --name test
```

こちらのコマンドを実行すると Ubuntu 22.04 の VM インスタンスが作成されます。

正常に起動できた場合、下記のような出力になります。
```
ubuntu@microstack01:~$ sunbeam launch ubuntu --name test
Launching an OpenStack instance ...
Access instance with `ssh -i /home/ubuntu/snap/openstack/564/sunbeam ubuntu@10.20.20.169`
```

案内に従って SSH 接続できることを確認できれば OK です。
```
ubuntu@microstack01:~$ ssh -i /home/ubuntu/snap/openstack/564/sunbeam ubuntu@10.20.20.169
・・・
ubuntu@test:~$ 
```

# あとがき
今回は MicroStack を使用して Hyper-V 上の Ubuntu VM 1台の上に All-in-One 構成の OpenStack を構築できることを確認しました。
筆者は過去に同条件の OpenStack を手動で構築したこともありますが、その時に比べて今回は遥かに少ない手順と時間で構築できたため、 OpenStack を試験的に触ったり OpenStack API の動作検証を行う場合などに MicroStack は便利かもしれません。
実運用を検討する場合はマルチノード構成での構築やネットワーク構成の見直し、カスタム VM イメージの導入等々、やるべきことが多くありますが[ドキュメント](https://microstack.run/docs)を参考に進めるのが良いと思いました。