Openstack Yogaを1から構築してみる ~Keystone編~

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

先日、私はubuntu220.04に対してdevstackという構築ツール？を使ってOpenstackの環境をデプロイしてみました。

https://qiita.com/ohtsuka-shota/items/4af12e5411cf240252b9

ただ、正直上の構成では満足できず。。。
というか、そもそも私はこのような簡単にデプロイできるサービスみたいなのはあまり好きではありません。中で何がどうやって動いているのか、連携しているのかが本当にわかりにくいからです。ブラックボックス化されてしまい、いざという時のトラブル対応も限定的な事しかできなくなってしまうでしょう。それはあまり好ましくない。
それに、実は私はOPCELというOpenstackの資格に一度落ちた経験があり。その時に感じた事は「結構細かいところまで聞かれるんだな。構築ツールに頼っていてはダメだったな。」という事でした。
なので、今回から少しずつOpenstackの環境を1から作っていきたいと思います。そして雪辱を晴らしていきたいと思います。完走できるか非常に怖いところですが、何とか頑張ります💦

# HW構成

|HW  |値  |
|---|---|
|CPU  |4sockets 4cores |
|Memory  |40GB  |
|Disk  |100G  |
|NIC1(ens18)  |192.168.2.10  |
|NIC2(ens19)  |192.168.2.11　|


# 用語　
## Keystoneとは

>Keystone は、 OpenStack の Identity APIを実装することにより、API クライアント認証、サービス検出、分散マルチテナント認証を提供する OpenStack サービスです 。

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

chatGPTたんにも聞いてみた。

>OpenStackのKeystoneは、OpenStackプラットフォームの中核的なサービスの1つであり、認証（Authentication）および認可（Authorization）のためのサービスです。OpenStackは、クラウドコンピューティングリソース（仮想マシン、ストレージ、ネットワークなど）を提供し、管理するためのオープンソースのクラウドコンピューティングプラットフォームで、Keystoneはそのセキュリティとアクセス管理の一環として使用されます。

## RabbitMQとは

chatGPTたんに聞いてみます。
>RabbitMQは、メッセージキューイングソフトウェアの一種であり、分散システムやマイクロサービスアーキテクチャなどで使用されるメッセージブローカーサービスの一つです。RabbitMQは、異なるアプリケーション間でデータやメッセージを非同期に送受信するためのプラットフォームを提供します。
RabbitMQを使用することで、システムは非同期に動作し、負荷分散やスケーラビリティの向上、耐障害性の向上などの利点を提供します。また、異なる部分を疎結合に保ち、柔軟性を高めるためにも役立ちます。

公式サイトは以下です。

https://www.rabbitmq.com/

## Memcachedとは？

これもchatGPTに聞いてみました。
>Memcached（メモキャッシュド）は、分散キャッシュシステムの一つで、主にデータベースやウェブアプリケーションのパフォーマンス向上のために使用されるオープンソースのインメモリキャッシュシステムです。Memcachedは、高速なキー-値ストアを提供し、アプリケーションの読み取りや書き込みアクセスに対するデータベースの負荷を軽減するのに役立ちます。

公式サイトは以下です。

https://memcached.org/


# 参考にしているサイト・書籍

公式サイトと、個人様のサイトになります。
個人様のサイトだけでも良いのかもですが、NTPやSSLの設定をしていたりと私の環境とはそぐわない部分があり。なので見比べつつ構築をすすめてみてます。

https://docs.openstack.org/keystone/yoga/install/keystone-install-ubuntu.html#configure-the-apache-http-server

https://www.server-world.info/query?os=Ubuntu_22.04&p=openstack_yoga&f=2


Amazonに売っているOpenstackの下記書籍もお勧めです。少し古いのが難点ですが、、、

https://www.amazon.co.jp/OpenStack%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%8F%A4%E8%B3%80%E6%94%BF%E7%B4%94-ebook/dp/B01K9EZCOK/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=

# config等
Qiitaだけだと、config等が分かりにくいなと思ったので、後追いでGitLabにまとめています。

https://gitlab.com/SHOLAND/openstack_open/-/tree/main/Openstack%20Yoga%E3%82%921%E3%81%8B%E3%82%89%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%20Keystone%E7%B7%A8


# 構築
## 環境確認

NICとKVMに対応できるかを確認します。"egrep -c '(vmx|svm)' /proc/cpuinfo "の出力結果は0より上でないとダメです。
```
root@openstack:~# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
    inet 127.0.0.1/8 scope host lo 
       valid_lft forever preferred_lft forever 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever 
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 
    link/ether 72:ae:f7:fa:a5:d7 brd ff:ff:ff:ff:ff:ff 
    altname enp0s18 
    inet 192.168.2.10/24 brd 192.168.2.255 scope global ens18 
       valid_lft forever preferred_lft forever 
    inet6 fe80::70ae:f7ff:fefa:a5d7/64 scope link 
       valid_lft forever preferred_lft forever 
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 
    link/ether 46:e1:68:df:48:6c brd ff:ff:ff:ff:ff:ff 
    altname enp0s19 
    inet 192.168.2.11/24 brd 192.168.2.255 scope global ens19 
       valid_lft forever preferred_lft forever 
    inet6 fe80::44e1:68ff:fedf:486c/64 scope link 
       valid_lft forever preferred_lft forever

root@openstack:~# egrep -c '(vmx|svm)' /proc/cpuinfo 
32
```

