3.2 KeyStone服务部署

实验架构

- 虚拟机1:控制节点
- 操作系统: CentOS 7.9
- 配置: 4 CPU,40GB+ 硬盘,8GB 内存
- 角色: 控制节点、网络节点和对象存储节点
- 虚拟机2:计算节点
- 操作系统: CentOS 7.9
- 配置: 2 CPU,40GB+ 硬盘,4GB 内存
- 角色: 计算节点、网络节点、对象存储和块存储节点
KeyStone 组件简介

假如名为 Alice 的用户想要在 OpenStack 平台上创建虚拟机,她需要先向 KeyStone 发送账号和密码进行 身份验证。KeyStone 通过验证后,会给用户 Alice 返回 证书(令牌/Token) 和访问具体服务的 端点(Endpoint),接下来用户携带证书通过端点去访问目标服务……

实验过程
1. 数据库创建和授权
在安装配置 KeyStone 前,需要先在 MariaDB 中为其创建专属数据库,并进行相应的权限配置。
连接到数据库服务器:
以 root 用户身份连接,输入在环境准备阶段设置的 MariaDB 密码。
mysql -u root -p

创建 keystone 数据库:
CREATE DATABASE keystone;

为 keystone 数据库授权:
执行以下命令,授予 keystone 用户相关权限:
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';

-
GRANT ALL PRIVILEGES- 意思是:授予所有权限。
- 也就是赋予增、删、改、查、建表、删表等几乎所有的操作能力。
-
ON keystone.*- 意思是:把权限作用在哪个地方?
- 第一个
keystone:代表是名为keystone的数据库。 .*:代表这个数据库里的所有表。
-
TO 'keystone'@'%'- 意思是:把权限给谁?
- 第二个
'keystone':代表数据库系统的用户名。 @'%':这是一个安全限制,意思是“该用户能从所有网络位置访问”。
-
IDENTIFIED BY 'keystone'- 意思是:验证身份的密码是什么?
- 第三个
'keystone':代表这个用户的密码。(在实验环境中,为了好记,通常把密码设置得和组件名字一样;在企业生产环境,这里会是一串复杂的乱码密码)。 - 特殊动作:在 MariaDB 中,如果这个用户之前不存在,加上这条
IDENTIFIED BY语句,系统会自动创建这个用户并同时设置好密码。
退出数据库:
exit

2. 安装并配置 KeyStone 组件
安装 keystone 相关软件包:
yum install openstack-keystone httpd mod_wsgi -y
修改配置文件 /etc/keystone/keystone.conf:
编辑配置文件,在相应的段落中添加或修改内容以完成配置。
在 [database] 标签下,配置数据库访问路径:
[database]
# ...
connection = mysql+pymysql://keystone:keystone@controller/keystone
在 [token] 标签下,配置 Fernet 认证的令牌提供者:
[token]
# ...
provider = fernet
同步认证服务数据库:
初始化 KeyStone 数据库表结构:
su -s /bin/sh -c "keystone-manage db_sync" keystone
验证数据库表:
检查同步是否成功,如果在返回的结果中看到了相应的表,则说明同步完成。
mysql -u keystone -p keystone -e "use keystone; show tables;"
初始化 Fernet 密钥存储库:
KeyStone 使用 Fernet 令牌来进行身份验证。我们需要先初始化这些令牌的密钥库。
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

初始化 KeyStone 服务:
现在我们将初始化 KeyStone 的核心配置,相当于创建一个“超级管理员”。
keystone-manage bootstrap --bootstrap-password admin \
--bootstrap-admin-url http://controller:5000/v3 \
--bootstrap-public-url http://controller:5000/v3 \
--bootstrap-internal-url http://controller:5000/v3 \
--bootstrap-region-id RegionOne

--bootstrap-password admin:把管理员(admin)的密码设置为admin。--bootstrap-*-url:设置身份认证服务的各个网络访问地址(端点)。--bootstrap-region-id RegionOne:指定服务所在的区域为RegionOne。
3. 配置 Apache HTTP 服务
KeyStone 默认是一个 Python 编写的 Web 应用程序,在生产环境中,我们通常使用 Apache HTTP 服务(配合 mod_wsgi)来运行它,以获得更好的性能和稳定性。
1)配置 Apache 服务器名称:
编辑 /etc/httpd/conf/httpd.conf 文件,搜索 ServerName,并将其配置为 controller 节点。
你可以直接在文件末尾添加以下内容,或者找到被注释的 ServerName 修改:
ServerName controller
2)创建 KeyStone 的虚拟主机配置文件链接:
让 Apache 知道如何处理发给 KeyStone 的请求。在 /etc/httpd/conf.d/ 目录下创建一个指向 KeyStone WSGI 配置的链接:
ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
3)启动并设置 HTTP 服务开机自启:

