Raspberry PiでOpenStackクラスターを作ってみよう

■ はじめに

こんにちは。SREの平です。 私の趣味であるRaspberry PiでOpenStackクラスターを作ってみます。 Controller(管理サーバー)は手順が少し多く面倒に見えますが、compute(VMが起動するサーバー)は手順も少なく、案外簡単にできると思います。

動かしたいだけであればRPiでなく、x86-64系のVMに対しOpenStack-Ansible(https://docs.openstack.org/openstack-ansible/latest/user/index.html)を適用させると簡単ですが、中身を確認しながら作る方が楽しいですよ。 お好きな方で進めていただければと存じます。

なおこの記事は自宅等で動くことと再現性の向上を優先し、パスワードやセキュリティについてはできるだけ簡単にするなどしています。 本番環境などでは危険な場合もあるのでご注意ください。それでは遊んでいきましょう。

■ 用意するもの

  • VLANが使えるL2スイッチとそれを束ねるL3スイッチまたはルーター
  • Raspberry Pi4 8GBモデル 2個(Controller 1台、compute 1台)
  • 32GB以上のMicroSDカード 2枚
  • 有線LANアダプター(LED付きでUGR〇ENなどRPiでの動作実績があるもの) 2個
  • きちんとした電源(5V3A以上推奨、5V4Aが望ましい) 2個

■ 設計概要

今回はVLANを使ったネットワーク構成で構築していきます(詳細)(https://docs.openstack.org/neutron/yoga/admin/deploy-lb-provider.html)。

RPiにはUSBのLANアダプタを追加し、管理系のトラフィックとVM系のトラフィックを分けようと考えました。
そしてそれぞれを受けるL2SWも別々とし、VM側に輻輳が発生しても管理系への影響が小さくなるよう設計しています。
私はL2SWにCISCO C2960CG、RouterにCISCO C891FJを使いましたが、拡張の予定がないのであればL2とRouterひっくるめて、C891FJの1台にまとめてしまえばコンパクトで見通しが良くなるので試験しやすく便利だと思います。
なお最上段にある(GW-Router)は、自宅のインターネット回線のGWとなりますが、今回のお話にはあまり関係ないため省きました。

物理結線図

■ ネットワーク機器の設定

まずはRPiを受けるL2SWの設定をしていきます。実は2台ともほぼ同じ設定で、VLANインターフェイスのIPが違う程度です。

  • 管理側
vlan 2-5

interface range gigabitEthernet 0/1 - 8
 description "to RPi4 Eth0"
 switchport trunk native vlan 2
 switchport mode trunk

interface GigabitEthernet0/10
 description "to C891FJ-K9"
 switchport trunk allowed vlan 2-5
 switchport mode trunk

interface Vlan2
 ip address 10.234.15.2 255.255.252.0
!
interface Vlan3
 ip address 192.168.0.2 255.255.252.0
!
interface Vlan4
 ip address 192.168.4.2 255.255.252.0
!
interface Vlan5
 ip address 192.168.8.2 255.255.252.0
  • VM側
vlan 2-5

interface range gigabitEthernet 0/1 - 8
 description "to RPi4 Eth1"
 switchport trunk native vlan 2
 switchport mode trunk

interface GigabitEthernet0/10
 description "to C891FJ-K9"
 switchport trunk allowed vlan 2-5
 switchport mode trunk

interface Vlan2
 ip address 10.234.15.3 255.255.252.0
!
interface Vlan3
 ip address 192.168.0.3 255.255.252.0
!
interface Vlan4
 ip address 192.168.4.3 255.255.252.0
!
interface Vlan5
 ip address 192.168.8.3 255.255.252.0

続いてRouter側の設定です。
2台のL2SWにTrunk接続し、OpenStack内で動くVMのIPルーティングをこのRouterで捌きます。

  • Router
vlan 2-5

interface GigabitEthernet0
 description "to GW-Router"
 switchport access vlan 2
 no ip address

interface GigabitEthernet1
 description "to C2960CG Control"
 switchport mode trunk
 no ip address
!
interface GigabitEthernet2
 description "to C2960CG Service"
 switchport mode trunk
 no ip address

interface Vlan1
 no ip address
 shutdown
!
interface Vlan2
 ip address 10.234.12.2 255.255.252.0
 no ip redirects
!
interface Vlan3
 ip address 192.168.0.1 255.255.252.0
!
interface Vlan4
 ip address 192.168.4.1 255.255.252.0
!
interface Vlan5
 ip address 192.168.8.1 255.255.252.0

 ip route 0.0.0.0 0.0.0.0 10.234.12.1

参考までに構築後のRouterの show ip route は以下のようになっていました。

Router#show ip route

Gateway of last resort is 10.234.12.1 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 10.234.12.1
      10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        10.234.12.0/22 is directly connected, Vlan2
L        10.234.12.2/32 is directly connected, Vlan2
C     192.168.0.0/22 is directly connected, Vlan3
      192.168.0.0/32 is subnetted, 1 subnets
L        192.168.0.1 is directly connected, Vlan3
C     192.168.4.0/22 is directly connected, Vlan4
      192.168.4.0/32 is subnetted, 1 subnets
L        192.168.4.1 is directly connected, Vlan4
C     192.168.8.0/22 is directly connected, Vlan5
      192.168.8.0/32 is subnetted, 1 subnets
L        192.168.8.1 is directly connected, Vlan5
Router#

■ SDカードの用意

Raspberry Pi Imager を用意します。そして以下のように選択し、UbuntuをSDに焼き付けてください。

  1. OSで Other general-purpose OS > Ubuntu > Ubuntu Server 22.04.1 64-bit を選択します。
  2. 歯車を押し以下のように設定します。
項目 内容
ホスト名: pios01(2台目は pios02 などとする)
SSHを有効にする: 公開鍵認証のみを許可する
authorized_keys 適当な公開鍵を入力する。
ユーザー名とパスワードを設定する
ユーザー名: 任意
パスワード: 任意
ロケール設定をする
タイムゾーン: Asia/Tokyo
キーボードレイアウト: 任意またはjp

■ RPi 初期設定

SSH

RPiにSDカードを入れ電源を入れ、sshしてください。 avahiが有効なクライアントならホスト名だけで入れます。

ssh ユーザー名@pios01
および
ssh ユーザー名@pios02

各種パッケージを追加します。

sudo -i
apt install -y cpu-checker bridge-utils vlan libvirt-clients linux-modules-extra-raspi zip

追加のmodulesを読み込ませます。

  • /etc/modules
bridge
br_netfilter
8021q
vhost_net

Bridge経由のiptablesを効かないようにしたりします。

  • /etc/modules-load.d/bridge.conf
br_netfilter
  • /etc/sysctl.d/99-bridge.conf
net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0

再起動時の自動設定を解除しつつ、hostsを設定します。

sed -i -e 's/ - update_etc_hosts/# - update_etc_hosts/' /etc/cloud/cloud.cfg
  • /etc/hosts
#IPv6
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

#IPv4
127.0.0.1 localhost
10.234.15.11 pios01
10.234.15.12 pios02
10.234.15.13 pios03

時刻を同期します。

echo "NTP=ntp.nict.jp" >> /etc/systemd/timesyncd.conf
systemctl restart systemd-timesyncd.service
timedatectl timesync-status

IPアドレスの設定をします。

※IPアドレス(10.234.15.11/22の部分等)は各自の環境に合わせて、適宜変更してください。

  • pios01 10.234.15.11/22
  • pios02 10.234.15.12/22
  • pios03 10.234.15.13/22
  • pios04 ...続く

  • /etc/netplan/99_config.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
      dhcp6: false
      addresses: [10.234.15.11/22]
      routes:
        - to: default
          via: 10.234.12.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
    eth1:
      dhcp4: false
      dhcp6: false

なお有線LANアダプターがeth1にならない場合には、以下のようにMACアドレスを指定してみてください。
ip aなどで enx000ec6c97fba などのように見えている場合があり、そのMACアドレスを指定します。

    eth1:
      dhcp4: false
      dhcp6: false
      match:
        macaddress: 00:0e:c6:c9:7f:ba
      set-name: eth1

IPアドレスの反映も含め、1度リブートしておきます。

reboot

ここまでの設定を確認していきます。

sudo -i
lsmod |grep -e bridge -e br_netfilter -e 8021q -e vhost_net
sysctl -a |grep net.bridge.bridge-nf-call

参考ログ

root@pios03:~# lsmod |grep -e bridge -e br_netfilter -e 8021q -e vhost_net
vhost_net              32768  0
vhost                  57344  1 vhost_net
tap                    36864  1 vhost_net
8021q                  40960  0
garp                   20480  1 8021q
mrp                    20480  1 8021q
br_netfilter           32768  0
bridge                323584  1 br_netfilter
stp                    20480  2 bridge,garp
llc                    20480  3 bridge,stp,garp
root@pios03:~#
root@pios03:~# sysctl -a |grep net.bridge.bridge-nf-call
net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
root@pios03:~#

2台とも準備が完了しました。
ここからController(pios01)のみに必要なパッケージを導入していきますので、しばらくcompute(pios02)には触りません。

■ DBの導入

================ ここからコントローラー ================

最初はdatabaseから用意していきます。不明な点は公式マニュアルも参照しながら進めるといいと思います。
cf. https://docs.openstack.org/install-guide/environment-sql-database-ubuntu.html

パッケージの導入と起動に必要な設定を行います。

apt install -y mariadb-server python3-pymysql
cat <<EOF >/etc/mysql/mariadb.conf.d/99-openstack.cnf
[mysqld]
pid-file                = /run/mysqld/mysqld.pid
basedir                 = /usr
bind-address            = 10.234.15.11
default-storage-engine  = innodb
innodb_file_per_table   = on
max_connections         = 4096
expire_logs_days        = 10
character-set-server    = utf8
collation-server        = utf8_general_ci
EOF

デフォルトの設定を削除します

rm /etc/mysql/mariadb.conf.d/50-server.cnf

再起動し、永続化します。

systemctl restart mysql.service

systemctl enable mysql.service

初期設定をします。

※記事中のパスワードは pass123 としていますが適宜変更してください。

mysql_secure_installation

Enter current password for root > Enter
Switch to unix_socket authentication    n
Change the root password?               Y   pass123
Remove anonymous users?                 Y
Disallow root login remotely?           Y
Remove test database and access to it?  Y
Reload privilege tables now?            Y

挙動の確認のため適当なクエリを見てみます。

文字コード確認

mysql -uroot -p -e"SHOW VARIABLES LIKE 'char%'"

ユーザー確認

mysql -uroot -p -e'SELECT user,host,password FROM mysql.user;'

■ Message queueの導入

RabbitMQを導入します。不明な点は公式マニュアルも参照しながら進めるといいと思います。
cf. https://docs.openstack.org/install-guide/environment-messaging-ubuntu.html

パッケージの導入と起動に必要な設定を行います。

apt install -y rabbitmq-server
sed -i -e 's/TimeoutStartSec=600/TimeoutStartSec=900\nTimeoutStopSec=900/' /lib/systemd/system/rabbitmq-server.service

openstackユーザーを作成します。

※記事中のパスワード rabbitmq123 は適宜変更してください。

rabbitmqctl add_user openstack rabbitmq123
rabbitmqctl set_permissions openstack ".*" ".*" ".*"

再起動し、永続化します。

systemctl daemon-reload
systemctl restart rabbitmq-server.service
systemctl enable rabbitmq-server.service

■ memcachedの導入

不明な点は公式マニュアルも参照しながら進めるといいと思います。
cf. https://docs.openstack.org/install-guide/environment-memcached-ubuntu.html

パッケージの導入と起動に必要な設定を行います。

apt install -y memcached python3-memcache

cat <<EOF >/etc/memcached.conf
-d
logfile /var/log/memcached.log
-m 64
-p 11211
-u memcache
-l 10.234.15.11
-P /var/run/memcached/memcached.pid
EOF

再起動し、永続化します。

systemctl restart memcached.service

systemctl enable memcached.service

■ Etcdの導入

不明な点は公式マニュアルも参照しながら進めるといいと思います。
cf. https://docs.openstack.org/install-guide/environment-etcd-ubuntu.html

パッケージの導入と起動に必要な設定を行います。

※バージョンによっては ETCD_UNSUPPORTED_ARCH="arm64" が必要な場合があります。

apt install -y etcd
cat <<EOF >/etc/default/etcd
ETCD_NAME="pios01"
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER="pios01=http://10.234.15.11:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.234.15.11:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.234.15.11:2379"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.234.15.11:2379"
EOF

再起動し、永続化します。

systemctl restart etcd.service

systemctl enable etcd.service

■ OpenStackパッケージの選択とクライアントの導入

導入するOpenStackのパッケージを選択しますが、2022年7月現在、22.04は最新のYogaがデフォルトなので、そのまま進みます。
cf. https://docs.openstack.org/install-guide/environment-packages-ubuntu.html

パッケージの導入を行います。

apt install -y python3-openstackclient

■ Keystoneの導入

不明な点は公式マニュアルも参照しながら進めるといいと思います。
cf. https://docs.openstack.org/keystone/yoga/install/keystone-install-ubuntu.html

keystoneユーザー等を作成します。

mysql -u root -p
create database keystone;
grant all privileges on keystone.* to keystone@'localhost' identified by 'keystone123';
grant all privileges on keystone.* to keystone@'%' identified by 'keystone123';
exit

コンポーネントの導入と起動に必要な設定を行います。

apt install -y keystone
cat <<EOF >/etc/keystone/keystone.conf
[DEFAULT]
log_dir = /var/log/keystone
[database]
connection = mysql+pymysql://keystone:keystone123@pios01/keystone
[extra_headers]
Distribution = Ubuntu
[token]
provider = fernet
EOF

データ入力および確認を行います。

su -s /bin/sh -c "keystone-manage db_sync" keystone
mysql -u root -p -e "USE keystone;SHOW TABLES;"

fernetトークンの初期化を行います。

keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

keystoneの初期設定をします。

keystone-manage bootstrap --bootstrap-password admin123 \
  --bootstrap-admin-url http://pios01:5000/v3/ \
  --bootstrap-internal-url http://pios01:5000/v3/ \
  --bootstrap-public-url http://pios01:5000/v3/ \
  --bootstrap-region-id RegionOne

Apache2にホスト名を追加します。

echo "ServerName pios01" >> /etc/apache2/apache2.conf

再起動し、永続化します。

systemctl restart apache2.service
systemctl enable apache2.service

Apache2に接続確認します。

curl http://pios01:5000/v3 ;echo ""

一般権限に落ちて以下作業を進めます。

exit

作業用に各種変数を一時設定します。

export OS_USERNAME=admin
export OS_PASSWORD=admin123
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://pios01:5000/v3
export OS_IDENTITY_API_VERSION=3

プロジェクト・ユーザー・ロール等の作成テストを行います。

openstack project create --domain default --description "Service Project" service
openstack project create --domain default --description "Demo Project" myproject
openstack user create --domain default --password-prompt myuser
> User Password: myuser123
openstack role create user
openstack role add --project myproject --user myuser user

動作確認します。

認証情報を一部取ります。

 unset OS_AUTH_URL OS_PASSWORD

adminユーザーのトークンを取得してみます。

※ここでのパスワードはadminユーザーなので admin123 です。

 openstack --os-auth-url http://pios01:5000/v3 \
  --os-project-domain-name Default --os-user-domain-name Default \
  --os-project-name admin --os-username admin token issue

myuserユーザーのトークンを取得してみます。

※ここでのパスワードはmyuserユーザーなので myuser123 です。

openstack --os-auth-url http://pios01:5000/v3 \
  --os-project-domain-name Default --os-user-domain-name Default \
  --os-project-name myproject --os-username myuser token issue

■ OpenStackクライアントの環境スクリプトを作成します。

公式マニュアルはこちらです。
cf. https://docs.openstack.org/keystone/xena/install/keystone-openrc-ubuntu.html

adminユーザーの変数スクリプトを作成します。

cat <<EOF >~/admin-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin123
export OS_AUTH_URL=http://pios01:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF

myuserユーザーの変数スクリプトを作成します。

cat <<EOF >~/demo-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=myuser123
export OS_AUTH_URL=http://pios01:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF

変数スクリプトを使ってみます。

. admin-openrc

確認してみます。

openstack token issue

■ Glanceの導入

不明な点は公式マニュアルも参照しながら進めるといいと思います。
cf. https://docs.openstack.org/glance/yoga/install/install-ubuntu.html

glanceユーザー等を作成します。

sudo -i
mysql -u root -p
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance123';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance123';
exit
exit

admin環境変数を読み込みます。


. admin-openrc

glanceユーザーの作成等をします。

※ここでのパスワードは glance123 にしました。

openstack user create --domain default --password-prompt glance
openstack role add --project service --user glance admin
openstack service create --name glance --description "OpenStack Image" image

APIエンドポイントを作成します。

openstack endpoint create --region RegionOne image public http://pios01:9292
openstack endpoint create --region RegionOne image internal http://pios01:9292
openstack endpoint create --region RegionOne image admin http://pios01:9292

コンポーネントの導入と起動に必要な設定を行います。

sudo -i
apt install -y glance
cat <<EOF >/etc/glance/glance-api.conf
[DEFAULT]
use_keystone_quotas = True
[database]
connection = mysql+pymysql://glance:glance123@pios01/glance
[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
[image_format]
disk_formats = ami,ari,aki,vhd,vhdx,vmdk,raw,qcow2,vdi,iso,ploop.root-tar
[key_manager]
[keystone_authtoken]
www_authenticate_uri = http://pios01:5000
auth_url = http://pios01:5000
memcached_servers = pios01:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = glance123
[paste_deploy]
flavor = keystone
EOF

データ入力を行います。

su -s /bin/sh -c "glance-manage db_sync" glance

再起動し、永続化します。

systemctl restart glance-api.service
systemctl enable glance-api.service
exit

glanceの動作確認を行います。ここではUbuntuイメージを登録してみます。

. admin-openrc
wget https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-arm64.img
glance image-create --name "ubuntu-22.04" \
  --file ubuntu-22.04-server-cloudimg-arm64.img \
  --disk-format qcow2 --container-format bare --visibility public

登録されたか確認してみます。

openstack image list

■ Placementの導入

不明な点は公式マニュアルも参照しながら進めるといいと思います。 cf. https://docs.openstack.org/placement/yoga/install/install-ubuntu.html

placementユーザー等を作成します。

sudo -i
mysql -u root -p
CREATE DATABASE placement;
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'placement123';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'placement123';
exit
exit

admin環境変数を読み込みます。

. admin-openrc

placementユーザーの作成等をします。

※ここでのパスワードは placement123 にしました。

openstack user create --domain default --password-prompt placement
openstack role add --project service --user placement admin
openstack service create --name placement --description "Placement API" placement

APIエンドポイントを作成します。

openstack endpoint create --region RegionOne placement public http://pios01:8778
openstack endpoint create --region RegionOne placement internal http://pios01:8778
openstack endpoint create --region RegionOne placement admin http://pios01:8778

コンポーネントの導入と起動に必要な設定を行います。

sudo -i
apt install -y placement-api
  • /etc/placement/placement.conf
[DEFAULT]
[api]
auth_strategy = keystone
[cors]
[keystone_authtoken]
auth_url = http://pios01:5000/v3
memcached_servers = pios01:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = placement123
[oslo_policy]
[placement]
[placement_database]
connection = mysql+pymysql://placement:placement123@pios01/placement
[profiler]

データ入力を行います。

su -s /bin/sh -c "placement-manage db sync" placement

再起動します。

systemctl restart apache2.service

admin環境変数を読み込みます。

exit
. admin-openrc

確認します。

sudo placement-status upgrade check

osc-placementプラグインをインストールします。それぞれ1分程度かかる場合がありました。

sudo apt install -y python3-pip
pip3 install osc-placement
openstack --os-placement-api-version 1.2 resource class list --sort-column name
openstack --os-placement-api-version 1.6 trait list --sort-column name

■ nova の導入

不明な点は公式マニュアルも参照しながら進めるといいと思います。
cf. https://docs.openstack.org/nova/yoga/install/controller-install-ubuntu.html

databaseでnovaユーザーの作成等をします。

※ここでのパスワードは nova123 にしました。

sudo -i
mysql -u root -p
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;

GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'nova123';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'nova123';

GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova123';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova123';

GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'nova123';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'nova123';

exit
exit

admin環境変数を読み込みます。

. admin-openrc

novaユーザーの作成

※ここでのパスワードは nova123 にしました。

openstack user create --domain default --password-prompt nova
 openstack role add --project service --user nova admin
openstack service create --name nova --description "OpenStack Compute" compute

APIエンドポイントを作成します。

openstack endpoint create --region RegionOne compute public http://pios01:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://pios01:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://pios01:8774/v2.1

コンポーネントの導入と起動に必要な設定を行います。

sudo apt install -y nova-api nova-conductor nova-novncproxy nova-scheduler
  • /etc/nova/nova.conf
[DEFAULT]
log_dir = /var/log/nova
lock_path = /var/lock/nova
state_path = /var/lib/nova
transport_url = rabbit://openstack:rabbitmq123@pios01:5672/
my_ip = 10.234.15.11
[api]
auth_strategy = keystone
[api_database]
connection = mysql+pymysql://nova:nova123@pios01/nova_api
[barbican]
[barbican_service_user]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[cyborg]
[database]
connection = mysql+pymysql://nova:nova123@pios01/nova
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://pios01:9292
[guestfs]
[healthcheck]
[hyperv]
[image_cache]
[ironic]
[key_manager]
[keystone]
[keystone_authtoken]
www_authenticate_uri = http://pios01:5000/
auth_url = http://pios01:5000/
memcached_servers = pios01:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova123
[libvirt]
[metrics]
[mks]
[neutron]
[notifications]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[oslo_reports]
[pci]
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://pios01:5000/v3
username = placement
password = placement123
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
discover_hosts_in_cells_interval = 300
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip
[workarounds]
[wsgi]
[zvm]
[cells]
enable = False
[os_region_name]
openstack =

データベースにデータを入力します。

su -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
su -s /bin/sh -c "nova-manage db sync" nova
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova

再起動し、永続化します。

systemctl restart nova-api
systemctl restart nova-scheduler
systemctl restart nova-conductor
systemctl restart nova-novncproxy

systemctl enable nova-api
systemctl enable nova-scheduler
systemctl enable nova-conductor
systemctl enable nova-novncproxy

exit

一旦ここでController(pios01)のみに必要なパッケージの導入が終わりました。
ここからController(pios01)とcompute(pios02)に必要なものを導入していきますが、混乱しやすいところがあるので確認しつつ進めてください。

================ ここからコンピュート ================

ここではcomputeノードのnovaの設定をしていきます。不明な点は公式マニュアルも参照しながら進めるといいと思います。
cf. https://docs.openstack.org/nova/yoga/install/compute-install-ubuntu.html

コンポーネント等の導入を行います。

sudo -i
apt install -y nova-compute seabios

libvirtのdefaultネットワークの非活性化をします。

virsh net-list
virsh net-destroy default
virsh net-autostart --network default --disable

起動に必要な設定を行います。

注意 computeが2台以上の場合、my_ipは1台ずつ異なります。 pios02なら 10.234.15.12 ですが pios03 なら 10.234.15.13 のように変更してください。

  • /etc/nova/nova.conf
[DEFAULT]
log_dir = /var/log/nova
lock_path = /var/lock/nova
state_path = /var/lib/nova
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:rabbitmq123@pios01
my_ip = 10.234.15.12
[api]
auth_strategy = keystone
[keystone_authtoken]
www_authenticate_uri = http://pios01:5000/
auth_uri = http://pios01:5000/
memcached_servers = pios01:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova123
[vnc]
enabled = True
keymap = ja
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://pios01:6080/vnc_auto.html
[glance]
api_servers = http://pios01:9292
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://pios01:5000/v3
username = placement
password = placement123
[neutron]
auth_url = http://pios01:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron123
[libvirt]
[wsgi]
api_paste_config=/etc/nova/api-paste.ini

続行前にRPi間の通信ができるか確認します。Controllerからcomputeにpingしてみます。

ping pios02

Controller~compute間で通信が成功しているのを確認したら再起動します

systemctl restart nova-compute

systemctl enable nova-compute

exit

Controllerにcomputeが登録されているか目視します。

※無事に接続できていれば30秒程度で表示されます。
※3台目以降を追加するときもここで追加されていきます。

. admin-openrc
openstack compute service list --service nova-compute

実行例

pios01:~$ openstack compute service list --service nova-compute
+--------------------------------------+--------------+--------+------+---------+-------+----------------------------+
| ID                                   | Binary       | Host   | Zone | Status  | State | Updated At                 |
+--------------------------------------+--------------+--------+------+---------+-------+----------------------------+
| 1e5c6a56-cced-401d-b977-50d96be67855 | nova-compute | pios02 | nova | enabled | up    | 2022-08-15T14:08:14.000000 |
+--------------------------------------+--------------+--------+------+---------+-------+----------------------------+
pios01:~$

各種確認作業になります。

cf. https://docs.openstack.org/nova/yoga/install/verify.html

openstack compute service list
openstack catalog list
openstack image list
sudo nova-status upgrade check

実行例

pios01:~$ openstack compute service list
+--------------------------------------+----------------+--------+----------+---------+-------+----------------------------+
| ID                                   | Binary         | Host   | Zone     | Status  | State | Updated At                 |
+--------------------------------------+----------------+--------+----------+---------+-------+----------------------------+
| a96a2596-09e5-46d4-a727-7eaf974dbb73 | nova-scheduler | pios01 | internal | enabled | up    | 2022-08-15T14:10:31.000000 |
| a4d43933-dc50-48ce-a2cf-fb940cbb8aaf | nova-conductor | pios01 | internal | enabled | up    | 2022-08-15T14:10:30.000000 |
| 1e5c6a56-cced-401d-b977-50d96be67855 | nova-compute   | pios02 | nova     | enabled | up    | 2022-08-15T14:10:24.000000 |
+--------------------------------------+----------------+--------+----------+---------+-------+----------------------------+
pios01:~$
pios01:~$  openstack catalog list
+-----------+-----------+-------------------------------------+
| Name      | Type      | Endpoints                           |
+-----------+-----------+-------------------------------------+
| glance    | image     | RegionOne                           |
|           |           |   public: http://pios01:9292        |
|           |           | RegionOne                           |
|           |           |   internal: http://pios01:9292      |
|           |           | RegionOne                           |
|           |           |   admin: http://pios01:9292         |
|           |           |                                     |
| nova      | compute   | RegionOne                           |
|           |           |   public: http://pios01:8774/v2.1   |
|           |           | RegionOne                           |
|           |           |   internal: http://pios01:8774/v2.1 |
|           |           | RegionOne                           |
|           |           |   admin: http://pios01:8774/v2.1    |
|           |           |                                     |
| placement | placement | RegionOne                           |
|           |           |   admin: http://pios01:8778         |
|           |           | RegionOne                           |
|           |           |   internal: http://pios01:8778      |
|           |           | RegionOne                           |
|           |           |   public: http://pios01:8778        |
|           |           |                                     |
| keystone  | identity  | RegionOne                           |
|           |           |   public: http://pios01:5000/v3/    |
|           |           | RegionOne                           |
|           |           |   admin: http://pios01:5000/v3/     |
|           |           | RegionOne                           |
|           |           |   internal: http://pios01:5000/v3/  |
|           |           |                                     |
+-----------+-----------+-------------------------------------+
pios01:~$
pios01:~$ openstack image list
+--------------------------------------+--------------+--------+
| ID                                   | Name         | Status |
+--------------------------------------+--------------+--------+
| 0e68c690-35ab-4411-a3d5-ac04f6dfe339 | ubuntu-22.04 | active |
+--------------------------------------+--------------+--------+
pios01:~$
pios01:~$ sudo nova-status upgrade check

※「No host mappings or compute nodes were found.」はたまに出ますが動くようです。

+--------------------------------------------------------------------+
| Upgrade Check Results                                              |
+--------------------------------------------------------------------+
| Check: Cells v2                                                    |
| Result: Success                                                    |
| Details: No host mappings or compute nodes were found. Remember to |
|   run command 'nova-manage cell_v2 discover_hosts' when new        |
|   compute hosts are deployed.                                      |
+--------------------------------------------------------------------+
| Check: Placement API                                               |
| Result: Success                                                    |
| Details: None                                                      |
+--------------------------------------------------------------------+
| Check: Cinder API                                                  |
| Result: Success                                                    |
| Details: None                                                      |
+--------------------------------------------------------------------+
| Check: Policy Scope-based Defaults                                 |
| Result: Success                                                    |
| Details: None                                                      |
+--------------------------------------------------------------------+
| Check: Policy File JSON to YAML Migration                          |
| Result: Success                                                    |
| Details: None                                                      |
+--------------------------------------------------------------------+
| Check: Older than N-1 computes                                     |
| Result: Success                                                    |
| Details: None                                                      |
+--------------------------------------------------------------------+
| Check: hw_machine_type unset                                       |
| Result: Success                                                    |
| Details: None                                                      |
+--------------------------------------------------------------------+
pios01:~$

■ Neutronの導入

ネットワークを構築していきます。
コントローラーとコンピュートで設定が分かれており、先にコントローラーで作業します。
https://docs.openstack.org/neutron/yoga/install/controller-install-ubuntu.html

なお今回はVLANを使ったネットワークを使うので、異なる箇所はこちらのドキュメントに従います。
https://docs.openstack.org/neutron/yoga/admin/deploy-lb-provider.html

================ ここからコントローラー ================

databaseでneutronユーザーの作成等をします。

※ここでのパスワードは neutron123 にしました。

sudo -i
mysql -u root -pmariadb123
CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutron123';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron123';
exit
exit

admin環境変数を読み込みます。

. admin-openrc

neutronユーザーの作成をします。

※ここでのパスワードは neutron123 にしました。

openstack user create --domain default --password-prompt neutron
openstack role add --project service --user neutron admin
openstack service create --name neutron --description "OpenStack Networking" network

neutron APIエンドポイントを作成していきます。

openstack endpoint create --region RegionOne network public http://pios01:9696
openstack endpoint create --region RegionOne network internal http://pios01:9696
openstack endpoint create --region RegionOne network admin http://pios01:9696

コンポーネントの導入と起動に必要な設定を行います。

sudo -i
apt install -y neutron-server neutron-plugin-ml2 \
  neutron-linuxbridge-agent neutron-l3-agent neutron-dhcp-agent \
  neutron-metadata-agent
  • /etc/neutron/neutron.conf
[DEFAULT]
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
transport_url = rabbit://openstack:rabbitmq123@pios01
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
[agent]
root_helper = "sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf"
[cache]
[cors]
[database]
connection = mysql+pymysql://neutron:neutron123@pios01/neutron
[healthcheck]
[ironic]
[keystone_authtoken]
www_authenticate_uri = http://pios01:5000
auth_url = http://pios01:5000
memcached_servers = pios01:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron123
[nova]
auth_url = http://pios01:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = nova123
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[oslo_reports]
[placement]
[privsep]
[quotas]
[ssl]

次にml2の設定をしていきます。

  • /etc/neutron/plugins/ml2/ml2_conf.ini
[DEFAULT]
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vlan
mechanism_drivers = linuxbridge
extension_drivers = port_security,dns
[ml2_type_flat]
[ml2_type_geneve]
[ml2_type_gre]
[ml2_type_vlan]
network_vlan_ranges = provider:3:5
[ml2_type_vxlan]
[ovs_driver]
[securitygroup]
enable_ipset = true
[sriov_driver]

次にLinux ブリッジ エージェントを設定していきます。

  • /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[agent]
[linux_bridge]
physical_interface_mappings = provider:eth1
[network_log]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false

次にl3_agentの設定をしていきます。

  • /etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver = linuxbridge
[agent]
[network_log]
[ovs]

次にdhcpの設定をしていきます。

  • /etc/neutron/dhcp_agent.ini
[DEFAULT]
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
[agent]
[ovs]

metadataエージェントの設定をしていきます。secretは適当な文字列を指定してください。

  • /etc/neutron/metadata_agent.ini
[DEFAULT]
nova_metadata_host = pios01
metadata_proxy_shared_secret = hoge
[agent]
[cache]

/etc/nova/nova.conf のneutronの設定に以下(特にservice_metadata_proxy/metadata_proxy_shared_secret)を追加します。

metadata_proxy_shared_secretはmetadata_agent.iniで設定したものと同じものを指定してください。

  • /etc/nova/nova.conf に一部追加
[neutron]
auth_url = http://pios01:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron123
service_metadata_proxy = true
metadata_proxy_shared_secret = hoge

データベースにデータを入力します。

su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

再起動し、永続化します。

systemctl restart nova-api.service
systemctl restart neutron-server.service
systemctl restart neutron-linuxbridge-agent.service
systemctl restart neutron-dhcp-agent.service
systemctl restart neutron-metadata-agent.service
systemctl restart neutron-l3-agent.service

systemctl enable nova-api.service
systemctl enable neutron-server.service
systemctl enable neutron-linuxbridge-agent.service
systemctl enable neutron-dhcp-agent.service
systemctl enable neutron-metadata-agent.service
systemctl enable neutron-l3-agent.service

exit

================ ここからコンピュート ================

コンピュートで作業します。以下を参照しています。

https://docs.openstack.org/neutron/yoga/install/compute-install-ubuntu.html

コンポーネントの導入と起動に必要な設定を行います。

apt install neutron-linuxbridge-agent
  • /etc/neutron/neutron.conf
[DEFAULT]
core_plugin = ml2
transport_url = rabbit://openstack:rabbitmq123@pios01
auth_strategy = keystone
[agent]
root_helper = "sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf"
[cache]
[cors]
[database]
[healthcheck]
[ironic]
[keystone_authtoken]
www_authenticate_uri = http://pios01:5000
auth_url = http://pios01:5000
memcached_servers = pios01:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron123
[nova]
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[oslo_reports]
[placement]
[privsep]
[quotas]
[ssl]

Linux ブリッジ エージェントを設定していきます。

  • /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[agent]
[linux_bridge]
physical_interface_mappings = provider:eth1
[network_log]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false

再起動し、永続化します。

systemctl restart nova-compute.service
systemctl restart neutron-linuxbridge-agent.service

systemctl enable nova-compute.service
systemctl enable neutron-linuxbridge-agent


exit

コントローラーで、追加したnetwork agentに新しいコンピュートが登録されているか目視します。

無事に接続できていれば30秒程度で表示されます。
3台目以降を追加するときもここで追加されていきます。

openstack network agent list
pios01:~$ openstack network agent list
+--------------------------------------+--------------------+--------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host   | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+--------+-------------------+-------+-------+---------------------------+
| 49e95279-aac7-422f-b4a7-6d3d33065745 | Metadata agent     | pios01 | None              | :-)   | UP    | neutron-metadata-agent    |
| 4dd2ce63-07cc-45c9-9837-7540002d1441 | L3 agent           | pios01 | nova              | :-)   | UP    | neutron-l3-agent          |
| 9b249c00-31e7-4fa3-b503-5c4e6ff4d697 | Linux bridge agent | pios01 | None              | :-)   | UP    | neutron-linuxbridge-agent |
| af3b8483-4fae-4db6-804d-fbea7ce3c73a | Linux bridge agent | pios02 | None              | :-)   | UP    | neutron-linuxbridge-agent |
| f1d685c9-18b3-4b35-83c0-b8991f2e87ed | DHCP agent         | pios01 | nova              | :-)   | UP    | neutron-dhcp-agent        |
+--------------------------------------+--------------------+--------+-------------------+-------+-------+---------------------------+
pios01:~$

