---
url: >-
  /courses/cloud-platform-build-management/10-openstack-architecture-workflow/index.md
---
# 第十次课：OpenStack 架构与实例创建工作流

## 进入本课环境

* `[Windows PowerShell] wsl ~`：打开本机默认的 WSL2 Ubuntu；本课在 WSL 中完成架构与工作流练习，不需要 SSH 登录 ECS。

前九次课一直站在“云服务器使用者”的位置：购买一台 ECS，登录系统，再部署和维护服务。从本次课开始，我们把视角移到云平台内部，看看一台云主机是怎样被多个服务共同创建出来的。

先用一条完整请求建立全景，后面再逐层拆开每项服务。

{{guided-demo:lesson-10-instance-workflow}}

本课不在 2 核 2 GiB ECS 上完整安装 OpenStack。完整控制面包含数据库、消息队列、身份、计算、网络、镜像、调度等多项服务，小规格单机很难提供稳定而有意义的实验。我们选择更适合当前条件的学习目标：

1. 能说清 OpenStack 核心服务各自负责什么。
2. 能沿一次实例创建请求找到身份、镜像、规格、网络、调度和计算证据。
3. 能区分“用户看到的实例状态”和“平台内部正在执行的任务”。
4. 能在没有 OpenStack 账号时，使用官方资料和本地证据表完成架构分析。

::: tip 关键提醒
本课的目标是读懂云平台，不是假装部署了云平台。官方页面截图能证明文档如何定义服务和状态；课程互动能证明你完成了架构推演，它们都不能证明本机正在运行 OpenStack。
:::

## 10.1 本课只做架构推演

先不安装 OpenStack。我们从一次创建实例的请求出发，依次回答身份、规格、镜像、网络、调度和计算由谁负责，再用状态与官方 API 页面核对这条请求链。

实训结果是一份服务映射与故障定位表。表中的每个判断都要写出依据，不能把“文档这样描述”写成“本机已经运行”。

## 10.2 OpenStack 不是单体软件

**OpenStack**（由一组相互协作的开源服务组成的云计算平台，主要用于建设和管理 IaaS 云）。比起一套装完即止的单体应用，它更像一个按职能分工的云平台组件库。

OpenStack 官方 2026.1 版本列出了大量的子项目。初学者不必被庞大的清单吓倒，先看懂这 8 个核心角色：

| 服务 | 常见项目名 | 核心职责 | 创建实例时提供什么 |
|---|---|---|---|
| 身份认证 | Keystone | 统一管理用户、项目、角色、令牌与服务入口 | 验证“是谁在哪个项目里发起请求” |
| 计算 | Nova | 负责实例生命周期调度与计算任务协调 | 接收创建指令并调度其他服务响应 |
| 资源候选 | Placement | 跟踪计算节点资源库存，并返回满足需求的分配候选 | 为 Nova 调度器提供可用资源候选 |
| 镜像 | Glance | 系统镜像的登记、检索与存储管理 | 提供虚拟机启动所需的操作系统镜像 |
| 网络 | Neutron | 管理虚拟网络、子网、端口、路由与安全组 | 为新实例分配虚拟网卡与网络联通 |
| 块存储 | Cinder | 云硬盘与数据卷的生命周期管理 | 按需挂载独立的数据云盘 |
| 控制台 | Horizon | 面向用户的 Web 图形界面 | 把用户的点击转化为后端 API 调用 |
| 消息与数据库 | RabbitMQ、MariaDB 等 | 跨服务传递异步消息、持久化平台元数据 | 支撑底层服务间协作，不对租户暴露 |

在实际架构中，绝不能把 Nova 简单等同于整个 OpenStack，也不能以为 Horizon 承担了底层虚拟机创建逻辑。Horizon 只是前台入口，真正的算力、网络和磁盘分配全由后端服务协同完成。

## 10.3 一次创建请求先回答六个问题

在阿里云控制台点选购买 ECS 时，我们需要指定镜像、规格、网络、安全组与登录密钥。OpenStack 的后台处理逻辑完全一致，每一项操作都对应明确的问题与服务：

