Ubuntu

OpenStackのチュートリアルをやってみたメモ

Ubuntu

このゴールデンウィークのテーマはOpenStack。簡単に環境が作れるようなので、とりあえず試してみて、最終的にはホームラボの環境をそこに移してしまおうと考えた。
ESXiはとっても安定しているし、使いやすいし、慣れているのでとっても良いのだけれど、今後要求されるハードウェア要件を満たせそうにないので。



広告


VMware PlayerにUbuntu 22.04をインストールし、Canonicalが用意してくれているチュートリアルに沿って、Microstackを使ってOpenStackをインストールしていく。
とはいえ、自分で見直したときに、あちこち行ったり来たりしないで済むように、順序を入れ替えたり、調べたメモを追記しているので、甚だしく記事が長くなっている。

チュートリアルが教えてくれるMicroStackは、非常に簡単なステップでOpenStackが使えるようになるツール。OSのインストールから使い始めまで1時間もかからず、すぐに使い始められるのは素晴らしい。OpenStackを1つ1つインストールしようとしたら、物凄く大変みたいなので。
一方で、これを本番運用しようと思ったら、細かな設定で少し苦労するかもしれない。

なお、Ubuntu 22.04では、最新の Yoga がインストールされるらしい。新しいOSに、新しい仮想プラットフォーム、楽しそうだ。

ホスト環境の準備

この環境でテストする。IPアドレスはすべてマスクしている。

種別説明IPアドレス
ゲートウェイインターネットに接続するためのルーター192.168.110.1
DNSLAN内の名前解決を担当192.168.110.2, 192.168.110.1
メインPCWindows 10(VMware 16 Playerを起動)192.168.110.0/24 のセグメントに配置
ホストUbuntu 22.04 Server on VMware 16 Player192.168.110.6

まずは、仮想マシンを作成。現在のメインPCのスペックからして、これが最大級と思われる。
HDDは200GBを用意した(実際、チュートリアル完走で約66GB、その他チョロチョロっとやって73GB弱)。

仮想マシンの中で仮想マシンを動かすために、VT-xは必要。
メインPCではVT-xが有効にできてなかったのだけれど、物凄く遅かった。GUIとか、ちょっと操作できるレベルにならなかった。
どうしても試したかったので他の色々を外して、どうにかVT-xを有効にした。

仮想マシンを作ったら、起動する前に、いくつか追加の設定をする。
UEFI起動(セキュアブートなし)、サイドチャネルの緩和は無効にする。

OpenStack.vmx ※今回作った仮想マシンはOpenStackという名前。

firmware = "efi"
efi.legacyBoot.enabled = "FALSE"
uefi.secureBoot.enabled = "FALSE"
ulm.disableMitigations="TRUE"

仮想ディスクにUbuntu 22.04 LTS Server をインストールしていく。
本番ではディスクを足したり引いたりすることがあるかもしれないので、LVMで構成する。

LVMの構成で、98GBを使うようになっていたので、このように見えている。

$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              2.4G  1.6M  2.4G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   97G   11G   81G  12% /
tmpfs                               12G     0   12G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  126M  1.7G   7% /boot
/dev/sda1                          1.1G  5.3M  1.1G   1% /boot/efi
tmpfs                              2.4G  4.0K  2.4G   1% /run/user/1000

容量すべてを割り当てるなら、以下を実行する。

$ sudo lvextend --extents +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
$ sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

OpenStackのインストール

MicroStackでは、OpenStackの以下の機能が提供される。これは「ふーん」程度で流して、まずはインストールして触ってみて、後から見直す程度で良いと思う。

名称機能
novaコンピュートインスタンス(仮想サーバー)を提供する。
Keystone, Glance, Neutron, Placementが必要。
KeystoneすべてのサービスにIDと認証を提供する。
APIクライアント認証、サービスディスカバリー、マルチテナント承認など。
Granceイメージリポジトリを提供。
コンピュートインスタンスは、イメージから起動する。
Neutron
(with OVN)
物理・仮想ネットワークの接続を提供。
OVNはNeutronとOpen vSwitchを統合し、仮想ネットワークを提供する。
HorizonOpenStackのダッシュボード。
Nova, Swift, Keystone等のサービスにWebインターフェースを提供。

MicroStackはインストールすると1ノードで動作するけれども、複数のマシンにインストールして組み合わせてクラスターを作ることができる
Juju(OSからサービスまでをデプロイして構成を管理する)をバックエンドにして利用することもできるようだけれども、ちょっと想像ができなかった。

MicroStackを使ったOpenStackのインストール

黄色部分は、LVMだった場合に必要なパラメーターのようで、チュートリアルにはなかったが追加している。

  • 1つ目 dns-domainは、DHCPで配布される情報。
  • 2つ目 lvmバックエンドの時にはこれを設定しておかないと、イメージ作成で失敗することがある。
$ sudo snap install microstack --beta
microstack (beta) ussuri from Canonical? installed

$ sudo snap set microstack config.network.dns-domain=hogeserver.hogeddns.jp.

$ sudo microstack init --auto --control --setup-loop-based-cinder-lvm-backend --loop-device-file-size 50
microstack (beta) ussuri from Canonical? installed
rohhie@openstack:~$ sudo microstack init --auto --control
2022-04-28 13:11:40,578 - microstack_init - INFO - Configuring clustering ...
2022-04-28 13:11:40,836 - microstack_init - INFO - Setting up as a control node.
2022-04-28 13:11:45,165 - microstack_init - INFO - Generating TLS Certificate and Key
2022-04-28 13:11:46,574 - microstack_init - INFO - Configuring networking ...
2022-04-28 13:11:54,496 - microstack_init - INFO - Opening horizon dashboard up to *
2022-04-28 13:11:55,744 - microstack_init - INFO - Waiting for RabbitMQ to start ...
Waiting for 192.168.110.6:5672
2022-04-28 13:12:04,212 - microstack_init - INFO - RabbitMQ started!
2022-04-28 13:12:04,212 - microstack_init - INFO - Configuring RabbitMQ ...
2022-04-28 13:12:05,650 - microstack_init - INFO - RabbitMQ Configured!
2022-04-28 13:12:05,676 - microstack_init - INFO - Waiting for MySQL server to start ...
Waiting for 192.168.110.6:3306
2022-04-28 13:12:14,157 - microstack_init - INFO - Mysql server started! Creating databases ...
2022-04-28 13:12:16,221 - microstack_init - INFO - Configuring Keystone Fernet Keys ...
2022-04-28 13:12:34,264 - microstack_init - INFO - Bootstrapping Keystone ...
2022-04-28 13:12:50,547 - microstack_init - INFO - Creating service project ...
2022-04-28 13:12:59,210 - microstack_init - INFO - Keystone configured!
2022-04-28 13:12:59,240 - microstack_init - INFO - Configuring the Placement service...
2022-04-28 13:13:25,975 - microstack_init - INFO - Running Placement DB migrations...
2022-04-28 13:13:30,557 - microstack_init - INFO - Configuring nova control plane services ...
2022-04-28 13:13:47,536 - microstack_init - INFO - Running Nova API DB migrations (this may take a lot of time)...
2022-04-28 13:14:19,543 - microstack_init - INFO - Running Nova DB migrations (this may take a lot of time)...
Waiting for 192.168.110.6:8774
2022-04-28 13:15:24,206 - microstack_init - INFO - Creating default flavors...
2022-04-28 13:15:57,430 - microstack_init - INFO - Configuring nova compute hypervisor ...
2022-04-28 13:15:57,431 - microstack_init - INFO - Checking virtualization extensions presence on the host
2022-04-28 13:15:57,453 - microstack_init - WARNING - Unable to determine hardware virtualization support by CPU vendor id "GenuineIntel": assuming it is not supported.
2022-04-28 13:15:57,454 - microstack_init - WARNING - Hardware virtualization is not supported - software emulation will be used for Nova instances
2022-04-28 13:16:00,313 - microstack_init - INFO - Configuring the Spice HTML5 console service...
2022-04-28 13:16:00,831 - microstack_init - INFO - Configuring Neutron
Waiting for 192.168.110.6:9696
2022-04-28 13:17:50,423 - microstack_init - INFO - Configuring Glance ...
Waiting for 192.168.110.6:9292
2022-04-28 13:18:32,868 - microstack_init - INFO - Adding cirros image ...
2022-04-28 13:18:36,839 - microstack_init - INFO - Creating security group rules ...
2022-04-28 13:18:49,349 - microstack_init - INFO - Configuring the Cinder services...
2022-04-28 13:20:05,011 - microstack_init - INFO - Running Cinder DB migrations...
2022-04-28 13:20:17,268 - microstack_init - INFO - restarting libvirt and virtlogd ...
2022-04-28 13:20:35,938 - microstack_init - INFO - Complete. Marked microstack as initialized!

※最初、ホストのVT-xを有効にできずに、警告が出ていた。作成したインスタンスは非常にモッタリと動いていた。
※インストール時にVT-xが有効になっていない場合、その後に有効にしてもソフトウェアエミュレーションのまま動作する(速度は改善しない)。

インスタンスのテスト

チュートリアルに沿って、testというインスタンスを作ってみる。

$ microstack launch cirros --name test
Creating local "microstack" ssh key at /home/rohhie/snap/microstack/common/.ssh/id_microstack
Launching server ...
Allocating floating ip ...
Server test launched! (status is BUILD)

Access it with `ssh -i /home/rohhie/snap/microstack/common/.ssh/id_microstack cirros@10.20.20.48`
You can also visit the OpenStack dashboard at https://10.20.20.1:443

※その時々で割り当てられるIPアドレスは変わる。

接続してみる。

$ ssh -i /home/rohhie/snap/microstack/common/.ssh/id_microstack cirros@10.20.20.48
sign_and_send_pubkey: no mutual signature supported
cirros@10.20.20.48's password:

んー、鍵が使えなくて、パスワードを要求されている。

パスワード?どこにそんな情報があるの??とあちこち探して、パスワード情報を発見。
Canonical / Microstack / Pro tips
openstack / イメージの入手

cirros@10.20.20.48's password: gocubsgo
$ ls -la
total 6
drwxr-xr-x    3 cirros   cirros        1024 Apr 28 14:45 .
drwxrwxr-x    4 root     root          1024 Nov 20  2017 ..
-rw-------    1 cirros   cirros          10 Apr 28 14:45 .ash_history
-rwxr-xr-x    1 cirros   cirros          43 Nov 20  2017 .profile
-rwxr-xr-x    1 cirros   cirros          66 Nov 20  2017 .shrc
drwxr-xr-x    2 cirros   cirros        1024 Apr 28 14:23 .ssh

$ uptime
 14:47:14 up 23 min,  1 users,  load average: 0.00, 0.00, 0.00

SSHにはDropbearが使われているようなんだけれども、何故、鍵でアクセスできないんだろう…?
Qitta / `sign_and_send_pubkey: no mutual signature supported` が出た時の対処

教えてくれたことを踏まえて、こんなファイルを定義してみた。
~/.ssh/config

Host 10.20.20.48
#   HostKeyAlgorithms ssh-rsa
    PubkeyAcceptedKeyTypes ssh-rsa

# こんな書き方をすると ssh cirros でアクセスができる。
Host cirros
        HostName                10.20.20.48
        User                    cirros
        PubkeyAcceptedKeyTypes  ssh-rsa
        IdentityFile            /home/rohhie/snap/microstack/common/.ssh/id_microstack

これでもう一度SSH接続してみる。

$ ssh -i /home/rohhie/snap/microstack/common/.ssh/id_microstack cirros@10.20.20.48
The authenticity of host '10.20.20.48 (10.20.20.48)' can't be established.
ECDSA key fingerprint is SHA256:rRm1z3AEQF4hkfT9XHMt8Ym61UJBa+VnF94JgpVQNZA.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.20.20.48' (ECDSA) to the list of known hosts.
$

鍵で接続できるようになった。ECDSAとなっている。でも、何でこんなことになっているのだろう?ちょっとよく分からなかった。

さてさて…どうもこれはCirrOSというもので、テスト用の小さなOSのようだった。

CirrOS は、OpenStack Compute のようなクラウドでテストイメージとして使用するために設計された、最小の Linux ディストリビューションです。 CirrOS ダウンロードページ から CirrOS をさまざまな形式でダウンロードできます。

In a CirrOS image, the login account is cirros. The password is gocubsgo. Since the fixed PW allows anyone to login, you should not run this image with a public IP attached.
DeepL先生の翻訳:CirrOSイメージの場合、ログインアカウントはcirrosです。パスワードはgocubsgoです。固定PWで誰でもログインできるので、このイメージはパブリックIPを付けて実行しない方がよいでしょう。

openstack / イメージの入手

ちょっとだけ変なことがあったけれど、少ない手順でOpenStackで色々やってみる環境ができた。

初期設定