■ 管理画面をインストールします

================ ここからコントローラー ================

コントローラーで作業します。以下を参照しています。

https://docs.openstack.org/horizon/latest/install/install-ubuntu.html

コンポーネントの導入と起動に必要な設定を行います。

apt install openstack-dashboard
  • /etc/openstack-dashboard/local_settings.py
# -*- coding: utf-8 -*-

import os
from django.utils.translation import gettext_lazy as _
from horizon.utils import secret_key
from openstack_dashboard.settings import HORIZON_CONFIG

DEBUG = False
LOCAL_PATH = os.path.dirname(os.path.abspath(__file__))
SECRET_KEY = secret_key.generate_or_read_from_file('/var/lib/openstack-dashboard/secret_key')
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '10.234.15.11:11211',
    },
}
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
OPENSTACK_HOST = "pios01"
#OPENSTACK_KEYSTONE_URL = "http://%s/identity/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_URL = "http://pios01:5000/v3"
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 3,
}
TIME_ZONE = "Asia/Tokyo"
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'console': {
            'format': '%(levelname)s %(name)s %(message)s'
        },
        'operation': {
            'format': '%(message)s'
        },
    },
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        },
        'console': {
            'level': 'DEBUG' if DEBUG else 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'console',
        },
        'operation': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'operation',
        },
    },
    'loggers': {
        'horizon': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'horizon.operation_log': {
            'handlers': ['operation'],
            'level': 'INFO',
            'propagate': False,
        },
        'openstack_dashboard': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'novaclient': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'cinderclient': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'keystoneauth': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'keystoneclient': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'glanceclient': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'neutronclient': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'swiftclient': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'oslo_policy': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'openstack_auth': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'django': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'django.db.backends': {
            'handlers': ['null'],
            'propagate': False,
        },
        'requests': {
            'handlers': ['null'],
            'propagate': False,
        },
        'urllib3': {
            'handlers': ['null'],
            'propagate': False,
        },
        'chardet.charsetprober': {
            'handlers': ['null'],
            'propagate': False,
        },
        'iso8601': {
            'handlers': ['null'],
            'propagate': False,
        },
        'scss': {
            'handlers': ['null'],
            'propagate': False,
        },
    },
}