| 问题 | OpenStack 对应的概念 | 主要负责服务 |
|---|---|---|
| 谁在请求，归属哪个项目？ | 用户、项目、Token | Keystone |
| 需要多大 CPU 和内存？ | Flavor（规格模板） | Nova |
| 用什么操作系统镜像启动？ | Image | Glance |
| 绑定到哪张虚拟网络？ | Network、Subnet、Port | Neutron |
| 哪些计算节点具有所需资源？ | Resource Provider、Allocation Candidate | Placement |
| 由谁选择节点并在底层拉起虚拟机？ | Scheduler、Server、Hypervisor Task | Nova Scheduler、Nova Compute |

其中 **Flavor**（描述虚拟 CPU、内存和磁盘等虚拟硬件规格的资源模板），**Image**（用于创建或重构实例的系统镜像），**Port**（连接实例虚拟网卡与虚拟网络的端口对象）。

遇到排错时，找准对应服务是关键。如果是“镜像下载超时”，去查安全组或者磁盘配额毫无意义；如果是“宿主机资源不足”，也不该去归咎镜像文件损坏。

## 10.4 实例创建是异步工作流

用户向 Nova 提交创建请求后，平台绝不会让 API 一直阻塞等待底层的镜像下载、网络分配和虚拟机拉起。API 校验通过后会立即返回，并将实例置于 `BUILD` 状态，后台再异步完成实际的搭建动作。

Nova Compute API 定义的标准任务生命周期如下：

```txt
BUILD
  scheduling            选择最佳计算节点
  networking            配置虚拟网卡与网络
  block_device_mapping  挂载本地磁盘或 Cinder 卷
  spawning              在 Hypervisor 上拉起虚拟机
ACTIVE                  成功运行，可尝试连接
ERROR                   过程出错，创建中断
```

这里的缩进不是说每一步永远严格串行，而是帮助初学者把状态和负责对象对应起来。生产环境还会受到驱动、网络实现、卷启动方式和运维配置影响。

官方页面还说明，创建是异步过程，可以通过 `GET /servers/{server_id}` 查询进度。所以别看到 API 请求已被接受，就急着下结论说“实例已经可以登录”。

## 10.5 用状态判断下一条证据

没有管理员权限时，学生通常只能看到实例状态、任务提示和有限的事件信息。即使如此，状态仍能帮助安排检查顺序：

| 现象 | 当前能说明 | 下一条证据 |
|---|---|---|
| 长时间 `BUILD`，任务为 `scheduling` | 请求可能还在资源选择阶段 | 规格、可用区、配额和调度事件 |
| `BUILD`，任务为 `networking` | 平台正在准备网络资源 | 网络、子网、端口和网络服务事件 |
| `BUILD`，任务为 `block_device_mapping` | 正在准备本地盘或卷 | 卷状态、镜像可见性和块存储事件 |
| `BUILD`，任务为 `spawning` | 已接近计算节点创建阶段 | 计算服务、镜像获取和虚拟化层事件 |
| `ACTIVE` | 平台认为实例已运行 | IP、端口、安全组、系统服务和实际 SSH |
| `ERROR` | 创建没有完成 | 故障消息、request ID 和管理员日志 |

::: warning 安全边界
`ACTIVE` 只说明平台认为实例在运行，离 SSH 成功还有距离。实例状态来自云平台，SSH 还要经过地址、网络、安全组、系统监听、账号和凭据。不要因为 SSH 失败就直接删除实例或重建控制面。
:::

## 10.6 API、命令行和 Horizon 是三个入口

Horizon、OpenStackClient 和应用程序最终都在调用服务 API，只是面向的使用方式不同：

```txt
Horizon 页面 ─┐
openstack CLI ├─> Keystone 令牌与服务目录 ─> Nova / Neutron / Glance / Cinder API
应用程序 API ─┘
```

如果 Horizon 页面报错，而 CLI 和 API 正常，问题可能位于界面或会话层；如果三种入口都在同一个 API 动作失败，则应继续查看服务端请求和依赖。界面按钮不是平台能力本身。

在有真实 OpenStack 环境时，常见只读命令包括：

```bash
[WSL] openstack token issue
```

它会请求 Keystone 签发或显示当前令牌信息，用于确认凭据和项目上下文。不要把输出中的令牌完整放进作业。

```bash
[WSL] openstack catalog list
```

