news 2026/9/30 1:27:35

OpenStack私有云搭建实战:从计算节点到多节点聚合的避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenStack私有云搭建实战:从计算节点到多节点聚合的避坑指南

简介:这份PDF面向云计算运维人员、OpenStack初学者及需要落地私有云的技术团队,系统梳理基于OpenStack搭建私有云的完整实践路径,帮助读者理解各核心组件的作用与配置方法。资源包共1个PDF文件,大小约1.64MB,内容以图文步骤形式呈现,便于按章节对照学习。目录涵盖基础环境准备、NTP时间同步、NOVA计算服务与NEUTRON网络服务的安装配置,以及PackStack快速安装、Cell创建、用户查看、页面登录与日志排查等模块,并延伸至Cinder、Glance、Swift、Horizon等组件的集成思路,同时涉及安全监控、自动化部署与测试优化。已有890人学习下载,适合希望从零掌握私有云部署流程、积累组件集成与排错经验的读者参考。

1. 从一台 compute01 说起:这份 OpenStack 私有云搭建笔记到底能帮你省掉多少试错

如果你手上只有两三台物理机,却要交付一套能跑虚拟机、能划内外网、能挂块存储的私有云环境,大概率绕不开 OpenStack。但真正动手时你会发现,官方文档是按组件拆开的,装完 Keystone 装 Glance,装完 Nova 又回头补 Neutron,中间任何一步认证或消息队列对不上,后面全是连锁报错。这份《私有云实践-基于 OpenStack 的私有云搭建》走的是另一条路:它以一个名为 compute01 的计算节点为主线,把 Rancher 生成容器、NTP 时间同步、Nova 计算服务、Neutron 网络服务、PackStack 快速安装、实例与网络管理、多物理节点聚合这一整条链路串了起来。它适合两类人:一是第一次搭 OpenStack、需要一份能照着敲的落地清单的运维新手;二是已经装过但卡在网络或计算节点注册环节、想找一份带验证命令的参考手册的熟手。下面我按自己拆包复现的顺序,把这份资料里真正能用的部分讲透。

2. 基础环境与 Nova 计算节点:容器、NTP、YUM 源三件事的顺序不能乱

2.1 用 Rancher 或 Docker 起一个干净的 compute01

资料里基础环境给了两条路:Rancher 生成容器,或者直接用 docker run。核心是拿到一个带 systemd、能跑 systemctl 的容器,所以必须加--privileged=true,入口指向/usr/sbin/init。我一般会先用 Docker 命令把容器拉起来验证,再决定要不要上 Rancher 做编排。

# 创建容器:privileged 让容器内能用 systemd,入口用 init docker run -d --name controller --privileged=true docker.io/sf2gis/openstack:ntp /usr/sbin/init # 进入容器 docker exec -it controller /bin/bash

逻辑说明:-d后台运行,--privileged=true是让容器内 systemd 能正常接管服务的关键,少了它systemctl start会直接报权限或 D-Bus 错误。/usr/sbin/init作为入口,保证容器起来后 PID 1 是 init 而不是 bash。参数上,镜像名docker.io/sf2gis/openstack:ntp是资料里给的,已经预置了 NTP 相关包,省掉后面单独装 chrony 的步骤。

用 Rancher 时,资料强调要在网络里固定 IP(10.42.0.11)和主机名(compute01),安全里选全部权限。这一步的坑在于主机名和 IP 必须和后面/etc/hosts里写的一致,否则 Nova 注册到 controller 时用的就是错的名字。

# 进入容器后设置 hosts,controller 和 compute01 必须能互相解析 cat >> /etc/hosts <<EOF 10.42.0.10 controller 10.42.0.11 compute01 EOF

逻辑说明:OpenStack 各组件之间靠主机名通信,RabbitMQ、Keystone、Glance 的地址在配置文件里写的都是controller这种名字。如果/etc/hosts里没有对应记录,服务启动时会卡在域名解析,日志里表现为连接超时而不是明确的“找不到主机”。参数上,10.42.0.10 是控制节点,10.42.0.11 是本计算节点,这两个地址要和后续 nova.conf 里的my_ip保持一致。

2.2 NTP 时间同步:分布式系统的隐形地基

资料把 NTP 单独列了一节,配置为同步 controller 时间。很多人会跳过这步,觉得差几秒无所谓,但 OpenStack 的 token 有有效期,节点间时间偏差过大会直接导致认证失败,报错信息还特别含糊,属于典型的玄学问题。

