Lazy loaded image
DevStack 快速搭建 OpenStack 单节点测试环境
Words 3527Read Time 9 min
2026-1-3
2026-1-3
date
related_level
slug
type
relate_date
summary
status
tags
category
last_updated
Jan 3, 2026 10:59 PM
是否已更新
orginal_page
是否推荐
参考资料
  • DevStack — DevStack documentation
其他可用项目:training-lab(不推荐,版本很久未更新)
  • 需要 VirtualBox 和 Vagrant
注意,DevStack 仅用于测试而非持久化部署 OpenStack
  • 重启后不会自动恢复服务,需要重新执行 stack.sh
DevStack 也可以适用于 LXC 容器单节点安装或者多节点部署
DevStack 网络架构简介
  • DevStack 默认使用 Neutron 网络服务(包括 L3 路由和 OpenvSwitch)
    • RHEL 安装 OVS 需要使用 openstack 相关库
    • br-ex 网桥接口由 Neutron 管理(不连接物理网卡)
    • 每个 project 具有独立子网网段(私有地址),通过浮动 IP(公共或者私有)暴露
      • 子网内的虚拟机通过 IP 伪装访问外网
    • DNS 解析依赖于主机 resolv.conf
可以通过设置 PUBLIC_INTERFACE 共享当前主机的网络接口
  • OVS 和桥接之间存在相互作用,单网口不建议采用 PUBLIC_INTERFACE,否则系统重启后可能会导致无法连接
  • 单网口设置样例
    • 和当前宿主机共享一个网段,需要严格限制浮动 IP 网段范围避免冲突
    • PUBLIC_NETWORK_GATEWAY 是当前服务器用来连接外部网络的网关
    • Q_FLOATING_ALLOCATION_POOL 是浮动 IP 地址范围,需要使用本地 DHCP 服务器未分配的 IP 地址段
私有网络地址配置:IPV4_ADDRS_SAFE_TO_USE, IPV6_ADDRS_SAFE_TO_USE
  • 影响浮动 IP 和子网范围
    • FIXED_RANGE, SUBNETPOOL_PREFIX_V4
    • FIXED_RANGE_V6, SUBNETPOOL_PREFIX_V6
安全组规则默认会阻止所有入站流量,PING 或者 SSH 到虚拟机需要添加规则
  • openstack security group rule create --proto icmp --dst-port 0 default
  • openstack security group rule create --proto tcp --dst-port 22 default
  • 使用 Cloud-init 脚本运行 start.sh 安装 DevStack 最小化样例
    • vim cloud-config.yaml
      • devstack 需要非 root 用户运行,创建了 stack 用户
最小化样例 local.conf 只包含以下内容
  • 具体可见对应仓库的 stack.shstackrc, openrc 配置
  • 注意,地址范围不能和与主机上正在使用的任何网络地址重叠
  • 在宿主机上配置以下软件
    • Rabbit
    • MySQL
    • Apache
local.conf 样例配置文件
local.conf 自定义安装阶段,安装服务及插件
定义安装阶段及组件配置
  • '[[' <phase> '|' <config-file-name> ']]'
<phase> 可以定义以下阶段
  • local 在开始获取 stackrc 之前从 local.conf 中提取 localrc
  • post-config 在第 2 层服务配置完成后、启动之前运行
  • extra 在服务启动后、任何 extra.d 文件运行前执行
  • post-extra 在 extra.d 中的文件执行完毕后运行
  • test-config 在 Tempest(OpenStack 集成测试套件)配置完成后运行
<config-file-name> 对应组件的配置文件名称
  • 以 nova 为例
  • 这里使用 $NOVA_CONF 是因为 stack.sh 里 source $TOP_DIR/lib/nova
  • 自定义启用或禁用特定组件
    • enable_service q-svc
    • disable_service c-vol