aptのupdateとupgradeを行います。
その後、一応rebootをしています。
```
root@openstack:~# apt update
root@openstack:~# apt upgrade -y
root@openstack:~# apt update
root@openstack:~# reboot
```

/etc/hostsの内容です。★の部分が追加したものです。
この設定はKeystoneの設定で使います。
※たぶん普通にこの設定はしなくていいと思います。
```
root@openstack:~# cat /etc/hosts
127.0.0.1 localhost
192.168.2.10 openstack ★ 
127.0.1.1 openstack

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
```

内部的にPython3を使うようなので、インストールされているか念のため確認します。
```
root@openstack:~# python3 -V
Python 3.10.12
```

## RabbitMQ,Memchached,Nginx,MariaDBのインストールと設定
RabbitMQ, Memcached, Nginx をインストールします。
```
root@openstack:~# apt -y install rabbitmq-server memcached python3-pymysql nginx libnginx-mod-stream
```

MariaDBもインストールします。
```
root@openstack:~# apt -y install mariadb-server
```

RabbitMQ用のユーザを追加します。
rabbitmqctlなんてコマンドがあるんだなぁ～・・・
```
root@openstack:~# rabbitmqctl add_user openstack password
Adding user "openstack" ...
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.

root@openstack:~# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/" ...
```

MariaDBのconfigを編集していきます。
誰からもリッスンするようにしつつ、余力を持たせるようにしているようです。
```
root@openstack:~# cp -p /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf.org
root@openstack:~# vi /etc/mysql/mariadb.conf.d/50-server.cnf
root@openstack:~# diff /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf.org
27c27
< bind-address            = 0.0.0.0
---
> bind-address            = 127.0.0.1
40c40
< max_connections        = 500
---
> #max_connections        = 100
```

Memcachedのconfigも編集していきます。
これもMariaDBの時と同じで、誰からもリッスンするようにしています。
```
root@openstack:~# cp -p /etc/memcached.conf /etc/memcached.conf.org
root@openstack:~# vi /etc/memcached.conf
root@openstack:~# diff /etc/memcached.conf /etc/memcached.conf.org
35c35
< -l 0.0.0.0
---
> -l 127.0.0.1
```

NGINXデフォルトサイトを無効化するために以下のコマンドを流します。
```
root@openstack:~# unlink /etc/nginx/sites-enabled/default
```

色々再起動をかけたり、enable化します。
```
root@openstack:~# systemctl restart mariadb rabbitmq-server memcached nginx
root@openstack:~# systemctl enable mariadb rabbitmq-server memcached nginx
```

## MariaDBにKeystone用のデータベースを作成

MariaDBのrootユーザのパスワードを指定します。
```
root@openstack:~# mysqladmin -u root password
New password:
Confirm new password:
```

データベースを作成します。
最後にshow databases;コマンドを入力して、Keystone用のデータベースが出力されることを確認します。
```
root@openstack:~# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 33
Server version: 10.6.12-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database keystone;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> grant all privileges on keystone.* to keystone@'localhost' identified by 'password';
Query OK, 0 rows affected (0.008 sec)

MariaDB [(none)]> grant all privileges on keystone.* to keystone@'%' identified by 'password';
Query OK, 0 rows affected (0.008 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| keystone           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.001 sec)

MariaDB [(none)]> exit
Bye
```

## Keystoneのインストールと設定
Keystoneをインストールします。
```
root@openstack:~# apt -y install keystone python3-openstackclient apache2 libapache2-mod-wsgi-py3 python3-oauth2client
```

Keystone用のトークンを生成します。
```
root@openstack:~# openssl rand -hex 10
6798b79fdacad4bc4292
```

Keystoneのconfigファイルをいじっていきます
```
root@openstack:~# cp -p /etc/keystone/keystone.conf /etc/keystone/keystone.conf.org
root@openstack:~# vi /etc/keystone/keystone.conf
root@openstack:~# diff /etc/keystone/keystone.conf /etc/keystone/keystone.conf.org
15c15
< admin_token = 6798b79fdacad4bc4292
---
> #admin_token = <None>
604c604
< connection = mysql+pymysql://keystone:password@openstack/keystone
---
> connection = sqlite:////var/lib/keystone/keystone.db
2191c2191
< provider = fernet
---
> #provider = fernet
```

以下のコマンドを流します。
```
root@openstack:~# su -s /bin/bash keystone -c "keystone-manage db_sync"
```