# 在 compute01 上把时间源指向 controller ntpdate controller # 或者写入 chrony/ntpd 配置,长期同步

逻辑说明:ntpdate是一次性同步,适合搭建阶段快速对齐;生产环境应该写进 NTP 配置文件做持续同步。参数上,时间源填 controller 的主机名或 IP 都行,前提是 controller 自己已经同步了可靠时间源。这一步做完可以用date对比两台机器,差在 1 秒以内再往下走。

2.3 改 YUM 源装 Nova:Liberty 源的启用状态是重点

资料里装 Nova 之前先改 YUM 源,备份原有 repo,然后改 Base、CentOS-OpenStack-liberty、rdo-release、rdo-testing 四个文件。这里最容易翻车的是 enabled 字段:centos-openstack-liberty默认enabled=0,而centos-openstack-liberty-test是enabled=1,如果你不改,装出来的可能是测试版包。

# 备份原有源 cp /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak_tmp/ # 安装 nova 计算服务 yum install openstack-nova-compute -y

逻辑说明:备份是为了改坏了能回滚,这是血泪经验,别省。openstack-nova-compute是计算节点包,控制节点装的是openstack-nova-api那一套,别装混。参数上,Base 源换成阿里云镜像https://mirrors.aliyun.com/centos/7/os/$basearch/是为了国内下载速度,gpgcheck 保持 1 保证包完整性。

装之前资料给了一条关键检查命令:

# 检查 CPU 是否支持硬件虚拟化,返回 1 或更大说明支持 egrep -c '(vmx|svm)' /proc/cpuinfo

逻辑说明:返回 0 说明不支持硬件加速,必须把/etc/nova/nova.conf里[libvirt]段的virt_type改成qemu,否则实例起不来。这是物理机或嵌套虚拟化环境里最常见的坑,很多人装完发现虚拟机卡在 spawning 状态,就是这里没改。

2.4 nova.conf 配置:认证、消息队列、VNC 三块要对齐

资料用egrep -v "^#|^$"把备份文件里的注释和空行过滤掉生成新配置,这个做法能让配置文件干净很多。核心配置分几块:

[DEFAULT] enabled_apis = osapi_compute,metadata transport_url = rabbit://openstack:abc123@controller auth_strategy = keystone my_ip = 10.42.0.11 use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver [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 = nova [vnc] enabled = True vncserver_listen = 0.0.0.0 vncserver_proxyclient_address = $my_ip novncproxy_base_url = http://controller:6080/vnc_auto.html [glance] api_servers = http://controller:9292 [oslo_concurrency] lock_path = /var/lib/nova/tmp

逻辑说明:transport_url里的openstack:abc123是 RabbitMQ 的用户名密码,必须和 controller 上创建的一致,否则计算节点连不上消息队列,服务起不来。my_ip填本机管理网 IP,VNC 的vncserver_proxyclient_address引用它。firewall_driver用 Noop 是因为网络和防火墙交给 Neutron 管,Nova 自己别再插一脚。[glance]的api_servers指向控制节点的镜像服务,实例创建时要从这里拉镜像。

配置完启动服务:

systemctl enable libvirtd.service openstack-nova-compute.service systemctl start libvirtd.service openstack-nova-compute.service

逻辑说明:enable是设置开机自启,start是立即启动,两条都要。资料特别提醒 polkit 服务可能启动失败,重装后重启能解决;另外重启后要确认/etc/hosts里 controller 还能解析,因为 compute 服务要连 controller 的 MQ。

2.5 控制端验证:四条命令确认计算节点注册成功

装完不是看服务 active 就完事,要到 controller 上验证:

# 在控制节点执行 source admin-openrc openstack compute service list nova service-list nova endpoints

逻辑说明:admin-openrc是管理员凭证,不 source 的话命令会报权限不足。openstack compute service list和nova service-list是两代命令,都能列出注册的服务组件。资料说输出应该显示控制节点上四个服务组件、计算节点上一个,如果计算节点的 nova-compute 没出现,说明注册失败,回去查 nova.conf 的认证和 MQ 配置。nova endpoints验证 Keystone 里的 API 端点是否齐全。

3. Neutron 网络服务:Linux 桥接代理和通用组件怎么配

3.1 装包与 neutron.conf 通用组件

Neutron 在计算节点上装的是openstack-neutron-linuxbridge、ebtables、ipset三个包。Linuxbridge 是网络代理,ebtables 和 ipset 是它依赖的包过滤工具。

