从零搭建一个能跑的私有云:ZStack 单节点最小化部署实战
你有没有想过,只用一台虚拟机,就能跑起一个功能完整的私有云平台?不是 OpenStack 那种动辄几十个服务、配置三天三夜的“庞然大物”,而是一个真正轻量、快速、开箱即用的 IaaS 系统。
今天我们就来干这件事——手把手带你从零部署一个 ZStack 最小化环境。全程不超过 30 分钟,资源占用低,适合学习、验证、原型开发,甚至作为 CI/CD 的测试底座。
别被“云平台”吓到。ZStack 的设计哲学就是:简单、自动化、可复现。我们这次要做的,就是把它最核心的能力压缩进一台普通服务器里,看看它是怎么工作的。
为什么选 ZStack?
在 OpenStack、VMware、Proxmox 这些名字之外,ZStack 可能不算大众,但它有几个非常吸引人的特点:
- 轻量级:Java 微服务架构,启动快,内存占用少(控制节点约 1.5GB);
- 去中心化:没有单点调度器,各服务独立运行,故障隔离性好;
- 安装极简:支持一键脚本部署,连数据库都能自动初始化;
- API 优先:超过 200 个 RESTful 接口,自动化运维友好;
- 国产开源:Apache 2.0 协议,社区活跃,文档齐全。
更重要的是,它特别适合做“最小化部署”——也就是我们今天的目标:用最少的资源,跑出一个能用的云平台。
核心组件拆解:这个“云”到底由什么组成?
在动手之前,先搞清楚 ZStack 是由哪些关键部件拼起来的。别担心,不像 OpenStack 那样一堆抽象概念,ZStack 的结构非常清晰。
1. Management Server:整个系统的“大脑”
你可以把它理解为云平台的指挥中心。所有操作——创建虚拟机、配置网络、上传镜像——最终都会发给它处理。
它运行在一个嵌入式的 Tomcat 容器中,默认监听8080端口,提供 Web UI 和 API 服务。内部通过消息总线协调各个模块,比如虚拟机引擎、镜像管理、网络控制器等。
🧠 小知识:它的启动速度通常不到 30 秒,JVM 堆内存默认 1~2GB,非常适合资源有限的实验环境。
2. 数据库:H2 还是 MySQL?
ZStack 需要一个数据库来存元数据——比如你创建了几台 VM、用了什么网络、权限如何分配。
在最小化部署中,它默认使用H2 数据库,这是一个纯 Java 写的轻量级嵌入式 DB,不需要额外安装。数据文件就放在/var/lib/zstack/database/下,随 Management Server 一起启停。
# 查看当前数据库连接信息 cat /usr/local/zstack/apache-tomcat/webapps/zstack/WEB-INF/classes/zstack.properties | grep jdbc输出类似:
jdbc.url=jdbc:h2:/var/lib/zstack/database/zstackdb;MVCC=TRUE;LOCK_TIMEOUT=10000 jdbc.user=zstack jdbc.password=zstack.password⚠️ 注意:H2 仅限单节点测试!生产环境一定要换成独立的 MySQL 实例,否则并发写入会出问题。
3. KVM + zstack-kvm-agent:真正的“干活的人”
Management Server 只负责发号施令,真正执行虚拟机创建的是底层的 Hypervisor —— 在这里就是KVM。
而连接“命令”和“执行”的桥梁,就是运行在主机上的zstack-kvm-agent。它是个 Python 程序,常驻后台,主要干这几件事:
- 上报本机 CPU、内存、磁盘资源;
- 接收 Management Server 下发的任务(如启动 VM);
- 调用 libvirt 和 QEMU 完成实际操作;
- 管理本地存储和镜像缓存。
它通过 HTTPS 与 Management Server 通信,使用 JSON-RPC 协议传输指令,具备断线重连机制,稳定性不错。
安装也很简单,一条命令搞定:
wget -O /tmp/zstack-kvm-agent-installer.sh http://<你的服务器IP>:8080/zstack/static/zstack-kvm-agent-installer.sh bash /tmp/zstack-kvm-agent-installer.sh -m <Management_Server_IP>这条命令会自动安装 KVM 所需的所有依赖(QEMU、libvirt、bridge-utils 等),然后注册当前主机到控制节点。
✅ 提示:确保主机开启硬件虚拟化(Intel VT-x / AMD-V),否则 KVM 无法工作。
4. Web UI 与 API:你怎么和它交互?
ZStack 提供了一个基于 Angular 的图形化界面,运行在 Management Server 内部的 Tomcat 中。
浏览器访问http://<IP>:8080即可登录,默认账号密码是:
- 用户名:
admin - 密码:
password
首次登录后请立即修改密码!
同时,它也暴露了完整的 RESTful API,路径为/api/*,支持 OAuth2 认证和异步任务查询(通过 Job ID 轮询)。你可以用 curl 或 Postman 直接调用,也可以写脚本集成到 CI/CD 流程中。
Swagger 文档已内置,访问http://<IP>:8080/doc/api/index.html即可查看所有接口说明。
动手实操:一步步搭起来
我们现在开始正式部署。假设你有一台干净的 Linux 主机,推荐配置如下:
- 操作系统:CentOS 7.x / Rocky Linux 8.x(官方推荐)
- CPU:4 核以上
- 内存:8GB
- 磁盘:50GB(SSD 更佳)
- 网络:静态 IP,能访问公网
第一步:准备环境
关闭 SELinux 和防火墙(或放行必要端口):
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config setenforce 0 systemctl stop firewalld systemctl disable firewalld设置静态 IP(略),并确保可以联网。
第二步:一键安装 ZStack
ZStack 官方提供了一键安装脚本,极大简化了过程:
wget -O - http://mirrors.zstack.org/zstackorg/zstack-install.sh | bash这个脚本会自动下载并安装 Management Server、Tomcat、H2 数据库,并生成必要的配置文件。
💡 如果网络较慢,也可以选择下载 ISO 镜像离线安装,但在线方式更方便。
第三步:启动并初始化
安装完成后,使用zstack-ctl工具管理服务:
# 启动 Management Server zstack-ctl start # 初始化数据库(首次运行必须) zstack-ctl deploy_db --host=localhost # 重启以加载新配置 zstack-ctl restart此时你应该能看到所有服务状态正常:
zstack-ctl status输出应显示running,包括management-server、database等。
第四步:安装 KVM Agent(自注册)
因为我们是在同一台机器上部署控制节点和计算节点,所以需要安装 agent 并指向自己:
export ZSTACK_SERVER_IP=$(hostname -I | awk '{print $1}') wget -O /tmp/zstack-kvm-agent-installer.sh http://${ZSTACK_SERVER_IP}:8080/zstack/static/zstack-kvm-agent-installer.sh bash /tmp/zstack-kvm-agent-installer.sh -m ${ZSTACK_SERVER_IP}安装完成后,agent 会自动上报主机信息。稍等片刻,在 Web UI 中就能看到一台 KVM 主机上线了。
第五步:打开浏览器,见证时刻
打开你的电脑浏览器,输入:
http://<你的服务器IP>:8080用admin/password登录,进入仪表盘。
你会看到:
- 一个默认区域(Region)和数据中心(Zone)已经创建;
- 一台 KVM 主机处于“已连接”状态;
- 存储、网络、镜像等模块都已就绪。
恭喜!你已经拥有一个能用的私有云了。
初体验:创建你的第一台云主机
接下来我们走一遍完整流程,感受一下“云”的运作逻辑。
1. 上传系统镜像
点击【镜像】→【添加镜像】,选择一个标准的 qcow2 镜像,例如 CentOS 7 的 cloud image。
上传完成后,状态变为“就绪”。
2. 创建实例规格(Instance Offering)
相当于定义虚拟机的“套餐”:CPU、内存大小。
点击【计算】→【实例规格】→【创建】,填写:
- 名称:small
- CPU:2 核
- 内存:2GB
保存即可。
3. 配置网络
ZStack 使用“二层+三层”网络模型:
- 二层网络(L2):对应 VLAN 或桥接设备;
- 三层网络(L3):带 IP 地址池的可路由网络。
点击【网络】→【创建二层网络】,类型选“桥接”,桥名填br0(若未创建需提前配置)。
再创建一个 L3 网络,绑定到该 L2,并设置 IP 范围(如192.168.100.100-200)。
4. 启动虚拟机
点击【实例】→【创建云服务器】:
- 选择刚才上传的镜像;
- 选择“small”规格;
- 选择刚创建的 L3 网络;
- 点击确定。
几秒钟后,虚拟机状态变为“运行中”,你可以通过 VNC 控制台连接进去。
🎉 成功了!这是你亲手搭建的云平台上跑起来的第一台 VM。
常见坑点与调试技巧
部署过程中可能会遇到一些问题,以下是几个高频“踩坑”场景及解决方案:
❌ 问题 1:打不开 Web UI
检查步骤:
# 1. 看服务是否在跑 zstack-ctl status # 2. 看 8080 端口是否被占用 netstat -tuln | grep 8080 # 3. 防火墙是否放行 firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload如果是云服务器(如阿里云 ECS),还需检查安全组规则。
❌ 问题 2:KVM 主机一直“未连接”
查看日志定位原因:
tail -f /var/log/zstack/kvm.log常见原因:
- Management Server IP 配置错误;
- 主机不支持硬件虚拟化(
grep -E '(vmx|svm)' /proc/cpuinfo应有输出); - 时间不同步(建议启用 NTP);
- DNS 解析失败(可临时加 hosts)。
❌ 问题 3:虚拟机创建失败
重点排查:
- 镜像格式是否为 qcow2(raw 不支持);
- 磁盘空间是否充足(
df -h); - libvirtd 是否运行:
systemctl status libvirtd; - 存储路径权限是否正确(默认
/opt/zstack/kvm/)。
设计背后的思考:为什么这样安排?
这套最小化部署看似简单,其实背后有不少工程取舍:
✅ 资源效率最大化
将 Management Server、Database、KVM Agent 全部集中于一台主机,牺牲了一定的隔离性,换来了极致的资源利用率。对于学习和测试环境来说,这正是我们想要的。
🔐 安全边界妥协
默认使用 H2 数据库、弱密码、HTTP 明文传输……这些都不是生产可用的配置。但我们明确知道这是“实验环境”,目标是快速验证,而不是追求高安全。
生产建议:改用外部 MySQL + HTTPS + 强密码 + 定期备份。
📦 可扩展性预留
虽然现在是单节点,但架构上完全支持横向扩展:
- 添加新的 KVM 节点?只需在新机器上运行 agent 安装脚本;
- 分离数据库?修改
zstack.properties指向外部 MySQL; - 实现高可用?部署多个 Management Server,前端挂负载均衡;
- 接入共享存储?配置 NFS 或 Ceph 作为主存储。
也就是说,今天的最小化部署,就是明天生产集群的起点。
这个环境能用来做什么?
别小看这一台机器上的“迷你云”,它的用途比你想象得多:
- 教学演示平台:给学生讲解云计算原理,直观展示资源池化、虚拟化、网络隔离等概念;
- CI/CD 测试底座:在 Jenkins/GitLab CI 中动态创建测试 VM,用完即毁,成本极低;
- 产品原型验证:快速搭建一套包含网络、存储、计算的完整环境,用于 PoC 演示;
- 技能练兵场:练习云平台运维、API 自动化、故障排查等实战能力。
而且一旦掌握这套方法论,迁移到多节点、高可用、混合云场景也只是规模变化而已。
写在最后:从“能跑”到“跑得好”
今天我们完成了 ZStack 的最小化部署,实现了“从零到一”的突破。但这只是开始。
下一步你可以尝试:
- 配置 HTTPS 访问(用 Nginx 反向代理 + Let’s Encrypt 证书);
- 备份数据库:
zstack-ctl dump_db,定期导出以防丢失; - 使用 API 编写自动化脚本,批量创建资源;
- 探索高级功能:VPC 网络、负载均衡、云路由器、多租户管理……
ZStack 的魅力在于,它既足够简单让你快速上手,又足够强大支撑企业级应用。
如果你正在寻找一个轻量、现代、易维护的私有云方案,不妨试试它。
💬 如果你在部署过程中遇到了其他问题,欢迎在评论区留言交流。我们一起把这条路走得更顺。