它读取服务目录，查看当前云公开了哪些服务入口。目录里出现 `compute` 不等于 Nova 后端一定健康。

```bash
[WSL] openstack server show <实例名或ID>
```

它读取一个实例的状态与属性。只有获得课程 OpenStack 账号时才执行；本课没有账号时，不在报告中编造输出。

## 10.7 本课实训：做一名“请求链分析员”

本课实训不需要云平台账号。进入 **WSL** 的 `lab-10` 目录：

```bash
[WSL] cd ~/cloud-course/lab-10
```

这一步切换到本课目录。可用 `pwd` 确认没有进错路径。

```bash
[WSL] mkdir -p answers
```

创建答题目录。已有目录时不会报错。

```bash
[WSL] cp starter/service-map.tsv answers/service-map.tsv
```

这一步把服务职责表复制到答题目录。只编辑 `answers/` 中的副本，保留原始模板作为对照。

```bash
[WSL] cp starter/instance-workflow.tsv answers/instance-workflow.tsv
```

这一步复制实例工作流表。随后为每个阶段补上负责服务、当前证据和下一条检查。

```bash
[WSL] bash verify.sh
```

脚本只检查表格结构、必需阶段、服务名和是否仍有空白项，不判断开放题文字是否合理。最终结论仍需根据官方资料人工复核。

完整步骤见[实训 10：OpenStack 服务映射与实例工作流](./lab-10.md)。

{{chat-lab:lesson-10-openstack-evidence}}

## 10.8 报告怎样写才不空泛

每个判断都使用“三列表”：

| 当前证据 | 已经证明 | 还需要什么 |
|---|---|---|
| 状态为 `BUILD`，任务为 `networking` | 请求已经进入网络准备阶段 | 网络端口、Neutron 事件或管理员日志 |
| 状态为 `ACTIVE` | 平台认为实例运行 | 实际 IP、访问控制、系统端口和 SSH 请求 |
| 服务目录有 `image` | Keystone 返回了镜像服务入口 | Glance API 与具体镜像是否可用 |

报告中不要写“Nova 负责一切”“状态正常所以网络正常”。服务职责越清楚，排障范围越小。

## 10.9 清理与提交

本课只产生本地答题表和 Word 报告，不创建云资源，也不启动后台服务。完成后保留：

* `answers/service-map.tsv`
* `answers/instance-workflow.tsv`
* `第10次课_OpenStack架构分析报告.docx`

删除临时测试副本前先确认路径：

```bash
[WSL] realpath ./answers
```

它会显示答题目录的绝对路径。确认它位于 `lab-10` 后，再清理明确的临时副本，不要误删报告和最终答案。

提交文件名：

```txt
班级_学号_姓名_第10次课_OpenStack架构分析报告.docx
```

只提交一个 Word 到智慧职教“第10次课”。截图中不出现令牌、账号、完整地址或浏览器个人信息。

{{reflection-checkpoint:lesson-10-openstack-ready}}

## 10.10 第十次课小测

{{assessment:lesson-10-check}}

## 10.11 小结

* OpenStack 是一组通过 API 协作的服务，不等于 Nova 或 Horizon。
* Keystone、Nova、Placement、Glance、Neutron 和 Cinder 各自回答不同问题。
* 实例创建是异步工作流，`BUILD` 中的任务状态能缩小检查范围。
* `ACTIVE` 是平台状态，不等于 SSH、应用和公网路径全部正常。
* 官方截图、互动推演和真实平台证据必须明确各自的证明范围。

下一次课把这些角色映射到阿里云 ECS、VPC、安全组、云盘、快照和 OSS，建立私有云与公有云之间的概念桥梁。

## 10.12 资料来源

以下资料在 2026-07-28 核对：

* [OpenStack 2026.1 Services and Libraries](https://docs.openstack.org/2026.1/projects.html)
* [OpenStack Installation Guide：Get started](https://docs.openstack.org/install-guide/get-started-with-openstack.html)
* [Nova：What is nova?](https://docs.openstack.org/nova/latest/)
* [Compute API：Server concepts](https://docs.openstack.org/api-guide/compute/server_concepts.html)
* [Installation Guide：Launch an instance](https://docs.openstack.org/install-guide/launch-instance.html)

{{assistant-invite:lesson-10-finish}}