SECURITY_GROUP_RULES = {
    'all_tcp': {
        'name': _('All TCP'),
        'ip_protocol': 'tcp',
        'from_port': '1',
        'to_port': '65535',
    },
    'all_udp': {
        'name': _('All UDP'),
        'ip_protocol': 'udp',
        'from_port': '1',
        'to_port': '65535',
    },
    'all_icmp': {
        'name': _('All ICMP'),
        'ip_protocol': 'icmp',
        'from_port': '-1',
        'to_port': '-1',
    },
    'ssh': {
        'name': 'SSH',
        'ip_protocol': 'tcp',
        'from_port': '22',
        'to_port': '22',
    },
    'smtp': {
        'name': 'SMTP',
        'ip_protocol': 'tcp',
        'from_port': '25',
        'to_port': '25',
    },
    'dns': {
        'name': 'DNS',
        'ip_protocol': 'tcp',
        'from_port': '53',
        'to_port': '53',
    },
    'http': {
        'name': 'HTTP',
        'ip_protocol': 'tcp',
        'from_port': '80',
        'to_port': '80',
    },
    'pop3': {
        'name': 'POP3',
        'ip_protocol': 'tcp',
        'from_port': '110',
        'to_port': '110',
    },
    'imap': {
        'name': 'IMAP',
        'ip_protocol': 'tcp',
        'from_port': '143',
        'to_port': '143',
    },
    'ldap': {
        'name': 'LDAP',
        'ip_protocol': 'tcp',
        'from_port': '389',
        'to_port': '389',
    },
    'https': {
        'name': 'HTTPS',
        'ip_protocol': 'tcp',
        'from_port': '443',
        'to_port': '443',
    },
    'smtps': {
        'name': 'SMTPS',
        'ip_protocol': 'tcp',
        'from_port': '465',
        'to_port': '465',
    },
    'imaps': {
        'name': 'IMAPS',
        'ip_protocol': 'tcp',
        'from_port': '993',
        'to_port': '993',
    },
    'pop3s': {
        'name': 'POP3S',
        'ip_protocol': 'tcp',
        'from_port': '995',
        'to_port': '995',
    },
    'ms_sql': {
        'name': 'MS SQL',
        'ip_protocol': 'tcp',
        'from_port': '1433',
        'to_port': '1433',
    },
    'mysql': {
        'name': 'MYSQL',
        'ip_protocol': 'tcp',
        'from_port': '3306',
        'to_port': '3306',
    },
    'rdp': {
        'name': 'RDP',
        'ip_protocol': 'tcp',
        'from_port': '3389',
        'to_port': '3389',
    },
}