yum install openstack-neutron-linuxbridge ebtables ipset -y

逻辑说明:openstack-neutron-linuxbridge提供 Linux 桥接的 agent,负责把虚拟机的网卡桥接到物理网络。ebtables 处理二层过滤,ipset 管理 IP 集合,安全组规则依赖它们。参数上没得选,这三个是配套的。

配置通用组件时,资料同样用egrep -v "^$|^#"清理备份文件:

[DEFAULT] transport_url = rabbit://openstack:abc123@controller auth_strategy = keystone [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 = neutron password = neutron

逻辑说明:transport_url和 Nova 里一样,指向同一个 RabbitMQ。auth_strategy = keystone表示认证走 Keystone。[keystone_authtoken]里的用户名密码是 neutron 服务账号,必须和 controller 上创建的一致。这里如果密码写错,agent 启动后会反复重连,日志里刷认证失败。

3.2 Linux 桥接代理配置与重启验证

Linux 桥接代理的配置文件是/etc/neutron/plugins/ml2/linuxbridge_agent.ini,核心是物理网卡映射和 VXLAN 配置。资料里这部分标题重复了两次(1.4.3 和 1.4.4 都叫“配置 Linux 桥接代理”),实际内容应该是一段配置加一段验证。

[linux_bridge] physical_interface_mappings = provider:eth0 [vxlan] enable_vxlan = True local_ip = 10.42.0.11 l2_population = True [securitygroup] enable_security_group = True firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

逻辑说明:physical_interface_mappings把 provider 网络映射到物理网卡 eth0,这里的 eth0 要换成你机器上实际承载外部网络的网卡名,写错会导致外部网络不通。local_ip填本机管理网 IP,VXLAN 隧道用这个地址。l2_population开启后能减少广播,提升网络效率。firewall_driver用 iptables 实现安全组。

配置完重启服务:

systemctl restart neutron-linuxbridge-agent.service systemctl enable neutron-linuxbridge-agent.service

逻辑说明:restart让配置生效,enable设置开机自启。重启后到 controller 上验证:

# 控制节点执行 openstack network agent list

逻辑说明:这条命令列出所有网络 agent,计算节点的 Linux bridge agent 应该显示为 up 状态。如果显示 down 或根本没出现,检查 neutron.conf 的认证配置和 linuxbridge_agent.ini 的 local_ip。

4. PackStack 快速安装与实例管理:从一键部署到能登录的虚拟机

4.1 PackStack 环境准备与安装

资料第 2 章给了 PackStack 快速安装路径,适合想先跑通再深入的人。环境准备包括关闭防火墙、SELinux,设置主机名和 hosts,然后装 PackStack 包。

# 关闭防火墙和 SELinux(搭建阶段) systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config # 安装 PackStack yum install -y openstack-packstack packstack --allinone

逻辑说明:--allinone是单节点全组件部署,适合验证和测试。生产环境应该用 answer file 定制。参数上,--allinone会自动生成 answer file 并执行安装,过程比较长,网络不稳容易断,建议在 tmux 里跑。装完会输出 dashboard 地址和 admin 密码,记下来。

4.2 创建 Cell、查看用户与页面登录

PackStack 装完后资料提到创建 Cell、查看用户、页面登录、日志查看。Cell 是 Nova 的扩展单元,单节点环境一般用默认 cell 就行,多节点才需要显式创建。

# 查看 Keystone 用户列表 openstack user list # 查看服务目录 openstack service list

逻辑说明:openstack user list确认 admin、nova、neutron、glance 等服务账号都在。openstack service list确认各服务的 endpoint 注册完整。页面登录用http://controller/dashboard,账号 admin,密码在 PackStack 输出的 answer file 里(通常是/root/keystonerc_admin)。

日志查看主要在/var/log/下按组件分目录,nova、neutron、keystone、glance 各有自己的日志文件,排错时先看对应组件的日志。

4.3 实例管理:创建、VNC、SSH 三步走

资料第 3 章讲实例管理,流程是环境准备、创建实例、VNC 控制台、绑定浮动 IP 后 SSH。创建实例前要确保有镜像、有网络、有安全组。

# 创建实例(命令行方式) openstack server create --flavor m1.small --image cirros --nic net-id=<内网ID> --security-group default --key-name mykey test-vm