CA証明書のインストール

この節では、MicroStackが生成した自己署名証明書をインストールしているが、自前の証明書をインストールする場合はこちらを参照

ダッシュボードにアクセスするとき、チュートリアルでは、ローカルIPアドレス(10.20.20.1)が示されていた。
今回、Ubuntu 22.04 Serverをインストールしただけで、デスクトップをインストールしていない。
さて、どうやってアクセスするか。

もしかしたら?と使用中のポートを確認してみたところ、https(443)をNginxが掴んでいる。

$ sudo ss -p -A tcp,udp,raw state listening state unconnected
Netid    State     Recv-Q    Send-Q    Local Address:Port     Peer Address:Port
<omit>
tcp      LISTEN    0         511             0.0.0.0:https         0.0.0.0:*        users:(("nginx",pid=5399,fd=9),("nginx",pid=5398,fd=9),("nginx",pid=5397,fd=9),("nginx",pid=5396,fd=9))
<omit>

MicrosatckがNginxを使ってアクセスできるようにしてくれている。

  • プログラム:/snap/microstack/current/usr/sbin/nginx
  • 動作設定:/var/snap/microstack/common/etc/nginx/snap/nginx.conf

Nginxの設定をたどってディレクトリを調べてみたら、以下の自己署名証明書が置かれていることが分かった。
これにより、ブラウザで警告表示され、この先でOpenStack Command Line Clientを利用する際にも、証明書を気にしないオプションを常に付け続けなければならない。

ファイル中身
/var/snap/microstack/common/etc/ssl/certs/cacert.pem認証局の証明書。この認証局がサーバー証明書に署名している。
/var/snap/microstack/common/etc/ssl/certs/cert.pemHTTPS通信で使われるサーバー証明書。
/var/snap/microstack/common/etc/ssl/private/key.pemcacert.pemとcert.pemの秘密鍵。
/var/snap/microstack/common/etc/ssl/private/compute-key.pem現時点では、何に使われているのか分からない。

HTTPS通信で提示されるサーバーの証明書は、というと…

$ openssl x509 -text -noout -in /var/snap/microstack/common/etc/ssl/certs/cert.pem
Certificate:
    Data:
<omit>
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:TRUE, pathlen:0
            X509v3 Subject Alternative Name:
                DNS:openstack, IP Address:192.168.110.6
<omit>

となっており、openstackで名前解決ができるようにするか、IPアドレスでアクセスすることが想定されている模様。

操作しているメインPC(Windows 10)
cacert.pem(中身はテキスト)を取り出して、openstack-ca.crtとして保存し、「信頼されたルート証明機関」として登録する。
ブラウザを立ち上げ直して、ダッシュボードにアクセスしたところ、安全にアクセスができた。

ホスト
cacert.pemを所定の場所に openstack-ca.crt という名前で保管して、信頼する認証局を登録する。
この先でOpenStack Command Line Clientを利用するときに、--insecureパラメーターなしでコマンド実行が可能になる

$ sudo cp /var/snap/microstack/common/etc/ssl/certs/cacert.pem /usr/local/share/ca-certificates/openstack-ca.crt
$ sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
rehash: warning: skipping ca-certificates.crt,it does not contain exactly one certificate or CRL
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

※拡張子がpemのままだと、証明書が上手く登録できない。

ダッシュボードへのサインイン

さて、https://192.168.110.6(ホストに割り当てたIPアドレス)でアクセスしてみる。

User Nameはadmin、パスワードは以下で調べることができる。

$ sudo snap get microstack config.credentials.keystone-password
u1PsUVXOtZB77rV56dCtoE2sjKP8XUAN

これでサインインすることができた。

adminのパスワード変更

チュートリアルでは、adminのパスワードをadminに変更してみようという説明があった。
ダッシュボードでパスワード変更画面にアクセスしたところ、502 Bad Gatewayとなった。

なるほど…言語を英語にすればいいのか。
ask ubuntu / 502 Bad Gateway nginx/1.19.0 | Ubuntu 20.04 LTS

パスワードを変更すると、一旦サインアウトされ、サインイン画面が表示される。
変更したパスワードでサインインできることを確認する。

OpenStack Clientを使ってサービスにアクセスしてみる

OpenStack Command Line Clientをインストールする。
マニュアルはこちら。
OpenStack Documentation / OpenStackClient

$ sudo snap install openstackclients

ダッシュボードのメニューから、rcファイルをダウンロードする。

これをホストにコピーして(テキストなので適当に作成してOK)実行する。

$ source ./admin-openrc.sh
Please enter your OpenStack Password for project admin as user admin: admin

※先程変更したadminのパスワードを入力している。

サービスリストを表示してみる。

$ openstack catalog list
+-----------+-----------+----------------------------------------------------------------------------+
| Name      | Type      | Endpoints                                                                  |
+-----------+-----------+----------------------------------------------------------------------------+
| glance    | image     | microstack                                                                 |
|           |           |   public: https://192.168.110.6:9292                                       |
|           |           | microstack                                                                 |
|           |           |   admin: https://192.168.110.6:9292                                        |
|           |           | microstack                                                                 |
|           |           |   internal: https://192.168.110.6:9292                                     |
|           |           |                                                                            |
| placement | placement | microstack                                                                 |
|           |           |   internal: https://192.168.110.6:8778                                     |
|           |           | microstack                                                                 |
|           |           |   public: https://192.168.110.6:8778                                       |
|           |           | microstack                                                                 |
|           |           |   admin: https://192.168.110.6:8778                                        |
|           |           |                                                                            |
| cinderv2  | volumev2  | microstack                                                                 |
|           |           |   internal: https://192.168.110.6:8776/v2/128baab4a6144d6d9cfe6cd9ac03fd8f |
|           |           | microstack                                                                 |
|           |           |   public: https://192.168.110.6:8776/v2/128baab4a6144d6d9cfe6cd9ac03fd8f   |
|           |           | microstack                                                                 |
|           |           |   admin: https://192.168.110.6:8776/v2/128baab4a6144d6d9cfe6cd9ac03fd8f    |
|           |           |                                                                            |
| neutron   | network   | microstack                                                                 |
|           |           |   admin: https://192.168.110.6:9696                                        |
|           |           | microstack                                                                 |
|           |           |   internal: https://192.168.110.6:9696                                     |
|           |           | microstack                                                                 |
|           |           |   public: https://192.168.110.6:9696                                       |
|           |           |                                                                            |
| nova      | compute   | microstack                                                                 |
|           |           |   public: https://192.168.110.6:8774/v2.1                                  |
|           |           | microstack                                                                 |
|           |           |   internal: https://192.168.110.6:8774/v2.1                                |
|           |           | microstack                                                                 |
|           |           |   admin: https://192.168.110.6:8774/v2.1                                   |
|           |           |                                                                            |
| cinderv3  | volumev3  | microstack                                                                 |
|           |           |   public: https://192.168.110.6:8776/v3/128baab4a6144d6d9cfe6cd9ac03fd8f   |
|           |           | microstack                                                                 |
|           |           |   internal: https://192.168.110.6:8776/v3/128baab4a6144d6d9cfe6cd9ac03fd8f |
|           |           | microstack                                                                 |
|           |           |   admin: https://192.168.110.6:8776/v3/128baab4a6144d6d9cfe6cd9ac03fd8f    |
|           |           |                                                                            |
| keystone  | identity  | microstack                                                                 |
|           |           |   internal: https://192.168.110.6:5000/v3/                                 |
|           |           | microstack                                                                 |
|           |           |   public: https://192.168.110.6:5000/v3/                                   |
|           |           | microstack                                                                 |
|           |           |   admin: https://192.168.110.6:5000/v3/                                    |
|           |           |                                                                            |
+-----------+-----------+----------------------------------------------------------------------------+

OpenStackに作られているユーザーの一覧を表示してみる(keystore)。

$ openstack user list
+----------------------------------+-----------+
| ID                               | Name      |
+----------------------------------+-----------+
| 17e20375f3d94b50b2ca511fbc25be88 | admin     |
| b30bf366da9c49fd9522e2e96a7b9f3a | placement |
| 22d2f528f5664a02934ab2600f66bbea | nova      |
| 9f85efaefcbf4893b3333518935e1241 | neutron   |
| cb63d8180e4341e49dc059dcefbccaec | glance    |
| c72860c708ba4928af6a53e2e6a85dfb | cinder    |
+----------------------------------+-----------+

イメージの一覧を表示してみる(Grance)。

$ openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| bffc6591-13cc-4fe5-b737-5bdc285c0b77 | cirros | active |
+--------------------------------------+--------+--------+

※最初に立ち上げたCirrOSはこれだった。

仮想ネットワークの一覧を表示してみる(Neutron)。

$ openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID                                   | Name     | Subnets                              |
+--------------------------------------+----------+--------------------------------------+
| 2594abce-f895-4bef-bafd-e72c00ecb6ef | external | 9e60d81a-950b-4171-b909-4fb1b198c2dc |
| 47a301d3-61f7-4a84-b05c-caa43dd2dcfd | test     | 759aed9c-5ad4-448e-a8f2-fa0c2a369f11 |
+--------------------------------------+----------+--------------------------------------+

ハイパーバイザーの一覧を表示してみる(Nova)。

$ openstack hypervisor list
+----+---------------------+-----------------+---------------+-------+
| ID | Hypervisor Hostname | Hypervisor Type | Host IP       | State |
+----+---------------------+-----------------+---------------+-------+
|  1 | openstack           | QEMU            | 192.168.110.6 | up    |
+----+---------------------+-----------------+---------------+-------+

ボリュームの一覧を表示してみる(Cinder)。

$ openstack volume list
< 何も表示されない >

※現時点ではボリュームができていない。

イメージの管理

これを初期設定と言って良いのかどうか分からないが、Ubuntu 20.04と22.04のクラウドイメージを登録する。
このイメージからインスタンスを簡単に起動できる。

チュートリアルにはUbuntu 18.04と20.04のクラウドイメージのリンクが書かれていたが、新バージョンもリリースされたことだし、Ubuntu 20.04と22.04をダウンロードしてみる。

$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img \
       https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img

※何種類かあるが、チュートリアルで示されていたkvmではなく、無印のイメージを使っている。

ダウンロードしてきたイメージを登録する。

$ openstack image create --disk-format qcow2 --min-disk 8 --min-ram 512 --file ./focal-server-cloudimg-amd64-disk-kvm.img --private 20.04
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                                                     |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| container_format | bare                                                                                                                                      |
| created_at       | 2022-04-29T04:06:48Z                                                                                                                      |
| disk_format      | qcow2                                                                                                                                     |
| file             | /v2/images/a55608a1-8fa6-424b-8760-2b8757dcc433/file                                                                                      |
| id               | a55608a1-8fa6-424b-8760-2b8757dcc433                                                                                                      |
| min_disk         | 8                                                                                                                                         |
| min_ram          | 512                                                                                                                                       |
| name             | 20.04                                                                                                                                     |
| owner            | 128baab4a6144d6d9cfe6cd9ac03fd8f                                                                                                          |
| properties       | os_hidden='False', owner_specified.openstack.md5='', owner_specified.openstack.object='images/20.04', owner_specified.openstack.sha256='' |
| protected        | False                                                                                                                                     |
| schema           | /v2/schemas/image                                                                                                                         |
| status           | queued                                                                                                                                    |
| tags             |                                                                                                                                           |
| updated_at       | 2022-04-29T04:06:48Z                                                                                                                      |
| visibility       | private                                                                                                                                   |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------+

$ openstack image create --disk-format qcow2 --min-disk 8 --min-ram 512 --file ./jammy-server-cloudimg-amd64-disk-kvm.img --public 22.04
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                                                     |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| container_format | bare                                                                                                                                      |
| created_at       | 2022-04-29T04:08:05Z                                                                                                                      |
| disk_format      | qcow2                                                                                                                                     |
| file             | /v2/images/e0ea809b-436d-40ad-8cd2-61850a6a85e2/file                                                                                      |
| id               | e0ea809b-436d-40ad-8cd2-61850a6a85e2                                                                                                      |
| min_disk         | 8                                                                                                                                         |
| min_ram          | 512                                                                                                                                       |
| name             | 22.04                                                                                                                                     |
| owner            | 128baab4a6144d6d9cfe6cd9ac03fd8f                                                                                                          |
| properties       | os_hidden='False', owner_specified.openstack.md5='', owner_specified.openstack.object='images/22.04', owner_specified.openstack.sha256='' |
| protected        | False                                                                                                                                     |
| schema           | /v2/schemas/image                                                                                                                         |
| status           | queued                                                                                                                                    |
| tags             |                                                                                                                                           |
| updated_at       | 2022-04-29T04:08:05Z                                                                                                                      |
| visibility       | public                                                                                                                                    |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------+

$ openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| a55608a1-8fa6-424b-8760-2b8757dcc433 | 20.04  | active |
| e0ea809b-436d-40ad-8cd2-61850a6a85e2 | 22.04  | active |
| bffc6591-13cc-4fe5-b737-5bdc285c0b77 | cirros | active |
+--------------------------------------+--------+--------+

この操作は、ダッシュボードでもできるようだ。
Admin / Compute / Images

フレーバーの管理

これも初期設定ではないかもしれないが、フレーバーを登録する。

フレーバーは、メモリやディスクのサイズをテンプレート化するもので、インストール時に5つのフレーバーが作られている。
チュートリアルの通りに新しいフレーバーを作ってみる。RAM 1GB、DISK 10GB、VCPU 1。

$ openstack flavor create --ram 1024 --disk 10 --vcpus 1 myflavor
+----------------------------+--------------------------------------+
| Field                      | Value                                |
+----------------------------+--------------------------------------+
| OS-FLV-DISABLED:disabled   | False                                |
| OS-FLV-EXT-DATA:ephemeral  | 0                                    |
| description                | None                                 |
| disk                       | 10                                   |
| id                         | 88ee7450-be5b-4cb8-af52-168cf53767f0 |
| name                       | myflavor                             |
| os-flavor-access:is_public | True                                 |
| properties                 |                                      |
| ram                        | 1024                                 |
| rxtx_factor                | 1.0                                  |
| swap                       |                                      |
| vcpus                      | 1                                    |
+----------------------------+--------------------------------------+

$ openstack flavor list
+--------------------------------------+-----------+-------+------+-----------+-------+-----------+
| ID                                   | Name      |   RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+-----------+-------+------+-----------+-------+-----------+
| 1                                    | m1.tiny   |   512 |    1 |         0 |     1 | True      |
| 2                                    | m1.small  |  2048 |   20 |         0 |     1 | True      |
| 3                                    | m1.medium |  4096 |   20 |         0 |     2 | True      |
| 4                                    | m1.large  |  8192 |   20 |         0 |     4 | True      |
| 5                                    | m1.xlarge | 16384 |   20 |         0 |     8 | True      |
| 88ee7450-be5b-4cb8-af52-168cf53767f0 | myflavor  |  1024 |   10 |         0 |     1 | True      |
+--------------------------------------+-----------+-------+------+-----------+-------+-----------+

こちらも、同じことがダッシュボードからできるようだ。
Admin / Compute / Flavors

マルチドメイン

OpenStackはマルチドメインに対応しているそうなんだけれども、ドメインって?

[ドメイン]
  ├ [ユーザー]
  ├ [グループ]
  ├ [ロール]
  ├ [イメージ]
  ├ [フレーバー]
  └ [プロジェクト]
      ├ [インスタンス]
      ├ [ボリューム]
      ︙

※見れば見るほど怪しい構成図だが、大まかな理解のために整理したもの。

ざっくりリソースはこんな管理がされているようだ。
マルチドメインというと、これをまるごと別に分けるようなことなので、個人レベルで使うことはなさそうだけれども、チュートリアルが教えてくれているので、これに沿って進めていく。

ドメインの作成

ドメインmydomainを作る。

$ openstack domain create --description "My domain" mydomain
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | My domain                        |
| enabled     | True                             |
| id          | 52c337fc4f7d4f7882e460486ae26c83 |
| name        | mydomain                         |
| options     | {}                               |
| tags        | []                               |
+-------------+----------------------------------+

$ openstack domain list
+----------------------------------+----------+---------+--------------------+
| ID                               | Name     | Enabled | Description        |
+----------------------------------+----------+---------+--------------------+
| 52c337fc4f7d4f7882e460486ae26c83 | mydomain | True    | My domain          |
| default                          | Default  | True    | The default domain |
+----------------------------------+----------+---------+--------------------+

管理者の作成

管理者ユーザーadminを作成する。
ドメインdefaultにもadminがいるので、チュートリアルでは、別のドメインならば同じ名前のユーザーがいても良いことを教えてくれているのだろう。

$ openstack user create --domain mydomain --password admin admin
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | 52c337fc4f7d4f7882e460486ae26c83 |
| enabled             | True                             |
| id                  | e93fadbf2db044989b8d8d7bf14e9775 |
| name                | admin                            |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

$ openstack user list
+----------------------------------+-----------+
| ID                               | Name      |
+----------------------------------+-----------+
| 17e20375f3d94b50b2ca511fbc25be88 | admin     |
| b30bf366da9c49fd9522e2e96a7b9f3a | placement |
| 22d2f528f5664a02934ab2600f66bbea | nova      |
| 9f85efaefcbf4893b3333518935e1241 | neutron   |
| cb63d8180e4341e49dc059dcefbccaec | glance    |
| c72860c708ba4928af6a53e2e6a85dfb | cinder    |
| e93fadbf2db044989b8d8d7bf14e9775 | admin     |
+----------------------------------+-----------+

mydomainのユーザーadminに、ロールadminを割り当てる。

$ openstack role add --domain mydomain --user-domain mydomain --user admin admin

マルチドメインを有効にする。

$ sudo bash -c 'cat > /var/snap/microstack/common/etc/horizon/local_settings.d/_10_enable_multidomain_support.py' << EOF
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
EOF

$ sudo snap restart microstack.horizon-uwsgi
Restarted.

サインアウトしてみたところ、ドメイン項目が追加されていた。

それぞれ、mydomain, admin, admin を入力してサインイン。チュートリアルで説明されているとおりにエラーが出るので、説明の通り無視する。

ロールの作成

ロール_member_を作る。コマンド実行に、割と時間が掛かった。

$ openstack role create _member_
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | None                             |
| domain_id   | None                             |
| id          | 350c4fcc617e491cb97ee81c10a2dbc1 |
| name        | _member_                         |
| options     | {}                               |
+-------------+----------------------------------+

$ openstack role list
+----------------------------------+----------+
| ID                               | Name     |
+----------------------------------+----------+
| 1392d7ac8ad04fc1a491c125d6660408 | reader   |
| 350c4fcc617e491cb97ee81c10a2dbc1 | _member_ |
| 3bd9f1a928d644aeb2c446f9a164c62e | member   |
| 400f37cc1ec5492082dd8955726c00af | admin    |
+----------------------------------+----------+

ロールを作ることはできるが、このロールは何ができるのか、という定義をするのは、
/etc/<SERVICE>/policy.json
だそうだ。OpenStackの各サービスでできることが分かってきたら、◯◯できるが、△△できない、的な特別なロールにしていくことができるのだろう。

ダッシュボードでもこの操作ができる。
Identity / Roles

プロジェクトの作成

プロジェクトmyprojectを作成する。
インスタンスやボリュームは、プロジェクトごとに分けて管理する。

$ openstack project create --domain mydomain myproject
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | 52c337fc4f7d4f7882e460486ae26c83 |
| enabled     | True                             |
| id          | 4fa457c670214d48ad69f829a62b545d |
| is_domain   | False                            |
| name        | myproject                        |
| options     | {}                               |
| parent_id   | 52c337fc4f7d4f7882e460486ae26c83 |
| tags        | []                               |
+-------------+----------------------------------+

$ openstack project list --domain mydomain
+----------------------------------+-----------+
| ID                               | Name      |
+----------------------------------+-----------+
| 4fa457c670214d48ad69f829a62b545d | myproject |
+----------------------------------+-----------+

ダッシュボードでもこの操作ができる。
Identity / Projects

管理者にロールを割り当てる

ユーザーadminに、プロジェクトmyprojectに対するロールmember, adminを割り当てる。

$ openstack role add --project myproject --project-domain mydomain --user admin --user-domain mydomain member
$ openstack role add --project myproject --project-domain mydomain --user admin --user-domain mydomain admin

一旦ダッシュボードからサインアウトし、再度サインインするとプロジェクトmyprojectが見えるようになる。

ここで、openstackコマンドを実行するためのrcファイルをダウンロードしてくる。

$ mv myproject-openrc.sh mydomain-admin-openrc.sh
$ source mydomain-admin-openrc.sh
Please enter your OpenStack Password for project admin as user admin: admin

openstackコマンドで、サーバー一覧とイメージ一覧を表示してみる。
現時点では、adminがアクセスできるインスタンスはないため、サーバー一覧には何も表示されない。
イメージはすべて見える。

$ openstack server list

$ openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| a55608a1-8fa6-424b-8760-2b8757dcc433 | 20.04  | active |
| e0ea809b-436d-40ad-8cd2-61850a6a85e2 | 22.04  | active |
| bffc6591-13cc-4fe5-b737-5bdc285c0b77 | cirros | active |
+--------------------------------------+--------+--------+

ロールadminを付ければ何でもできる、というわけでもないことが分かる。

ユーザーとグループの作成

ユーザーmyuserを作る。

$ openstack user create --domain mydomain --password mypassword myuser
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | 52c337fc4f7d4f7882e460486ae26c83 |
| enabled             | True                             |
| id                  | 6cb9db3f04324c24bbb31adec62e369f |
| name                | myuser                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

$ openstack user list --domain mydomain
+----------------------------------+--------+
| ID                               | Name   |
+----------------------------------+--------+
| e93fadbf2db044989b8d8d7bf14e9775 | admin  |
| 6cb9db3f04324c24bbb31adec62e369f | myuser |
+----------------------------------+--------+

ダッシュボードでもこの操作ができる。
Identity / Users

続いて、グループmygroupを作る。

$ openstack group create --domain mydomain mygroup
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | 52c337fc4f7d4f7882e460486ae26c83 |
| id          | 3cbd6e0c6aa44ce68b6541715b5cc5d0 |
| name        | mygroup                          |
+-------------+----------------------------------+

$ openstack group list --domain mydomain
+----------------------------------+---------+
| ID                               | Name    |
+----------------------------------+---------+
| 3cbd6e0c6aa44ce68b6541715b5cc5d0 | mygroup |
+----------------------------------+---------+

ダッシュボードでもこの操作ができる。
Identity / Groups

作成したグループmygroupに、ユーザーmyuserを追加する。

$ openstack group add user --group-domain mydomain --user-domain mydomain mygroup myuser

$ openstack user list --group mygroup
+----------------------------------+--------+
| ID                               | Name   |
+----------------------------------+--------+
| 6cb9db3f04324c24bbb31adec62e369f | myuser |
+----------------------------------+--------+

ダッシュボードでもこの操作ができる。
Identity / Groups → ActionのManage Members

グループmygroupに、ロールmemberを割り当てる。

$ openstack role add --project myproject --project-domain mydomain --group mygroup member

$ openstack role assignment list --role member
+----------------------------------+------+----------------------------------+----------------------------------+--------+--------+-----------+
| Role                             | User | Group                            | Project                          | Domain | System | Inherited |
+----------------------------------+------+----------------------------------+----------------------------------+--------+--------+-----------+
| 3bd9f1a928d644aeb2c446f9a164c62e |      | 3cbd6e0c6aa44ce68b6541715b5cc5d0 | 4fa457c670214d48ad69f829a62b545d |        |        | False     |
+----------------------------------+------+----------------------------------+----------------------------------+--------+--------+-----------+

※IDでしかみられないけれど、割り当てられている。

ダッシュボードでもこの操作ができる。
Identity / Projects → ActionのModify Groups

ユーザーmyuserのrcファイルを取得するため、ダッシュボードにサインインし直す。
mydomain, myuser, mypassword

rcファイルをダウンロードする。

$ mv myproject-openrc.sh mydomain-myuser-openrc.sh
$ source mydomain-myuser-openrc.sh
Please enter your OpenStack Password for project admin as user myuser: mypassword

試しにイメージの一覧を表示してみる。イメージはグローバルリソースなので、memberでもみることができる。

$ openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| e0ea809b-436d-40ad-8cd2-61850a6a85e2 | 22.04  | active |
| bffc6591-13cc-4fe5-b737-5bdc285c0b77 | cirros | active |
+--------------------------------------+--------+--------+

プライベートで登録したイメージ20.04は見えない。

ユーザーでリソースを操作

キーペアーの作成

キーペアmykeypairを作成する。

$ openstack keypair create --private-key ./mykeypair.pem --type ssh mykeypair
+-------------+-------------------------------------------------+
| Field       | Value                                           |
+-------------+-------------------------------------------------+
| created_at  | None                                            |
| fingerprint | 42:74:96:37:c2:11:4b:6e:71:76:7c:4d:96:11:0f:fd |
| id          | mykeypair                                       |
| is_deleted  | None                                            |
| name        | mykeypair                                       |
| type        | ssh                                             |
| user_id     | 6cb9db3f04324c24bbb31adec62e369f                |
+-------------+-------------------------------------------------+

ダッシュボードでもこの操作ができる。
Project / Compute / Key Pairs

ネットワークの作成

