尝试从头开始构建OpenStack Yoga ~Keystone篇~

你好。
我是株式会社Class Act基础设施事业部的大塚。

前几天,我使用一个名为devstack的构建工具,在Ubuntu 20.04上部署了Openstack环境进行尝试。

 

然而,说实话,对于上述的结构,我并不满意…
或者说,从根本上来说,我并不太喜欢像这样可以轻松部署的服务。这是因为我真的很难理解其中的工作原理和协同机制。它们都变成了黑盒子,一旦出现问题,我只能采取有限的应对措施。这并不理想。
而且,事实上,我曾经不合格地考过Openstack的认证OPCEL。我从中得到的感受是“他们确实问得很详细。依赖构建工具是不可行的。”
因此,我打算从现在开始逐步构建一个全新的Openstack环境。并且想要报仇雪恨。能否成功的问题非常令人担心,但我会尽力而为的?

硬件组成

HW値CPU4sockets 4coresMemory40GBDisk100GNIC1(ens18)192.168.2.10NIC2(ens19)192.168.2.11

使用词汇

Keystone是什么意思?

Keystone 是 OpenStack 服务,通过实现 Identity API 提供 API 客户端认证、服务发现和分布式多租户认证。

 

我也问了ChatGPT小姐。

OpenStack的Keystone是OpenStack平台的核心服务之一,用于身份验证和授权服务。OpenStack是一个开源的云计算平台,用于提供和管理云计算资源(虚拟机、存储、网络等)。Keystone作为安全性和访问管理的一部分被使用。

RabbitMQ是什么

我会去问ChatGPT太太。

RabbitMQ是一种消息队列软件,是用于分布式系统和微服务架构等的消息代理服务之一。RabbitMQ提供了平台,用于在不同的应用之间异步发送和接收数据和消息。
通过使用RabbitMQ,系统可以异步运行,并提供负载均衡、可扩展性和容错性等优势。此外,它还有助于保持不同部分之间的松耦合,增强灵活性。

官方网站如下。

 

“Memcached是什么?”

我也咨询了chatGPT。

Memcached(内存缓存)是一种分布式缓存系统,主要用于提高数据库和Web应用程序的性能的开源内存缓存系统。Memcached提供快速的键值存储,有助于减轻数据库对应用程序读取和写入访问的负载。

公式网站在下面。

 

参考的网站和书籍

这个句子的中文释义为:这是官方网站和个人网站。虽然只有个人网站可能也可以,但是因为有NTP和SSL的设置,与我的环境不太合适。所以我正在比较并逐步进行搭建。

以下是对该句子的同义转述:
这有官方网站和个人网站两个选项。虽然只有个人网站可能也可以,但是由于存在不适应我环境的NTP和SSL设置,所以我在比较并逐步进行搭建。

 

亚马逊上销售的下列Openstack书籍也值得推荐。只是有点过时的问题…

 

配置等

因为我觉得只用Qiita的话,会让配置等方面变得比较难懂,所以我在后来将它们整理到GitLab上了。

 

创建

环境确认

我将验证是否支持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的更新和升级操作。
然后,暂时重新启动系统。

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、Memcached、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的配置文件。它似乎需要让它可以监听任何人,并保持一定的余力。

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的配置。
与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

执行各种重启和启用操作。

root@openstack:~# systemctl restart mariadb rabbitmq-server memcached nginx
root@openstack:~# systemctl enable mariadb rabbitmq-server memcached nginx

创建一个用于Keystone的MariaDB数据库。

请设置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 的配置文件。

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服务。
根据官方网站上的描述,我认为这是在启动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项目

通过执行source命令加载环境变量,然后执行openstack命令创建项目。输出了一个列表,并且看起来也成功创建了。

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 |
+----------------------------------+--------------+

顺便一提

key01.png
key02.png
key03.png