凌晨三点的服务器机房,只有散热风扇的嗡鸣声陪伴着我。屏幕上闪烁的光标仿佛在嘲笑我的无知——这已经是我第七次尝试部署OpenStack Rocky版本的单节点环境了。作为云计算领域的入门者,我原以为按照官方文档就能轻松完成部署,却没想到从数据库配置到服务认证,处处都是隐藏的陷阱。本文将完整记录我从失败到成功的全过程,特别聚焦Keystone身份服务与MariaDB、Apache的集成细节,希望能为后来者照亮前路。
在CentOS 7.9最小化安装完成后,第一个教训就来了:不要相信默认的yum源。OpenStack Rocky需要特定版本的软件包,必须首先配置正确的仓库:
bash复制# 安装EPEL和OpenStack Rocky仓库
yum install -y epel-release
yum install -y centos-release-openstack-rocky
系统优化环节有三个关键配置常被忽略:
bash复制yum install -y policycoreutils-python
semanage port -a -t http_port_t -p tcp 5000
bash复制yum install -y chrony
systemctl enable --now chronyd
chronyc sources
bash复制firewall-cmd --permanent --add-port=5000/tcp
firewall-cmd --reload
提示:使用
hostnamectl set-hostname controller设置主机名,并在/etc/hosts中添加解析记录,后续所有配置都依赖这个主机名。
官方文档轻描淡写的数据库配置,实际藏着三个大坑:
密码策略陷阱:MariaDB 10.3+默认启用密码强度检查,而OpenStack生成的初始密码可能不符合要求。必须先调整策略:
sql复制# 登录MariaDB后执行
SET GLOBAL validate_password_policy=LOW;
FLUSH PRIVILEGES;
字符集问题:OpenStack部分组件需要utf8mb4支持,必须在创建数据库时显式指定:
sql复制CREATE DATABASE keystone
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
权限配置要点:很多教程省略了@'%'的授权,导致后续服务无法远程连接:
sql复制GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost'
IDENTIFIED BY 'Keystone@DBPASS123';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%'
IDENTIFIED BY 'Keystone@DBPASS123';
FLUSH PRIVILEGES;
验证阶段不能只用mysql -u keystone -p测试,必须用OpenStack实际使用的Python驱动验证:
bash复制yum install -y MySQL-python
python -c "
import MySQLdb
db=MySQLdb.connect(host='localhost',user='keystone',
passwd='Keystone@DBPASS123',db='keystone')
print(db.cursor().execute('SELECT 1'))"
安装基础包时容易遗漏mod_wsgi的Python 3版本:
bash复制yum install -y openstack-keystone httpd python3-mod_wsgi
配置文件/etc/keystone/keystone.conf需要重点关注的参数:
| 参数项 | 推荐值 | 注意事项 |
|---|---|---|
| [database] connection | mysql+pymysql://keystone:Keystone@DBPASS123@controller/keystone | 必须加pymysql驱动声明 |
| [token] provider | fernet | 需要提前初始化fernet密钥 |
| [DEFAULT] log_dir | /var/log/keystone | 确保目录权限正确 |
fernet密钥初始化时遇到的典型错误是权限问题:
bash复制keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
chown -R keystone:keystone /etc/keystone/fernet-keys
最关键的bootstrap命令必须包含所有URL参数,否则后续服务注册会失败:
bash复制keystone-manage bootstrap --bootstrap-password Admin@PASS123 \
--bootstrap-admin-url http://controller:5000/v3/ \
--bootstrap-internal-url http://controller:5000/v3/ \
--bootstrap-public-url http://controller:5000/v3/ \
--bootstrap-region-id RegionOne
httpd配置中最容易被忽视的是ServerName:
bash复制echo "ServerName controller" >> /etc/httpd/conf/httpd.conf
WSGI配置需要检查三个关键点:
/usr/share/keystone/wsgi-keystone.conf必须正确链接bash复制ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
bash复制netstat -tulnp | grep 5000
bash复制restorecon -Rv /usr/share/keystone/
启动服务后验证时,不能只看httpd状态,必须检查Keystone的API端点:
bash复制systemctl enable --now httpd
curl -s http://controller:5000/v3/ | python -m json.tool
admin-openrc环境变量文件必须包含所有必要参数,缺少任何一个都会导致后续操作失败:
bash复制cat > ~/admin-openrc << EOF
export OS_USERNAME=admin
export OS_PASSWORD=Admin@PASS123
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 OS_IMAGE_API_VERSION=2
EOF
source环境变量后,验证步骤需要分层进行:
基础身份认证:
bash复制openstack token issue
输出应包含有效的expires时间和token字符串
服务目录检查:
bash复制openstack catalog list
确认Keystone的三个端点(admin/internal/public)都已注册
项目创建测试:
bash复制openstack project create --domain default \
--description "Demo Project" demo
角色权限验证:
bash复制openstack role create reader
openstack role add --project demo --user admin reader
当所有组件就绪后,一个实用的检查清单可以帮助确认部署状态:
bash复制# 检查服务列表
openstack service list
# 验证端点健康状态
curl -s http://controller:5000/v3/ | grep -i version
# 测试用户权限
openstack --os-project-name demo token issue
记得第一次看到openstack user list成功返回admin用户信息时,我对着屏幕傻笑了五分钟。这种成就感或许就是开源基础设施的魅力所在——它不会轻易向你低头,但一旦征服,回报丰厚。