ネットワークは配線、サブネットはネットワークセグメント(ネットワーク・サブネットマスク)のイメージだった。
チュートリアルではIPv4を扱っていたが、IPv6のサブネットを追加することもできそうだった。

ネットワークmynetworkを作成。

$ openstack network create mynetwork
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2022-04-29T09:12:13Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | b4c44d53-c362-4187-8eef-763a08122483 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1442                                 |
| name                      | mynetwork                            |
| port_security_enabled     | True                                 |
| project_id                | 4fa457c670214d48ad69f829a62b545d     |
| provider:network_type     | None                                 |
| provider:physical_network | None                                 |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 1                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| updated_at                | 2022-04-29T09:12:14Z                 |
+---------------------------+--------------------------------------+

$ openstack network list
+--------------------------------------+-----------+--------------------------------------+
| ID                                   | Name      | Subnets                              |
+--------------------------------------+-----------+--------------------------------------+
| 2594abce-f895-4bef-bafd-e72c00ecb6ef | external  | 9e60d81a-950b-4171-b909-4fb1b198c2dc |
| b4c44d53-c362-4187-8eef-763a08122483 | mynetwork |                                      |
+--------------------------------------+-----------+--------------------------------------+

サブネットmysubnetを作成。

$ openstack subnet create --network mynetwork --subnet-range 192.168.0.0/24 --allocation-pool start=192.168.0.101,end=192.168.0.200 --dns-nameserver 192.168.110.1 mysubnet
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| allocation_pools     | 192.168.0.101-192.168.0.200          |
| cidr                 | 192.168.0.0/24                       |
| created_at           | 2022-04-29T09:14:11Z                 |
| description          |                                      |
| dns_nameservers      | 192.168.110.1                        |
| dns_publish_fixed_ip | None                                 |
| enable_dhcp          | True                                 |
| gateway_ip           | 192.168.0.1                          |
| host_routes          |                                      |
| id                   | 5ee18c53-0f40-48c1-8392-1aeb3f3b69b0 |
| ip_version           | 4                                    |
| ipv6_address_mode    | None                                 |
| ipv6_ra_mode         | None                                 |
| name                 | mysubnet                             |
| network_id           | b4c44d53-c362-4187-8eef-763a08122483 |
| project_id           | 4fa457c670214d48ad69f829a62b545d     |
| revision_number      | 0                                    |
| segment_id           | None                                 |
| service_types        |                                      |
| subnetpool_id        | None                                 |
| tags                 |                                      |
| updated_at           | 2022-04-29T09:14:11Z                 |
+----------------------+--------------------------------------+

$ openstack subnet list
+--------------------------------------+----------+--------------------------------------+----------------+
| ID                                   | Name     | Network                              | Subnet         |
+--------------------------------------+----------+--------------------------------------+----------------+
| 5ee18c53-0f40-48c1-8392-1aeb3f3b69b0 | mysubnet | b4c44d53-c362-4187-8eef-763a08122483 | 192.168.0.0/24 |
+--------------------------------------+----------+--------------------------------------+----------------+

ダッシュボードでもネットワークとサブネットの作成ができる。
Project / Network / Networks

ルーターの作成

この段階では、[external] - [mynetwork]の間がつながっていない。
ここでルーターmyrouterを作成して、2つのネットワークを繋ぐ。

$ openstack router create myrouter
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| admin_state_up          | UP                                   |
| availability_zone_hints |                                      |
| availability_zones      |                                      |
| created_at              | 2022-04-29T09:18:04Z                 |
| description             |                                      |
| external_gateway_info   | null                                 |
| flavor_id               | None                                 |
| id                      | 3474ed07-f6d9-4b6c-9c13-d1f5875655e2 |
| name                    | myrouter                             |
| project_id              | 4fa457c670214d48ad69f829a62b545d     |
| revision_number         | 1                                    |
| routes                  |                                      |
| status                  | ACTIVE                               |
| tags                    |                                      |
| updated_at              | 2022-04-29T09:18:04Z                 |
+-------------------------+--------------------------------------+

$ openstack router list
+--------------------------------------+----------+--------+-------+----------------------------------+
| ID                                   | Name     | Status | State | Project                          |
+--------------------------------------+----------+--------+-------+----------------------------------+
| 3474ed07-f6d9-4b6c-9c13-d1f5875655e2 | myrouter | ACTIVE | UP    | 4fa457c670214d48ad69f829a62b545d |
+--------------------------------------+----------+--------+-------+----------------------------------+

ダッシュボードでもこの操作ができる。
Project / Network / Routers

ネットワークexternalとルーターを接続(外向けのゲートウェイとして接続)。
続けて、サブネットmysubnetをルーターに接続(サブネットとして追加)。

$ openstack router set --external-gateway external myrouter
$ openstack router add subnet myrouter mysubnet

ダッシュボードでもこの操作ができる。
Project / Network / Routers → ルーターをクリックし、インターフェースを定義。

インスタンスの作成

Ubuntu 22.04のインスタンスmyinstance-1とmyinstance-2を作成する。

  • インスタンスをmynetworkに接続する。
  • インスタンスにmykeypairを適用する。
$ openstack server create --flavor myflavor --image 22.04 --network mynetwork --key-name mykeypair --min 2 --max 2 myinstance
+-----------------------------+-------------------------------------------------+
| Field                       | Value                                           |
+-----------------------------+-------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL                                          |
| OS-EXT-AZ:availability_zone |                                                 |
| OS-EXT-STS:power_state      | NOSTATE                                         |
| OS-EXT-STS:task_state       | scheduling                                      |
| OS-EXT-STS:vm_state         | building                                        |
| OS-SRV-USG:launched_at      | None                                            |
| OS-SRV-USG:terminated_at    | None                                            |
| accessIPv4                  |                                                 |
| accessIPv6                  |                                                 |
| addresses                   |                                                 |
| adminPass                   | pqJ9ZVhxp4PB                                    |
| config_drive                |                                                 |
| created                     | 2022-04-29T09:44:54Z                            |
| flavor                      | myflavor (88ee7450-be5b-4cb8-af52-168cf53767f0) |
| hostId                      |                                                 |
| id                          | a98e237a-d8d9-4546-9703-4f3f63f74031            |
| image                       | 22.04 (e0ea809b-436d-40ad-8cd2-61850a6a85e2)    |
| key_name                    | mykeypair                                       |
| name                        | myinstance-1                                    |
| progress                    | 0                                               |
| project_id                  | 4fa457c670214d48ad69f829a62b545d                |
| properties                  |                                                 |
| security_groups             | name='default'                                  |
| status                      | BUILD                                           |
| updated                     | 2022-04-29T09:44:54Z                            |
| user_id                     | 6cb9db3f04324c24bbb31adec62e369f                |
| volumes_attached            |                                                 |
+-----------------------------+-------------------------------------------------+

$ openstack server list
+--------------------------------------+--------------+--------+-------------------------+-------+----------+
| ID                                   | Name         | Status | Networks                | Image | Flavor   |
+--------------------------------------+--------------+--------+-------------------------+-------+----------+
| 286f58f0-1a3d-40ce-a560-a1d085fead7d | myinstance-2 | ACTIVE | mynetwork=192.168.0.132 | 22.04 | myflavor |
| a98e237a-d8d9-4546-9703-4f3f63f74031 | myinstance-1 | ACTIVE | mynetwork=192.168.0.190 | 22.04 | myflavor |
+--------------------------------------+--------------+--------+-------------------------+-------+----------+

ダッシュボードでもこの操作ができる。
Project / Compute / Instances

ただ、このインスタンスは起動しているのだけれども、外からアクセスすることができないので、どうなっているのか見られない。
ここから接続するための準備をしていく。

フローティングIPアドレスの作成

この段階で、ネットワークと各装置(myprojectに関係するもの)は、以下のようになっている。

   The internet
    │
┌───┴────┐┌────────┐
│Homelab Gateway ││Homelab DNS     │
│192.168.110.1   |│192.168.110.2   |
└───┬────┘└───┬────┘
    ├─────────┴──…
┌───┴────┐
│192.168.110.6   | ↑↑↑  Homelab Network  ↑↑↑
│OpenStack Host  │
│10.20.20.1      | ↓↓↓ OpenStack Network ↓↓↓↓
└───┬────┘
┌───┴────┐
│10.20.20.100    |
│myrouter        │
│192.168.0.1     |
└───┬────┘
    └─────────┬─────────┬──…
          ┌───┴────┐┌───┴────┐
          │[              ]|│[              ]|
          │192.168.0.190   |│192.168.0.132   |
          │myinstance-1    ││myinstance-2    │
          └────────┘└────────┘

※[ ]括弧内はフローティングIPアドレス。

ホストからmyrouterまではいけるけれども、myinstance-1にはアクセスができない。
そこで、フローティングIPアドレスを作成し、myinstance-1に割り当てる。

$ openstack floating ip create external
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| created_at          | 2022-04-29T09:27:10Z                 |
| description         |                                      |
| dns_domain          | None                                 |
| dns_name            | None                                 |
| fixed_ip_address    | None                                 |
| floating_ip_address | 10.20.20.90                          |
| floating_network_id | 2594abce-f895-4bef-bafd-e72c00ecb6ef |
| id                  | e584432f-bc31-41a2-ac64-a0d41dc3651f |
| name                | 10.20.20.90                          |
| port_details        | None                                 |
| port_id             | None                                 |
| project_id          | 4fa457c670214d48ad69f829a62b545d     |
| qos_policy_id       | None                                 |
| revision_number     | 0                                    |
| router_id           | None                                 |
| status              | DOWN                                 |
| subnet_id           | None                                 |
| tags                | []                                   |
| updated_at          | 2022-04-29T09:27:10Z                 |
+---------------------+--------------------------------------+

$ openstack floating ip list
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| ID                                   | Floating IP Address | Fixed IP Address | Port | Floating Network                     | Project                          |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| e584432f-bc31-41a2-ac64-a0d41dc3651f | 10.20.20.90         | None             | None | 2594abce-f895-4bef-bafd-e72c00ecb6ef | 4fa457c670214d48ad69f829a62b545d |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+

ダッシュボードでもこの操作ができる。
Project / Network / Floating IPs

myinstance-1にフローティングIPアドレスを割り当てる。
チュートリアルでは、環境によって作られるフローティングIPアドレスに対応するため、リストからIPアドレスを切り出しているが、IPアドレスを直接書いても問題はない(というか、普通はそうするだろうなと)。

$ IP=$(openstack floating ip list | tail -n 2 | head -n 1 | awk '{print $4}')
$ echo $IP
10.20.20.90

$ openstack server add floating ip myinstance-1 $IP

$ openstack server show myinstance-1
+-----------------------------+----------------------------------------------------------+
| Field                       | Value                                                    |
+-----------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL                                                   |
| OS-EXT-AZ:availability_zone | nova                                                     |
| OS-EXT-STS:power_state      | Running                                                  |
| OS-EXT-STS:task_state       | None                                                     |
| OS-EXT-STS:vm_state         | active                                                   |
| OS-SRV-USG:launched_at      | 2022-04-29T09:45:35.000000                               |
| OS-SRV-USG:terminated_at    | None                                                     |
| accessIPv4                  |                                                          |
| accessIPv6                  |                                                          |
| addresses                   | mynetwork=10.20.20.90, 192.168.0.190                     |
| config_drive                |                                                          |
| created                     | 2022-04-29T09:44:54Z                                     |
| flavor                      | myflavor (88ee7450-be5b-4cb8-af52-168cf53767f0)          |
| hostId                      | b35712179963d2905210de2ceaa7150737a8bfd7f0c48ad807c8ead7 |
| id                          | a98e237a-d8d9-4546-9703-4f3f63f74031                     |
| image                       | 22.04 (e0ea809b-436d-40ad-8cd2-61850a6a85e2)             |
| key_name                    | mykeypair                                                |
| name                        | myinstance-1                                             |
| progress                    | 0                                                        |
| project_id                  | 4fa457c670214d48ad69f829a62b545d                         |
| properties                  |                                                          |
| security_groups             | name='default'                                           |
| status                      | ACTIVE                                                   |
| updated                     | 2022-04-29T09:45:36Z                                     |
| user_id                     | 6cb9db3f04324c24bbb31adec62e369f                         |
| volumes_attached            |                                                          |
+-----------------------------+----------------------------------------------------------+

ダッシュボードでもこの操作ができる。
Project / Compute / Instances → ActionのAssociate Floating IP

│OpenStack Host  │
│10.20.20.1      | ↓↓↓ OpenStack Network ↓↓↓↓
└───┬────┘
┌───┴────┐
│10.20.20.100    |
│myrouter        │
│192.168.0.1     |
└───┬────┘
    └─────────┬─────────┬──…
          ┌───┴────┐┌───┴────┐
          │[ 10.20.20.90  ]|│[              ]|
          │192.168.0.190   |│192.168.0.132   |
          │myinstance-1    ││myinstance-2    │
          └────────┘└────────┘

