devstackを使ってubuntu22.04にopenstackをデプロイする

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はubuntu22.04にOpenstack環境を作っていきたいと思います。
このubuntu22.04はProxmox VE（VMWareみたいなもの）上にVMとして立ち上げています。

# メインで参考にしているサイト

https://github.com/rafiror/openstack/wiki/Devstack%E5%85%A5%E9%96%80

https://docs.openstack.org/devstack/latest/

https://www.linuxbuzz.com/install-single-node-openstack-using-devstack-on-ubuntu/

# HWスペック

スペックについては、参考にしているサイトにも書いていると思いますのでそちらも併せてご覧ください。最小スペックも書いているかと思います。ただし、Openstackはリソースバカ食いモンスターなので余裕をもって割り当てたほうがいいでしょう。
NICは2枚用意します。用意していないとdevstackで環境をデプロイするときにsshセッションが切れます。

|HW  |値  |
|---|---|
|CPU  |4sockets 4cores |
|Memory  |20GB  |
|Disk  |100G  |
|NIC1  |192.168.2.20（dashboard用）  |
|NIC1  |192.168.2.21（Openstackが内部で使う？用）  |

# 用語
## Openstackとは

>OpenStack は、プールされた仮想リソースを使用してプライベートクラウドおよびパブリッククラウドを構築および管理するオープンソース・プラットフォームです。
>仮想化では、ストレージ、CPU、RAM などのリソースをベンダー固有の各種プログラムから抽出し、ハイパーバイザーによって分割してから、必要に応じて配布します。OpenStack では、一貫性のあるアプリケーション・プログラミング・インタフェース (API) 群を使ってこれらの仮想リソースをもう一歩先まで抽象化することで、分離したプールを作成します。

https://www.redhat.com/ja/topics/openstack

とりあえず、AWSやAzure、GCPみたいなクラウドサービスを自分用に作ることができる、みたいなイメージを持っておけばいいのかなと思います。
AWS等はパブリッククラウドと呼称され、Openstackはプライベートクラウドと呼ばれます。
細かいところまで突き詰めると違うのかもしれませんが、仮想化という点においてはコンテナオーケストレーションツールであるKubernetesもプライベートクラウドと思ってもいいのかもしれません？

## devstackとは

>DevStack は、git master のすべての最新バージョンに基づいて完全な OpenStack 環境を迅速に構築するために使用される一連の拡張可能なスクリプトです。これは、開発環境として、また OpenStack プロジェクトの機能テストの多くの基礎として対話的に使用されます。

https://docs.openstack.org/devstack/latest/

# 環境構築
## VMの環境確認
NICが2枚あることを確認します。ens18,19と2つあることが確認できました。
```
root@openstack:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 8a:32:83:23:21:61 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 192.168.2.20/24 brd 192.168.2.255 scope global ens18
       valid_lft forever preferred_lft forever
    inet6 fe80::8832:83ff:fe23:2161/64 scope link
       valid_lft forever preferred_lft forever
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 1a:d9:df:05:e2:01 brd ff:ff:ff:ff:ff:ff
    altname enp0s19
    inet 192.168.2.21/24 brd 192.168.2.255 scope global ens19
       valid_lft forever preferred_lft forever
    inet6 fe80::18d9:dfff:fe05:e201/64 scope link
       valid_lft forever preferred_lft forever
```

次に以下のコマンドを実行して、出力結果が0より上であることを確認します。
devstackでデプロイするOpenstackのインスタンスはKVM上で稼働することになるのですが、
今操作しているubuntu VMにKVMを構築可能か？を確認していると思って頂ければいいのかなと思います。
```
root@openstack:~# egrep -c '(vmx|svm)' /proc/cpuinfo
32
```

## 構築
以下のコマンド群を実行します。
Openstack用のユーザを作成したり、gitからdevstackのツールセットをダウンロードしたりしています。
その後local.confファイルをいじっています。このファイルはstack.shとネームドされているスクリプトが内部で使用する設定ファイルになります。
```
root@openstack:~# useradd -s /bin/bash -d /opt/stack -m stack
root@openstack:~# chmod +x /opt/stack
root@openstack:~# usermod -aG sudo stack
root@openstack:~# echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
stack ALL=(ALL) NOPASSWD: ALL
root@openstack:~# sudo -u stack -i
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
stack@openstack:~$ git clone https://opendev.org/openstack/devstack
stack@openstack:~$ cd devstack
stack@openstack:~/devstack$ cp samples/local.conf local.conf
stack@openstack:~/devstack$ vi local.conf
```

local.confで編集した内容は以下となります。
今後パラメータの意味を確認して追記していきたいと思っておりますが、基本的にはOpnestackのホストとなるVMのIPアドレスやネットワークに合わせて指定をしてあげればいいと思います。Gatewayについても同様です。
PUBLIC_INTERFACEはsshしていない方のNICを指定します。
```
[[local|localrc]]
HOST_IP=192.168.2.20
SERVICE_HOST=192.168.2.20
MYSQL_HOST=192.168.2.20
RABBIT_HOST=192.168.2.20
GLANCE_HOSTPORT=192.168.2.20:9292
ADMIN_PASSWORD=password
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

## Neutron options
Q_USE_SECGROUP=True
FLOATING_RANGE="192.168.2.0/24"
IPV4_ADDRS_SAFE_TO_USE="10.0.0.0/22"
Q_FLOATING_ALLOCATION_POOL=start=192.168.2.190,end=192.168.2.199
PUBLIC_NETWORK_GATEWAY="192.168.2.254"
PUBLIC_INTERFACE=enp0s19

# Open vSwitch provider networking configuration
Q_USE_PROVIDERNET_FOR_PUBLIC=True
OVS_PHYSICAL_BRIDGE=br-ex
PUBLIC_BRIDGE=br-ex
OVS_BRIDGE_MAPPINGS=public:br-ex
```

local.confの設定を完了したら、同ディレクトリにあるstack.shを実行します。
私の環境では15~20分くらい待つとデプロイが完了しました。
デプロイの最後に"Horizon is now available at"や"The password"等の出力がありますが、これはOpenstackのWebUIにログインするために必要な情報です。
```
stack@openstack:~/devstack$ ./stack.sh

This is your host IP address: 192.168.2.20
This is your host IPv6 address: ::1
Horizon is now available at http://192.168.2.20/dashboard
Keystone is serving at http://192.168.2.20/identity/
The default users are: admin and demo
The password: nomoresecret
Services are running under systemd unit files.
For more information see:
https://docs.openstack.org/devstack/latest/systemd.html
DevStack Version: 2023.2
Change: ffc1b76f64341e18b5a6e60783f1e33297623f99 [neutron] Rely on PATH env set by devstack 2023-08-28 11:01:07 +0530
OS Version: Ubuntu 22.04 jammy
```

## WebUIにアクセスしログインする
"Horizon is now available at"に出力されたURLを任意のWebブラウザに打ち込んでOpenstackにアクセスします。
ユーザはadmin、パスワードは"The password:"で出力されたnomoresecretになります。
![os_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4f1b0110-b535-c334-894e-bfae31ca5bd6.png)

以下のような画面に遷移したら成功です。
![os_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/794d7047-3958-4910-a134-28439edf5bcb.png)