
从零搭建OpenStack私有云我是如何用两台旧电脑打造个人开发测试平台的去年整理仓库时发现两台闲置的旧台式机配置都是i5-6500加16GB内存。看着它们积灰实在可惜我决定用这两台老伙计搭建一个OpenStack私有云环境用于日常开发测试。整个过程充满意外和挑战但也收获了不少实战经验。本文将详细记录这次搭建之旅希望能给同样想用有限资源构建私有云的开发者一些参考。1. 硬件准备与系统规划两台旧电脑的配置如下设备类型CPU内存硬盘网卡控制节点i5-650016GB256GB SSD千兆有线×1计算节点i5-650016GB256GB SSD1TB千兆有线×1关键决策点将SSD用于系统盘和数据库存储机械硬盘作为计算节点的实例存储由于只有单网卡选择Linuxbridge而非OVS简化网络配置控制节点需要运行大部分服务分配更多内存资源安装Ubuntu 18.04 LTS时遇到第一个坑UEFI启动模式下安装程序无法识别SSD。解决方法是在BIOS中切换为Legacy启动模式。系统安装完成后立即执行以下基础配置# 更新系统并安装必要工具 sudo apt update sudo apt upgrade -y sudo apt install -y git vim net-tools # 设置主机名和hosts文件 sudo hostnamectl set-hostname controller # 控制节点 # 或 sudo hostnamectl set-hostname compute1 # 计算节点 # 编辑/etc/hosts添加两节点的IP和主机名映射 192.168.1.100 controller 192.168.1.101 compute1提示确保两台机器的时间同步非常重要后续的认证服务对时间差极其敏感。建议安装chrony并配置NTP服务器sudo apt install -y chrony sudo systemctl restart chrony2. OpenStack Stein基础环境搭建选择Stein版本是因为它在稳定性和资源消耗之间取得了较好平衡。首先在两台机器上安装OpenStack客户端和数据库# 添加OpenStack仓库 sudo apt install -y software-properties-common sudo add-apt-repository cloud-archive:stein # 安装MySQL数据库仅控制节点 sudo apt install -y mariadb-server python-pymysql创建MySQL配置文件/etc/mysql/mariadb.conf.d/99-openstack.cnf[mysqld] bind-address 192.168.1.100 default-storage-engine innodb innodb_file_per_table on max_connections 4096 collation-server utf8_general_ci character-set-server utf8安装消息队列服务时遇到了第二个坑RabbitMQ服务启动后无法连接。排查发现是防火墙阻止了5672端口。解决方案# 安装RabbitMQ sudo apt install -y rabbitmq-server # 创建OpenStack用户 sudo rabbitmqctl add_user openstack RABBIT_PASS sudo rabbitmqctl set_permissions openstack .* .* .* # 检查端口监听状态 sudo netstat -tnlp | grep 5672注意如果使用UFW防火墙记得开放必要端口sudo ufw allow 3306/tcp # MySQL sudo ufw allow 5672/tcp # RabbitMQ sudo ufw allow 80/tcp # Horizon3. 核心组件安装与配置3.1 Keystone身份服务安装Keystone时特别注意要提前创建好数据库mysql -u root -p -e CREATE DATABASE keystone; mysql -u root -p -e GRANT ALL PRIVILEGES ON keystone.* TO keystonelocalhost IDENTIFIED BY KEYSTONE_DBPASS; mysql -u root -p -e GRANT ALL PRIVILEGES ON keystone.* TO keystone% IDENTIFIED BY KEYSTONE_DBPASS;配置完成后测试认证服务是否正常工作openstack --os-auth-url http://controller:5000/v3 \ --os-project-domain-name Default --os-user-domain-name Default \ --os-project-name admin --os-username admin token issue3.2 Glance镜像服务将下载的CirrOS测试镜像添加到Glancewget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img openstack image create cirros \ --file cirros-0.4.0-x86_64-disk.img \ --disk-format qcow2 --container-format bare \ --public3.3 Nova计算服务计算节点的配置需要特别注意资源分配。在/etc/nova/nova.conf中调整以下参数[DEFAULT] compute_driver libvirt.LibvirtDriver [libvirt] virt_type qemu cpu_mode none由于使用的是旧硬件选择qemu而非KVM可以获得更好的兼容性虽然性能会有所下降。4. 网络与服务验证4.1 Neutron网络服务采用最简单的provider网络模式配置如下[linux_bridge] physical_interface_mappings provider:enp3s0 [securitygroup] firewall_driver nova.virt.firewall.NoopFirewallDriver enable_security_group True创建网络和子网openstack network create --share --external \ --provider-physical-network provider \ --provider-network-type flat provider openstack subnet create --network provider \ --allocation-pool start192.168.1.150,end192.168.1.200 \ --dns-nameserver 8.8.8.8 --gateway 192.168.1.1 \ --subnet-range 192.168.1.0/24 provider4.2 创建测试实例通过Horizon仪表板创建第一个实例时遇到了VNC控制台无法连接的问题。排查发现是nova-consoleproxy服务没有正确配置。解决方法# 编辑/etc/nova/nova.conf [vnc] enabled true server_listen 0.0.0.0 server_proxyclient_address $my_ip novncproxy_base_url http://controller:6080/vnc_auto.html最终成功创建并登录测试实例ssh -i mykey.pem cirros192.168.1.1505. 实际应用场景这个简易OpenStack环境已经稳定运行了三个月主要支撑以下开发场景多版本测试同时运行Python 3.6/3.8/3.10环境进行兼容性测试CI/CD实验部署Jenkins slave节点进行构建任务网络原型验证测试不同网络拓扑下的应用表现教学演示向团队新人展示云计算基础概念资源监控显示平均负载节点CPU使用率内存使用磁盘IO控制节点35%12GB中等计算节点60%14GB较高对于性能瓶颈我的优化策略是对开发测试实例启用内存气球ballooning技术调整Nova调度器的权重配置优先选择负载较低的节点对不重要的实例设置CPU配额限制6. 遇到的典型问题与解决时间同步问题某天突然所有API调用都返回401错误。检查发现控制节点的时间比NTP服务器快了5分钟。解决方法# 强制同步时间 sudo chronyc -a makestep sudo systemctl restart apache2镜像上传失败Glance报错Unable to add image to store。原因是/var/lib/glance/images目录权限问题sudo chown glance:glance /var/lib/glance/images sudo systemctl restart glance-api实例启动卡住查看Nova日志发现是计算节点libvirt服务崩溃。根本原因是旧电脑的BIOS中需要禁用CPU的C-states节能功能。