※[ ]括弧内はフローティングIPアドレス。

myinstance-1に、フローティングIPアドレスを割り当てることができた。

セキュリティグループの作成

ネットワークはつながったが、ホストからmyinstance-1への接続はできない。
これは、デフォルトのセキュリティポリシーが適用されており、外からの接続を受け付けないため。

そこで、セキュリティグループを作り、そこでSSHの接続を許可し、myinstance-1に適用する。

セキュリティグループmysecuritygroupを作る。

$ openstack security group create mysecuritygroup
+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field           | Value                                                                                                                                                 |
+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| created_at      | 2022-04-29T09:29:56Z                                                                                                                                  |
| description     | mysecuritygroup                                                                                                                                       |
| id              | 2939d735-3ad4-45c0-8b34-30cf0b9072cf                                                                                                                  |
| name            | mysecuritygroup                                                                                                                                       |
| project_id      | 4fa457c670214d48ad69f829a62b545d                                                                                                                      |
| revision_number | 1                                                                                                                                                     |
| rules           | created_at='2022-04-29T09:29:56Z', direction='egress', ethertype='IPv6', id='33bd2b3a-f61e-431a-95f6-d7af0aaff667', updated_at='2022-04-29T09:29:56Z' |
|                 | created_at='2022-04-29T09:29:56Z', direction='egress', ethertype='IPv4', id='55569f1b-741d-462f-884b-ad2ebdc3909e', updated_at='2022-04-29T09:29:56Z' |
| stateful        | True                                                                                                                                                  |
| tags            | []                                                                                                                                                    |
| updated_at      | 2022-04-29T09:29:56Z                                                                                                                                  |
+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+

$ openstack security group list
+--------------------------------------+-----------------+------------------------+----------------------------------+------+
| ID                                   | Name            | Description            | Project                          | Tags |
+--------------------------------------+-----------------+------------------------+----------------------------------+------+
| 2939d735-3ad4-45c0-8b34-30cf0b9072cf | mysecuritygroup | mysecuritygroup        | 4fa457c670214d48ad69f829a62b545d | []   |
| f8006170-07f0-4e0d-8a8b-97d82ff28d15 | default         | Default security group | 4fa457c670214d48ad69f829a62b545d | []   |
+--------------------------------------+-----------------+------------------------+----------------------------------+------+

セキュリティグループにSSH接続を許可するルールを追加する。

$ openstack security group rule create --remote-ip 0.0.0.0/0 --dst-port 22:22 --protocol tcp --ingress mysecuritygroup
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| created_at              | 2022-04-29T09:36:08Z                 |
| description             |                                      |
| direction               | ingress                              |
| ether_type              | IPv4                                 |
| id                      | 1a5a873a-7b2a-418f-873c-2aeb074f33f9 |
| name                    | None                                 |
| port_range_max          | 22                                   |
| port_range_min          | 22                                   |
| project_id              | 4fa457c670214d48ad69f829a62b545d     |
| protocol                | tcp                                  |
| remote_address_group_id | None                                 |
| remote_group_id         | None                                 |
| remote_ip_prefix        | 0.0.0.0/0                            |
| revision_number         | 0                                    |
| security_group_id       | 2939d735-3ad4-45c0-8b34-30cf0b9072cf |
| tags                    | []                                   |
| updated_at              | 2022-04-29T09:36:08Z                 |
+-------------------------+--------------------------------------+

$ openstack security group rule list mysecuritygroup
+--------------------------------------+-------------+-----------+-----------+------------+-----------+-----------------------+----------------------+
| ID                                   | IP Protocol | Ethertype | IP Range  | Port Range | Direction | Remote Security Group | Remote Address Group |
+--------------------------------------+-------------+-----------+-----------+------------+-----------+-----------------------+----------------------+
| 1a5a873a-7b2a-418f-873c-2aeb074f33f9 | tcp         | IPv4      | 0.0.0.0/0 | 22:22      | ingress   | None                  | None                 |
| 33bd2b3a-f61e-431a-95f6-d7af0aaff667 | None        | IPv6      | ::/0      |            | egress    | None                  | None                 |
| 55569f1b-741d-462f-884b-ad2ebdc3909e | None        | IPv4      | 0.0.0.0/0 |            | egress    | None                  | None                 |
+--------------------------------------+-------------+-----------+-----------+------------+-----------+-----------------------+----------------------+

ダッシュボードでもセキュリティグループとルールが作成できる。
Project / Network / Security Groups

インスタンスにセキュリティグループを割り当てる。

$ openstack server add security group myinstance-1 mysecuritygroup

ダッシュボードでもこの操作ができる。
Project / Compute / Instances → ActionのEdit Security Group

ホストからSSHで接続

インスタンスを作成するとき、mykeypairを割り当てている。
mykeypairを作成したときに生成された秘密鍵を使い、SSHで接続する。

$ chmod 0400 mykeypair.pem

$ IP=$(openstack floating ip list | tail -n 2 | head -n 1 | awk '{print $4}')
$ echo $IP
10.20.20.90

$ ssh -i mykeypair.pem -o StrictHostKeyChecking=no ubuntu@$IP
Warning: Permanently added '10.20.20.90' (ED25519) to the list of known hosts.
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-1004-kvm x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri Apr 29 10:03:37 UTC 2022

  System load:  0.15380859375     Processes:             68
  Usage of /:   13.5% of 9.52GB   Users logged in:       0
  Memory usage: 15%               IPv4 address for ens3: 192.168.0.190
  Swap usage:   0%

0 updates can be applied immediately.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

$ resolvectl status
Global
       Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub

Link 2 (ens3)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.110.2
       DNS Servers: 192.168.110.2
        DNS Domain: hogeserver.hogeddns.jp

SSHで接続ができた。ただ、この状態でpingが到達するのは、ホストまでだった。インターネットに接続することもできない。
これは、後で解決していく。

インスタンスの削除

チュートリアルでは、インスタンスの削除方法を教えてくれている。
同じようなやり方で、サブネットやフローティングIPアドレスを削除することができるので、練習だなーと。

$ openstack server delete myinstance-2

$ openstack server list
+--------------------------------------+--------------+--------+--------------------------------------+-------+----------+
| ID                                   | Name         | Status | Networks                             | Image | Flavor   |
+--------------------------------------+--------------+--------+--------------------------------------+-------+----------+
| a98e237a-d8d9-4546-9703-4f3f63f74031 | myinstance-1 | ACTIVE | mynetwork=10.20.20.90, 192.168.0.190 | 22.04 | myflavor |
+--------------------------------------+--------------+--------+--------------------------------------+-------+----------+

ダッシュボードでもこの操作ができる。
Project / Compute / Instances → ActionのDelete Instance

テーマ:ネットワーク

チュートリアルでできあがったネットワークと機器の構成は以下だったが、myinstance-1からホームラボのゲートウェイに行くことができなかった。

   The internet
    │
┌───┴────┐┌────────┐
│Homelab Gateway ││Homelab DNS     │
│192.168.110.1   |│192.168.110.2   |
└───┬────┘└───┬────┘
    ├─────────┴──…
┌───┴────┐
│192.168.110.6   | ↑↑↑  Homelab Network  ↑↑↑
│OpenStack Host  │
│10.20.20.1      | ↓↓↓ OpenStack Network ↓↓↓↓
└───┬────┘
    ├───────────────────┬──…
┌───┴────┐          ┌───┴────┐
│10.20.20.100    |          │10.20.20.223    |
│myrouter        │          │test-router     │
│192.168.0.1     |          │192.168.222.1   |
└───┬────┘          └───┬────┘
    ├─────────┬──…      ├──…
┌───┴────┐┌───┴────┐┌───┴────┐
│[ 10.20.20.90  ]|│[              ]|│[ 10.20.20.48  ]|
│192.168.0.190   |│192.168.0.132   |│192.168.222.72  |
│myinstance-1    ││myinstance-2    ││test(CirrOS)    │
└────────┘└────────┘└────────┘

※[ ]括弧内はフローティングIPアドレス。

pingがタイムアウト

まず、疎通を確認しようと思ったのだけれども、myinstance-1からmyrouterにpingしてもタイムアウトする。
なるほど、そこからですか…ということで、セキュリティグループのdefaultでICMPの受信を許可する。
(練習なんだし、pingぐらいバシバシやるでしょ、という発想)

$ openstack security group rule create --ingress --remote-ip 0.0.0.0/0 --protocol icmp default
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| created_at              | 2022-04-30T10:40:37Z                 |
| description             |                                      |
| direction               | ingress                              |
| ether_type              | IPv4                                 |
| id                      | 1ac99a98-d893-479f-ae6d-5f94e599b5ac |
| name                    | None                                 |
| port_range_max          | None                                 |
| port_range_min          | None                                 |
| project_id              | 4fa457c670214d48ad69f829a62b545d     |
| protocol                | icmp                                 |
| remote_address_group_id | None                                 |
| remote_group_id         | None                                 |
| remote_ip_prefix        | 0.0.0.0/0                            |
| revision_number         | 0                                    |
| security_group_id       | f8006170-07f0-4e0d-8a8b-97d82ff28d15 |
| tags                    | []                                   |
| updated_at              | 2022-04-30T10:40:37Z                 |
+-------------------------+--------------------------------------+

この操作で、OpenStackのネットワークすべてのIPアドレスに対して、pingで疎通確認ができるようになった。
でもまだ、ホームラボのゲートウェイには届かない。

LANとの関係を整理する(ルーティング)

結論からすると、この節ではホストをルーターにしている。

完成図。

   The internet
    │
┌───┴────┐┌────────┐
│Homelab Gateway ││Homelab DNS     │
│192.168.110.1   |│192.168.110.2   |
└───┬────┘└───┬────┘
    ├─────────┴──…
┌───┴────┐
│192.168.110.6   ├┐ ↑↑↑  Homelab Network  ↑↑↑
│OpenStack Host  │ Forward 
│10.20.20.1      ├ ↓↓↓ OpenStack Network ↓↓↓↓
└───┬────┘
    ├───────────────────┬──…
┌───┴────┐          ┌───┴────┐
│10.20.20.100    |          │10.20.20.223    |
│myrouter        │          │test-router     │
│192.168.0.1     |          │192.168.222.1   |
└───┬────┘          └───┬────┘
    ├─────────┬──…      ├──…
┌───┴────┐┌───┴────┐┌───┴────┐
│[ 10.20.20.90  ]|│[              ]|│[ 10.20.20.48  ]|
│192.168.0.190   |│192.168.0.132   |│192.168.222.72  |
│myinstance-1    ││myinstance-2    ││test(CirrOS)    │
└────────┘└────────┘└────────┘

※[ ]括弧内はフローティングIPアドレス。

ホストのLAN側のネットワークと、OpenStackのexternalのネットワークの間のパケットが転送されていない。
そこで、以下の転送設定を試してみたところ、myinstance-1からホームラボのゲートウェイ、その先のインターネットにアクセスができるようになった。

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo iptables -t nat -A POSTROUTING -s 10.20.20.0/24 ! -d 10.20.20.0/24 -j MASQUERADE

恒久対策とする場合…現状、ホストもファイアウォールで保護をしていないことを踏まえて、UFWで実装してみる。
細かいところは、過去記事を見ていただければと

パケットの転送を許可。
/etc/ufw/sysctl.conf

<omit>
# Uncomment this to allow this host to route packets between interfaces
net/ipv4/ip_forward=1              ← コメントになっているのを有効にする。
net/ipv6/conf/default/forwarding=1 ← 将来的にはIPv6もやるかも。
net/ipv6/conf/all/forwarding=1     ← 〃
<omit>

転送ルールを設定。ファイルの最後に追加する。
/etc/ufw/before.rules

<omit>
# NAT rules
*nat
:POSTROUTING ACCEPT
-F
-A POSTROUTING -s 10.20.20.0/24 ! -d 10.20.20.0/24 -j MASQUERADE
COMMIT

※IPv6を色々するなら、before6.rules。今回はパス。

ホストにブロックログが延々と出るようになり、それがsyslogに出力される。
ちょっと嫌なので、以下を設定しておく。
/etc/rsyslog.d/20-ufw.conf

<omit>
& stop ← コメントになっているのを有効にする。

反映。

$ sudo systemctl restart rsyslog

元々、ファイアウォールの設定をしていなかった訳なので…ローカルネットワークからのアクセスを全部解放して、UFWを有効化。

$ sudo ufw allow to any from 192.168.110.0/24 comment "LAN"
$ sudo ufw route allow in on br-ex out on ens33
$ sudo ufw route allow in on ens33 out on br-ex
$ sudo ufw enable

1行目でLANからのアクセスをすべて許容しているが、これを細かく設定すれば、ホストがより安全になる。
2~3行目でbr-exとens33の相互に転送を許可しているが、これはUFWの転送ポリシーがDROPとなっていて、転送がブロックされるため。