DEFAULT_THEME = 'ubuntu'
WEBROOT='/horizon/'
ALLOWED_HOSTS = '*'
COMPRESS_OFFLINE = True

これで一通りの設定が完了しました。 ここからはコンソールを使って作業を進めていきましょう。

■ コンソールでインスタンスを作成する事前作業を行う

コンソールにログインします。

http://pios01/horizon

ドメインは default で、ID/PWはKeystone設定時に作成した admin/admin123 または myuser/myuser123 でログインできますが、まだ全体設定を行うため、adminでログインしてください。

プロジェクト・ユーザーの作成

まず個人ごとのプロジェクトを作成します。 taira-project を作成してみます。

  • ユーザー管理 > プロジェクト > 『プロジェクトの作成』を選択
項目 内容
名前 taira-project
有効

次に taira というユーザーを作成します。

  • ユーザー管理 > ユーザー > 『ユーザーの作成』を選択
項目 内容
ユーザー名 taira
パスワード 自由に設定してください。
主プロジェクト taira-project
ロール user
有効
ロック

フレーバーの作成

インスタンスサイズを決めるフレーバーを作成します。

  • 管理 > コンピュート > フレーバー > 『フレーバーの作成』を選択

全て自由ですが、あまり大きなものはRPiが小さいので不可能です。
適度に分割できるサイズが良いと思います。自分は以下のようなフレーバーを作成しました。

