DevStack部署OpenStack入门指南:单节点云环境实战

发布时间:2026/10/2 20:04:11
DevStack部署OpenStack入门指南:单节点云环境实战 这个系列写到第17篇前面十几篇都在讲概念、组件架构、各个服务模块之间的关系说白了都是在给今天这篇做铺垫。OpenStack这东西光靠看文档是永远学不会的你得上手装一遍、点一遍、踩一遍坑才算真正开始懂它。但手动部署一套OpenStack对新手太不友好十几个服务、几十个组件包、各种依赖关系和版本约束第一次搞没个两三天根本起不来折腾到后面往往连报错都看不懂。所以社区搞了个叫DevStack的工具专门用于快速拉起一套单节点OpenStack环境让开发者和学习者能在几十分钟内看到整个平台完整跑起来。这篇就带你把它部署出来。先说清楚这篇适合谁看你是运维工程师、云计算方向的学生或者单纯想搞明白OpenStack到底怎么工作的开发者只要手里有一台还能用的电脑愿意开个虚拟机折腾一下这篇都能带你走完全程。你会在这篇里得到一套能登录、能创建云主机的OpenStack环境同时也知道部署过程中最容易在哪里翻车、日志去哪儿查、出了问题怎么重来。1. 为什么说 DevStack 是 OpenStack 学习路上的必经之路1.1 DevStack 到底是什么DevStack是一组由OpenStack官方维护的shell脚本核心就一个文件stack.sh。它的工作方式非常简单粗暴把OpenStack所有核心服务比如Keystone、Glance、Nova、Neutron、Cinder、Horizon全部下载源码、安装依赖、修改配置然后在一台机器上拉起来。它能让OpenStack从“零”到“可用”的时间压缩到半小时左右这在手动的世界里是不可想象的。我见过不少新人第一次手动部署OpenStack从找文档到配数据库到调网络折腾三天最后环境还是坏的挫败感极强。DevStack的意义就在于把这种挫败感提前消解掉它把环境问题一次解决让你把精力放在“OpenStack本身是怎么工作的”这件事上。顺便说一句DevStack里的“Dev”是Development的缩写它的设计初衷是给开发OpenStack的人提供调试环境不是给生产环境用的。这一点理解到位了后面很多选择你就能想通它为什么这样做。1.2 DevStack、手动部署、Kolla-Ansible 怎么选经常有人问我学OpenStack到底该用DevStack还是手动部署还是Kolla-Ansible我的建议很明确第一遍学习DevStack想搞懂细节再手动想上生产Kolla-Ansible或者更专业的发行版。方案部署难度耗时适合场景缺点DevStack低30-60分钟学习、开发调试、功能验证不适合生产单节点为主手动部署高2-3天起步学习组件原理、生产排障基础依赖关系复杂新手容易崩溃Kolla-Ansible中高1-2小时生产化部署、多节点容器化架构学习曲线较陡DevStack的真正优势不是“快”而是它把OpenStack复杂的分步部署逻辑封装成了黑盒。你不需要关心每个包装在哪、每个配置文件改哪里它全都处理好了。这样你就能直接跳到下一层登录Dashboard、创建网络、启动云主机从使用者的角度建立起对整个平台的体感然后再回头去理解内部机制学习效率反而高得多。1.3 “仅供参考”背后的潜台词这个系列在标题里写了“仅供参考”这几个字我建议你认真对待。DevStack有一个比较出名的问题它默认配置里很多密码、密钥都是固定的它也不会帮你做高可用、不会做安全加固日志级别又是debug跑在公网上基本等于裸奔。所以我在这里也把话说在前面你在自己电脑的虚拟机里拿DevStack练手没问题你把它部署到公司服务器上对外提供服务那是给自己埋雷。正规的生产路径是Kolla-Ansible、OpenStack-Helm这类容器化方案或者直接购买商业发行版。而DevStack在你的技术成长路径上扮演的角色是“启蒙环境”它负责让你用最低成本理解OpenStack的整体工作流程。定位摆正了你学起来反而不会有心理负担也知道自己在做什么。2. 部署 DevStack 之前把这五项先检查一遍2.1 硬件配置8G 内存是及格线16G 是舒适区DevStack虽然只在单机跑但它同时要承载Nova的虚拟机管理、Neutron的网络服务、Cinder的卷服务、Horizon的Web界面还有MySQL、RabbitMQ这些基础组件。资源不够部署过程中进程直接被OOM杀掉是家常便饭。我给你的建议配置如下项目最低要求推荐配置说明CPU4核8核编译部分源码会占用多核内存8G16G8G只跑核心服务勉强够磁盘40G80G源码、日志、镜像非常占空间网络单网卡双网卡单网卡也能跑双网卡更清晰内存这块我踩过很多次坑。曾经用4G内存跑DevStack部署到一半MySQL进程就被杀掉了然后Keystone一直连不上数据库日志里全是“MySQL server has gone away”。后来老老实实把虚拟机内存加到8G问题立刻消失。如果你手头的机器只有8G建议在local.conf里只启用核心服务别加太多插件也能跑得动。2.2 系统选择为什么 Ubuntu 是默认答案DevStack官方支持的发行版不少Fedora、CentOS Stream、Debian都在列表里但我还是会推荐你用Ubuntu 22.04 LTS。原因很简单DevStack的CI集群测试最多的就是Ubuntu遇到问题搜一下几乎都能找到对应的解决方案。另一个实际原因是Python版本和包管理器的兼容性。OpenStack各服务对Python版本有严格要求Ubuntu 22.04自带Python 3.10能很好地路由到正确的依赖。CentOS那边想装OpenStack经常要先处理Python版本冲突对新手来说凭空多了一堆麻烦事。如果你用的是CentOS或者Rocky Linux能装吗能但我不建议第一次就挑战自己。学习环境的目的是减少变量Ubuntu能帮你屏蔽掉系统和Python层面的兼容性问题。先把OpenStack本身跑起来再考虑系统差异。2.3 网络准备一张还是两张网卡HOST_IP 怎么定DevStack默认的网络方案是flat网络也就是说OpenStack里创建的虚拟机要和宿主机共享同一个物理网络由Neutron负责分配IP和DHCP。这就意味着你的宿主机或虚拟机必须有一个能从外部访问的真实IP地址。单网卡完全可以跑通前提是你明白HOST_IP这个参数的含义。它是OpenStack各服务监听的IP地址直接影响Dashboard和API服务能不能被访问。很多人部署完发现网页打不开多半就是HOST_IP填了127.0.0.1服务全绑在回环地址上了。更合理的做法是给实验虚拟机配一个固定IP比如192.168.1.10在local.conf里把HOST_IP设为这个值。这样你从宿主机或者其他机器访问http://192.168.1.10/dashboard 就能正常打开。如果你同时还配置了浮动IP池创建云主机后还能拿到一个可以远程连通的地址体验会完整很多。还有两种比较麻烦的网络场景一是公司网络里有多层路由浮动IP池的网段和你宿主机不在同一个广播域导致云主机网络不通二是通过代理上网的环境git和pip都会受代理影响需要先在系统层面配好代理变量。这两种情况在学习环境里能避免就尽量避免否则排查起来非常痛苦。2.4 虚拟化到底开没开嵌套虚拟化的坑这个点我必须单独拿出来说因为无数人栽在这里。DevStack里的Nova要创建KVM虚拟机就需要宿主机有虚拟化能力。而很多新手是在自己笔记本上装VMware Workstation再在里边开Ubuntu虚拟机跑DevStack这就涉及嵌套虚拟化。如果你在VMware Workstation创建虚拟机时没有在“处理器”设置里勾选“虚拟化Intel VT-x/EPT或AMD-V/RVI(V)”那么Ubuntu虚拟机里检测不到完整的硬件虚拟化Nova的libvirt会退化成QEMU软件模拟或者直接报错。常见报错就是那句“模块‘hv’启动失败。未能启动虚拟机。”解决方法很直接关掉虚拟机在VMware的虚拟机设置里找到处理器选项勾选虚拟化引擎中的相关选项然后重新启动。如果你Windows系统本身开了Hyper-VVMware Workstation可能会和它冲突这种时候要么关闭Hyper-V要么改用VirtualBox并打开嵌套虚拟化选项。在Linux服务器上用KVM跑嵌套虚拟化也一样需要宿主机加载内核模块时启用嵌套特性比如对Intel CPU执行modprobe kvm_intel nested1。确认虚拟化生效可以进Ubuntu虚拟机后执行lscpu | grep Virtualization看到VT-x或AMD-V字样再配合ls /dev/kvm存在才算真的准备好了。2.5 部署前的快照习惯关键时刻能救命这一条看似简单但真的能救命。DevStack部署过程中出点小问题太正常了而很多时候你排错排到心累最优雅的解决办法其实就是“回到干净状态重来一次”。所以在开始之前务必在虚拟机管理平台里打一个干净快照确保里面有操作系统、有网络、有SSH但还没装任何OpenStack相关的东西。有了快照你就可以放心大胆地反复折腾。部署失败了回滚快照几分钟后又是一个干净环境。我见过不少人喜欢在同一个坏掉的环境里反复跑清理脚本越清越脏最后连系统都想重装。快照思维是运维的基本功它同样是玩OpenStack实验环境的基本功。3. DevStack 部署实操从零到 Dashboard 出现3.1 创建 stack 用户并准备 sudo 权限DevStack官方明确要求不能用root直接部署理由是为了安全也为了避免某些服务拒绝以root身份运行。所以第一步是创建一个专用的stack用户。使用SSH登录到你的Ubuntu虚拟机后执行下面的命令sudo useradd -s /bin/bash -d /opt/stack -m stack echo stack ALL(ALL) NOPASSWD: ALL | sudo tee /etc/sudoers.d/stack创建用户的时候把家目录定在/opt/stack是因为后面DevStack会把OpenStack的源码都放这里单独分一个目录也方便管理。sudoers.d里的免密sudo配置是让stack用户在部署过程中可以执行管理员命令而不需要反复输入密码否则自动化脚本会在某个地方卡住。建议你现在就切换到这个用户下操作sudo su - stack接下来的所有步骤都默认你已经处于stack用户环境。3.2 拉取 DevStack 源码与 local.conf 配置详解DevStack的源码托管在OpenStack的官方代码平台opendev.org上。如果你的网络访问它比较慢也可以直接去GitHub搜devstack项目拉取镜像仓库代码内容是一致的。切换好用户后先clone下来git clone https://opendev.org/openstack/devstack cd devstack源码拉下来后最关键的就是创建local.conf配置文件。这个文件决定了你要装哪些服务、组件之间怎么通信、网络怎么规划。如果你什么都不配直接跑stack.sh它也能跑起来但很多参数会用默认值反而容易踩坑。我的建议是先按下面这份配置跑第一遍[[local|localrc]] ADMIN_PASSWORDsecret DATABASE_PASSWORD$ADMIN_PASSWORD RABBIT_PASSWORD$ADMIN_PASSWORD SERVICE_PASSWORD$ADMIN_PASSWORD HOST_IP192.168.1.10这里解释一下每个参数的用途参数作用ADMIN_PASSWORD管理员账号admin的登录密码同时作为其他服务默认密码的基础DATABASE_PASSWORDMySQL数据库的密码RABBIT_PASSWORDRabbitMQ消息队列的密码SERVICE_PASSWORD各OpenStack服务之间的通信密码HOST_IP本机对外IP所有服务监听和API访问都基于它如果后面你想让创建出来的云主机能自动拿到公网浮动IP还需要在local.conf里追加浮动IP池的配置Q_FLOATING_ALLOCATED_POOL192.168.1.200,192.168.1.210 PUBLIC_NETWORK_GATEWAY192.168.1.1这段配置的意思是从192.168.1.200到192.168.1.210这个IP段作为浮动IP资源池网关指向你的路由器地址。需要注意这个网段必须和宿主机在同一个网络里否则IP通了也路由不出去。3.3 执行 stack.sh过程中到底发生了什么配置写完后执行./stack.sh 21 | tee /tmp/stack.sh.logtee的作用是把屏幕输出同时写入日志文件后面排查问题要靠它。整个部署过程一般需要20到50分钟具体取决于你的网速和机器性能。部署过程大致分三个阶段。第一阶段是下载源码和安装系统依赖包包括编译Python包、安装MySQL、RabbitMQ等屏幕上会滚动大量apt和pip输出。第二阶段是初始化数据库Keystone会往MySQL里建库建表这一步能看到很多“Creating tables”的字样。第三阶段是启动各服务Nova、Neutron、Glance等进程陆续被拉起最后HorizonDashboard启动脚本会提示访问地址。这里强烈建议你用screen或者tmux跑部署或者至少开一个终端挂在后台。因为整个部署时间较长SSH连接一旦断开进程可能被中断导致环境处于半成品状态非常难恢复。如果你没用screen命令养成交替执行screen -S devstack再进终端跑./stack.sh的习惯能省掉大量懊恼。部署完成后你可以用screen -r stack查看OpenStack各服务的运行状态DevStack的管理方式就是把每个服务挂在一个独立的screen窗口里。3.4 部署完成后的第一次登录和基本验证部署完成通常会在最后输出一段提示This is your host IP address和Dashboard的URL。在你的浏览器里访问http://192.168.1.10/dashboard使用用户名admin、密码secret登录密码是你local.conf里设置的ADMIN_PASSWORD。如果你是配置的demo用户一般密码和ADMIN_PASSWORD相同项目选择demo。第一次登录Dashboard看到的是一个正常的云管理控制台界面左侧有计算、网络、镜像等服务菜单。这个时候别急着创建云主机先验证一下后端服务是否都正常。可以回到SSH终端执行openstack service list openstack compute service list openstack network agent list这三条命令分别查询平台服务列表、Nova计算节点状态、Neutron网络代理状态如果它们返回的状态都是up说明这一套DevStack环境已经站稳了。到这一步你的OpenStack学习环境正式落地。4. 我在实战中踩过的坑DevStack 高频报错排查实录4.1 网络类故障源码拉不下来、pip 装不动DevStack部署过程中最耗时间的其实就是下载与其说是部署失败不如说是下载失败。国内网络环境下访问opendev.org或者PyPI官方源经常超时git clone到一半断掉pip install动不动就Retrying。遇到git拉取慢或失败解决办法是换仓库源。可以直接从GitHub克隆devstack或者在某些代码托管平台上找同步镜像。拉下来之后如果你发现某些子项目比如nova、neutron还是从opendev.org的子模块地址拉取可以设置git全局替换规则把opendev.org替换成可访问的地址。pip安装慢和失败的问题更常见也更简单粗暴。修改pip配置指向国内镜像源mkdir -p ~/.pip cat ~/.pip/pip.conf EOF [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn EOF这个配置要在stack用户的家目录下设置因为部署过程是以stack用户执行的。另外如果前端编译过程中npm也卡住同理可以给npm设置国内registry镜像。这类网络问题不会让部署“报错”得很明显但会表现为某个步骤一直卡着不动这时候去看/tmp/stack.sh.log往往能看到一堆timeout和Retrying记录。4.2 资源类故障内存不足导致服务反复重启资源类故障是新手容易忽略的方向因为报错信息很迷惑。最常见的情况是部署到MySQL初始化阶段突然报错日志里有“Killed”字样或者服务状态反复显示“start request repeated too quickly”。“Killed”通常意味着进程是被OOM Killer杀掉的。DevStack同时运行的服务太多内存顶不住系统就会挑肥肉杀MySQL和RabbitMQ往往是第一批受害者。判断方法很简单执行dmesg | tail -20看有没有明显的out of memory记录。这种问题最优解是给虚拟机加内存加到16G通常就完全没问题。如果不想加内存可以精简服务在local.conf里注释掉cinder、swift、heat等非必要插件让DevStack只装core服务。再有就是别在部署期间同时在虚拟机上跑其他重型任务我就见过有人一边部署一边跑编译结果双双被OOM带走。另外还要检查磁盘空间。OpenStack源码加上镜像文件、日志文件轻松超过20G磁盘写满后各种诡异问题都会冒出来。部署前务必确认根目录拥有足够空间使用df -h看看。4.3 配置类故障endpoint 错了、服务没起来这类问题通常不是脚本执行失败而是环境起来了但功能不对。比如登录Dashboard能进去但创建云主机时发现网络列表是空的或者用CLI执行openstack endpoint list发现Keystone里面记录的endpoint地址是错的。endpoint地址错误几乎都是HOST_IP配置不对导致的。DevStack在初始化阶段会把HOST_IP写进Keystone的endpoint注册表如果填写的是127.0.0.1所有API地址都会指向回环地址。外部客户端访问不到CLI也会报“Unable to establish connection”。还有一种服务起不来的情况与端口占用有关。比如你在宿主机上已经跑了一个Nginx占用了80端口Horizon可能无法正常启动。排查方法是用ss -lntp查看端口占用关掉冲突进程后再重新执行./unstack.sh ./stack.sh。Horizon页面样式错乱或者登录后接口报500通常看这些日志日志文件对应服务/opt/stack/logs/screen/horizon.logHorizon仪表板/opt/stack/logs/screen/keystone.logKeystone认证服务/opt/stack/logs/screen/nova-api.logNova API服务/opt/stack/logs/screen/neutron-server.logNeutron网络服务DevStack把服务的实时输出都放在/opt/stack/logs/screen/目录下按服务名分文件。排查任何功能问题先从这个目录对应的日志入手比盲目重启服务有效得多。4.4 重来一遍的正确姿势unstack、clean 与快照回滚DevStack提供了几个管理脚本很多人搞不清楚它们的区别这里我一次说清楚。./unstack.sh的作用是停止当前所有正在运行的OpenStack服务相当于关停环境但不会删除数据和源码。当你改了local.conf想重新部署或者只是想重启环境用这个。./clean.sh的作用是清空所有OpenStack相关的数据文件和日志但不会卸载系统级依赖包。当你觉得环境已经彻底乱了想重新初始化所有服务可以先用unstack再clean然后重新跑stack.sh。但我的经验是如果你的环境经历过多次失败源码和配置文件已经被改得面目全非clean.sh不见得能清理干净。最稳妥的做法还是回到我们之前说的快照。回滚快照后你就在一个全新系统上重来整个过程比清理旧环境还快。还有一点很关键不要用sudo ./stack.sh来执行部署。DevStack内部会检测用户如果发现是root会直接拒绝。正确做法是确保当前用户是stack并且拥有sudo权限。同样不要频繁在不同用户之间切换部署源码目录的所属权乱了也会引发权限类的报错。我整理了一张高频报错速查表你在遇到问题时可以先对号入座报错现象大概率原因处理建议git clone超时网络访问opendev.org不通改用GitHub镜像或导入zip包pip安装依赖失败默认PyPI源访问慢配置清华等国内镜像源部署中进程被Killed内存不足加内存或精简非必要服务MySQL服务反复重启数据目录权限或磁盘满检查磁盘空间修复权限Dashboard无法打开HOST_IP配置为127.0.0.1改为真实IP并重新部署创建云主机一直ERROR虚拟化未开启检查/dev/kvm是否存在API连不上Keystoneendpoint地址错误检查和重设HOST_IP5. 部署不是终点用 CLI 跑通你的第一个云主机5.1 加载环境变量环境搭好只是第一步。接下来你肯定想知道OpenStack到底能不能像宣传里那样一键创建一台云主机。我用命令行给你演示一遍这是实验环境中最常见的操作路径。DevStack部署时会在/opt/stack/devstack目录下生成一个openrc文件里面包含了当前环境所有必要的环境变量和认证信息。加载它之后你的CLI才能正确连接到OpenStack API。cd /opt/stack/devstack source openrc admin admin第一个参数是用户名第二个是项目名。admin admin就是用管理员身份操作。如果你想让自己的操作更贴近普通用户可以改成source openrc demo demo这代表以demo用户登录demo项目体验更真实。加载完可以先跑一条openstack token issue看看能不能成功获取认证令牌能输出一长串UUID说明CLI和环境已经连通。5.2 创建网络、子网与路由器OpenStack里创建云主机之前必须先把网络环境准备好。我习惯用下面的顺序先建网络再建子网再建路由器然后把子网接入路由器最后给路由器设置外部网关。openstack network create demo-net openstack subnet create demo-subnet \ --network demo-net \ --subnet-range 192.168.100.0/24 \ --dns-nameserver 8.8.8.8 openstack router create demo-router openstack router add subnet demo-router demo-subnet openstack router set demo-router --external-gateway public这里的public网络是DevStack部署时自动创建的外部网络对应你配置的浮动IP池。你创建的内部子网负责给云主机分配私有IP路由器的角色是把这些私有IP通过NAT转发到外部网络云主机才能获得浮动IP访问外网。如果你不创建这些直接在Dashboard里选默认网络很容易出现创建云主机后没有网络可用或者IP分配不到的情况。我建议你在学习阶段就用命令行建一遍这样对Neutron的网络模型会有直观理解。5.3 创建安全组规则与第一台实例默认情况下新建的云主机不会放通任何外部流量包括ping和SSH。这个安全设计经常让人误以为网络坏了。我们需要先给默认安全组添加规则openstack security group rule create default --protocol icmp openstack security group rule create default --protocol tcp --dst-port 22然后确认一下当前的镜像和规格openstack image list openstack flavor listDevStack默认会帮你在Glance里上传一个很小的镜像通常是cirros这个镜像专门用于OpenStack测试只有几十MB。规格里会有m1.tiny内存512M正好适合实验。然后执行创建命令openstack server create \ --image cirros-0.6.2-x86_64-disk.img \ --flavor m1.tiny \ --network demo-net \ demo-vm镜像名字以你openstack image list里实际显示为准直接复制过去就行。创建后可以用openstack server list查看状态从BUILD变成ACTIVE就表示云主机启动成功。5.4 给云主机绑定浮动 IP 并验证连通性云主机创建成功但只有一个私有IP外面连不进去。这时候浮动IP就派上用场了openstack floating ip create public openstack server add floating ip demo-vm 浮动IP地址第一条命令会从public网络中分配一个浮动IP第二条命令把它绑定到demo-vm上。绑定后你可以尝试ping 浮动IP地址 ssh cirros浮动IP地址cirros镜像默认用户名是cirros密码是gocubsgo端口就是22。能ping通并且能SSH登录说明整个网络链路是通的从虚拟化到网络到安全组全都工作正常。到这一步你已经亲手完成了一朵“小云”从搭建到使用的完整闭环。5.5 部署完成后还能怎么玩第一个云主机跑通后这个环境可以继续支持你玩很多内容。比如在Dashboard里尝试给云主机创建快照再基于快照创建新实例或者创建一块Cinder云硬盘挂载到云主机上也可以试着在local.conf里启用Heat服务编排插件用模板一次性创建一组云资源。如果你想进一步折腾还可以尝试把DevStack部署成多节点模式一个控制节点加一个计算节点这能帮你理解控制平面和数据平面的分离。不过多节点对网络要求高一些建议先把单节点的完整流程摸透再上。最后再分享一点实操体会我前前后后部署过几十次DevStack回头来看最大的收获其实不是那几条部署命令而是被各种报错折磨出来的排查思路。每次看/opt/stack/logs/screen/下的服务日志都是在对OpenStack加深一层理解。建议你部署完不要急着删掉环境多创建几次云主机、多改几次网络配置遇到问题先看日志而不是直接重装这个过程比任何教程都值钱。另外再强调一次留好干净快照大胆去折腾这个环境就是拿来练手的坏了回滚就行。你现在踩的每一个坑将来在面对真实生产环境时都会变成你的判断力。