設定の結果はこうなる。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Anywhere                   ALLOW       192.168.0.0/16             # LAN

Anywhere on ens33          ALLOW FWD   Anywhere on br-ex
Anywhere on br-ex          ALLOW FWD   Anywhere on ens33
Anywhere (v6) on ens33     ALLOW FWD   Anywhere (v6) on br-ex
Anywhere (v6) on br-ex     ALLOW FWD   Anywhere (v6) on ens33

これで、恒久的にホストがルーターとして動作できるようになった。
早速、ホストからmyinstance-1に接続して試してみる。

$ ssh -i mykeypair.pem -o StrictHostKeyChecking=no ubuntu@$IP

※$IPはmyinstance-1に割り当てたフローティングIPアドレス。

$ ping 192.168.110.1 -c 4
PING 192.168.110.1 (192.168.110.1) 56(84) bytes of data.
64 bytes from 192.168.110.1: icmp_seq=1 ttl=62 time=2.82 ms
64 bytes from 192.168.110.1: icmp_seq=2 ttl=62 time=2.40 ms
64 bytes from 192.168.110.1: icmp_seq=3 ttl=62 time=1.11 ms
64 bytes from 192.168.110.1: icmp_seq=4 ttl=62 time=1.47 ms

--- 192.168.110.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 1.106/1.950/2.822/0.690 ms

$ dig rohhie.net +short
192.168.110.33

さて、LANにある他の端末からmyinstance-1にSSHするにはどうしたらいいのか。
10.20.20.0/24に向かうパケットのゲートウェイをOpenStackのホスト(192.168.110.6)にする。

他の端末(Ubuntu 22.04)の /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:
      addresses:
      - 192.168.110.5/24
      routes:
        - to: default
          via: 192.168.110.1
        - to: 10.20.20.0/24
          via: 192.168.110.6
      nameservers:
        addresses:
        - 192.168.110.2
        search:
        - hogeserver.hogeddns.jp
  version: 2

$ sudo netplan apply

これで、pingによる疎通確認もできるようになったし、SSH接続もできた。

LANとの関係を整理する(外部ネットワーク)

前の節では、ホームラボネットワークとOpenStackの双方で通信ができるように、ホストがルーターとして振る舞うように設定した。
でも、ホームラボではネットワークを分けていないし、ルーターもインターネットサービスプロバイダから貸与されているもので、あんまり複雑な動きをさせたくない…ということで、externalのサブネットexternal-subnetを物理ネットワークと同じセグメントに設定したい。

完成図はこちら。

   The internet
    │
┌───┴────┐┌────────┐
│Homelab Gateway ││Homelab DNS     │
│192.168.110.1   |│192.168.110.2   |
└───┬────┘└───┬────┘
    ├─────────┴──…
┌───┴────┐
│IP Addres なし  │
│OpenStack Host  │
│192.168.110.6   ├┐ bridge  ↑↑↑  Homelab Network  ↑↑↑
│10.20.20.1      ├┘        ↓↓↓ OpenStack Network ↓↓↓↓
└───┬────┘
    ├─────────┬─────────┬─────────┬──…
┌───┴────┐┌───┴────┐┌───┴────┐┌───┴────┐
│192.168.110.163 ││[192.168.110.132] │192.168.110.203 ││[192.168.110.242]
│myrouter        ││myinstance-1    |│test-router     |│test(CirrOS)    |
│192.168.0.1     |│192.168.0.190   ││192.168.222.1   ││192.168.222.72  |
└───┬────┘└───┬────┘└───┬────┘└───┬────┘
    └─────────┘         └─────────┘

※[ ]括弧内はフローティングIPアドレス。

MicroStackで作成するOpenStack環境では、ホストに設定されるIPアドレス(10.20.20.1)やネットワーク(10.20.20.0/24)が固定されており、変更することができないそうだ。
そこで、こちらで教えてくれた方法で回避する。
Rod's Connection Strings / OpenStack Single-Node (MicroStack)

手順は長くなっているけれど、できること、できないことをメモしながらなのでご容赦。

ネットワークを作成する…が失敗。1つの環境に複数のflatなネットワークは作成できないようだった。

$ openstack network create --external --provider-network-type flat --provider-physical-network physnet1 external-mylan
Error while executing command: ConflictException: 409, Unable to create the flat network. Physical network physnet1 is in use.

$ openstack network show external
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2022-04-28T13:17:25Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | 2594abce-f895-4bef-bafd-e72c00ecb6ef |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | False                                |
| is_vlan_transparent       | None                                 |
| mtu                       | 1500                                 |
| name                      | external                             |
| port_security_enabled     | True                                 |
| project_id                | 128baab4a6144d6d9cfe6cd9ac03fd8f     |
| provider:network_type     | flat                                 |
| provider:physical_network | physnet1                             |
| provider:segmentation_id  | None                                 |
| qos_policy_id             | None                                 |
| revision_number           | 4                                    |
| router:external           | External                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   | 9e60d81a-950b-4171-b909-4fb1b198c2dc |
| tags                      |                                      |
| updated_at                | 2022-05-01T20:47:53Z                 |
+---------------------------+--------------------------------------+

ということで、ネットワークexternalをそのまま使うことにして、external-subnetをどうにかする。
CIDRの書き換えはできないようなので、作り直す方向。

$ openstack subnet show external-subnet
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| allocation_pools     | 10.20.20.2-10.20.20.254              |
| cidr                 | 10.20.20.0/24                        |
| created_at           | 2022-04-28T13:17:32Z                 |
| description          |                                      |
| dns_nameservers      |                                      |
| dns_publish_fixed_ip | None                                 |
| enable_dhcp          | False                                |
| gateway_ip           | 10.20.20.1                           |
| host_routes          |                                      |
| id                   | 9e60d81a-950b-4171-b909-4fb1b198c2dc |
| ip_version           | 4                                    |
| ipv6_address_mode    | None                                 |
| ipv6_ra_mode         | None                                 |
| name                 | external-subnet                      |
| network_id           | 2594abce-f895-4bef-bafd-e72c00ecb6ef |
| project_id           | 128baab4a6144d6d9cfe6cd9ac03fd8f     |
| revision_number      | 0                                    |
| segment_id           | None                                 |
| service_types        |                                      |
| subnetpool_id        | None                                 |
| tags                 |                                      |
| updated_at           | 2022-04-28T13:17:32Z                 |
+----------------------+--------------------------------------+

$ openstack subnet delete external-subnet
Failed to delete subnet with name or ID 'external-subnet': ConflictException: 409: Client Error for url: https://192.168.110.6:9696/v2.0/subnets/9e60d81a-950b-4171-b909-4fb1b198c2dc, Unable to complete operation on subnet 9e60d81a-950b-4171-b909-4fb1b198c2dc: One or more ports have an IP allocation from this subnet.
1 of 1 subnets failed to delete.

ところが、IPアドレスが払い出されているとサブネットは削除できないようだ。
ぶら下がっているルーター2つ(test-router, myrouter)のexternalへの接続を切ってみよう。

# ドメインmydomainのadminになる
$ source mydomain-admin-openrc.sh
Please enter your OpenStack Password for project myproject as user admin: admin

# Floating IP Addressの一覧
$ openstack floating ip list
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
| ID                                   | Floating IP Address | Fixed IP Address | Port                                 | Floating Network                     | Project                          |
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
| 389794e6-2931-4303-a7ab-c4b78298d6a8 | 10.20.20.79         | 192.168.0.103    | cf9db7cd-a7c2-4cab-a7a7-7109bcce5a33 | 2a2469bc-3ab2-4684-8cfa-4252f8ca2d58 | 416bc83215a9453fb9e4b822413b81c1 |
| e0e6f4c9-a353-4dd0-85a5-43f297d98608 | 10.20.20.85         | 192.168.222.228  | f21fa518-9008-48bd-94bf-163846e5d970 | 2a2469bc-3ab2-4684-8cfa-4252f8ca2d58 | cf19ae0f87b34f6f8a731f862511a9e4 |
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+

# CirrOsのテストインスタンスに割り当てられているフローティングIPアドレスを削除して、ルーターの接続を解除
$ openstack floating ip delete 10.20.20.85
$ openstack router unset --external-gateway test-router

# Ubuntu 22.04のインスタンスに割り当てられているフローティングIPアドレスを削除して、ルーターの接続を解除
$ openstack floating ip delete 10.20.20.79
$ openstack router unset --external-gateway myrouter

改めて、external-subnetを削除。

$ openstack subnet delete external-subnet

external-subnetをホームラボのネットワークと同じにして作成。

$ openstack subnet create --network external --subnet-range 192.168.0.0/24 --gateway 192.168.110.1 --allocation-pool start=192.168.110.128,end=192.168.110.254 --dns-nameserver 192.168.110.2 --dns-nameserver 192.168.110.1 external-subnet
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| allocation_pools     | 192.168.110.128-192.168.110.254      |
| cidr                 | 192.168.0.0/16                       |
| created_at           | 2022-05-01T22:54:58Z                 |
| description          |                                      |
| dns_nameservers      | 192.168.110.1, 192.168.110.2         | ※表示順序が変わっているが、中に入ってみると192.168.110.2がリゾルバになっていた。
| dns_publish_fixed_ip | None                                 |
| enable_dhcp          | True                                 |
| gateway_ip           | 192.168.110.1                        |
| host_routes          |                                      |
| id                   | b3e4e025-7d11-430f-9997-d11c4ec5702a |
| ip_version           | 4                                    |
| ipv6_address_mode    | None                                 |
| ipv6_ra_mode         | None                                 |
| name                 | external-subnet                      |
| network_id           | 2594abce-f895-4bef-bafd-e72c00ecb6ef |
| project_id           | 4fa457c670214d48ad69f829a62b545d     |
| revision_number      | 0                                    |
| segment_id           | None                                 |
| service_types        |                                      |
| subnetpool_id        | None                                 |
| tags                 |                                      |
| updated_at           | 2022-05-01T22:54:58Z                 |
+----------------------+--------------------------------------+

ルーターを接続する。

$ openstack router set --external-gateway external myrouter
$ openstack router set --external-gateway external test-router

フローティングIPアドレスを払い出す。

$ openstack floating ip create external
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| created_at          | 2022-05-01T23:56:22Z                 |
| description         |                                      |
| dns_domain          | None                                 |
| dns_name            | None                                 |
| fixed_ip_address    | None                                 |
| floating_ip_address | 192.168.110.132                      |
| floating_network_id | 2594abce-f895-4bef-bafd-e72c00ecb6ef |
| id                  | 2a00e836-a4c4-4482-911a-17fe81374ebc |
| name                | 192.168.110.132                      |
| port_details        | None                                 |
| port_id             | None                                 |
| project_id          | 4fa457c670214d48ad69f829a62b545d     |
| qos_policy_id       | None                                 |
| revision_number     | 0                                    |
| router_id           | None                                 |
| status              | DOWN                                 |
| subnet_id           | None                                 |
| tags                | []                                   |
| updated_at          | 2022-05-01T23:56:22Z                 |
+---------------------+--------------------------------------+

ついでに、test(CirrOS)用にも払い出し。192.168.110.242

※環境によって、払い出されるフローティングIPアドレスは違うので注意。

myinstance-1にフローティングIPアドレスを割り当てる。

$ openstack server add floating ip myinstance-1 192.168.110.132
$ openstack server add floating ip myinstance-1 192.168.110.242

ここまでやってみたけれども、br-exに割り当てられたIPアドレスが変わらない。
個別にサービスを再起動してみたけれども変わらないので、microstack自体を再起動してみた。

$ sudo snap restart microstack

※実行の必要がない…

かなり時間が掛かった。しかし、これでも尚、変わらない。
どうやら、MicroStackは10.20.20.0/24をハードコーディングしているらしく、ウィッシュリストにこれが載っていた。
Launchpad / MicroStack / IP addresses of the subnet attached to the external network are hard-coded

この報告の参照先で、br-exとens33をブリッジで接続し、ens33のIPアドレスをクリア、br-exにホストのIPアドレスを割り当てる、と教えてくれた。
Rod's Connection Strings / OpenStack Single-Node (MicroStack)

$ sudo microstack.ovs-vsctl add-port br-ex ens33

$ sudo ip addr flush dev ens33
$ sudo ip addr add 192.168.110.6/24 dev br-ex
$ sudo ip link set br-ex up

※SSH接続が切れてしまうので、2~4行目はセミコロン等でつなげて実行する。

myinstance-1を起動して、SSHで接続してみる。

$ openstack server start myinstance-1
$ ssh -i mykeypair.pem -o StrictHostKeyChecking=no ubuntu@192.168.110.132
$ dig rohhie.net +short ← ローカルにあるDNSサーバーに問い合わせてみる
192.168.110.33