逻辑说明:--flavor是资源规格,--image是镜像名,--nic net-id指定接入的内网,--security-group是安全组,--key-name是密钥对。参数里内网 ID 用openstack network list查。创建后状态从 build 变 active 才算成功。

VNC 是在页面上点实例名称进控制台,适合看启动过程和排查网络不通。SSH 需要先绑定浮动 IP:

# 绑定浮动 IP openstack server add floating ip test-vm <浮动IP>

逻辑说明:浮动 IP 从外部网络分配,绑定后实例才能从外部访问。绑完用ssh -i mykey.pem cirros@<浮动IP>登录。如果连不上,先检查安全组是否放行 22 端口,再检查路由器是否把内外网连通。

4.4 计算节点扩展:加节点就是复制配置改 IP

资料 3.4 节讲计算节点扩展,步骤是环境准备、装计算节点、改 hostname、配 nova、启动服务、控制端验证。核心思路是把 compute01 的配置复制到新节点,改my_ip和主机名。

# 新节点上改 hostname hostnamectl set-hostname compute02 # 改 /etc/hosts 加入新节点记录

逻辑说明:新节点的my_ip要改成自己的管理网 IP,/etc/hosts里要加上 controller 和所有计算节点的记录。配完启动服务,到 controller 上openstack compute service list应该能看到新的 nova-compute。

5. 网络与存储管理:外部网络、内部网络、路由器、浮动 IP 的创建顺序

5.1 创建外部网络与内部网络

资料 3.7 节把网络管理讲得比较细。外部网络在管理员视角创建,模拟物理网卡;内部网络在项目视角创建,模拟局域网。

# 管理员创建外部网络 openstack network create --external --provider-physical-network provider --provider-network-type flat public # 创建外部子网 openstack subnet create --network public --subnet-range 192.168.1.0/24 --gateway 192.168.1.1 --no-dhcp public-subnet

逻辑说明:--external标记为外部网络,--provider-physical-network provider对应 linuxbridge_agent.ini 里的映射名,--provider-network-type flat表示不封装。子网用--no-dhcp因为外部网络的 IP 由物理网络分配。

# 项目视角创建内部网络 openstack network create private openstack subnet create --network private --subnet-range 10.0.0.0/24 --gateway 10.0.0.1 --dns-nameserver 8.8.8.8 private-subnet

逻辑说明:内部网络用 vxlan 或 vlan 隔离,子网开 DHCP 给虚拟机自动分配 IP。--dns-nameserver让虚拟机内能解析域名。

5.2 创建路由器打通内外网

路由器是外部网络和内部网络的连接器,创建后要设置网关和添加接口。

# 创建路由器 openstack router create router1 # 设置外部网关 openstack router set --external-gateway public router1 # 添加内部子网接口 openstack router add subnet router1 private-subnet

逻辑说明:--external-gateway public让路由器能访问外部网络,add subnet把内部子网挂到路由器上。这样内网虚拟机就能通过路由器访问外网(SNAT)。外网访问内网需要绑定浮动 IP(DNAT)。

5.3 浮动 IP 与安全组

浮动 IP 从外部网络分配,绑定到实例后实现外网访问。

# 创建浮动 IP openstack floating ip create public # 绑定到实例 openstack server add floating ip test-vm <浮动IP>

逻辑说明:浮动 IP 是 NAT 映射,绑定后外部流量转到实例的内网 IP。安全组控制哪些端口能进:

# 放行 SSH openstack security group rule create --protocol tcp --dst-port 22 default

逻辑说明:默认安全组通常只放行 ICMP 和少量端口,SSH 要手动加。--dst-port 22指定端口,--protocol tcp指定协议。

6. 避坑与排查:五条血泪经验

6.1 计算节点注册不上,openstack compute service list里没有 nova-compute

现象:服务 active,但控制端看不到计算节点。原因:nova.conf 里transport_url的 RabbitMQ 密码错,或者/etc/hosts里 controller 解析不到。解决:先ping controller确认解析,再rabbitmqctl list_users确认账号密码,最后看/var/log/nova/nova-compute.log里的具体报错。

6.2 实例卡在 spawning 或 error

现象:创建实例后一直 spawning,最后 error。原因:CPU 不支持硬件虚拟化但virt_type没改成 qemu,或者 Glance 镜像服务连不上。解决:egrep -c '(vmx|svm)' /proc/cpuinfo检查,返回 0 就改[libvirt] virt_type = qemu;再确认[glance] api_servers地址能 curl 通。