上記のコマンドの意味をchatGPTたんに確認したところ、以下の様な回答を得ました。
参考にしていた書籍では"データベースの作成"と書いていたのですが「上で作ったやろがい！」と思って疑問でした。chatGPTの回答を鵜呑みにするならデータベースの同期をするために行ったのですかね？MariaDBのデータベースとKeystoneの内部的なデータの同期の為に行っていた…？
```
このコマンドは、特定のユーザー（`keystone`）のコンテキストで、`keystone-manage db_sync` コマンドを実行するためのものです。具体的な動作は次のようになります。

1. `su` コマンドは、別のユーザーのコンテキストでコマンドを実行するために使用されます。
2. `-s /bin/bash` オプションは、`keystone` ユーザーのログインシェルを `/bin/bash` に設定します。これにより、`keystone` ユーザーの環境が設定され、シェルのプロンプトが表示されることはありません。
3. `-c "keystone-manage db_sync"` オプションは、`keystone` ユーザーのコンテキストで実行するコマンドを指定します。この場合、`keystone-manage db_sync` コマンドが実行されます。

具体的な利用ケースとして、OpenStackのIdentity ServiceであるKeystoneのデータベースを同期化（データベーススキーマの更新）するために使用されることがあります。KeystoneはOpenStackのユーザー認証とアイデンティティ管理を担当するコンポーネントであり、データベースの同期は新しいバージョンのKeystoneを導入したり、アップグレードしたりする際に必要です。
```

fernetトークンの初期化を行う（ようです。fernetとか聞いたことなかったです。）
手順として書いているのでそのまま従ってみます。
```
root@openstack:~# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
root@openstack:~# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
```

apacheのconfigファイルを編集します。
```
root@openstack:~# cp -p /etc/apache2/apache2.conf /etc/apache2/apache2.conf.org
root@openstack:~# vi /etc/apache2/apache2.conf
root@openstack:~# diff /etc/apache2/apache2.conf /etc/apache2/apache2.conf.org
70d69
< ServerName openstack
```

IDサービスをブートします。
公式サイトにはIDサービスと書いていたため、そのまま書いていますが、Keystoneを起動しているという事かと思います。
```
root@openstack:~# keystone-manage bootstrap --bootstrap-password password \
  --bootstrap-admin-url http://openstack:5000/v3/ \
  --bootstrap-internal-url http://openstack:5000/v3/ \
  --bootstrap-public-url http://openstack:5000/v3/ \
  --bootstrap-region-id RegionOne
```

apacheを再起動します。
```
root@openstack:~# systemctl restart apache2
```

環境変数を格納しているファイルを作成します。
```
root@openstack:~# vi keystonerc
root@openstack:~# cat keystonerc
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=password
export OS_AUTH_URL=http://openstack:5000/v3
export OS_IDENTITY_API_VERSION=3
```

## openstack のprojectを作成してみる
sourceコマンドを実行して環境変数を読み込ませて、openstackコマンドを実行してprojectを作成してみます。一覧が出力され、作成も出来ていそうです。
```
root@openstack:~# chmod 600 keystonerc
root@openstack:~# source keystonerc
root@openstack ~(keystone)# echo "source ~/keystonerc " >> ~/.bashrc

root@openstack ~(keystone)# openstack project list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 5ea984608bdf4a338bddfc4e9f14bec7 | admin |
+----------------------------------+-------+
root@openstack ~(keystone)# openstack project create --domain default --description "this_is_test_project" test_project
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | this_is_test_project             |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 94f179ab12a24facaf5001a1365700c2 |
| is_domain   | False                            |
| name        | test_project                     |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+
root@openstack ~(keystone)# openstack project list
+----------------------------------+--------------+
| ID                               | Name         |
+----------------------------------+--------------+
| 5ea984608bdf4a338bddfc4e9f14bec7 | admin        |
| 94f179ab12a24facaf5001a1365700c2 | test_project |
+----------------------------------+--------------+
```


# ちなみに

Openstackの公式サイトの導線かなりわかりにくいですね。。。
Openstackの公式サイトの上にあるタブから"DOCS"を押下してみてください。
すると画面が遷移し、以下の様な画面が表示されます。画面上の方にCurrently viewingと表示があるのでその右でOpenstackのバージョンを選択出来る場所があります。
![key01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/dd5dbc9c-b2c7-0ce2-7724-306d834e9802.png)

試しに今回の構築バージョンであるYogaを選択してみると以下の様になります。
この画面になりましたら、少し下にスクロールしてみてください。インストールガイドと表示されてる場所があるので押下します。
![key02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b5e714b1-9a18-e067-9980-40a5c100a2e2.png)

すると以下の様な画面が表示されます。右側にProject installation Guidesと表示があるのが見えるかと思いますが、その下にGlanceやNova、Heat、Desinate等コンポートネントごとのリンクがあります。そのリンク先でインストール手順が閲覧出来そうです。
![key03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/fe06ad10-5544-5295-2adc-3812e361a02e.png)