$ ping rohhie.net -c 4
PING rohhie.net (192.168.110.33) 56(84) bytes of data.
64 bytes from 192.168.110.33 (192.168.110.33): icmp_seq=1 ttl=63 time=6.28 ms
64 bytes from 192.168.110.33 (192.168.110.33): icmp_seq=2 ttl=63 time=1.70 ms
64 bytes from 192.168.110.33 (192.168.110.33): icmp_seq=3 ttl=63 time=0.880 ms
64 bytes from 192.168.110.33 (192.168.110.33): icmp_seq=4 ttl=63 time=0.824 ms

--- rohhie.net ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 0.824/2.421/6.283/2.256 ms

つながった。他の端末からSSHで接続もできた。

恒久対策にする方法も教えてくれていて…

/usr/local/bin/microstack-br-workaround ※新規作成

#!/bin/bash

#microstack.ovs-vsctl add-port br-ex ens33 ← 既に実行されている前提
ip addr flush dev ens33
ip addr add 192.168.110.6/24 dev br-ex
ip link set br-ex up

Rod's Connection Strings / OpenStack Single-Node (MicroStack)より引用。

実行権を付ける。

$ sudo chmod +x /usr/local/bin/microstack-br-workaround

これを、Microstackのexternal-bridge.serviceの後に実行するように仕掛ける。
/etc/systemd/system/microstack-bk-workaround.service ※新規作成

[Unit]
Description=Microstack bridge workaround
Requires=snap.microstack.external-bridge.service
After=snap.microstack.external-bridge.service

[Service]
ExecStart=/usr/local/bin/microstack-br-workaround
SyslogIdentifier=microstack-br-workaround
Restart=no
WorkingDirectory=/usr/local/bin
TimeoutStopSec=30
Type=oneshot

[Install]
WantedBy=multi-user.target

Rod's Connection Strings / OpenStack Single-Node (MicroStack)より引用。

サービスを有効化する。

$ sudo systemctl daemon-reload
$ sudo systemctl enable microstack-bk-workaround

ホストを再起動して動作を確かめる。

Search Domainの変更

microstack initを実行する前に、以下のコマンドを実行しておく。

$ sudo snap set microstack config.network.dns-domain=hogeserver.hogeddns.jp.

そうそう変更するものでもないと思うけれど、これを変更する他の方法がどうやっても見つからなかった。

myinstance-1にSSHで接続し、Search Domainを確認したら、microstack.exampleだった。

$ resolvectl status
Global
       Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub

Link 2 (ens3)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.110.2
       DNS Servers: 192.168.110.2
        DNS Domain: microstack.example

これを変更しようと思ったが、エラーが発生する。

$ openstack network set --dns-domain hogeserver.hogeddns.jp mynetwork
No Extension found for dns-integration

この値をどこで設定しているのかと探してみたところ、ここにファイルがあったけれど、変更しても書き込むことができなかった。
/snap/microstack/current/bin/set-default-config.py

31行目
        'config.network.dns-domain': 'microstack.example.',

ココにもそれっぽい値があったが、変更してみても、変化はなかった。
/var/snap/microstack/common/etc/neutron/neutron.conf.d/neutron-snap.conf

12行目
dns_domain = microstack.example.

こ、これは!?
Canonical / Microstack / Kernel tweaks
/var/snap/microstack/common/etc/neutron/dhcp_agent.iniの中でdhcp_domainで設定できそうだったのだけれども、前のバージョンで削除されてしまったようだ。
OpenStack / dhcp_agent.ini

neutron.confで設定しているようだから、これを編集する方法を探したけれども、ファイルが更新できない。
Lanchpad / Microstack / can not edit the neutron.conf file for configuring OpenDaylight with openstack
ユニークなファイルを置いてdns_domain指定してみたけれども、結局変更できなかった。

任意のIPアドレス

適当なIPアドレスが割り当てられ、インスタンスが存在する限り同じIPアドレスが使われ続けるのは便利。
でも、この装置にはこの番号を割り当てたい、という場合もあろうかと。たとえば、スナップショットから環境を復元する場合なんかは、IPアドレスも元に戻したいだろうなぁと。

フローティングIPアドレスは、作成するときにパラメーターで指定ができた。

$ openstack floating ip create --floating-ip-address 10.20.20.180 external
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| created_at          | 2022-05-05T22:40:19Z                 |
| description         |                                      |
| dns_domain          | None                                 |
| dns_name            | None                                 |
| fixed_ip_address    | None                                 |
| floating_ip_address | 10.20.20.180                         |
| floating_network_id | 66bdc2fc-dd85-44a9-9722-d63cb97f3b75 |
| id                  | 9dfd17b7-4bf3-4470-8849-6f6de75c06c1 |
| name                | 10.20.20.180                         |
| port_details        | None                                 |
| port_id             | None                                 |
| project_id          | 5065ae27a2ef46b6908399c66f6188d2     |
| qos_policy_id       | None                                 |
| revision_number     | 0                                    |
| router_id           | None                                 |
| status              | DOWN                                 |
| subnet_id           | None                                 |
| tags                | []                                   |
| updated_at          | 2022-05-05T22:40:19Z                 |
+---------------------+--------------------------------------+

インスタンスに割り当てられるIPアドレスを決めたいときは、ネットワークにポートを作る。
ポートにはIPアドレスが割り当てられる。

$ openstack port create --network mynetwork --fixed-ip subnet=mysubnet,ip-address=192.168.0.180 myport
+-------------------------+------------------------------------------------------------------------------+
| Field                   | Value                                                                        |
+-------------------------+------------------------------------------------------------------------------+
| admin_state_up          | UP                                                                           |
| allowed_address_pairs   |                                                                              |
| binding_host_id         | None                                                                         |
| binding_profile         | None                                                                         |
| binding_vif_details     | None                                                                         |
| binding_vif_type        | None                                                                         |
| binding_vnic_type       | normal                                                                       |
| created_at              | 2022-05-05T23:06:57Z                                                         |
| data_plane_status       | None                                                                         |
| description             |                                                                              |
| device_id               |                                                                              |
| device_owner            |                                                                              |
| device_profile          | None                                                                         |
| dns_assignment          | None                                                                         |
| dns_domain              | None                                                                         |
| dns_name                | None                                                                         |
| extra_dhcp_opts         |                                                                              |
| fixed_ips               | ip_address='192.168.0.180', subnet_id='48f290d4-c782-42e0-b1db-86a73aaa7558' |
| id                      | bc03dde9-5adf-46d0-8267-a731e8111ee6                                         |
| ip_allocation           | None                                                                         |
| mac_address             | fa:16:3e:c9:4f:92                                                            |
| name                    | myport                                                                       |
| network_id              | 9e911694-b1fa-4dc3-8eea-73baf99d3452                                         |
| numa_affinity_policy    | None                                                                         |
| port_security_enabled   | True                                                                         |
| project_id              | 5065ae27a2ef46b6908399c66f6188d2                                             |
| propagate_uplink_status | None                                                                         |
| qos_network_policy_id   | None                                                                         |
| qos_policy_id           | None                                                                         |
| resource_request        | None                                                                         |
| revision_number         | 1                                                                            |
| security_group_ids      | 9ea2feed-415e-4918-80fc-a5142a59232d                                         |
| status                  | DOWN                                                                         |
| tags                    |                                                                              |
| trunk_details           | None                                                                         |
| updated_at              | 2022-05-05T23:06:58Z                                                         |
+-------------------------+------------------------------------------------------------------------------+

インスタンスを作成するときに、このポートを指定する。
そして、フローティングIPアドレスを割り当てる。

$ openstack server create --flavor myflavor --image 22.04img --port myport --key-name mykeypair kantan
$ openstack server add floating ip kantan 10.20.20.180
$ openstack server show kantan
+-----------------------------+----------------------------------------------------------+
| Field                       | Value                                                    |
+-----------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL                                                   |
| OS-EXT-AZ:availability_zone | nova                                                     |
| OS-EXT-STS:power_state      | Running                                                  |
| OS-EXT-STS:task_state       | None                                                     |
| OS-EXT-STS:vm_state         | active                                                   |
| OS-SRV-USG:launched_at      | 2022-05-05T23:09:47.000000                               |
| OS-SRV-USG:terminated_at    | None                                                     |
| accessIPv4                  |                                                          |
| accessIPv6                  |                                                          |
| addresses                   | mynetwork=10.20.20.180, 192.168.0.180                    |
| config_drive                |                                                          |
| created                     | 2022-05-05T23:09:28Z                                     |
| flavor                      | myflavor (ebd54468-cdcc-4abb-be4d-3fe7148f0a9c)          |
| hostId                      | cbea1bb6899489fbf36b9a5b16be5e4cdbd86113b20d6ed3f3a6d55a |
| id                          | b44d438a-a363-4a2c-9fb3-8b172246cc2f                     |
| image                       | 22.04img (cb741841-3d17-4883-9f89-da3c5552c91f)          |
| key_name                    | mykeypair                                                |
| name                        | kantan                                                   |
| progress                    | 0                                                        |
| project_id                  | 5065ae27a2ef46b6908399c66f6188d2                         |
| properties                  |                                                          |
| security_groups             | name='default'                                           |
| status                      | ACTIVE                                                   |
| updated                     | 2022-05-05T23:09:47Z                                     |
| user_id                     | 25e6c8cce37f401cb7810ad65a549349                         |
| volumes_attached            |                                                          |
+-----------------------------+----------------------------------------------------------+

思った通りのIPアドレスを割り当てることができた。

テーマ:その他の色々

インスタンスを自動起動したい

ホームラボでは時々停電が起きる。雷で電気が来なくなることもあるし、電気を使いすぎてブレーカーが落ちることもある。
そんなときに、とりあえずサーバー(PCだけど)の電源を入れれば、各種サービスが復旧する環境でないとまずい。どんな装置構成になっているのか家族に教えていない(聞きもしない)のだから。

インスタンスの自動起動については、こちらで教えてくれた。
ComputingforGeeks / How To Configure OpenStack Instances / VMs to Autostart after Nova compute reboot

どうやら、最後の起動状態を復元してくれる仕組みのようなので、最初だけ処理して落ちる…的なインスタンスを登録しておくことはできそうもない。

これをMicroStackで実行するには…と、/snap/microstack/current/etc/nova/nova.confを書き換えてみようとしたが、どういうわけか書き換えられない。
探してみると、こちらに情報があった。
Launchpad / MicroStack / Autostart instances after reboot

/var/snap/microstack/common/etc/nova/nova.conf.d/nova.conf ※新規作成

[DEFAULT]
resume_guests_state_on_host_boot = True

これで、再起動しても自動でインスタンスが起動するようになった。
ホストをタスクマネージャーで強制終了しても、ホストを起動すると、起動中だったインスタンスが自動起動してきた。

なお、教えてくれていたautostartをenableにする方法は、やってみたけれども上手くいかなかった。

  • インスタンスを起動すると、disableになってしまい、enableの状態を保持しておくことができない。
  • インスタンスが停止しているときにenableに設定しても、自動起動しない。

一応メモしておくと…インスタンスIDを調べる。

$ openstack server show myinstance-1
+-------------------------------------+----------------------------------------------------------+
| Field                               | Value                                                    |
+-------------------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig                   | MANUAL                                                   |
| OS-EXT-AZ:availability_zone         | nova                                                     |
| OS-EXT-SRV-ATTR:host                | openstack                                                |
| OS-EXT-SRV-ATTR:hypervisor_hostname | openstack                                                |
| OS-EXT-SRV-ATTR:instance_name       | instance-00000003                                        |
| OS-EXT-STS:power_state              | Running                                                  |
<omit>

インスタンスの自動起動の状態を確認したところ、無効になっている。

$ sudo microstack.virsh dominfo instance-00000003
Id:             1
Name:           instance-00000003
UUID:           a98e237a-d8d9-4546-9703-4f3f63f74031
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       217.3s
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: none
Security DOI:   0

自動起動を有効にする。

$ sudo microstack.virsh autostart instance-00000003
Domain instance-00000003 marked as autostarted

こうすることでenableにはなるけれど、インスタンスを起動するとdisableに書き換わってしまう。
このことを見ると、上手く機能させることはできそうもなかった。

ISOでインスタンスを起動したい

レスキューモードならISOから起動できるという話があった。
myinstance-1を止める。

$ openstack server stop myinstance-1

試しに、Ubuntu 22.04 desktopのISOをダウンロードしてきて、imageを作成する。

