前言

公有云用得再熟,也总有一天会遇到"数据必须放自己机房"的需求——那时绕不开 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 篇。