前言
公有云用得再熟,也总有一天会遇到"数据必须放自己机房"的需求——那时绕不开 OpenStack:开源界的"云操作系统",用于自建 IaaS。这篇把它的核心组件和运作机制讲清楚。
一、OpenStack 是什么
一句话:把一堆物理服务器、交换机、存储,变成一套可 API 调用的云平台。
用户/运维
│ Dashboard(Horizon) / CLI / REST API
▼
┌──────────────── OpenStack 控制面 ────────────────┐
│ Keystone(认证) → Nova(计算) / Neutron(网络) │
│ / Cinder(块存储) / Glance(镜像) / Swift(对象存储) │
└──────────────────────┬───────────────────────────┘
│ 驱动调度
┌──────────────┼──────────────┐
▼ ▼ ▼
计算节点×N 网络节点×N 存储节点×N
(KVM/libvirt) (OVS/Linux网桥) (Ceph/LVM)
它和 KVM 的关系:KVM 是发动机,OpenStack 是整车厂——负责把虚拟化能力包装成多租户、可配额、有网络的完整云。
二、六大核心组件
1. Keystone:门卫与户口本
认证(Authentication)+ 授权(Authorization)+ 服务目录。
- 用户/项目/角色模型: user → project(租户) → role
- 所有组件的 API 都要先过 Keystone 拿 token
- 服务目录: 记录"Nova 的 API 在哪、Cinder 的 API 在哪"
openstack token issue # 拿 token
openstack user list
openstack role add --user zy --project devops member
2. Nova:计算的大脑
虚拟机的生命周期管理(不自己跑虚拟机,调度给计算节点上的 libvirt/KVM):
nova-api 接收请求
nova-scheduler 决定落在哪台计算节点(CPU/内存/磁盘过滤+权衡)
nova-conductor 中介(帮计算节点写库, 解耦)
nova-compute 每台计算节点上的工人(调 libvirt 开机)
openstack server create --flavor m1.medium --image rocky9 \
--network private --key-name mykey vm-lab01
openstack server list
3. Neutron:网络的灵魂
提供租户自服务网络(这是 OpenStack 最复杂也最有价值的部分):
| 概念 | 作用 |
|---|---|
| network / subnet | 虚拟网络与网段(VXLAN 隧道隔离租户) |
| router | 虚拟路由器(SNAT 出网 / floating IP 入站) |
| port | 虚拟机网卡的"插座"(绑 IP/MAC) |
| security group | 实例级防火墙规则 |
openstack network create net-app
openstack subnet create --subnet-range 10.10.0.0/24 --network net-app subnet-app
openstack router add subnet router-app subnet-app
4. Glance:镜像仓库
openstack image create --disk-format qcow2 --container-format bare \
--file rocky-9.qcow2 --public rocky9
openstack image list
# Nova 建虚拟机时从这里拉镜像 → 增量拷贝到计算节点
5. Cinder:块存储(云硬盘)
openstack volume create --size 50 vol-data
openstack server add volume vm-lab01 vol-data
# 底层由后端驱动实现: Ceph RBD / LVM / 商业存储
# 支持快照、在线扩容、跨机迁移(云厂商 CBS 的原型)
6. Swift:对象存储
# REST API 存取海量对象(对标公有云 OSS/S3)
curl -H "X-Auth-Token: $TOKEN" -T backup.tar.gz \
http://swift:8080/v1/AUTH_xxx/container/backup.tar.gz
rings + 副本策略保证持久性,适合归档/镜像备份场景。
三、一个虚拟机的诞生之旅
把组件串起来的完整链路(也是排障的思路图):
1. 用户: openstack server create(带 token)
2. Keystone 验 token → 放行到 nova-api
3. nova-api 写库(状态 BUILD) → 消息队列 → scheduler
4. scheduler 过滤计算节点(剩多少内存/镜像在哪/可用区)
→ 选定 compute-03
5. compute-03:
a. 从 Glance 下载镜像(或命中本地缓存)
b. 向 Neutron 申请 port(分配 IP/MAC)
c. 从 Cinder 挂载卷(若有)
d. 调 libvirt → KVM 虚拟机启动
e. cloud-init 注入密钥/主机名
6. 状态 → ACTIVE, 用户拿到 IP
任何一步失败:openstack server show vm -f value fault + 各组件日志(/var/log/nova/*.log)定位。
四、部署形态与现实建议
| 形态 | 说明 |
|---|---|
| DevStack | all-in-one 快速体验(仅实验) |
| Kolla-Ansible | 容器化生产部署(推荐) |
| Puppet/Terraform 传统部署 | 老牌,定制强 |
| 厂商发行版 | 红帽 OSP / 国内超融合方案 |
谁该上 OpenStack:
- ✅ 中大型企业私有云、运营商、科研机构:多租户 + 自服务 + 规模化
- ✅ 需要云 API 但数据不能出机房
- ⚠️ 三五台机器的小机房:别上,KVM + virsh + Ansible 足够(虚拟化实战篇那套)
- ⚠️ 想省钱:OpenStack 本身免费但人力成本高(需要专职团队)
五、与公有云/K8s 的关系
很多公司的真实架构:
公有云(弹性业务)
+
OpenStack 私有云(敏感数据/稳定负载)
+
K8s 跑在两者之上(OpenStack Magnum/公有云 ACK/TKE)
层级关系:
OpenStack 管"机器"(IaaS, 虚拟机的云)
K8s 管"容器"(PaaS, 应用的云)
→ 不是替代关系, 是上下层
六、排障速查
openstack server show vm01 -f value fault # 直接错误信息
openstack service list # 组件健康
nova service-list / openstack compute service list
openstack network agent list # 网络代理状态
# 经典故障对照
虚拟机 ERROR "No valid host" → 资源不够/调度器过滤全挂
ping 不通 floating IP → 检查 router 网关/security group/外网桥
卷 attach 卡住 → cinder 后端状态/多路径
镜像下载超时 → Glance 存储/计算节点到 Glance 网络
小结
| 组件 | 一句话 |
|---|---|
| Keystone | 认证与服务目录(一切的入口) |
| Nova | 虚拟机生命周期与调度 |
| Neutron | 租户虚拟网络 |
| Glance | 镜像仓库 |
| Cinder | 云硬盘 |
| Swift | 对象存储 |
| 本质 | KVM 的"整车厂",私有云的操作系统 |
本文是「云计算」系列第 5 篇。