尝试从头开始构建OpenStack Yoga ~Keystone篇~
你好。
我是株式会社Class Act基础设施事业部的大塚。
前几天,我使用一个名为devstack的构建工具,在Ubuntu 20.04上部署了Openstack环境进行尝试。
然而,说实话,对于上述的结构,我并不满意…
或者说,从根本上来说,我并不太喜欢像这样可以轻松部署的服务。这是因为我真的很难理解其中的工作原理和协同机制。它们都变成了黑盒子,一旦出现问题,我只能采取有限的应对措施。这并不理想。
而且,事实上,我曾经不合格地考过Openstack的认证OPCEL。我从中得到的感受是“他们确实问得很详细。依赖构建工具是不可行的。”
因此,我打算从现在开始逐步构建一个全新的Openstack环境。并且想要报仇雪恨。能否成功的问题非常令人担心,但我会尽力而为的?
硬件组成
使用词汇
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 |
+----------------------------------+--------------+