名前 nano micro xmicro small medium
仮想CPU 1 1 1 2 3
メモリー 512 1024 2048 2048 4096
ルート DISK 5 5 5 5 5

ネットワークの作成

ネットワークの状況を確認しておきます。全てupしているのを目視してから作業しましょう。
このとき Compute node との通信が失敗するような場合には、Controller と Compute との間で ping し合うと改善する場合があります。

pios01:~$ openstack network agent list
+--------------------------------------+--------------------+--------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host   | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+--------+-------------------+-------+-------+---------------------------+
| 49e95279-aac7-422f-b4a7-6d3d33065745 | Metadata agent     | pios01 | None              | :-)   | UP    | neutron-metadata-agent    |
| 4dd2ce63-07cc-45c9-9837-7540002d1441 | L3 agent           | pios01 | nova              | :-)   | UP    | neutron-l3-agent          |
| 9b249c00-31e7-4fa3-b503-5c4e6ff4d697 | Linux bridge agent | pios01 | None              | :-)   | UP    | neutron-linuxbridge-agent |
| af3b8483-4fae-4db6-804d-fbea7ce3c73a | Linux bridge agent | pios02 | None              | :-)   | UP    | neutron-linuxbridge-agent |
| f1d685c9-18b3-4b35-83c0-b8991f2e87ed | DHCP agent         | pios01 | nova              | :-)   | UP    | neutron-dhcp-agent        |
+--------------------------------------+--------------------+--------+-------------------+-------+-------+---------------------------+
pios01:~$

