在 OpenStack 的各个服务中,KeyStone 扮演着核心的身份认证角色。本节我们将部署 KeyStone 服务,为整个云平台建立起统一的“通行证”机制。
实验架构

- 虚拟机1:控制节点
- 操作系统: CentOS 7.9
- 配置: 4 CPU,40GB+ 硬盘,8GB 内存
- 角色: 控制节点、网络节点和对象存储节点
- 虚拟机2:计算节点
- 操作系统: CentOS 7.9
- 配置: 2 CPU,40GB+ 硬盘,4GB 内存
- 角色: 计算节点、网络节点、对象存储和块存储节点
KeyStone 组件简介
Keystone 是 OpenStack 的身份认证与权限管理组件,可以理解为整个 OpenStack 平台的“统一登录和门禁系统”。
用户在访问 Nova、Neutron、Glance 等服务之前,需要先通过 Keystone 验证身份;认证成功后,Keystone 会为用户签发 Token(令牌),其他组件根据该令牌判断用户是否具有相应的访问权限。Keystone 还负责管理 OpenStack 中的用户、项目、角色和服务目录,明确“谁可以访问哪些资源、具有什么权限,以及各个服务的访问地址”。
因此,在搭建 OpenStack 时,Keystone 通常是最先部署和配置的核心组件之一,后续 Nova、Glance、Neutron 等服务都需要在 Keystone 中完成服务注册、用户创建和 Endpoint 配置。

端点(Endpoint)本质上就是一个网络访问地址(URL)。在 OpenStack 中,不同的服务都会在 KeyStone 中注册自己的 Endpoint,方便其他组件或用户找到并调用它们。
环境准备
- 开启电脑上的 VMnet1 和 VMnet8 两块网卡;
- 在 VMware 中开启 controller 节点,并使用 MoboXTerm 进行连接;
- 执行以下命令对实验环境进行初始化:
curl -s http://192.168.192.205/scripts/env3-1-local.sh | bash
一、数据库创建和授权
在安装配置 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

二、安装并配置 KeyStone 组件
安装 keystone 相关软件包:
yum install openstack-keystone httpd mod_wsgi -y
修改配置文件 /etc/keystone/keystone.conf:
[database]
connection = mysql+pymysql://keystone:keystone@controller/keystone
[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

Fernet 是一种安全、轻量级的令牌格式。它不需要像早期的令牌格式那样在数据库中大量存储,因此运行效率更高。这两条命令会自动生成用于加密令牌的密钥。
Fernet(菲奈特)来源于意大利,本意是一种源自意大利的苦味草本利口酒(也可以理解为一种西式“药酒”)。
初始化 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。
三、配置 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 httpd
systemctl enable httpd
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 开头的命令时,系统会自动读取这些变量完成身份验证。这使得我们接下来的操作更加省力!
四、使用 bruno 验证

命令速查







检查完成情况
curl -s http://192.168.192.205/scripts/3.2.sh | bash
