CentOS7 OpenStack Mitaka全栈部署复盘:从Glance到云主机创建的踩坑实录
文章目录
- [CentOS7 OpenStack Mitaka全栈部署复盘:从Glance到云主机创建的踩坑实录](#CentOS7 OpenStack Mitaka全栈部署复盘:从Glance到云主机创建的踩坑实录)
-
- 一、实操概述
- 二、部署实施一:Glance镜像服务
-
- [2.1 核心配置文件修改](#2.1 核心配置文件修改)
- [2.2 数据库初始化踩坑](#2.2 数据库初始化踩坑)
- [2.3 服务启动与端口验证](#2.3 服务启动与端口验证)
- [2.4 Keystone服务注册与端点创建](#2.4 Keystone服务注册与端点创建)
- [2.5 镜像上传报错](#2.5 镜像上传报错)
- 三、计算节点基础环境准备
-
- [3.1 时间同步服务部署](#3.1 时间同步服务部署)
- [3.2 硬件虚拟化支持验证](#3.2 硬件虚拟化支持验证)
- [3.3 嵌套虚拟化验证](#3.3 嵌套虚拟化验证)
- [3.4 网络连通与基础工具安装](#3.4 网络连通与基础工具安装)
- 四、部署实施二:Nova计算服务
-
- [4.1 Controller端数据库创建](#4.1 Controller端数据库创建)
- [4.2 Controller端Nova核心配置](#4.2 Controller端Nova核心配置)
- [4.3 服务启动异常排查](#4.3 服务启动异常排查)
- [4.4 Compute端Nova配置](#4.4 Compute端Nova配置)
- [4.5 计算节点服务启动与验证](#4.5 计算节点服务启动与验证)
- 五、部署实施三:Neutron网络服务
-
- [5.1 数据库创建与Keystone注册](#5.1 数据库创建与Keystone注册)
- [5.2 核心配置文件修改](#5.2 核心配置文件修改)
- [5.3 数据库同步与服务启动](#5.3 数据库同步与服务启动)
- [5.4 Compute端Neutron部署](#5.4 Compute端Neutron部署)
- [5.5 全节点Agent验证](#5.5 全节点Agent验证)
- [5.6 Provider扁平网络创建](#5.6 Provider扁平网络创建)
- 六、功能验证:云主机全流程测试
-
- [6.1 基础资源核查](#6.1 基础资源核查)
- [6.2 云主机创建与状态验证](#6.2 云主机创建与状态验证)
- [6.3 控制台与连通性测试](#6.3 控制台与连通性测试)
- 七、部署实施四:Horizon仪表盘
-
- [7.1 核心配置文件修改](#7.1 核心配置文件修改)
- [7.2 httpd启动失败排错](#7.2 httpd启动失败排错)
- [7.3 修复后启动验证](#7.3 修复后启动验证)
- [7.4 登录验证与界面功能](#7.4 登录验证与界面功能)
- 八、踩坑汇总与实操总结
-
- [8.1 核心踩坑点汇总](#8.1 核心踩坑点汇总)
- [8.2 实操心得](#8.2 实操心得)
一、实操概述
本次实操基于CentOS 7.9系统搭建OpenStack Mitaka版本云平台,采用controller+compute1双节点架构,依次完成Glance镜像服务、计算节点环境初始化、Nova计算服务、Neutron网络服务、云实例创建验证、Horizon仪表盘六大模块的部署。全程踩坑不少,从配置拼写、部署顺序到服务依赖问题,一步步排查解决,最终跑通了从镜像上传到云主机创建、Web界面管理的完整链路。
二、部署实施一:Glance镜像服务
Glance是OpenStack的镜像管理组件,负责云主机镜像的存储、查询和分发,是云平台的核心基础服务。
2.1 核心配置文件修改
首先在controller节点修改Glance的两个核心配置文件:glance-api.conf和glance-registry.conf,分别配置数据库连接、Keystone认证、镜像存储后端等核心参数。
bash
vim /etc/glance/glance-api.conf
vim /etc/glance/glance-registry.conf
过滤掉所有注释行后,核心有效配置如下:
ini
[database]
connection = mysql+pymysql://glance:glance@controller/glance
[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = glance

其余配置段保持默认即可,主要是各类通用框架、消息队列和插件的空配置段。

2.2 数据库初始化踩坑
改完配置我直接登录MySQL,想查看Glance的表结构,执行use glance;时直接报错:ERROR 1049 (42000): Unknown database 'glance'。

这是新手很容易踩的顺序坑:必须先创建数据库和授权用户,再修改配置文件,最后执行数据库同步。我先写了配置却忘了建库,自然访问失败,后续补上了数据库创建步骤。
2.3 服务启动与端口验证
数据库和配置准备完毕后,设置Glance两个服务开机自启并启动,随后检查9292端口是否正常监听:
bash
systemctl enable openstack-glance-api.service openstack-glance-registry.service
systemctl start openstack-glance-api.service openstack-glance-registry.service
netstat -antlp | grep :9292
看到9292端口处于LISTEN状态,进程为python2,说明Glance API服务启动成功。

2.4 Keystone服务注册与端点创建
Glance需要注册到Keystone身份服务中,才能被其他组件调用。先加载管理员环境变量,创建image类型的服务实体,再依次创建public、internal两类访问端点:
bash
source admin-openrc
openstack service create --name glance --description "OpenStack Image service" image
openstack endpoint create --region RegionOne image public http://controller:9292
openstack endpoint create --region RegionOne image internal http://controller:9292

继续创建admin端点,完成后查看服务列表和端点列表验证注册结果,同时尝试上传镜像:
bash
openstack endpoint create --region RegionOne image admin http://controller:9292
openstack service list
openstack endpoint list | grep image
openstack image create "cirros" \
--file cirros-0.6.0-x86_64-disk.img \
--disk-format qcow2 --container-format bare \
--public

2.5 镜像上传报错
执行上传命令后直接报错:[Errno 2] No such file or directory: 'cirros-0.6.0-x86_64-disk.img'。
原因很简单:当前执行命令的目录下没有对应的镜像文件。要么提前把镜像下载到当前目录,要么命令里写绝对路径即可解决。
三、计算节点基础环境准备
完成控制节点Glance服务后,转向compute1计算节点,完成时间同步、硬件虚拟化、嵌套虚拟化、基础依赖安装等前置准备。
3.1 时间同步服务部署
多节点OpenStack必须保证时间一致,否则会出现认证失败、服务异常等问题。在compute1节点安装NTP时间同步服务:
bash
yum install -y ntp
systemctl enable ntpd
systemctl start ntpd

3.2 硬件虚拟化支持验证
计算节点需要CPU支持硬件虚拟化才能运行KVM虚拟机。执行命令查看CPU是否支持SVM(AMD平台虚拟化指令):
bash
grep svm /proc/cpuinfo
输出的flags中包含svm字段,说明CPU支持硬件虚拟化。

安装虚拟化相关依赖包后,启动libvirtd服务,检查KVM内核模块是否加载:
bash
systemctl enable libvirtd
systemctl start libvirtd
lsmod | grep kvm
可以看到kvm和kvm_amd模块已正常加载。

3.3 嵌套虚拟化验证
由于是在虚拟机中部署OpenStack,必须开启嵌套虚拟化才能正常创建云主机。重启主机后验证嵌套虚拟化状态,输出1表示已成功开启:
bash
grep svm /proc/cpuinfo | head -1
lsmod | grep kvm
cat /sys/module/kvm_amd/parameters/nested

3.4 网络连通与基础工具安装
先验证compute1到controller节点的网络连通性,确保节点间通信正常:
bash
ping controller -c 3

随后安装OpenStack常用工具包crudini和openstack-utils,方便后续批量修改配置文件:
bash
yum install -y crudini openstack-utils
安装过程中提示centos-release-openstack-mitaka包不存在,是因为源已经提前配置完成,直接安装工具包即可。

四、部署实施二:Nova计算服务
Nova是OpenStack的核心计算组件,负责云主机的创建、调度、销毁等全生命周期管理,分为控制节点服务和计算节点服务两部分。
4.1 Controller端数据库创建
Nova需要两个独立数据库:nova_api存储API接口相关数据,nova存储计算核心业务数据。登录MySQL创建数据库并授权nova用户:
sql
CREATE DATABASE nova_api;
CREATE DATABASE nova;
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '123456';

4.2 Controller端Nova核心配置
修改/etc/nova/nova.conf主配置文件,按不同配置段逐一设置参数。
全局配置段
配置启用的API、消息队列后端、认证策略、本机IP、网络驱动等:
ini
[DEFAULT]
enabled_apis = osapi_compute, metadata
rpc_backend = rabbit
auth_strategy = keystone
my_ip = 192.168.241.171
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

数据库连接配置
分别配置API数据库和核心数据库的连接串:
ini
[api_database]
connection = mysql+pymysql://nova:123456@controller/nova_api

ini
[database]
connection = mysql+pymysql://nova:123456@controller/nova

消息队列配置
配置RabbitMQ消息队列连接信息,Nova各组件间通过消息队列通信:
ini
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 123456

Keystone认证配置
配置Keystone认证地址和服务账号信息:
ini
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = 123456

Glance与并发锁配置
指定Glance服务地址,设置进程锁文件存储路径:
ini
[glance]
api_servers = http://controller:9292

ini
[oslo_concurrency]
lock_path = /var/lib/nova/tmp

4.3 服务启动异常排查
配置完成后,启用并启动Nova控制节点的所有服务:
bash
systemctl enable openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service
systemctl start openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service
systemctl enable openstack-nova-novncproxy.service openstack-nova-consoleauth.service
systemctl start openstack-nova-novncproxy.service openstack-nova-consoleauth.service
执行openstack compute service list查看服务状态,结果调度器、导体服务的State都是down。

排查与解决
初步判断是消息队列连接异常,核对后发现RabbitMQ中openstack用户的实际密码,与Nova配置文件中填写的密码不一致,导致服务无法连接消息队列。
执行三步修复:
- 用crudini修正配置文件中的密码
- 同步修改RabbitMQ中openstack用户的密码
- 重置服务失败状态,重启所有Nova服务
bash
crudini --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_password 123456
rabbitmqctl change_password openstack 123456
systemctl reset-failed openstack-nova-scheduler.service
systemctl restart openstack-nova-api.service \
openstack-nova-scheduler.service \
openstack-nova-conductor.service \
openstack-nova-consoleauth.service
重启后再次查看计算服务列表,所有服务状态变为up,问题解决。

4.4 Compute端Nova配置
转到compute1计算节点,同样修改/etc/nova/nova.conf配置文件,大部分配置与控制节点一致,差异主要在本机IP和VNC控制台配置。
ini
[DEFAULT]
rpc_backend = rabbit
auth_strategy = keystone
my_ip = 192.168.241.172
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

ini
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 123456

ini
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = 123456

ini
[glance]
api_servers = http://controller:9292

额外添加VNC控制台配置,支持通过Web访问云主机桌面:
ini
[vnc]
enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html

4.5 计算节点服务启动与验证
确认CPU虚拟化支持后,启用并启动libvirtd和nova-compute服务:
bash
egrep -c '(vmx|svm)' /proc/cpuinfo
systemctl enable libvirtd.service openstack-nova-compute.service
systemctl start libvirtd.service openstack-nova-compute.service

回到controller节点,再次查看计算服务列表,可以看到compute1节点的nova-compute服务已成功注册,状态为up。

五、部署实施三:Neutron网络服务
Neutron是OpenStack的网络核心组件,负责提供虚拟网络、子网、端口、安全组等网络资源。本次采用LinuxBridge插件+Flat扁平网络模式。
5.1 数据库创建与Keystone注册
创建Neutron数据库
登录MySQL创建neutron数据库并授权:
sql
CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '123456';

Keystone身份注册
创建neutron系统用户,加入service项目的admin角色,然后创建network类型的服务与三个访问端点:
bash
source admin-openrc
openstack user create --domain default --password 123456 neutron
openstack role add --project service --user neutron admin
openstack service create --name neutron --description "OpenStack Networking" network
openstack endpoint create --region RegionOne network public http://controller:9696
openstack endpoint create --region RegionOne network internal http://controller:9696
openstack endpoint create --region RegionOne network admin http://controller:9696

5.2 核心配置文件修改
Controller节点需要修改Neutron主配置、ML2插件、LinuxBridge代理、DHCP代理、元数据代理共5个配置文件,同时还要在Nova配置中添加网络相关参数:
bash
vim /etc/neutron/neutron.conf
vim /etc/neutron/plugins/ml2/ml2_conf.ini
vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
vim /etc/neutron/dhcp_agent.ini
vim /etc/neutron/metadata_agent.ini
vim /etc/nova/nova.conf

5.3 数据库同步与服务启动
配置完成后,执行Neutron数据库迁移,生成所有网络数据表:
bash
su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \
--config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
迁移过程会输出一系列版本升级日志,最终显示OK代表同步成功。

同步完成后重启Nova API服务,然后启动所有Neutron服务并设置开机自启:
bash
systemctl restart openstack-nova-api.service
systemctl enable neutron-server.service \
neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
neutron-metadata-agent.service
systemctl start neutron-server.service \
neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
neutron-metadata-agent.service

启动后查看Agent列表,controller节点的DHCP代理、Metadata代理、LinuxBridge代理均正常运行:
bash
neutron agent-list

5.4 Compute端Neutron部署
在compute1节点安装Neutron LinuxBridge代理,修改对应配置文件,然后启动代理服务并重启Nova计算服务:
bash
vim /etc/neutron/neutron.conf
vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
vim /etc/nova/nova.conf
systemctl enable neutron-linuxbridge-agent.service
systemctl start neutron-linuxbridge-agent.service
systemctl restart openstack-nova-compute.service

5.5 全节点Agent验证
回到controller节点再次查询Agent列表,此时会新增compute1节点的LinuxBridge代理,所有四个Agent的alive状态均为True,说明全节点网络服务部署成功。

5.6 Provider扁平网络创建
创建一个Flat类型的提供商网络,与宿主机处于同一网段,云主机可以直接获取物理网段IP:
bash
neutron net-create --shared --provider:physical_network provider \
--provider:network_type flat provider
neutron subnet-create --name provider \
--allocation-pool start=192.168.241.101,end=192.168.241.150 \
--dns-nameserver 114.114.114.114 --gateway 192.168.241.2 \
provider 192.168.241.0/24

六、功能验证:云主机全流程测试
所有核心组件部署完成后,通过创建云主机来验证整个平台的功能链路是否通畅。
6.1 基础资源核查
先查看当前平台可用的规格、镜像、网络和安全组资源:
bash
openstack flavor list
openstack image list
openstack network list
openstack security group list
查询过程中镜像列表曾出现Service Unavailable (HTTP 503)报错,排查后是Glance服务异常,重启服务后恢复正常。

6.2 云主机创建与状态验证
使用cirros镜像、m1.tiny规格,连接provider网络,创建测试云主机:
bash
openstack server create --flavor m1.tiny --image cirros \
--nic net-id=00f1e3d6-2c24-44b8-bc22-8f184d6bbb59 \
--security-group default provider-instance
刚创建时云主机处于BUILD调度状态,等待30秒后再次查询,状态变为ACTIVE,并成功分配到IP地址192.168.241.102。
bash
sleep 30
openstack server list

6.3 控制台与连通性测试
获取VNC控制台地址:
bash
openstack console url show provider-instance

默认安全组禁止外部访问,先添加TCP 22端口的放行规则,再测试网络连通性:
bash
openstack security group rule create --proto tcp --dst-port 22 default
ping -c 4 192.168.241.102
数据包全部正常接收,随后通过SSH成功登录cirros系统,说明网络链路完全通畅。



七、部署实施四:Horizon仪表盘
Horizon是OpenStack的Web管理界面,基于Django框架开发,可以直观地管理平台所有资源。
7.1 核心配置文件修改
修改Dashboard的主配置文件/etc/openstack-dashboard/local_settings,配置Keystone地址、域名支持、时区、Neutron功能开关等参数:
python
import os
from django.utils.translation import ugettext_lazy as _
DEBUG = True
ALLOWED_HOSTS = ['*',]
OPENSTACK_HOST = "controller"
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_API_VERSIONS = {
"identity": 3,
"image": 2,
"volume": 2,
}
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'controller:11211',
}
}
OPENSTACK_NEUTRON_NETWORK = {
'enable_router': False,
'enable_quotas': False,
'enable_ipv6': False,
'enable_distributed_router': False,
'enable_ha_router': False,
'enable_lb': False,
'enable_firewall': False,
'enable_vpn': False,
'enable_fip_topology_check': False,
'default_ipv4_subnet_pool_label': None,
}
TIME_ZONE = "Asia/Shanghai"
WEBROOT = '/dashboard'

7.2 httpd启动失败排错
安装完Dashboard相关依赖包后,重启httpd和memcached服务,结果httpd直接启动失败。

通过systemctl status httpd查看详细报错,错误信息非常明确:IndentationError: unexpected indent,定位到配置文件中的字典项存在多余缩进。
这是部署Horizon的高频坑:配置文件是Python语法,对缩进极其敏感,复制粘贴时很容易带入多余空格,导致Django加载配置时语法报错,进而导致httpd启动失败。

7.3 修复后启动验证
修正配置文件的缩进问题后,再次重启服务,httpd成功启动,进程正常运行。

7.4 登录验证与界面功能
浏览器访问Dashboard地址,出现登录页面,选择域default,输入admin账号密码即可登录。

也可以通过curl命令验证Keystone V3接口是否正常:
bash
curl http://127.0.0.1:5000/v3/

登录后可以在界面中查看各类资源:身份管理页面的项目、用户列表。

资源概况的使用统计。

网络列表。

云实例详情。


以及网络拓扑可视化页面。

八、踩坑汇总与实操总结
8.1 核心踩坑点汇总
- 部署顺序颠倒:Glance部署时先改配置后建库,导致数据库不存在报错。正确顺序:建库建用户→写配置→同步数据库→启动服务。
- 文件路径错误:上传镜像时未注意当前工作目录,直接使用相对文件名导致找不到文件。
- 消息队列密码不匹配:Nova配置中的RabbitMQ密码与实际用户密码不一致,导致所有计算服务状态down。排错优先检查消息队列连通性。
- Python配置缩进错误:Horizon配置文件缩进错误直接导致httpd启动失败,Python格式的配置文件务必严格对齐缩进。
- 服务异常连锁反应:Glance服务异常会导致镜像列表返回503,排错时要从底层依赖服务往上逐层排查。
8.2 实操心得
OpenStack Mitaka的每个组件基本都遵循「建数据库→Keystone注册→改配置文件→同步数据库→启动服务→验证」的标准流程,但细节处容错率极低。一个参数拼写错误、一个密码不对应、一个顺序颠倒,都可能导致整个组件无法正常工作。
排错最有效的手段就是看服务状态和日志:systemctl status能快速定位启动失败原因,组件日志能给出更详细的错误信息。从数据库、消息队列、认证服务到组件本身,逐层排查,绝大多数问题都能快速定位。
这次完整走通四大核心组件的部署和云主机创建,不仅熟悉了OpenStack的组件协作逻辑,更积累了一套通用的排错思路,为后续更复杂的网络和存储组件部署打下了基础。