6.3 虚拟机有内网 IP 但访问不了外网

现象:实例能 ping 通同网段,但 ping 不通外网。原因:路由器没设外部网关,或者外部网络的provider-physical-network映射和 linuxbridge_agent.ini 不一致。解决:openstack router show router1看external_gateway_info是否为空,空的话openstack router set --external-gateway public router1;再核对映射名。

6.4 浮动 IP 绑了但 SSH 连不上

现象:浮动 IP 绑定成功,但 SSH 超时。原因:安全组没放行 22 端口,或者实例内防火墙没关。解决:openstack security group rule list default看有没有 22 端口规则,没有就加;实例内systemctl stop firewalld临时关闭验证。

6.5 重启后服务全挂

现象:机器重启后 OpenStack 服务没起来。原因:systemctl enable没做,或者/etc/hosts被覆盖导致主机名解析失败。解决:逐个systemctl enable关键服务(libvirtd、nova-compute、neutron-linuxbridge-agent),并把 hosts 配置写进容器启动脚本或镜像里。

7. 多物理节点聚合与进阶技巧:从单机到能交付的私有云

资料第 4 章讲聚合多物理节点创建云主机,整体规划、添加计算节点、装镜像、建安全组、建密钥对、建网络拓扑、创建实例、控制台查看、绑浮动 IP、SSH 管理,最后给整体概况。这一章是把前面所有单节点操作复制到多节点并保证一致性的过程。

多节点最容易出问题的是配置漂移:compute01 改了某个参数,compute02 忘了改,结果实例调度到 compute02 就失败。我一般会用一个检查脚本在每台计算节点上跑一遍:

#!/bin/bash # 检查计算节点关键配置一致性 echo "=== hostname ===" hostname echo "=== my_ip ===" grep "^my_ip" /etc/nova/nova.conf echo "=== transport_url ===" grep "^transport_url" /etc/nova/nova.conf echo "=== local_ip ===" grep "^local_ip" /etc/neutron/plugins/ml2/linuxbridge_agent.ini echo "=== hosts ===" cat /etc/hosts echo "=== services ===" systemctl is-active libvirtd openstack-nova-compute neutron-linuxbridge-agent

逻辑说明:这个脚本把每台节点上影响注册和网络的关键参数打出来,多节点部署时逐台跑,对比输出是否只有my_ip和local_ip不同,其余必须一致。systemctl is-active一次性检查三个核心服务,输出 active 才算正常。参数上,grep "^my_ip"只匹配行首,避免匹配到注释行。

镜像管理方面,资料提到 Glance 和 Cinder、Swift。Glance 管镜像,Cinder 管块存储,Swift 管对象存储。多节点环境里 Glance 通常部署在控制节点,计算节点通过[glance] api_servers访问。Cinder 如果没配,创建实例时只能用本地磁盘或临时盘,数据不持久。我一般会先确认openstack image list有可用镜像,openstack volume type list有存储后端,再创建实例。

网络拓扑在多节点下要确认所有计算节点的 linuxbridge_agent.ini 里local_ip是各自的管理网 IP,VXLAN 隧道才能互通。如果实例跨节点通信失败,先openstack network agent list看各节点的 agent 是否 up,再检查 VXLAN 的local_ip有没有写错。

密钥对和安全组是多节点交付前的最后一道检查。密钥对在项目里创建,公钥存 OpenStack,私钥自己留着。安全组规则要覆盖 SSH、ICMP 和业务端口。我习惯在交付前用一台跳板机 SSH 到每台新建实例,确认网络和认证都通,再交给用户。

从那以后我每次搭多节点 OpenStack,都强制先跑一遍上面那个一致性检查脚本,确认所有计算节点的my_ip、local_ip、transport_url和 hosts 只有该不同的地方不同,再往下创建实例。这个习惯帮我省掉了至少三次“实例调度到某台节点就失败”的排查时间。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 1:27:18

C++ vector模拟实现:掌握内存管理与RAII精髓

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:27:13

Windows DCOM安全属性深度解析:权限、身份验证与注册表映射

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:26:38

政务知识库接入DeepSeek:RAG架构、数据清洗与私有化部署全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:26:25

Qt窗口程序开发实战:工程骨架、布局、信号槽、线程与打包排错

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:26:24

嵌入式开发告别古法编程:智能体辅助开发实战与边界

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:26:01

Agent开发FPGA工程:从脚本化到自动编排的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华