在实际云计算平台部署中,OpenStack 的认证服务 Keystone 是第一个必须正确安装和配置的核心组件。它负责管理用户、项目、角色和权限,是所有其他服务(如 Nova、Glance、Neutron)访问的入口。很多初学者在搭建 OpenStack 实验环境时,往往卡在 Keystone 的初始配置上,面对数据库初始化、服务端点注册和令牌机制感到无从下手。
本文将以一个最小化的、可复现的上机实验为目标,带你完成 Keystone 认证服务的安装与基础配置。我们将从准备一个干净的 CentOS 或 Ubuntu 环境开始,逐步完成数据库创建、Keystone 软件包安装、配置文件修改、数据库同步、服务端点创建以及最终的服务验证。整个过程会解释每一步背后的目的,并重点指出配置文件中容易出错的参数,以及如何通过日志和命令行工具排查常见问题。完成本实验后,你将拥有一个可提供认证令牌的基础 Keystone 服务,为后续集成其他 OpenStack 服务打下坚实基础。
1. 实验环境准备与规划
在开始安装 Keystone 之前,一个清晰、隔离的实验环境至关重要。我们不建议在生产服务器或已有重要服务的机器上直接操作。
1.1 操作系统与网络规划
本实验基于 OpenStack 社区广泛支持的 Linux 发行版。你可以根据熟悉程度选择其一。
- 操作系统: CentOS 7/8 Stream 或 Ubuntu 20.04/22.04 LTS。本文命令示例将同时给出两种系统的差异。
- 主机名与网络: 确保主机名解析正常。建议在
/etc/hosts文件中添加本机 IP 与主机名的映射。# 编辑 hosts 文件,假设你的服务器IP是 192.168.100.10,主机名是 controller sudo vi /etc/hosts # 添加一行 192.168.100.10 controller - 防火墙与 SELinux: 为了简化实验,我们暂时禁用它们,但在生产环境中需要精细配置规则。
- CentOS:
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config - Ubuntu:
sudo ufw disable
- CentOS:
1.2 基础依赖安装
OpenStack 服务通常通过特定版本的软件仓库安装。我们需要先配置 OpenStack 仓库(这里以 Yoga 版本为例,这是一个长期支持且稳定的版本)。
- CentOS:
# 安装 EPEL 仓库 sudo yum install -y epel-release # 安装 OpenStack Yoga 仓库 sudo yum install -y centos-release-openstack-yoga # 更新系统并升级软件包 sudo yum update -y - Ubuntu:
# 添加 OpenStack Yoga 仓库 sudo add-apt-repository -y cloud-archive:yoga sudo apt update && sudo apt upgrade -y
接下来安装一些通用工具和 Python 客户端,它们对后续的配置和调试很有帮助。
# CentOS sudo yum install -y python3-openstackclient openstack-selinux # Ubuntu sudo apt install -y python3-openstackclient2. 数据库与消息队列服务初始化
Keystone 需要后端数据库来存储其数据(用户、项目、令牌等)。通常使用 MariaDB 或 MySQL。同时,OpenStack 服务间通过消息队列(如 RabbitMQ)进行异步通信,虽然 Keystone 本身不重度依赖,但为完整环境,我们一并安装。
2.1 安装与配置 MariaDB
安装数据库服务器:
# CentOS sudo yum install -y mariadb-server mariadb # Ubuntu sudo apt install -y mariadb-server启动并设置开机自启:
sudo systemctl enable mariadb sudo systemctl start mariadb运行安全初始化脚本: 这个脚本会设置 root 密码、移除匿名用户、禁止远程 root 登录等。
sudo mysql_secure_installation执行时,根据提示设置一个强密码(例如
KEYSTONE_DBPASS),并对所有安全相关问题回答 “Y”。为 Keystone 创建专用数据库和用户:
sudo mysql -u root -p在 MySQL 提示符下,执行以下 SQL 语句。请将
KEYSTONE_DBPASS替换为你设定的强密码。-- 创建 keystone 数据库 CREATE DATABASE keystone; -- 创建 keystone 数据库用户,并授予其对该数据库的全部权限 -- 注意:'keystone'@'localhost' 表示只允许从本机连接,生产环境可能需要调整 GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS'; -- 同样授权给从控制器主机名连接的用户(根据你的网络规划) GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS'; -- 刷新权限 FLUSH PRIVILEGES; -- 退出 EXIT;
2.2 安装与配置 RabbitMQ
安装 RabbitMQ 服务器:
# CentOS sudo yum install -y rabbitmq-server # Ubuntu sudo apt install -y rabbitmq-server启动并设置开机自启:
sudo systemctl enable rabbitmq-server sudo systemctl start rabbitmq-server添加 OpenStack 用户: 这里我们创建一个名为
openstack的用户,密码设为RABBIT_PASS(请自行更改)。sudo rabbitmqctl add_user openstack RABBIT_PASS # 授予该用户对所有虚拟主机的配置、读、写权限 sudo rabbitmqctl set_permissions openstack ".*" ".*" ".*"
3. Keystone 服务安装与核心配置
这是最关键的一步,任何配置文件的错误都会导致服务无法启动或认证失败。
3.1 安装 Keystone 组件
# CentOS sudo yum install -y openstack-keystone httpd mod_wsgi python3-openstackclient # Ubuntu sudo apt install -y keystone apache2 libapache2-mod-wsgi-py3 python3-openstackclient注意:在 CentOS 8/Rocky Linux 8 及以后,Keystone 默认通过httpd(Apache) 和mod_wsgi运行。Ubuntu 也使用 Apache。
3.2 配置 Keystone 主配置文件
Keystone 的主配置文件通常位于/etc/keystone/keystone.conf。在修改前,建议先备份。
sudo cp /etc/keystone/keystone.conf /etc/keystone/keystone.conf.bak使用文本编辑器(如vi或nano)打开该文件。我们需要修改[DEFAULT],[database],[token]等部分。找到对应章节,进行如下修改:
[DEFAULT] # 启用 Fernet 令牌,这是一种无状态的、更安全的令牌格式,无需持久化到数据库 # 早期版本使用的 UUID 或 PKI 令牌已不推荐 provider = fernet [database] # 配置数据库连接。使用你在 2.1 节中创建的密码。 # 格式:mysql+pymysql://<用户名>:<密码>@<主机>/<数据库名> connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone [token] # 指定令牌的提供者为 Fernet provider = fernet关键参数解释:
connection: 这是 Keystone 连接数据库的字符串。务必确保用户名、密码、主机名(controller)和数据库名(keystone)完全正确。pymysql是 Python 的 MySQL 驱动。provider = fernet: Fernet 令牌是当前推荐方式。它使用密钥加密令牌信息,服务端无需存储,验证时只需解密即可,提高了性能和可扩展性。
3.3 初始化数据库与 Fernet 密钥
同步数据库表结构: 此命令会根据
keystone.conf中的配置,在keystone数据库中创建所有必要的表。sudo su -s /bin/sh -c "keystone-manage db_sync" keystone执行成功不会有太多输出。如果出现错误,请检查
[database]部分的连接字符串、数据库服务是否运行、用户权限是否正确。初始化 Fernet 密钥仓库: Fernet 令牌需要加密密钥。密钥通常有多个,并定期轮换。
sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone这些命令会在
/etc/keystone/fernet-keys/目录下生成初始密钥。
3.4 配置 Apache HTTP Server 托管 Keystone
现代 OpenStack 部署使用 Apache 的mod_wsgi来托管 Keystone 的 WSGI 应用。
配置 Apache 虚拟主机: 编辑 Apache 的 Keystone 配置文件。
- CentOS/Rocky Linux:
/etc/httpd/conf.d/wsgi-keystone.conf - Ubuntu:
/etc/apache2/sites-available/keystone.conf
确保文件内容类似如下(路径可能因系统略有差异):
Listen 5000 Listen 35357 <VirtualHost *:5000> WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} WSGIProcessGroup keystone-public WSGIScriptAlias / /usr/bin/keystone-wsgi-public WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On ErrorLogFormat "%{cu}t %M" ErrorLog /var/log/httpd/keystone-error.log CustomLog /var/log/httpd/keystone-access.log combined <Directory /usr/bin> Require all granted </Directory> </VirtualHost> <VirtualHost *:35357> WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} WSGIProcessGroup keystone-admin WSGIScriptAlias / /usr/bin/keystone-wsgi-admin WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On ErrorLogFormat "%{cu}t %M" ErrorLog /var/log/httpd/keystone-error.log CustomLog /var/log/httpd/keystone-access.log combined <Directory /usr/bin> Require all granted </Directory> </VirtualHost>解释: Keystone 使用两个端口,5000 用于公共 API(如获取令牌),35357 用于管理 API(如创建用户)。这里配置了两个虚拟主机分别监听。
- CentOS/Rocky Linux:
启用配置并重启 Apache:
# CentOS/Rocky Linux sudo systemctl enable httpd sudo systemctl start httpd # Ubuntu sudo a2ensite keystone.conf sudo systemctl restart apache2验证 Apache 是否正在监听端口:
sudo netstat -tnlp | grep -E ‘:(5000|35357)’应该能看到
httpd或apache2进程正在监听 5000 和 35357 端口。
4. 引导 Keystone 服务与创建初始实体
现在 Keystone 服务已经运行,但数据库里还没有任何用户、项目或角色。我们需要进行“引导”(bootstrap)来创建初始的管理员账户和服务端点。
4.1 引导 Keystone
此命令会创建初始的管理员用户、项目、角色、域和服务端点。请务必设置一个非常强壮的ADMIN_PASS密码。
sudo keystone-manage bootstrap --bootstrap-password ADMIN_PASS \ --bootstrap-admin-url http://controller:35357/v3/ \ --bootstrap-internal-url http://controller:5000/v3/ \ --bootstrap-public-url http://controller:5000/v3/ \ --bootstrap-region-id RegionOne参数解释:
--bootstrap-password: 管理员用户admin的密码。--bootstrap-*-url: 定义了 Keystone 服务自身的端点 URL。在单节点实验环境中,内部、公共和管理 URL 可以相同,都指向本机 (controller)。--bootstrap-region-id: 区域标识,默认为RegionOne。
4.2 配置管理员环境变量
为了后续使用openstack命令行客户端时免去每次输入密码和端点信息的麻烦,我们设置环境变量。
# 将以下内容添加到你的 shell 配置文件(如 ~/.bashrc 或 ~/.zshrc)中,然后执行 source ~/.bashrc export OS_USERNAME=admin export OS_PASSWORD=ADMIN_PASS # 替换为上面设置的密码 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设置完成后,你可以通过openstack token issue命令测试是否能够成功获取令牌。
openstack token issue如果成功,你将看到一个包含令牌 ID、过期时间等信息的 JSON 输出。
4.3 创建第一个非管理员项目、用户和角色
一个只有admin用户的系统是不完整的。我们通常需要创建普通项目(如demo)和用户。
创建
demo项目:openstack project create --domain default --description “Demo Project” demo创建
demo用户: 为其设置密码DEMO_PASS。openstack user create --domain default --password DEMO_PASS demo创建
user角色: OpenStack 默认有admin角色,我们再创建一个普通用户角色。openstack role create user将
user角色授予demo用户在demo项目上:openstack role add --project demo --user demo user验证非管理员用户: 临时切换环境变量,测试
demo用户能否获取令牌。export OS_USERNAME=demo export OS_PASSWORD=DEMO_PASS export OS_PROJECT_NAME=demo # 其他环境变量(如 OS_AUTH_URL)保持不变 openstack token issue成功后,记得将环境变量改回
admin用户,以便进行后续管理操作。
5. 服务验证与常见问题排查
安装配置完成后,必须进行系统性验证,而不仅仅是检查服务进程是否在运行。
5.1 基础服务状态检查
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| Keystone 服务进程 | sudo systemctl status httpd(CentOS) 或sudo systemctl status apache2(Ubuntu) | 状态为active (running) |
| 数据库服务 | sudo systemctl status mariadb | 状态为active (running) |
| 消息队列服务 | sudo systemctl status rabbitmq-server | 状态为active (running) |
| 端口监听 | sudo netstat -tnlp | grep -E ‘:(5000|35357|3306|5672)’ | 应看到 5000, 35357 (Keystone), 3306 (MySQL), 5672 (RabbitMQ) 端口被监听 |
5.2 认证功能测试
使用openstack客户端进行端到端测试是最可靠的方式。
获取管理员令牌:
# 确保环境变量已设置为 admin openstack token issue观察输出中是否有
expires_at(过期时间)字段,且时间在未来。列出用户和项目:
openstack user list openstack project list应该能看到
admin和demo用户,以及admin和demo项目。
5.3 常见问题与排查路径
即使严格按照步骤操作,也可能遇到问题。以下是几个典型场景的排查思路。
问题1:keystone-manage db_sync失败,提示数据库连接错误。
- 现象:
OperationalError或Access denied for user。 - 排查:
- 检查 MariaDB 服务是否运行:
sudo systemctl status mariadb。 - 使用
mysql -u keystone -p尝试手动连接,验证密码是否正确。 - 检查
/etc/keystone/keystone.conf中[database]部分的connection字符串,确保主机名、数据库名、用户名、密码无误。 - 确认 MySQL 中
keystone用户的授权主机(‘keystone’@‘localhost’和‘keystone’@‘%’)是否正确。
- 检查 MariaDB 服务是否运行:
问题2:Apache 服务启动失败,或访问http://controller:5000/v3无响应。
- 现象:
systemctl status显示服务失败,或curl命令超时/返回错误。 - 排查:
- 查看 Apache 错误日志:
sudo tail -f /var/log/httpd/error_log(CentOS) 或sudo tail -f /var/log/apache2/error.log(Ubuntu)。日志通常会明确指出语法错误或模块加载失败。 - 检查 Keystone 的 WSGI 文件是否存在:
ls -la /usr/bin/keystone-wsgi-*。 - 检查 SELinux 或 AppArmor 是否阻止了 Apache(实验环境可先禁用排查)。
- 检查防火墙是否阻止了 5000 和 35357 端口。
- 查看 Apache 错误日志:
问题3:openstack token issue返回 401 Unauthorized 或 500 Internal Server Error。
- 现象: 认证失败。
- 排查:
- 401 错误: 首先确认
OS_PASSWORD环境变量或命令行输入的密码绝对正确,区分大小写。其次确认OS_AUTH_URL的端口和路径 (/v3) 是否正确。 - 500 错误: 这通常是服务端问题。查看 Keystone 的日志:
sudo tail -f /var/log/httpd/keystone-error.log。常见原因包括 Fernet 密钥路径权限错误、数据库连接池问题等。确保/etc/keystone/fernet-keys/目录及其内容对keystone用户可读。
- 401 错误: 首先确认
问题4:创建用户或项目时提示“找不到默认域”。
- 现象:
Default domain not found。 - 排查: 在 OpenStack V3 API 中,所有实体都归属于一个域。引导过程会自动创建
Default域。如果丢失,可以手动创建:openstack domain create --description “Default Domain” default。但更建议检查引导过程是否完全成功。
6. 生产环境考量与后续步骤
本实验旨在快速搭建一个可工作的 Keystone 服务。若要用于开发测试或生产,还需要考虑以下方面:
6.1 安全加固
- 启用并配置防火墙: 只允许可信网络访问 5000 和 35357 端口。
- 使用 HTTPS: 在生产环境中,必须使用 TLS/SSL 加密 API 端点。需要为 Apache 配置 SSL 证书,并将
http://改为https://。 - 定期轮换 Fernet 密钥: 使用
keystone-manage fernet_rotate命令。 - 使用强密码策略: 为
admin,keystone数据库用户等账户设置复杂密码。 - 审计日志: 配置并定期检查
/var/log/httpd/keystone-access.log和keystone-error.log,关注异常访问。
6.2 高可用与性能
- 数据库高可用: 将 MariaDB 配置为主从复制或使用 Galera Cluster。
- Keystone 集群: 部署多个 Keystone 节点,前端通过负载均衡器(如 HAProxy)分发请求。
- 缓存: 配置 Memcached 或 Redis 作为令牌和目录信息的缓存后端,在
[cache]部分配置。 - 调整 Apache 参数: 根据负载调整
wsgi-keystone.conf中的processes和threads数量。
6.3 后续集成
一个正常运行的 Keystone 是 OpenStack 的基石。接下来,你可以按照类似模式安装其他服务:
- Glance(镜像服务): 需要向 Keystone 注册服务,并配置使用 Keystone 进行认证。
- Nova(计算服务): 同样需要 Keystone 的认证信息来与其他服务通信。
- Neutron(网络服务): 依赖 Keystone 管理其服务的用户和权限。
每个服务安装时,都需要在 Keystone 中创建对应的服务实体(service)和端点(endpoint),并在其配置文件中正确指向 Keystone 的认证 URL。这正是我们在本实验中先行搭建 Keystone 的意义所在——它为整个云平台提供了统一的身份入口。
完成本实验后,你应该已经掌握了 Keystone 服务从零安装、配置、引导到验证的完整流程。理解每个配置文件参数的作用和每个管理命令的目的,远比记忆命令本身更重要。当遇到问题时,养成首先查看相关日志(数据库日志、Apache 日志、Keystone 日志)的习惯,能帮助你快速定位绝大多数配置错误。