文章背景图

OpenStack 架构与虚拟机创建流程:Nova、Neutron、Glance、Cinder 如何协作

2026-07-25
4
-
- 分钟

OpenStack 创建虚拟机看起来只是执行一条命令,背后却需要身份、计算、网络、镜像、存储和资源调度等多个服务协同。理解这条请求链路,能明显提高部署与故障排查效率。

## 1. 主要服务及职责

- Keystone:认证用户身份,签发 Token,并提供服务目录。

- Nova:负责实例生命周期,包括 API、调度、计算节点执行和状态管理。

- Placement:维护资源提供者及 CPU、内存、磁盘、PCI 等资源库存与分配记录。

- Glance:保存和分发系统镜像及镜像元数据。

- Neutron:创建网络、子网、端口、安全组和路由等网络资源。

- Cinder:提供持久化块存储卷、快照和备份。

- Horizon:Web 管理界面,本质上仍通过各服务 API 工作。

Nova 本身还包含 nova-api、nova-scheduler、nova-conductor、nova-compute 和控制台代理等组件。消息队列用于组件间通信,数据库保存控制面状态。

## 2. 用户请求进入云平台

用户可以通过 Horizon、OpenStack CLI 或 SDK 发起请求。例如:

```bash

openstack server create \

--flavor m1.small \

--image ubuntu-22.04 \

--network private-net \

--security-group default \

--key-name demo-key \

demo-vm

```

客户端先从 Keystone 获取认证信息和服务目录,再把创建请求发送给 Nova API。生产环境不应把管理员密码直接写进脚本,应使用受限账号、application credential 或安全的凭证管理方式。

## 3. Nova API 检查请求

Nova API 会执行策略检查、配额检查和参数校验,确认镜像、规格、网络等引用是否有效。随后 Nova 创建实例记录和 Build Request,并把调度请求交给后续组件。

常见失败点:

- 项目实例、核心数、内存或端口配额不足。

- flavor、image、network 或 keypair 不存在。

- 用户缺少对应策略权限。

- 指定可用区或主机无效。

## 4. Scheduler 与 Placement 选择计算节点

nova-scheduler 从 Placement 获取候选资源提供者,先过滤不满足条件的主机,再根据权重选择目标计算节点。判断条件可能包括:

- vCPU、内存和本地磁盘是否足够。

- 可用区与主机聚合是否匹配。

- flavor extra specs 是否满足。

- NUMA、CPU pinning、Huge Page、GPU 或 PCI/SR-IOV 资源是否可用。

- 镜像、卷和网络是否带有额外约束。

遇到 NoValidHost 时,不要只看 hypervisor 剩余资源,还应检查 Placement allocation、主机聚合、extra specs、PCI 库存、禁用的计算服务和 nova-scheduler 日志。

## 5. Neutron 准备网络

Nova 请求 Neutron 创建或绑定端口。端口包含 MAC、固定 IP、安全组、绑定主机和 VNIC 类型等信息。普通虚拟网卡通常使用 normal,SR-IOV 场景可能使用 direct

网络准备可能涉及:

- 从子网地址池分配固定 IP。

- 生成或更新 Neutron Port。

- 应用安全组和 QoS 策略。

- 由 OVS、OVN、Linux Bridge 或 SR-IOV 机制驱动完成绑定。

- 配置 DHCP、L2 转发与路由能力。

若实例卡在 networking 阶段,应检查端口状态、binding 信息、相关 agent、机制驱动日志和底层物理网络映射。

## 6. Glance 与 Cinder 准备启动盘

镜像启动时,nova-compute 从 Glance 获取镜像,缓存到计算节点并通过虚拟化驱动创建磁盘。卷启动时,Cinder 根据镜像创建卷或使用已有卷,再通过存储后端把设备连接到计算节点。

两种方式的区别:

- 镜像加本地临时盘:实例删除后根盘通常随之消失,创建速度和性能取决于本地存储。

- Boot from Volume:根盘由 Cinder 管理,可设置实例删除时是否保留,更适合需要持久化的场景。

## 7. nova-compute 创建虚拟机

目标计算节点上的 nova-compute 通过 libvirt/KVM 等虚拟化驱动:

1. 准备镜像或连接卷。

2. 创建网络接口并完成端口绑定。

3. 生成实例 XML 和设备配置。

4. 启动虚拟机进程。

5. 回报实例、任务和电源状态。

cloud-init 可以从 Metadata Service 或 Config Drive 获取主机名、SSH 公钥、用户数据和网络配置。镜像没有正确安装 cloud-init 时,密钥或初始化脚本可能不会生效。

## 8. 创建完成后的验证

```bash

openstack server show demo-vm

openstack server event list demo-vm

openstack port list --server demo-vm

openstack console log show demo-vm

openstack volume list --server demo-vm

```

至少确认:实例为 ACTIVE、任务状态为空、端口为 ACTIVE、固定 IP 正确、安全组符合预期、控制台无启动错误,并从目标网络实际测试连通性。

## 9. 一条实用排障链路

创建失败时按顺序定位:

1. 客户端认证、Endpoint 和项目是否正确。

2. Nova API 是否接受请求,配额是否足够。

3. Scheduler 是否找到候选主机。

4. Placement 库存和 allocation 是否一致。

5. Neutron 端口是否成功绑定。

6. Glance 镜像或 Cinder 卷是否可用。

7. nova-compute、libvirt 和底层存储是否正常。

8. 修复后重新创建,并验证用户实际访问路径。

不要直接修改 Nova、Neutron 或 Cinder 数据库来“修状态”。应先确认真实资源状态,再使用受支持的 API、管理命令或恢复流程。

## 参考资料

- https://docs.openstack.org/nova/latest/install/get-started-compute.html

- https://docs.openstack.org/python-openstackclient/latest/cli/command-objects/server.html

原创

OpenStack 架构与虚拟机创建流程:Nova、Neutron、Glance、Cinder 如何协作

本文链接: OpenStack 架构与虚拟机创建流程:Nova、Neutron、Glance、Cinder 如何协作

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录