■ はじめに
こんにちは。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に焼き付けてください。
- OSで Other general-purpose OS > Ubuntu > Ubuntu Server 22.04.1 64-bit を選択します。
- 歯車を押し以下のように設定します。
項目 | 内容 |
---|---|
ホスト名: | 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回ほど全文を読み返しておりますが、まだまだ文中のミスなどが多くあるかと存じます。ご容赦いただければ幸いです。
今後はこの環境を色々発展させていきたいと考えていますので引き続きおつきいただけますようよろしくお願いいたします。