systemctl start <服务名>:启动服务systemctl enable <服务名>:设置服务为开机自动启动
验证状态是否为启动:

4)配置管理员环境变量:
为了方便在命令行中操作 OpenStack(不需要每次敲命令都输入长长的参数),我们将管理员的账号信息配置成临时环境变量。
直接在命令行中执行以下命令(注意:这里的密码是之前设置的 admin):
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export 命令后,当你运行 openstack 开头的命令时,系统会自动读取这些变量完成身份验证。这使得我们接下来的操作更加省力!4. 创建域、项目、用户和角色
在 OpenStack 中管理权限,就像管理一家公司:
- 域(Domain):相当于一个大集团或分公司。
- 项目(Project/Tenant):相当于公司里的部门。
- 用户(User):就是部门里的具体员工。
- 角色(Role):代表员工的职位(如经理、普通员工),决定了他们能做什么。
1)查看现有的域:
当前系统中应该已经存在一个名为 Default 的默认域。

2)创建一个新的测试域 xdxy:

3)创建一个名为 service 的项目:
在 OpenStack 中,各个独立的服务(如我们之后要安装的计算服务 Nova、网络服务 Neutron 等)都需要有自己的账号来互相通信。我们把它们统一放到 service 项目下进行统一管理。

4)创建班级与学生账号:
在实际使用云平台时,出于安全考虑,普通的操作不应该在超级管理员(root/admin)下进行。我们可以模拟创建一个学院的实训小组,用来做后面的实验练习。
创建实训小组项目 cloud_computing_group:
这就好比我们在云平台上划分出了一个叫“云计算小组”的项目。

创建学生测试账号 monitor:
我们要为刚刚的实训小组安排一个同学去操作,我们就叫他 monitor(班长)。
执行命令后,系统会提示你设置密码,为了方便实验,我们直接输入 monitor 作为密码。

创建职位角色 student:
我们需要定义一个身份标签,也就是在云平台里的“学生”身份。

将用户、角色和项目绑定在一起:
这行命令的意思是:在 lab_group(实训小组)项目中,赋予 monitor(班长)用户以 student(学生)的身份角色,这样班长就可以在小组项目里顺利开展接下来的实验了。
openstack role add student --project cloud_computing_group --user monitor


5. 验证 KeyStone 服务是否正常
接下来,我们要检查刚刚配置的 KeyStone 能不能正常发放“通行证”(令牌)。
1)清除管理员环境变量:
为了公平测试,我们先取消掉刚才导入的管理员临时环境变量,避免干扰。
unset OS_AUTH_URL
unset OS_PASSWORD
2)测试管理员获取令牌:
手动指定参数,请求超级管理员 admin 的身份令牌。
执行命令后会要求输入密码,请输入 admin。
openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name Default --os-user-domain-name Default \
--os-project-name admin --os-username admin token issue

如果屏幕上打印出一个包含 id、expires 等字段的长长表格,说明管理员的登录验证完全成功。
3)测试学生账号获取令牌:
同理,我们要测试一下刚刚创建的学生(班长)能不能获取自己的令牌,顺便测试他能不能访问自己的小组(项目)。
执行命令后输入刚才设置的密码 monitor。
openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name xdxy --os-user-domain-name xdxy \
--os-project-name cloud_computing_group --os-username monitor token issue

6. 使用 bruno 验证
请求超级管理员 admin 的身份令牌,在 bruno 中构建一个 POST 请求,请求体(Body)内容如下,把密码换成你自己设置的密码:
{
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "admin",
"domain": { "name": "Default" },
"password": "密码"
}
}
},
"scope": {
"project": {
"name": "admin",
"domain": { "name": "Default" }
}
}
}
}

同理,我们要测试一下刚刚创建的学生(班长)能不能获取自己的令牌,将刚才请求体的JSON字段进行修改:
auth.identity.password.user.name: monitorauth.identity.password.user.domain.name:xdxyauth.identity.password.user.password:monitorscope.project.name: cloud_computing_groupscope.project.domain.name: xdxy

附1: 命令速查







附2: 关于脚本中的隐藏字符
如果出现 openstack 命令无法执行的情况,如下图所示:

该问题原因是:admin-openstack.sh 脚本包含了 Windows 格式的换行符(CRLF,即 \r\n) 。
解决办法:
dos2unix admin-openstack.sh
附3: 检查完成情况
curl -s http://192.168.192.205/scripts/3.2.sh | bash