現状を確認しておきます。

  • 管理>コンピュート>ハイパーバイザー>コンピュートホスト
Host Availability zone Status State Time since update
pios02 nova 有効 動作中 0 分
  • 管理>コンピュート>ホストアグリゲート の アベイラビリティーゾーン

※ホストアグリゲートは空で、コントローラーはinternal、コンピュートはnovaのAZに分かれています。

Availability Zone Name Hosts Available
internal pios01 (サービス稼働中) はい
nova pios02 (サービス稼働中) はい

ではネットワークを作成します。ネットワークはプロジェクトごとに作成していきます。
概要の理解はこちらが便利です。
https://docs.openstack.org/neutron/yoga/install/concepts.html

VLAN内容

VLAN番号 CIDR表記 ホストアドレス プロジェクト NW名 セグメントID サブネット名 pool
Vlan3 192.168.0.0/22 192.168.0.0~192.168.3.255 myproject Myuser-network 3 Myuser-subnet 192.168.3.1,192.168.3.254
Vlan4 192.168.4.0/22 192.168.4.0~192.168.7.255 taira-project taira-network 4 Taira-subnet 192.168.7.1,192.168.7.254
Vlan5 192.168.8.0/22 192.168.8.0~192.168.11.255 予備
  • 管理 > ネットワーク > ネットワーク > 『ネットワークの作成』を選択