自定义安装插件
  • 在 local 阶段添加 enable_plugin
    • 加载 ec2-api 插件样例
      • enable_plugin ec2-api https://opendev.org/openstack/ec2-api
    DevStack 自定义配置 local.conf 并安装运行
    参考资料
    假设有两个网口 ens18 和 ens19,ens18 用于 ssh 管理 devstack 主机,ens19 用于桥接 br-ex
    • 单网口的话存在重启后无法从外部网络连接服务器的风险
    • nmcli device status
    • nmcli con show ens19
    • 如 ens19 未创建连接
      • nmcli connection add type ethernet \ ifname ens19 \ con-name ens19 \ ipv4.method manual \ ipv4.addresses 192.168.1.79/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 8.8.8.8
    • 以 RHEL 9 + devstack stable/2024.2 分支为例,建议在 RHEL 8 或 9 安装
    RHEL 9 直接启用对应库即可
    • subscription-manager register
      • 已经注册 RHEL 跳过
    • subscription-manager repos --enable=rhel-9-for-x86_64-baseos-rpms \ --enable=rhel-9-for-x86_64-appstream-rpms \ --enable=rhel-9-for-x86_64-supplementary-rpms
    • subscription-manager repos --enable=codeready-builder-for-rhel-9-x86_64-rpms
      • 启用 CRB 库
    • dnf install https://trunk.rdoproject.org/rdo_release/rdo-release.el9s.rpm
      • 社区 RDO 库 RPM,会安装最新版本
    目前 RHEL 10 缺失必要库需要手动编译,且 rabbitmq 异常无法解决
    RHEL 10 手动编译安装并运行 ovs 和 ovn
    参考资料
    安装编译相关依赖
    • sudo dnf install -y autoconf automake rpm-build rpmdevtools libtool make gcc gcc-c++ python3-devel python3-sphinx pkgconfig openssl-devel libcap-ng-devel kernel-devel graphviz groff libbpf-devel libxdp-devel numactl-devel selinux-policy-devel systemtap-sdt-devel postgresql-devel unbound unbound-devel
    ovs(openvswitch) 捆绑到 Openstack 库,目前 RHEL 10 官方库还没有只能手动编译
    • git clone --depth 1 -b branch-3.6 https://github.com/openvswitch/ovs.git /opt/ovs
    • cd /opt/ovs
    • ./boot.sh
      • 构筑 configure 脚本
    • ./configure --enable-python
      • 配置
      • 默认安装到 /usr/local
    • make
    • make check TESTSUITEFLAGS=-j4
      • 可选,4 线程运行所有单元测试
      • 仅测试 2040-2050(测试之间没有相互依赖关系)
        • make check TESTSUITEFLAGS='2040-2050 -j4'
    安装 ovs rpm 包并启用 openvswitch 服务
    • make rpm-fedora
      • 推荐
    • cd opt/ovs/rpm/rpmbuild/RPMS
      • dnf install ./noarch/python3-openvswitch-<ovs_ver>-1.el10.noarch.rpm
      • dnf install ./x86_64/openvswitch-<ovs_ver>-1.el10.x86_64.rpm
    • systemctl status openvswitch.service
    • systemctl enable --now openvswitch.service
    其他:make install 安装二进制文件并通过 ovs-ctl 启用
    • make install
    • export PATH=$PATH:/usr/local/share/openvswitch/scripts
    • ovs-ctl start
    手动编译 ovn(Open Virtual Network)
    • git clone --depth 1 -b branch-25.09 https://github.com/ovn-org/ovn.git /opt/ovn
    • cd /opt/ovn
    • ./boot.sh
      • 构筑 configure 脚本
    • ./configure --with-ovs-source=/opt/ovs
      • 配置之前需要先准备编译好的 ovs 模块
    • make
    • make check TESTSUITEFLAGS=-j4
      • 可选,4 线程运行所有单元测试
      • 仅测试 2040-2050(测试之间没有相互依赖关系)
        • make check TESTSUITEFLAGS='2040-2050 -j4'
    安装 ovs rpm 包并启用 ovn-northd 和 ovn-controller 服务
    • make rpm-fedora
      • 推荐
    • cd /opt/ovn/rpm/rpmbuild/RPMS/x86_64
      • dnf install ./ovn-<ovn_ves>.el10.x86_64.rpm
      • dnf install ./ovn-central-<ovn_ves>-1.el10.x86_64.rpm
      • dnf install ./ovn-host-<ovn_ves>-1.el10.x86_64.rpm
    • 创建路径 /var/run/ovn
      • mkdir -p /var/run/ovn && chown stack:stack /var/run/ovn
      • ls -al /var/run/ovn
    • systemctl status ovn-northd ovn-controller
    • systemctl enable --now ovn-northd ovn-controller
      • 注意 ovs-contorller 可能会导致网络连接异常
    • VM 上运行所有单元测试是均可以通过的,部分会被 skip
    RHEL 10 的 rabbitmq 即使配置成功也会报错 invalid credentials 导致最终 api 503 异常
    • 查看相关配置文件和连接完全正常,匪夷所思
      • rabbitmqctl list_users
      • rabbitmqctl list_permissions -p /
      • rabbitmqctl authenticate_user stackrabbit "secretrabbit"
        • 正常
      • rabbitmqctl eval 'application:get_env(rabbit, loopback_users).'
    前置准备:更新 repo 以及安装必要软件
    • sudo dnf update -qy
    • sudo dnf install -qy git curl python3 net-tools unzip
    • sudo dnf install -qy libvirt virt-install qemu-kvm
      • 需要额外安装 kvm 相关软件
    • sudo dnf install -qy memcached
      • keystone 组件需要
    • sudo dnf install -qy rsync-daemon
      • swift 组件需要
      • systemctl enable --now rsyncd
    前置准备:开启 ip 转发
    • vim /etc/sysctl.d/99.ip_forward.conf
    前置准备:添加 rabbitmq 库并安装配置
    • 正常安装报错 rabbitmq-server 不存在
    添加 GPG 密钥
    • rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc'
    • rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key'
      • erlang 库
    • rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key'
      • rabbitmq-server 库
    添加 repo
    • 注意仅提供 amd64 的 x86 版本 erlang
    • vim /etc/yum.repos.d/rabbitmq.repo
    安装依赖和 rabbitmq-server
    • dnf update -qy
    • dnf install -y logrotate erlang
    • dnf install -y rabbitmq-server
    rabbitmq-server 启动失败可能还需要配置 hostnamectl 的 dns 解析
    • hostnamectl
      • 查看当前 hostname
    • vim /etc/hosts
      • 127.0.0.1 <your_hostname>
      • <host_ip> <your_hostname>
    配置 rabbitmq 禁用 loopback_users 限制
    • echo 'loopback_users = none' | sudo tee /etc/rabbitmq/rabbitmq.conf
    前置准备:创建 stack 用户
    • useradd -s /bin/bash -d /home/stack -m stack
    • cat > /etc/sudoers.d/99-stack-user <<EOF stack ALL=(ALL) NOPASSWD:ALL Defaults:stack !requiretty EOF
    • chmod 0440 /etc/sudoers.d/99-stack-user
    • 修改 pip 源
      • mkdir -p /home/stack/.pip
      • cat > /home/stack/.pip/pip.conf <<EOF [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple EOF
    • mkdir -p /opt/stack/logs && chown -R stack:stack /opt/stack /home/stack
    克隆 devstack 项目
    • sudo -u stack git clone --depth 1 -b stable/2024.2 https://opendev.org/openstack/devstack /home/stack/devstack
    验证当前安装 devstack 环境
    • sudo su - stack -c "cd /home/stack/devstack && bash ./tools/info.sh"
    其他:neutron 会关闭 firewalld 并启用 iptables
    • iptables -L -n -v
      • 检查现有规则
    • 如果 SSH 是通过非默认 22 端口需要提前创建对应规则,否则后续无法连接
    自定义 local.conf 安装配置文件
    配置 DevStack Nova 基于 KVM 的嵌套虚拟化
    确认当前 VM 是否已启用嵌套 KVM 虚拟化
    • local.conf 的 [[local|localrc]] 部分添加 LIBVIRT_TYPE=kvm 显式启用 KVM 而非 QEMU
    • 可能会遇到一些 requirement 冲突,此时需要使用相同版本的 branch
    • sudo su - stack -c "vim /home/stack/devstack/local.conf"
    • 安装 DevStack(花费时间较长)
      • sudo su - stack -c "cd /home/stack/devstack && bash ./stack.sh"
    安装结束后的概要
    安装成功后查看 DevStack 服务运行状态并测试 openstack cli
    • systemctl list-units --all 'devstack@*'
    • systemctl list-unit-files 'devstack@*'
    • source /home/stack/devstack/openrc admin admin
      • 默认用户为 admin 和 demo
    • openstack service list --long
    • 卸载 DevStack 并清理安装
      • sudo su - stack -c "cd /home/stack/devstack && bash ./unstack.sh && bash ./clean.sh"
    访问 DevStack horizon 面板
    参考资料
    DevStack 通过 iptables 而非 firewalld 管理防火墙,还需要放行对应端口
    • dnf install -qy iptables-services
      • 用于持久化 iptables 规则
    • iptables -L -n -v
    • 放行端口
      • iptables -I INPUT -p tcp --dport 80 -j ACCEPT
      • iptables -I INPUT -p tcp --dport 443 -j ACCEPT
      • iptables -I INPUT -p tcp --dport 9696 -j ACCEPT
        • neutron 服务
      • iptables -I INPUT -p tcp --dport 6080 -j ACCEPT
        • horizon 终端控制台(VNC)
      • iptables -I INPUT -p tcp --dport 6082 -j ACCEPT
        • horizon 终端控制台(SPICE)
      • iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
        • swift 服务
    • 允许已建立的连接转发
      • iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    • 持久化规则
      • service iptables save
    • 浏览器访问 http://<host_ip>/dashboard
      • 账户为 admin 或者 demo
      • 密码为之前 local.conf 设置的
    检查 DevStack 网络配置
    • source /home/stack/devstack/openrc admin admin
    检查 ovn 和 ovs
    • ovn-nbctl show
      • OVN Northbound 数据库,定义逻辑网络和逻辑路由(上层逻辑网络配置)
    • ovn-nbctl lr-nat-list $(ovn-nbctl show | grep router1 | cut -d' ' -f2)
      • 查看路由规则
    • ovn-sbctl show
      • OVN Southbound 数据库,控制逻辑网络到物理网络的映射和下发状态
    • ovs-vsctl show
      • Open vSwitch(OVS) 的本地桥和端口配置
    • ovs-vsctl list-ports br-ex
      • 应该含有 ens19patch-provnet-xxxx-to-br-int
      • 没有 ens19 则手动创建桥接
        • ovs-vsctl --may-exist add-port br-ex ens19
      • ip link show br-ex
    检查 SNAT 是否已经 enable
    • openstack router show router1 | grep snat
    检查 public 网络和 agent
    • openstack network show public | grep provider
      • openstack network agent list
        • 应该有 neutron-ovn-metadata-agent 和 ovn-controller
      DevStack 命令行创建测试 VM 并 SSH 到 VM
      • source /home/stack/devstack/openrc demo demo
        • 以 demo 身份执行
      • 测试 openstack cli
        • openstack network list
      创建密钥对,浮动 IP
      • fip_id=$(openstack floating ip create public -c id -f value)
        • openstack floating ip list
      • openstack keypair create --public-key ~/.ssh/id_rsa.pub test-keypair
        • openstack keypair list
      创建实例并分配浮动 IP
      • image_id=$(openstack image list -c ID -c Name -f value | grep cirros | cut -d' ' -f1)
        • 默认配置了一个几十兆的 cirros 镜像用于测试
      • m_flavor=$(openstack flavor list -c Name -f value | head -n 1)
        • 选最小的即可
      • openstack server create --network private --key-name test-keypair test-server --flavor $m_flavor --image $image_id
      • openstack server add floating ip test-server ${fip_id}
      • openstack server list
      配置 demo 项目安全组规则(ping 和 SSH)
      • openstack --os-project-name demo security group list
      • openstack security group rule create --proto icmp --dst-port 0 default
      • openstack security group rule create --proto tcp --dst-port 22 default
      • openstack --os-project-name demo security group rule list
      通过 DevStack 跳板机 SSH 连接 VM 实例(仅允许 SSH 访问)
      配置 DevStack 主机 stack 用户 ssh 登录
      • mkdir -p /home/stack/.ssh
      • cat ~/.ssh/id_rsa.pub > /home/stack/.ssh/authorized_keys
      • chown stack:stack -R /home/stack/.ssh
      • openstack server ssh test-server -- -l cirros -J username@hostname
        • usernamehostname 为 devstack 主机的用户名和主机名
          • 这里为 stack@192.168.1.79
      通过 VPN 工具创建到浮动 IP 网段范围的 SSH 隧道
      dnf install -y sshuttle
      • EPEL 替换清华源
        • sed -e 's!^metalink=!#metalink=!g' \ -e 's!^#baseurl=!baseurl=!g' \ -e 's!https\?://download\.fedoraproject\.org/pub/epel!https://mirrors.tuna.tsinghua.edu.cn/epel!g' \ -e 's!https\?://download\.example/pub/epel!https://mirrors.tuna.tsinghua.edu.cn/epel!g' \ -i /etc/yum.repos.d/epel{,-testing}.repo
      • sshuttle -r username@hostname:22 192.168.2.0/24
        • usernamehostname 为 devstack 主机的用户名和主机名
          • 这里为 stack@192.168.1.79
        • 192.168.2.0/24 为之前创建的浮动 IP 范围
      • openstack server ssh test-server -- -l cirros
       
       
       
      上一篇
      Jenkins Kubernetes 插件原理与 Pod 模板 steps 字段参考
      下一篇
      CKA & CKAD 备考笔记

      Comments
      Loading...