Ubuntu 22.04上使用DevStack快速部署OpenStack开发测试环境
在国内开发或测试环境中快速搭建一个可用的 OpenStack 平台是很多学习者和开发者面临的第一道门槛。手动部署 OpenStack 组件复杂且耗时而 DevStack 作为一个自动化部署脚本工具能够极大地简化这一过程。它通过一系列 Shell 脚本将 OpenStack 的核心服务快速部署到一台机器上非常适合用于开发、测试和概念验证。本文将带你在一台 Ubuntu 22.04 LTS 系统上从零开始完成 DevStack 的配置和 OpenStack 的快速部署并解释每一步背后的原理和常见问题的排查方法。本文的目标读者是具备 Linux 基础操作知识希望快速获得一个 OpenStack 实验环境的开发者或运维人员。通过本文你将理解 DevStack 的工作机制掌握从系统准备、网络配置、脚本修改到服务验证的全流程并能处理部署过程中遇到的大部分典型错误。1. 理解 DevStack 的核心机制与准备工作DevStack 并非一个生产级的部署工具它的设计目标是“快速”和“可重复”。它通过 Git 拉取 OpenStack 各个项目的最新代码或指定分支然后运行一系列安装和配置脚本在本地创建一个 All-in-One单节点的 OpenStack 环境。这意味着所有服务如 Nova、Neutron、Glance、Keystone 等都将运行在同一台主机上。在开始之前必须明确几个关键前提这能避免后续很多问题纯净的系统强烈建议使用新安装的 Ubuntu 22.04 LTS 系统。已有复杂环境或旧版本残留可能导致依赖冲突。充足的资源单节点部署对硬件有一定要求。建议至少提供 4 核 CPU、8 GB 内存和 50 GB 磁盘空间。虚拟机资源不足是部署失败的主要原因之一。稳定的网络部署过程中需要从 GitHub、PyPI 等源下载大量软件包和代码网络中断或缓慢会导致脚本执行超时失败。正确的身份全程需要使用具有sudo权限的非 root 用户例如ubuntu或stack进行操作DevStack 脚本会检查此点。1.1 基础系统环境准备首先确保系统是最新的并安装一些基础工具。# 更新系统包列表和已安装的包 sudo apt update sudo apt upgrade -y # 安装 DevStack 所需的基础工具如 Git、Python 环境等 sudo apt install -y git python3-pip接下来创建一个专门用于运行 DevStack 的用户。虽然可以使用现有用户但创建一个独立的stack用户是一种最佳实践可以更好地隔离环境。# 创建 stack 用户并设置密码 sudo useradd -s /bin/bash -d /opt/stack -m stack echo stack ALL(ALL) NOPASSWD: ALL | sudo tee /etc/sudoers.d/stack切换到stack用户后续所有操作都将在此用户下进行。sudo su - stack1.2 配置系统与网络环境DevStack 会配置复杂的网络包括桥接设备和 IP 地址。为了避免与现有网络管理服务冲突我们需要先禁用 Ubuntu 自带的网络管理器对于服务器版通常未安装可跳过。更重要的是确保主机名设置正确。# 设置主机名例如设置为 ‘devstack’ sudo hostnamectl set-hostname devstack # 编辑 /etc/hosts确保 127.0.1.1 或 127.0.0.1 指向正确的主机名 echo 127.0.0.1 devstack | sudo tee -a /etc/hosts对于虚拟机环境如 VMware、VirtualBox需要确保虚拟机的网络适配器设置为“桥接模式”或“NAT 模式”并且主机可以访问互联网。在物理机上则需保证网络连通。2. 获取与配置 DevStack环境准备就绪后就可以获取 DevStack 脚本并进行关键配置了。2.1 克隆 DevStack 仓库在stack用户的家目录下克隆官方仓库。建议使用稳定分支如stable/zed对应 OpenStack Zed 版本以避免主分支可能存在的临时问题。# 进入家目录 cd ~ # 克隆 stable/zed 分支 git clone https://opendev.org/openstack/devstack -b stable/zed cd devstack2.2 创建本地配置文件local.conflocal.conf是 DevStack 的核心配置文件它允许我们自定义各种参数如密码、服务、网络配置等。在devstack目录下创建该文件。# 使用文本编辑器创建并编辑 local.conf nano local.conf以下是一个最小化但功能完整的local.conf配置示例它定义了管理员密码、启用基础服务并配置了简单的 FlatDHCP 网络。将此内容复制到文件中[[local|localrc]] # 通用配置 ADMIN_PASSWORDsecretadmin DATABASE_PASSWORD$ADMIN_PASSWORD RABBIT_PASSWORD$ADMIN_PASSWORD SERVICE_PASSWORD$ADMIN_PASSWORD # 启用基础服务 enable_plugin heat https://opendev.org/openstack/heat stable/zed enable_plugin magnum https://opendev.org/openstack/magnum stable/zed # 网络配置 - 使用简单的 FlatDHCP 模式更易成功 FLOATING_RANGE192.168.100.224/27 FIXED_RANGE10.0.0.0/24 FIXED_NETWORK_SIZE256 FLAT_INTERFACEeth0 PUBLIC_INTERFACEeth0 # 禁用安全组仅用于测试简化网络访问 disable_service tempest关键参数解释ADMIN_PASSWORDOpenStack 管理员密码其他服务密码默认与其相同。FLOATING_RANGE浮动 IP 池需要是一个与主机物理网络eth0所在网络同网段但未被占用的 IP 段。例如主机 IP 是192.168.100.10那么可以设置一个该子网内的小段。FLAT_INTERFACE指定用于扁平网络的物理网卡名称使用ip addr命令查看你的网卡名可能是ens33,enp0s3等。disable_service tempest禁用集成测试服务 Tempest以加快部署速度。注意FLOATING_RANGE的配置是初期失败的高发区。如果主机使用 DHCP 获取 IP且你无法控制所在网段可以考虑先使用PUBLIC_INTERFACEeth0但不配置FLOATING_RANGE让 DevStack 仅创建私有网络后续再处理外部网络。3. 执行部署与监控过程配置完成后就可以运行部署脚本了。这个过程会持续较长时间30分钟到数小时取决于网络和机器性能。3.1 启动部署脚本在devstack目录下直接运行stack.sh脚本。./stack.sh脚本会开始执行以下主要阶段可以在终端输出中观察到系统依赖安装安装所需的系统包如数据库、消息队列。项目代码克隆从 Git 拉取各个 OpenStack 服务的代码。Python 虚拟环境创建与依赖安装为每个服务创建独立的虚拟环境并安装 Python 包。数据库初始化创建服务所需的数据库和表结构。服务配置与启动生成配置文件并以后台进程形式启动所有 OpenStack 服务。3.2 监控日志与处理交互部署过程是自动的但需要关注以下几点网络交互脚本可能会提示输入密码或确认通常直接按回车即可。错误暂停如果遇到错误脚本会暂停并高亮显示错误信息。此时需要根据错误日志进行排查见第5节。日志文件所有服务的日志都位于/opt/stack/logs/目录下。如果脚本运行失败查看stack.sh.log或对应服务的.log文件是首要的排查手段。一个成功的部署会在最后输出类似以下的信息... This is your host IP address: 192.168.100.10 This is your host IPv6 address: ::1 Horizon is now available at http://192.168.100.10/dashboard Keystone is serving at http://192.168.100.10/identity/ The default users are: admin and demo The password: secretadmin ...记下输出的 HorizonWeb 控制台地址和管理员密码。4. 验证部署结果与基本操作部署脚本成功运行完毕并不代表所有服务都健康。需要进行基础验证。4.1 加载环境变量并检查服务状态DevStack 会创建一个管理员权限的环境变量文件openrc。加载它后才能使用命令行工具。# 加载管理员环境变量 source ~/devstack/openrc admin admin检查核心服务列表是否都处于up状态openstack compute service list openstack network agent list openstack volume service list4.2 访问 Dashboard 并创建第一个实例打开浏览器访问http://你的主机IP/dashboard。使用用户名admin和密码secretadmin即local.conf中设置的ADMIN_PASSWORD登录。进入“管理员” - “系统” - “计算服务”查看所有 Nova 服务是否正常。创建测试实例镜像进入“项目” - “计算” - “镜像”可以上传一个 Cirros一个微型 Linux 测试镜像的 QCOW2 文件或使用 DevStack 可能已预下载的cirros镜像。网络确保在“网络” - “网络拓扑”中存在一个网络且路由器连接到了外部网络如果配置了FLOATING_RANGE。安全组添加一条规则允许 ICMP 和 SSH 入站流量。启动实例选择镜像、网络、密钥对需提前创建然后启动实例。4.3 通过命令行管理资源除了 Dashboard熟悉命令行操作至关重要。以下是一些基本命令# 查看镜像列表 openstack image list # 查看网络列表 openstack network list # 查看创建的实例 openstack server list # 为实例分配浮动 IP openstack floating ip create public openstack server add floating ip 实例ID 浮动IP地址5. 常见问题排查与解决DevStack 部署失败很常见关键在于学会查看日志和定位问题。5.1 部署失败通用排查流程当./stack.sh运行失败时按以下顺序排查检查最直接的错误信息脚本停止时屏幕上最后几行通常包含错误摘要。查看主日志文件tail -f /opt/stack/logs/stack.sh.log查看实时日志或less /opt/stack/logs/stack.sh.log查看完整日志搜索ERROR、Failed关键字。检查特定服务日志如果错误指向某个服务如nova-api则查看/opt/stack/logs/nova-api.log。检查网络连通性使用ping 8.8.8.8和curl -I https://github.com测试外网连通性。国内环境有时需要配置 Git 和 Pip 代理。检查资源是否充足使用free -h查看内存df -h查看磁盘空间。内存不足会导致编译或服务启动失败。5.2 典型错误与解决方案下表列出了几个最常见的错误场景及处理思路问题现象可能原因检查与解决方案git clone超时或失败网络连接问题特别是访问 GitHub。1. 配置 Git HTTP/HTTPS 代理git config --global http.proxy your_proxy2. 或使用国内镜像源需修改 DevStack 脚本中的仓库地址较复杂。pip install失败提示包找不到或版本冲突Python 包索引访问慢或依赖解析问题。1. 配置 PIP 源在stack用户下创建~/.pip/pip.conf指向国内镜像如清华、阿里云。2. 尝试重启./stack.sh有时重试即可。服务启动失败日志中出现Address already in use端口被占用。可能是之前未清理的旧服务。运行./unstack.sh和./clean.sh进行彻底清理然后重新部署。实例启动失败状态为ERROR日志提示No valid host was found计算节点本机资源不足或调度失败。1. 检查内存和磁盘是否足够。2. 检查 Nova 计算服务状态openstack compute service list。3. 查看/opt/stack/logs/nova-scheduler.log和nova-compute.log获取详细原因。无法访问 Horizon 控制台防火墙阻止了 80 端口或apache2服务未运行。1. 检查防火墙sudo ufw status如需则放行 80 端口sudo ufw allow 80/tcp。2. 检查 Apache 服务sudo systemctl status apache2。网络创建失败Neutron 代理异常网络配置错误特别是FLAT_INTERFACE指定错误。1. 确认FLAT_INTERFACE的网卡名是否正确 (ip addr)。2. 查看/opt/stack/logs/neutron-*.log获取具体错误。3. 考虑使用更简单的local.conf先禁用复杂网络功能。5.3 清理与重装如果环境混乱需要推倒重来务必使用 DevStack 自带的清理脚本# 在 devstack 目录下执行 ./unstack.sh # 停止所有服务 ./clean.sh # 删除所有编译安装的程序、配置和数据危险执行clean.sh后相当于回到了刚克隆完仓库的状态可以修改local.conf后再次运行./stack.sh。6. 生产环境考量与最佳实践再次强调DevStack 仅适用于开发、测试和学习。如果你需要考虑更接近生产的环境以下是一些重要的扩展方向和最佳实践多节点部署生产环境需要将控制节点、计算节点、网络节点、存储节点分离。可以考虑使用 Kolla-Ansible、OpenStack-Ansible 或 Charms 等专业的部署工具。高可用对关键服务如 API、数据库、消息队列实施集群化部署避免单点故障。网络规划生产环境需要精心规划 Provider Networks、Overlay NetworksVXLAN/GRE、安全组策略、负载均衡器等。存储后端DevStack 通常使用本地存储或简单的 LVM。生产环境需要集成 Ceph、SAN/NAS 等共享存储以实现实时迁移和卷服务高可用。监控与日志集成 Prometheus、Grafana 进行监控使用 ELK 或 Loki 栈集中管理日志。配置管理所有对 OpenStack 的配置变更都应通过代码如 Ansible Playbook进行管理并纳入版本控制。定期备份备份数据库尤其是 Keystone、Nova、Neutron 的库和关键配置文件。对于使用 DevStack 的学习环境一个核心建议是将部署成功的整个虚拟机或物理机状态制作一个快照或模板。这样可以在实验环境被破坏后快速恢复到已知的健康状态节省大量重复部署的时间。通过本文的步骤你应该已经成功搭建起一个基础的 OpenStack 环境。接下来可以深入探索具体服务的使用如通过 Heat 进行编排通过 Magnum 管理容器集群或者深入研究 Neutron 的网络模型。理解这个单节点环境的构成是迈向理解复杂分布式云平台架构的第一步。