※ここでは taira-network を作ってみますが、Myuser-networkも別のユーザー用もほとんど同じです。
※物理ネットワークは linuxbridge_agent.ini の physical_interface_mappings で指定した名前を記入します。

項目 内容
名前 taira-network
プロジェクト taira-project
プロバイダーネットワーク種別 VLAN
物理ネットワーク provider
セグメントID 4
管理状態有効
共有
外部ネットワーク
サブネットの作成
アベイラビリティーゾーン ヒント nova
MTU 1500
サブネット名 Taira-subnet
ネットワークアドレス 192.168.4.0/22
IP バージョン IPv4
ゲートウェイ IP 192.168.4.1
ゲートウェイなし
DHCP 有効
IP アドレス割り当てプール 192.168.7.1,192.168.7.254
DNS サーバー 8.8.8.8

いよいよ個人ごとのアカウントに入り、インスタンスを作成していきましょう。

■ コンソールでVMインスタンス作成

adminをログアウトし、tairaでログインしなおします。

  • プロジェクト>コンピュート>インスタンス インスタンスの起動 を押す
項目 内容
インスタンス名 test 等
アベイラビリティゾーン nova
インスタンス数 1
ブートソース イメージ
イメージ ubuntu-22.04 等
フレーバー micro 等
ネットワーク taira-network
セキュリティグループ default
キーペア 作成・またはインポートにて対応します。なおインポートですが名前に ".pem"をつけると失敗する場合があるようです。失敗するときはtairaなどとシンプルにしてみましょう。

■ ログインと接続性のテスト、そして削除

ログインしてインスタンスに接続できるか確認してみます。 管理画面に出た IP Address にsshしてみます。今回は 192.168.7.12 と出ていました。

ssh ubuntu@192.168.7.12
sudo -i
apt install -y nginx

別のマシンから http://192.168.7.12 が見えれば問題ないのではないでしょうか。 問題なければインスタンスを削除してみます。

プロジェクト>コンピュート>インスタンス で作成したインスタンスを選択し 『インスタンスの削除』を押す。

一通りの作業はこれでできるようになりました。

