一、为什么选择自建“开发测试云”
搭建专属的开发测试环境,是许多团队在提效和降本路上绕不开的课题。直接上公有云看似方便,但三个痛点非常明显:
- 成本高昂:测试环境需要7×24小时运行,按量计费一年下来轻松烧掉一台高端笔记本的预算。
- 环境抢占:开发、测试、QA团队共用一套环境,任何配置变更都可能引发“蝴蝶效应”,导致全员工作停摆。
- 资源闲置:公司内网往往有千兆带宽和淘汰下来的旧服务器,与其让它们吃灰,不如物尽其用。
今天,我们就用3台性能普通的二手电脑,配合开源的 Proxmox VE (PVE) 8,带你用30分钟搭建一套功能完备的私有“开发测试云”。这套系统将包含:
- 3节点高可用集群:任意一台物理机宕机,虚拟机(VM)可自动迁移,业务无感知。
- 30台带“公网IP”的测试VM:支持一键批量创建,并通过网络配置模拟公网访问能力。
- 日志、监控、DNS全自服务:提供平台化的运维能力,让开发同学自助使用,减少对运维团队的依赖。
二、硬件与网络:5分钟基础配置
首先规划好硬件和网络。我们准备3台节点,配置与角色分配如下:
| 节点 |
主机名 |
管理 IP |
角色 |
| 主节点 |
pve-dev01 |
192.168.80.11 |
控制节点 + 镜像仓库 + 日志中心 |
| 计算节点 |
pve-dev02 |
192.168.80.12 |
纯虚拟机计算节点 |
| 计算节点 |
pve-dev03 |
192.168.80.13 |
纯虚拟机计算节点 |
硬件建议:
- 每台电脑配备32GB内存和1TB SSD,基本能满足多台轻量级VM运行。
- 准备两块千兆电口网卡。
安装注意:
- 使用PVE 8的ISO制作启动U盘进行安装。
- 安装时,时区务必选择“Shanghai”,NTP服务器填写
ntp.aliyun.com。这一步对于集群时钟同步、防止“脑裂”至关重要。
- 安装过程中,第二块网卡(例如
eno2)先不配置IP,留到后面用作创建“假公网”网桥 vmbr2。
三、搭建集群:3条命令构建骨架
集群是实现高可用的基础。配置过程非常简单,几乎就是三条命令:
# ① 在主节点 pve-dev01 上创建集群
pvecm create dev-cluster
# ② 在其他节点(pve-dev02, pve-dev03)上执行,加入集群
pvecm add 192.168.80.11
# ③ 在任何节点检查集群状态
pvecm status # 看到输出中有 “Quorate: Yes” 即可
网络提示:如果公司内部交换机禁用了多播(Multicast),需要预先在所有节点的 /etc/corosync/corosync.conf 配置文件中,启用 transport: udpu (单播)模式。
四、批量创建“带公网”的测试虚拟机
1. 虚拟网络拓扑设计
为了实现VM能“模拟公网”访问,并隔离不同项目,我们设计以下纯虚拟网络:
vmbr2(192.168.2.1) ← 假公网出口网关
│
├── vmbr100(VLAN100) ← 项目 A 专用网络
├── vmbr101(VLAN101) ← 项目 B 专用网络
└── vmbr102(VLAN102) ← 项目 C 专用网络
- 假公网:所有VM的默认网关指向
192.168.2.1,在PVE主机上对这个网段配置SNAT(源地址转换)。这样,VM内发起的对外网络请求(如调试微信回调、模拟OSS上传)都能正常出去,仿佛拥有公网IP。
- 项目隔离:不同VLAN在二层网络隔离。即使某个测试VM把网络搞崩,也完全不会影响其他VLAN下的虚拟机。
2. 一键批量克隆脚本
使用Cloud-Init模板可以极大简化VM初始化。假设你已准备好一个CentOS 9的Cloud-Init模板(VM ID为9000),以下脚本可以批量创建30台VM:
#!/usr/bin/env bash
TEMPLATE=9000 # 预先制作好的Cloud-Init模板ID
VLAN=100 # 项目所属VLAN
for i in {1..30}; do
VMID=200$i
NAME=proj${VLAN}-vm$i
# 克隆模板
qm clone $TEMPLATE $VMID --name $NAME --full
# 配置网络:连接到指定VLAN的网桥
qm set $VMID --net0 virtio,bridge=vmbr${VLAN},tag=${VLAN}
# 配置IP和网关
qm set $VMID --ipconfig0 ip=192.168.${VLAN}.$((100+i))/24,gw=192.168.${VLAN}.1
# 注入SSH公钥,实现免密登录
qm set $VMID --sshkey /root/.ssh/id_rsa.pub
# 启动虚拟机
qm start $VMID
done
运行这个脚本大约2分钟后,开发同学就可以直接使用命令:
ssh proj100-vm7.dev.int
连接到第7台测试机,全程无需手动干预系统安装、网络配置或密钥注入。
五、自服务三件套:日志、监控与DNS
为了让开发团队能自主排查问题,我们容器化部署三个核心服务:
| 系统 |
部署命令(Docker版) |
给开发带来的价值 |
| 日志 |
docker run -d -p 3100:3100 grafana/loki |
VM内的应用日志可按项目、版本、时间等维度秒级检索。 |
| 监控 |
docker run -d -p 9090:9090 prom/prometheus |
监控VM状态,任何VM宕机可在1分钟内通过飞书/钉钉告警。 |
| DNS |
docker run -d -p 53:5353 coredns/coredns -conf /Corefile |
自动提供 xxx.dev.int 域名解析,彻底告别手动维护hosts文件。 |
集成要点:
- 日志采集:将
Promtail 代理预先安装在VM模板中,并设为开机自启,自动将日志推送到Loki。
- 域名管理:CoreDNS可以对接etcd。在上述批量创建脚本中,可以在创建VM后,顺势将
主机名 -> IP 的映射写入etcd。这样VM启动完成时,域名就已经可以解析,体验无缝衔接。
六、日常运维:3个高频命令就够
对于日常管理,记住下面三个命令足以应对大部分场景:
| 场景 |
命令 |
| 查看集群健康状态 |
pvecm status |
| 在线迁移虚拟机(不中断服务) |
qm migrate 2001 pve-dev02 --online |
| 升级系统前,为一批VM创建快照 |
for id in $(seq 2001 2030); do qm snapshot $id “pre-release”; done |
七、成本与收益对比
算一笔经济账,自建方案的优势非常直观:
| 项目 |
公有云方案(按1年估算) |
自建PVE方案(一次性投入) |
| 3+ 台 2核4G 云实例 |
≈ 10,000 元 |
0 元(利用旧硬件) |
| 500 GB 日志存储 |
≈ 12,000 元 |
0 元(使用本地SSD) |
| 宕机恢复 |
人工处理,耗时 |
集群HA自动迁移 |
| 合计 |
≈ 22,000 元 |
3台旧电脑 + 30分钟部署时间 |
八、未来可扩展的进阶玩法
基础平台搭好后,还可以向更自动化的方向演进:
- Ceph超融合:将三台节点的SSD池化,构建分布式存储。这样可以彻底省去外置NAS,还能享受秒级快照、克隆等高级存储功能。
- GitLab CI/CD集成:在GitLab Pipeline中调用PVE的API (
pvesh),实现 “Merge Request合并后,自动创建一套独立测试环境” ,测试完毕再自动销毁,实现资源最大化利用。
- 支持远程办公:在阿里云等公有云购买一台轻量应用服务器(如4核8G),通过WireGuard等工具与内网PVE集群组建VPN。这样,异地同事也能直接
ssh proj100-vm7.dev.int 访问测试环境。
用30分钟和手边的闲置资源,打造一个可控、高效、低成本的开发测试云。把省下来的年度预算,用在更能激励团队的团建活动上,岂不更香?希望这篇实践指南能为你带来启发,也欢迎到 云栈社区 分享你的搭建经验和遇到的问题。