$ openstack image create --shared --disk-format iso --file ubuntu-22.04-desktop-amd64.iso ubuntu-22.04-desktop-amd64.iso
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field            | Value                                                                                                                                                              |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| container_format | bare                                                                                                                                                               |
| created_at       | 2022-05-03T04:48:48Z                                                                                                                                               |
| disk_format      | iso                                                                                                                                                                |
| file             | /v2/images/9c43935c-4380-406b-8217-1d89c41cec63/file                                                                                                               |
| id               | 9c43935c-4380-406b-8217-1d89c41cec63                                                                                                                               |
| min_disk         | 0                                                                                                                                                                  |
| min_ram          | 0                                                                                                                                                                  |
| name             | ubuntu-22.04-desktop-amd64.iso                                                                                                                                     |
| owner            | 416bc83215a9453fb9e4b822413b81c1                                                                                                                                   |
| properties       | os_hidden='False', owner_specified.openstack.md5='', owner_specified.openstack.object='images/ubuntu-22.04-desktop-amd64.iso', owner_specified.openstack.sha256='' |
| protected        | False                                                                                                                                                              |
| schema           | /v2/schemas/image                                                                                                                                                  |
| status           | queued                                                                                                                                                             |
| tags             |                                                                                                                                                                    |
| updated_at       | 2022-05-03T04:48:48Z                                                                                                                                               |
| visibility       | shared                                                                                                                                                             |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+

myinstance-1をレスキューモードにして起動。

$ openstack server rescue --image ubuntu-22.04-desktop-amd64.iso myinstance-1

ダッシュボードからインスタンスを探し、コンソールを表示させる。

おぉ、凄い!普通に操作できそうな気配。
VT-xを有効にした環境であれば、そこそこの速度で動作するので、きっとレスキューもできると思う。

ISOからボリュームを作成したい

ISOでインスタンスを起動したいと思って探していたら、このページが見つかった。でも、このページは、ISOからOSをインストールしたイメージを作る手順を指しているようだ。なんか違う、なんか違う…と思いながら作業を進めていた。
OpenStack Documentation / nova 25.0.1.dev6 / Launch an instance using ISO image
DreamHost / Launch an instance using an ISO image file with the OpenStack CLI

途中で、ISOからボリュームを作る操作があり、そこでエラーが発生した。

$ openstack volume create --size 4 --bootable ubuntu-22.04-desktop-amd64-iso
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| attachments         | []                                   |
| availability_zone   | nova                                 |
| bootable            | false                                |
| consistencygroup_id | None                                 |
| created_at          | 2022-05-02T06:57:01.000000           |
| description         | None                                 |
| encrypted           | False                                |
| id                  | 047e846d-f9e9-42da-aeae-544d60e6d73a |
| migration_status    | None                                 |
| multiattach         | False                                |
| name                | ubuntu-22.04-desktop-amd64-iso       |
| properties          |                                      |
| replication_status  | None                                 |
| size                | 4                                    |
| snapshot_id         | None                                 |
| source_volid        | None                                 |
| status              | creating                             |
| type                | __DEFAULT__                          |
| updated_at          | None                                 |
| user_id             | e93fadbf2db044989b8d8d7bf14e9775     |
+---------------------+--------------------------------------+

$ openstack volume show ubuntu-22.04-desktop-amd64-iso
これで確認したところ、statusがエラーとなっていた。

ダッシュボードで確認したところ
schedule allocate volume:Could not find any available weighted backend.
というメッセージが表示されている。

こちらをみると、インストールのところからやり直しとされている。
Launchpad / MicroStack / can not create a volume

finally it works well .thanks a lot.
1. sudo apt upgrade
2. sudo snap remove microstack (now it works)
3. sudo snap install --beta microstack
4. sudo microstack init --auto --control --setup-loop-based-cinder-lvm-backend --loop-device-file-size 50

z (yy3) wrote on 2021-05-21

こちらでは、VMwareだと失敗するという情報があったりもする。何か環境に依存する部分があるのかもしれない。
Charmhub / Microstack Cannot create volumes

ということで、再インストールし、初期化時にパラメーターを追加した。

$ sudo microstack init --auto --control --setup-loop-based-cinder-lvm-backend --loop-device-file-size 50

これで、ボリュームが作成できるようになった。

画面を直接操作したい

Ubuntuのクラウドイメージを起動しても、固まった画像が表示されるだけ。

インストール用ISOから起動したときには、画面の操作ができたのに、これは何だろう?
これはUbuntuだけで発生していて、CentOSとかだと問題ないという話も。

$ wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-2111.qcow2c
$ source mydomain-admin-openrc.sh
$ openstack image create --disk-format qcow2 --min-disk 8 --min-ram 512 --file ./CentOS-7-x86_64-GenericCloud-2111.qcow2c --public Cent7

$ source mydomain-myuser-openrc.sh
$ openstack server create --flavor myflavor --image Cent7 --network mynetwork --key-name mykeypair mycentos
$ openstack floating ip create external
$ openstack server add floating ip mycentos 10.20.20.166
$ openstack server add security group mycentos mysecuritygroup

確かに動く画面が表示された。ログインはできなかったけれど。
SSHで接続してみると、先程、ログイン画面で失敗したのが表示されている。

$ ssh -i mykeypair.pem centos@10.20.20.166
Warning: Permanently added '10.20.20.166' (ED25519) to the list of known hosts.
Last failed login: Thu May  5 10:31:16 UTC 2022 on tty1
There was 1 failed login attempt since the last successful login.
[centos@mycentos ~]$ sudo passwd centos
Changing password for user centos.
New password: centos
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: centos
passwd: all authentication tokens updated successfully.

パスワードを設定したので、改めてコンソールからログインしてみる。

確かに、普通に操作ができる。

変だと思って情報を探してみると、kvm以外のイメージを使ってごらん、と書かれている。
PROXMOX / Cannot start new VM: "GRUB_FORCE_PARTUUID set, attempting initrdless boot"

クラウドイメージを探しに行ったとき、確かにいくつか種類があったな。
Qiita / ubuntu cloud image の見分け方

チュートリアルがkvmを指していたので使っていたが、imgを使ってみよう。

$ wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img

$ source mydomain-admin-openrc.sh
$ openstack image create --disk-format qcow2 --min-disk 8 --min-ram 512 --file ./jammy-server-cloudimg-amd64.img --public 22.04img

$ source mydomain-myuser-openrc.sh
$ openstack server create --flavor myflavor --image 22.04img --network mynetwork --key-name mykeypair jammy
$ openstack floating ip create external
$ openstack server add floating ip jammy 10.20.20.88
$ openstack server add security group jammy mysecuritygroup

$ ssh -i mykeypair.pem -o StrictHostKeyChecking=no ubuntu@10.20.20.88
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-25-generic x86_64)
<omit>
$ sudo passwd ubuntu
New password: ubuntu
Retype new password: ubuntu
passwd: password updated successfully

画面は狭いけれども、ログインすることができた。

ということで、本編ではkvmを取った方のヤツを手順に入れることにした。

証明書を差し替える

ダッシュボードにアクセスすると警告されるのは、暗号化のために使われる証明書が自己署名された、いわゆるオレオレ証明書だから。
チュートリアルが、openstackコマンドに --insecure パラメーターを付けるのも、これが理由。

ホームラボで運用している認証局があるので、証明書を差し替えたいと考えた。
Add TLS OpenStack API endpoints

こちらに書かれている設定を読み出してみた。

$ sudo snap get microstack config.tls.generate-self-signed
true
$ sudo snap get microstack config.tls.cacert-path
/var/snap/microstack/common/etc/ssl/certs/cacert.pem
$ sudo snap get microstack config.tls.cert-path
/var/snap/microstack/common/etc/ssl/certs/cert.pem
$ sudo snap get microstack config.tls.key-path
/var/snap/microstack/common/etc/ssl/private/key.pem

※本編で探し出した証明書と同じだった。

これは、もしかしたら、microstack initする前に設定しておくものなのかもしれない…

$ sudo snap set microstack config.tls.generate-self-signed=false

※これをやると、ダッシュボードからログインできなくなる。

まず、現在のサーバー証明書のSubject Alternative Nameはこれ。

$ openssl x509 -text -noout -in /var/snap/microstack/common/etc/ssl/certs/cert.pem
Certificate:
    Data:
<omit>
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:TRUE, pathlen:0
            X509v3 Subject Alternative Name:
                DNS:openstack, IP Address:192.168.110.6
<omit>

これを DNS:openstack.hogeserver.hogeddns.jp, IP Address:192.168.110.6 に変更したサーバー証明書を作成する。

なお、このIPアドレスを入れておくことは重要。
内部的には、このIPアドレスを使ってサービス間のやりとりがなされているので、IPアドレスが入っていないと、エラーが発生し続ける。

2022-05-04 21:25:55.929 104871 ERROR nova keystoneauth1.exceptions.connection.SSLError: SSL exception connecting to https://192.168.110.6:5000/v3/auth/tokens: HTTPSConnectionPool(host='192.168.110.6', port=5000): Max retries exceeded with url: /v3/auth/tokens (Caused by SSLError(SSLCertVerificationError("hostname '192.168.110.6' doesn't match either of 'hogeserver.hogeddns.jp', '*.hogeserver.hogeddns.jp'")))

この参照方法を修正することも考えたけれども、ホスト名にすると、名前解決ができなければならず、1.1.1.1(Cloudflare)に聞きに行っても、hogeserverなんて解決できるはずもないから。

何か起きたときのために、現在の証明書は待避しておく。

$ sudo mv /var/snap/microstack/common/etc/ssl/certs/cacert.pem /var/snap/microstack/common/etc/ssl/certs/cacert.pem.org
$ sudo mv /var/snap/microstack/common/etc/ssl/certs/cert.pem /var/snap/microstack/common/etc/ssl/certs/cert.pem.org
$ sudo mv /var/snap/microstack/common/etc/ssl/private/key.pem /var/snap/microstack/common/etc/ssl/private/key.pem.org

以下の証明書を配置する。

ファイル名内容
/var/snap/microstack/common/etc/ssl/certs/cacert.pemホームラボの認証局証明書。
/var/snap/microstack/common/etc/ssl/certs/cert.pemホームラボの認証局が署名したサーバー証明書。
/var/snap/microstack/common/etc/ssl/private/key.pemサーバー証明書のCSRを作成すると同時に生成した秘密鍵。パスフレーズはなくしておく。

操作しているメインPC(Windows 10)
既に、ホームラボのCA証明書が「信頼されたルート証明機関」として登録されている。
 https://192.168.110.6
 https://openstack.hogeserver.hogeddns.jp
のいずれでアクセスしても、安全表示になる。

ホスト
cacert.pemを所定の場所に openstack-ca.crt という名前で保管して、信頼する認証局を登録する。
この先でOpenStack Command Line Clientを利用するときに、--insecureパラメーターなしでコマンド実行が可能になる

$ sudo cp /var/snap/microstack/common/etc/ssl/certs/cacert.pem /usr/local/share/ca-certificates/hoge-ca.crt
$ sudo update-ca-certificates

準備ができたら、MicroStackを再起動。

$ sudo snap restart microstack

上手く差し替えができていれば、ダッシュボードからサインインできる(と思う)。
上手くいかないときは、大概ダッシュボードに入れずに詰むので、早い段階で設定しておくのが良いのかなと。

アンインストール

Microstackを再インストールする必要があって、一旦アンインストールしたのだけれど、ディスクの容量があまり減らなかったような…

アンインストール前。

$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              2.4G  1.9M  2.4G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   97G   73G   20G  79% /
tmpfs                               12G     0   12G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  126M  1.7G   7% /boot
/dev/sda1                          1.1G  5.3M  1.1G   1% /boot/efi
tmpfs                              2.4G  4.0K  2.4G   1% /run/user/1000

アンインストール。

$ sudo snap remove --purge microstack
microstack removed

※--purge指定はしていなかった。

アンインストール後。

$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv   97G   13G   80G  14% /

アンインストール時に --purge を入れなかった場合。

$ sudo snap remove microstack ← とても時間が掛かる。gzipがCPUを使っている。

$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              2.4G  1.7M  2.4G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   97G   21G   71G  23% / ← 8GB程多い。

もしかしたら、状態を復旧できたりとか、作り込んだデーターが取り出せたりするのかもしれないが、今度の課題とする。

さいごに

まず、MicroStackはOpenStackが「動く」ところからはじめられるのが、とても良い。「動く」から、その先を色々と試してみられる。そうじゃなかったら、こんなでかいシステムを短期間で調べるのは難しい。ホントに凄いことをやる人がいるもんだなぁ。
Ubuntuの上で動くから、ウチみたいに古いPCでも動きそう。ネットワークで色々とあったけれども、やりたいことができるようになったので良し。

とはいえ、ESXiからOpenStackへの移行は簡単じゃなさそうだ。Microstackの場合は、色々とできたり、できなかったりする中で、試しながら設定していくことになるから。

他のインストール方法として、Charmed OpenStackというのもあるようだ。
Ubuntu OpenStack / Charmed OpenStack Documentation

いや、もうちょっと軽い環境を考えてみようかな。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他