■ カスタマイズスクリプト(cloud-init)の使い方例

インスタンスの起動時に毎回同じ設定をするのであれば自動化した方が便利です。 インスタンスの作成時にカスタマイズスクリプトへ以下のように書いておくと、ユーザー名の指定、日本時間でnictで自動同期、公開鍵の指定をしています(公開鍵は適宜編集してください)。

詳しくは公式ドキュメントを参照してください。

module-reference https://cloudinit.readthedocs.io/en/latest/topics/modules.html

#cloud-config
timezone: Asia/Tokyo
package_upgrade: true
keyboard:
  layout: jp
write_files:
  - path: /etc/systemd/timesyncd.conf
    content: |
      [Time]
      NTP=ntp.nict.jp
      FallbackNTP=ntp.ubuntu.com
users:
  - name: taira
    shell: /bin/bash
    groups: adm,admin
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    ssh_authorized_keys:
      - ssh-rsa AAAほげほげ証明書省略xxxxxxxx= hoge
runcmd:
  - [ systemctl, restart, systemd-timesyncd.service ]

■ SDカード丸ごとバックアップ

ここまででOpenStackの機能は一通り使えるようになってきたのではないでしょうか。 今後さらに拡張していく予定ですが、一旦安定運用した時点でSDカード丸ごとバックアップを取っておくと、今後間違えてシステムを破壊してもこの時点に戻ってこれるので安心です。バックアップをしていきます。

作業前に重要なサービスを停止します。

sudo -i
systemctl stop apache2.service

systemctl stop neutron-l3-agent.service
systemctl stop neutron-metadata-agent.service
systemctl stop neutron-dhcp-agent.service
systemctl stop neutron-linuxbridge-agent.service
systemctl stop neutron-server.service

systemctl stop nova-novncproxy
systemctl stop nova-conductor
systemctl stop nova-scheduler
systemctl stop nova-api
systemctl stop glance-api.service

systemctl stop etcd.service
systemctl stop memcached.service
systemctl stop rabbitmq-server.service
systemctl stop mysql.service
exit

USB3.0のSDカードリーダーに既存のSDカードと同メーカー・同サイズかより大きいものを挿し、RPiに挿します。 lsblk -f で状態を確認してみましょう。 今回は sda で認識され FAT32 のボリュームが1つあるようです。

pios01:~$ lsblk -f
NAME        FSTYPE   FSVER LABEL       UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
loop0       squashfs 4.0                                                          0   100% /snap/core20/1590
loop1       squashfs 4.0                                                          0   100% /snap/core20/1627
loop2       squashfs 4.0                                                          0   100% /snap/lxd/22927
loop3       squashfs 4.0                                                          0   100% /snap/snapd/16299
loop4       squashfs 4.0                                                          0   100% /snap/snapd/16782
loop5       squashfs 4.0                                                          0   100% /snap/lxd/23545
sda
└─sda1      vfat     FAT32             CDB5-526C
mmcblk0
├─mmcblk0p1 vfat     FAT32 system-boot D7E2-9D99                              65.6M    74% /boot/firmware
└─mmcblk0p2 ext4     1.0   writable    b09bb4c8-de4d-4ce6-a93f-30c4c9241a58   20.2G    24% /
pios01:~$

rpi-cloneも最初にクリアしてくれますが、念のため事前にクリアしておきましょう。

sudo parted /dev/sda rm 1

すると以下のように空になりました。では mmcblk0 を sda にバックアップしていきましょう。

pios01:~$ lsblk -f
//snip
sda
mmcblk0
├─mmcblk0p1 vfat     FAT32 system-boot D7E2-9D99                              65.6M    74% /boot/firmware
└─mmcblk0p2 ext4     1.0   writable    b09bb4c8-de4d-4ce6-a93f-30c4c9241a58   20.2G    24% /
pios01:~$

まずrpi-cloneをインストールします

cd /tmp
git clone https://github.com/billw2/rpi-clone.git
sudo cp ./rpi-clone/rpi-clone /usr/local/sbin/sys-clone
sudo cp ./rpi-clone/rpi-clone-setup /usr/local/sbin/sys-clone-setup

sdaにcloneします。

sudo sys-clone sda

このとき以下のようなログが流れますが、rootパーティーションのLabelを覚えておき、続けます。 なおバックアップはだいたい10~13分前後かかることが多いです。

pios01:~$ sudo sys-clone sda

Booted disk: mmcblk0 31.3GB                Destination disk: sda 31.3GB
---------------------------------------------------------------------------
Part               Size    FS     Label           Part   Size  FS  Label
1 /boot/firmware   256.0M  fat32  --
2 root              28.9G  ext4   writable
---------------------------------------------------------------------------
== Initialize: IMAGE partition table - partition number mismatch: 2 -> 0 ==
1 /boot/firmware      (186.0M used)  : MKFS  SYNC to sda1
2 root                (6.9G used)    : RESIZE  MKFS  SYNC to sda2
---------------------------------------------------------------------------
Run setup script       : no.
Verbose mode           : no.
-----------------------:
** WARNING **          : All destination disk sda data will be overwritten!
-----------------------:

Initialize and clone to the destination disk sda?  (yes/no): ← yes
Optional destination ext type file system label (16 chars max): ← rootのLabelを指定します。今回は writable でした。
Hit Enter when ready to unmount the /dev/sda partitions ... ← Enterを押す

次にsda1(たまにsda2も)のLABELが落ちている場合がほとんどなので lsblk -f で確認してみます。 今回はsda1のLABEL が無いようです。

//snip
sda
├─sda1      vfat     FAT32             3A8A-EFC4
└─sda2      ext4     1.0   writable    202d1dcd-e3c5-4412-b821-eb1b28dd5128
mmcblk0
├─mmcblk0p1 vfat     FAT32 system-boot D7E2-9D99                              65.6M    74% /boot/firmware
└─mmcblk0p2 ext4     1.0   writable    b09bb4c8-de4d-4ce6-a93f-30c4c9241a58   20.3G    24% /

sda1もしくはsda2のLABELが落ちていたら補完します。

sudo fatlabel /dev/sda1 system-boot
sudo e2label /dev/sda2 writable

補完後、sda1のLABELの部分にsystem-bootが追加されていれば大丈夫です。 同じように2台目もやっておきます。 その後shutしてから、メインのSDは保管。バックアップのSDに差し替えてから、引き続き遊んでいきましょう。

■ 最後に

ご覧のように大変長文になってしまい、誤字脱字・コピペミスなど、数多くありました。
私が誤字を見つけられなくなってから再び2回ほど全文を読み返しておりますが、まだまだ文中のミスなどが多くあるかと存じます。ご容赦いただければ幸いです。
今後はこの環境を色々発展させていきたいと考えていますので引き続きおつきいただけますようよろしくお願いいたします。