00 · OpenStack 总纲——从云计算到 OpenStack 全景
本篇是整个系列的"地图"。读完本篇,你应当能回答:OpenStack 是什么、由哪些组件构成、它们如何协作、一台虚拟机是怎样被创建出来的。
本篇重"广"(建立整体认知),各分篇重"深"(原理与实操)。建议先通读本篇,再带着全局视角进入各分篇。
本篇导读 / 学习目标
学完本篇,你将能够:
一、先理解云计算:OpenStack 所处的位置
1.1 什么是云计算
云计算(Cloud Computing):一种按网络、按需、可计量地访问共享计算资源池(网络、服务器、存储、应用、服务)的模式,资源可以被快速供给和释放,而无需大量人工管理。
五个本质特征(记忆口诀:“按需自助、广泛接入、资源池化、快速弹性、可计量服务”):
| 按需自助服务 On-demand self-service | 消费者可单方面自动获取计算资源,无需与服务商人工交互 |
| 广泛网络访问 Broad network access | 资源通过网络获取,标准客户端(手机/电脑/API)均可使用 |
| 资源池化 Resource pooling | 提供商的资源被池化,多租户共享,物理位置对用户透明 |
| 快速弹性 Rapid elasticity | 资源可被快速、弹性地分配与释放,看起来"无限可用" |
| 可计量服务 Measured service | 资源使用被计量、监控与计费(按用量付费) |
1.2 服务模型:SPI 三层(IaaS / PaaS / SaaS)
SPI 模型:按"云厂商管到哪一层、用户管到哪一层",把云服务分为三层,越往上用户越省心、灵活性越低。
#mermaid-svg-hZkETWyUNPNJVbHw{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hZkETWyUNPNJVbHw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hZkETWyUNPNJVbHw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hZkETWyUNPNJVbHw .error-icon{fill:#552222;}#mermaid-svg-hZkETWyUNPNJVbHw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hZkETWyUNPNJVbHw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hZkETWyUNPNJVbHw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hZkETWyUNPNJVbHw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hZkETWyUNPNJVbHw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hZkETWyUNPNJVbHw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hZkETWyUNPNJVbHw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hZkETWyUNPNJVbHw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hZkETWyUNPNJVbHw .marker.cross{stroke:#333333;}#mermaid-svg-hZkETWyUNPNJVbHw svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hZkETWyUNPNJVbHw p{margin:0;}#mermaid-svg-hZkETWyUNPNJVbHw .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-hZkETWyUNPNJVbHw .cluster-label text{fill:#333;}#mermaid-svg-hZkETWyUNPNJVbHw .cluster-label span{color:#333;}#mermaid-svg-hZkETWyUNPNJVbHw .cluster-label span p{background-color:transparent;}#mermaid-svg-hZkETWyUNPNJVbHw .label text,#mermaid-svg-hZkETWyUNPNJVbHw span{fill:#333;color:#333;}#mermaid-svg-hZkETWyUNPNJVbHw .node rect,#mermaid-svg-hZkETWyUNPNJVbHw .node circle,#mermaid-svg-hZkETWyUNPNJVbHw .node ellipse,#mermaid-svg-hZkETWyUNPNJVbHw .node polygon,#mermaid-svg-hZkETWyUNPNJVbHw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hZkETWyUNPNJVbHw .rough-node .label text,#mermaid-svg-hZkETWyUNPNJVbHw .node .label text,#mermaid-svg-hZkETWyUNPNJVbHw .image-shape .label,#mermaid-svg-hZkETWyUNPNJVbHw .icon-shape .label{text-anchor:middle;}#mermaid-svg-hZkETWyUNPNJVbHw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hZkETWyUNPNJVbHw .rough-node .label,#mermaid-svg-hZkETWyUNPNJVbHw .node .label,#mermaid-svg-hZkETWyUNPNJVbHw .image-shape .label,#mermaid-svg-hZkETWyUNPNJVbHw .icon-shape .label{text-align:center;}#mermaid-svg-hZkETWyUNPNJVbHw .node.clickable{cursor:pointer;}#mermaid-svg-hZkETWyUNPNJVbHw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hZkETWyUNPNJVbHw .arrowheadPath{fill:#333333;}#mermaid-svg-hZkETWyUNPNJVbHw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hZkETWyUNPNJVbHw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hZkETWyUNPNJVbHw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hZkETWyUNPNJVbHw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hZkETWyUNPNJVbHw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hZkETWyUNPNJVbHw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hZkETWyUNPNJVbHw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hZkETWyUNPNJVbHw .cluster text{fill:#333;}#mermaid-svg-hZkETWyUNPNJVbHw .cluster span{color:#333;}#mermaid-svg-hZkETWyUNPNJVbHw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hZkETWyUNPNJVbHw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hZkETWyUNPNJVbHw rect.text{fill:none;stroke-width:0;}#mermaid-svg-hZkETWyUNPNJVbHw .icon-shape,#mermaid-svg-hZkETWyUNPNJVbHw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hZkETWyUNPNJVbHw .icon-shape p,#mermaid-svg-hZkETWyUNPNJVbHw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hZkETWyUNPNJVbHw .icon-shape .label rect,#mermaid-svg-hZkETWyUNPNJVbHw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hZkETWyUNPNJVbHw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hZkETWyUNPNJVbHw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hZkETWyUNPNJVbHw :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
SaaS:管到应用(开箱即用)
用户管:使用
厂商管:应用及以下全部
PaaS:管到平台
用户管:应用 / 数据
厂商管:运行时 / 中间件 / OS / 基础设施
IaaS:管到基础设施
用户管:OS / 中间件 / 应用 / 数据
厂商管:虚拟化 / 服务器 / 存储 / 网络
传统自建 On-Premise
用户管:应用到硬件全部
| IaaS | Infrastructure as a Service(基础设施即服务) | 虚拟机、网络、存储、负载均衡等基础资源 | OS、中间件、应用、数据 | OpenStack、AWS EC2、阿里云 ECS、华为云 ECS |
| PaaS | Platform as a Service(平台即服务) | 运行时、数据库、中间件、开发平台 | 应用与数据 | 数据库 RDS、应用引擎、K8s 托管服务 |
| SaaS | Software as a Service(软件即服务) | 完整可用的软件 | 直接使用 | 网页邮箱、在线文档、钉钉/飞书 |
记忆要点:OpenStack 是一个开源的 IaaS 平台——它把"数据中心的计算、存储、网络资源"池化,通过 API 对外提供虚拟机等基础设施服务。
1.3 部署模型:四类云
| 公有云 Public Cloud | 云资源由服务商运营,向公众开放 | 多租户、按需付费、规模大;如 AWS、阿里云、华为云 |
| 私有云 Private Cloud | 云资源专供一个组织使用(可自建或托管) | 安全可控、可定制;OpenStack 是私有云事实标准之一 |
| 混合云 Hybrid Cloud | 公有云 + 私有云通过技术打通、协同使用 | 敏感数据放私有、弹性峰值放公有 |
| 社区云 Community Cloud | 多个有共同诉求的组织共享的云 | 如政府云、行业云 |
1.4 虚拟化:云计算的地基
虚拟化(Virtualization):在一台物理机上抽象出多个相互隔离的虚拟计算机(虚拟机 VM),每台 VM 拥有独立的虚拟 CPU、内存、磁盘、网卡,运行各自的操作系统。
- Hypervisor(虚拟机监控器/VMM):负责虚拟化的软件层,分为:
- Type-1(裸金属型):直接装在硬件上,如 KVM、ESXi、Xen;
- Type-2(宿主型):作为应用装在普通 OS 上,如 VMware Workstation、VirtualBox。
- KVM(Kernel-based Virtual Machine):Linux 内核内置的开源虚拟化模块,把 Linux 变成 Type-1 Hypervisor;配合用户态的 QEMU 完成设备模拟。OpenStack Nova 默认使用 KVM/QEMU 作为底层虚拟化驱动。
- 除了计算虚拟化,还有存储虚拟化(如 LVM、Ceph)和网络虚拟化(如 Linux Bridge、OVS、SDN)——它们共同构成 OpenStack 的地基。
关系链:物理资源 → 虚拟化(KVM/LVM/OVS)→ 资源池化 → OpenStack 编排管理 → 以 API 对外提供云服务。
二、OpenStack 是什么
2.1 一句话定义
OpenStack 是一个开源的云计算管理平台(IaaS),通过一组相互协作的服务(组件),对数据中心的计算、存储、网络资源进行统一的池化、编排与自动化管理,并通过 REST API 与 Web 界面对外提供服务。
可以把它理解为:“云数据中心的操作系统”——它不直接生产资源,而是把底层虚拟化/存储/网络资源管理起来,让用户像用电一样自助申请虚拟机、网络、存储。
2.2 发展简史
- 2010 年 7 月,由 Rackspace(托管服务商)和 NASA(美国宇航局) 联合发起、开源:
- NASA 贡献了计算组件 Nova(前身 Nebula);
- Rackspace 贡献了对象存储组件 Swift。
- 此后由社区驱动,约每 6 个月发布一个正式版本,版本按字母顺序用城市/地区命名(A→B→C…)。
- 2012 年成立独立的 OpenStack 基金会;2020 年更名为 OpenInfra 基金会,统筹 OpenStack 及 Kata Containers、Zuul 等基础设施项目。
- 如今 OpenStack 是全球部署最广的开源私有云/混合云平台之一,与 Kubernetes 共同构成现代云基础设施的两大支柱。
2.3 版本规则(重要:本实验环境是 Victoria)
- 早期版本按字母顺序命名,每年两个版本(约 4 月、10 月)。部分关键版本:
| Austin | 2010.10 | 第 1 个版本,只有 Nova + Swift |
| Bexar / Cactus / Diablo | 2011 | 早期迭代 |
| Essex | 2012.04 | Keystone、Horizon 正式加入 |
| Folsom | 2012.09 | Quantum(网络,后改名 Neutron)、Cinder 加入 |
| Grizzly | 2013.04 | 首次引入 LBaaS |
| Havana | 2013.10 | Heat(编排)、Ceilometer(遥测) 加入 |
| Icehouse / Juno / Kilo | 2014–2015 | 成熟与扩展 |
| Liberty / Mitaka / Newton | 2015–2016 | 功能大发展 |
| Ocata / Pike / Queens / Rocky / Stein | 2017–2019 | Cells v2、Placement 演进 |
| Train / Ussuri | 2019–2020 | — |
| Victoria | 2020.10 | ★ 本课程实验环境使用的版本 |
| Wallaby / Xena / Yoga / Zed | 2021–2022 | 字母命名到 Z 结束 |
| 2023.1 Antelope 起 | 2023 至今 | 改为"年份.序号"命名(仍保留代号),如 2024.1 Caracal、2024.2 Dalmatian、2025.1 Epoxy、2025.2 Fenix,保持每年两版 |
记忆要点:本实验 = CentOS-Stream-8 + OpenStack Victoria(第 22 个版本),用 Packstack 部署。
2.4 OpenStack 的设计哲学
| 微服务 / 松耦合 | 每个功能是一个独立服务(组件),可单独部署、升级、扩展,互不绑定 |
| 一切皆 API(API 驱动) | 所有服务都通过 REST API 暴露能力;Horizon、CLI 本质都只是 API 的封装 |
| 共享无(Shared-Nothing) | 各组件不共享内部状态,状态统一存放在数据库;组件可水平扩展、多实例运行 |
| 消息驱动(异步通信) | 同一服务内部各进程(如 nova-api→scheduler→compute)通过消息队列 RabbitMQ 异步通信(RPC) |
| 可插拔 / 可扩展 | 后端技术以**驱动(Driver)/插件(Plugin)**形式接入:Hypervisor 可换 KVM/VMware,存储可换 LVM/Ceph,网络可换 OVS/OVN |
| 面向多租户 | 原生支持多租户隔离(Project/租户、配额、权限、网络隔离) |
三、OpenStack 总体架构
3.1 逻辑架构:三个平面 + 一条总线 + 一个数据库
OpenStack 在逻辑上可以看作:大量服务进程(API/调度/执行)+ 一条消息总线(RabbitMQ)+ 一个数据库(MariaDB)+ 各类后端(Hypervisor/存储/网络设备)。
#mermaid-svg-rNr52l4RnywQdf6r{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rNr52l4RnywQdf6r .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rNr52l4RnywQdf6r .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rNr52l4RnywQdf6r .error-icon{fill:#552222;}#mermaid-svg-rNr52l4RnywQdf6r .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rNr52l4RnywQdf6r .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rNr52l4RnywQdf6r .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rNr52l4RnywQdf6r .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rNr52l4RnywQdf6r .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rNr52l4RnywQdf6r .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rNr52l4RnywQdf6r .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rNr52l4RnywQdf6r .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rNr52l4RnywQdf6r .marker.cross{stroke:#333333;}#mermaid-svg-rNr52l4RnywQdf6r svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rNr52l4RnywQdf6r p{margin:0;}#mermaid-svg-rNr52l4RnywQdf6r .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-rNr52l4RnywQdf6r .cluster-label text{fill:#333;}#mermaid-svg-rNr52l4RnywQdf6r .cluster-label span{color:#333;}#mermaid-svg-rNr52l4RnywQdf6r .cluster-label span p{background-color:transparent;}#mermaid-svg-rNr52l4RnywQdf6r .label text,#mermaid-svg-rNr52l4RnywQdf6r span{fill:#333;color:#333;}#mermaid-svg-rNr52l4RnywQdf6r .node rect,#mermaid-svg-rNr52l4RnywQdf6r .node circle,#mermaid-svg-rNr52l4RnywQdf6r .node ellipse,#mermaid-svg-rNr52l4RnywQdf6r .node polygon,#mermaid-svg-rNr52l4RnywQdf6r .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rNr52l4RnywQdf6r .rough-node .label text,#mermaid-svg-rNr52l4RnywQdf6r .node .label text,#mermaid-svg-rNr52l4RnywQdf6r .image-shape .label,#mermaid-svg-rNr52l4RnywQdf6r .icon-shape .label{text-anchor:middle;}#mermaid-svg-rNr52l4RnywQdf6r .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rNr52l4RnywQdf6r .rough-node .label,#mermaid-svg-rNr52l4RnywQdf6r .node .label,#mermaid-svg-rNr52l4RnywQdf6r .image-shape .label,#mermaid-svg-rNr52l4RnywQdf6r .icon-shape .label{text-align:center;}#mermaid-svg-rNr52l4RnywQdf6r .node.clickable{cursor:pointer;}#mermaid-svg-rNr52l4RnywQdf6r .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rNr52l4RnywQdf6r .arrowheadPath{fill:#333333;}#mermaid-svg-rNr52l4RnywQdf6r .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rNr52l4RnywQdf6r .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rNr52l4RnywQdf6r .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rNr52l4RnywQdf6r .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rNr52l4RnywQdf6r .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rNr52l4RnywQdf6r .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rNr52l4RnywQdf6r .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rNr52l4RnywQdf6r .cluster text{fill:#333;}#mermaid-svg-rNr52l4RnywQdf6r .cluster span{color:#333;}#mermaid-svg-rNr52l4RnywQdf6r div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rNr52l4RnywQdf6r .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rNr52l4RnywQdf6r rect.text{fill:none;stroke-width:0;}#mermaid-svg-rNr52l4RnywQdf6r .icon-shape,#mermaid-svg-rNr52l4RnywQdf6r .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rNr52l4RnywQdf6r .icon-shape p,#mermaid-svg-rNr52l4RnywQdf6r .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rNr52l4RnywQdf6r .icon-shape .label rect,#mermaid-svg-rNr52l4RnywQdf6r .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rNr52l4RnywQdf6r .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rNr52l4RnywQdf6r .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rNr52l4RnywQdf6r :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
数据平面(计算/存储/网络节点)
消息与数据
控制平面(控制节点)
接入层
HTTP
用户/管理员
Horizon(Web 界面)
OpenStack CLI / SDK
Keystone 认证
glance-api
nova-api / placement
nova-scheduler / conductor
neutron-server
cinder-api / scheduler
heat-api / engine
RabbitMQ 消息队列
MariaDB 数据库
Memcached 缓存
nova-compute + KVM
cinder-volume(LVM 等)
Swift 存储
Neutron Agent / OVN
- 控制平面(Control Plane):接收请求、做认证/调度/编排,决定"做什么、在哪做",但不直接承载业务负载。
- 数据平面(Data Plane):真正运行虚拟机、存放数据、转发流量的地方。
- 消息总线:服务内部进程通过 RabbitMQ 做 RPC(rpc.call 同步等待、rpc.cast 单向通知)。
- 数据库:所有服务的状态、元数据统一存放在 MariaDB(MySQL),每个服务有自己的库(nova、glance、cinder、neutron、keystone…)。
3.2 四类节点(物理部署视角)
节点(Node):运行 OpenStack 一组服务的物理机(或虚拟机)。生产环境通常按职责拆分,实验环境为节省资源会合并。
| 控制节点 Controller | Keystone、Glance、Horizon、nova-api/scheduler/conductor、placement、neutron-server、cinder-api/scheduler、heat-api/engine、MariaDB、RabbitMQ、Memcached | 管理、调度、认证、API 入口(“大脑”) |
| 计算节点 Compute | nova-compute、KVM/QEMU、Neutron 二层 Agent(OVN/OVS/Linux Bridge) | 真正运行虚拟机、提供计算资源(“干活的肌肉”) |
| 存储节点 Storage | cinder-volume(+ 存储后端)、Swift 的 account/container/object 服务 | 提供块存储卷与对象存储(“仓库”) |
| 网络节点 Network | neutron L3/DHCP/metadata Agent、虚拟路由器 | 提供 DHCP、三层路由、NAT、浮动 IP(“门卫”) |
说明:
- All-in-One(一体化):把所有服务装在一台机器上,适合学习/测试(DevStack 常用)。
- 本课程实验环境:两节点——controller = 192.168.108.10、compute = 192.168.108.11。
- 控制节点同时承担了存储(Cinder 用 LVM、Swift 用 loopback)与网络管理功能;
- 网络后端为 OVN,租户网络用 Geneve 封装,传统独立网络节点的 L3/DHCP 功能由 OVN 集中式组件承担。
3.3 实验环境拓扑(贯穿全套笔记)
#mermaid-svg-jdEtTwovxZ7bKuTM{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jdEtTwovxZ7bKuTM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jdEtTwovxZ7bKuTM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jdEtTwovxZ7bKuTM .error-icon{fill:#552222;}#mermaid-svg-jdEtTwovxZ7bKuTM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jdEtTwovxZ7bKuTM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jdEtTwovxZ7bKuTM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jdEtTwovxZ7bKuTM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jdEtTwovxZ7bKuTM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jdEtTwovxZ7bKuTM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jdEtTwovxZ7bKuTM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jdEtTwovxZ7bKuTM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jdEtTwovxZ7bKuTM .marker.cross{stroke:#333333;}#mermaid-svg-jdEtTwovxZ7bKuTM svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jdEtTwovxZ7bKuTM p{margin:0;}#mermaid-svg-jdEtTwovxZ7bKuTM .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-jdEtTwovxZ7bKuTM .cluster-label text{fill:#333;}#mermaid-svg-jdEtTwovxZ7bKuTM .cluster-label span{color:#333;}#mermaid-svg-jdEtTwovxZ7bKuTM .cluster-label span p{background-color:transparent;}#mermaid-svg-jdEtTwovxZ7bKuTM .label text,#mermaid-svg-jdEtTwovxZ7bKuTM span{fill:#333;color:#333;}#mermaid-svg-jdEtTwovxZ7bKuTM .node rect,#mermaid-svg-jdEtTwovxZ7bKuTM .node circle,#mermaid-svg-jdEtTwovxZ7bKuTM .node ellipse,#mermaid-svg-jdEtTwovxZ7bKuTM .node polygon,#mermaid-svg-jdEtTwovxZ7bKuTM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jdEtTwovxZ7bKuTM .rough-node .label text,#mermaid-svg-jdEtTwovxZ7bKuTM .node .label text,#mermaid-svg-jdEtTwovxZ7bKuTM .image-shape .label,#mermaid-svg-jdEtTwovxZ7bKuTM .icon-shape .label{text-anchor:middle;}#mermaid-svg-jdEtTwovxZ7bKuTM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jdEtTwovxZ7bKuTM .rough-node .label,#mermaid-svg-jdEtTwovxZ7bKuTM .node .label,#mermaid-svg-jdEtTwovxZ7bKuTM .image-shape .label,#mermaid-svg-jdEtTwovxZ7bKuTM .icon-shape .label{text-align:center;}#mermaid-svg-jdEtTwovxZ7bKuTM .node.clickable{cursor:pointer;}#mermaid-svg-jdEtTwovxZ7bKuTM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jdEtTwovxZ7bKuTM .arrowheadPath{fill:#333333;}#mermaid-svg-jdEtTwovxZ7bKuTM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jdEtTwovxZ7bKuTM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jdEtTwovxZ7bKuTM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jdEtTwovxZ7bKuTM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jdEtTwovxZ7bKuTM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jdEtTwovxZ7bKuTM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jdEtTwovxZ7bKuTM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jdEtTwovxZ7bKuTM .cluster text{fill:#333;}#mermaid-svg-jdEtTwovxZ7bKuTM .cluster span{color:#333;}#mermaid-svg-jdEtTwovxZ7bKuTM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jdEtTwovxZ7bKuTM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jdEtTwovxZ7bKuTM rect.text{fill:none;stroke-width:0;}#mermaid-svg-jdEtTwovxZ7bKuTM .icon-shape,#mermaid-svg-jdEtTwovxZ7bKuTM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jdEtTwovxZ7bKuTM .icon-shape p,#mermaid-svg-jdEtTwovxZ7bKuTM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jdEtTwovxZ7bKuTM .icon-shape .label rect,#mermaid-svg-jdEtTwovxZ7bKuTM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jdEtTwovxZ7bKuTM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jdEtTwovxZ7bKuTM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jdEtTwovxZ7bKuTM :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
VMware Workstation(NAT 网络 192.168.108.0/24,网关 192.168.108.2)
NAT
NAT
controller192.168.108.10控制/存储/网络管理
compute192.168.108.11nova-compute + KVM
外部网络 / 互联网
| 操作系统 | CentOS-Stream-8(minimal) |
| OpenStack 版本 | Victoria |
| 部署工具 | Packstack(底层用 Puppet) |
| 控制节点 | controller / 192.168.108.10 |
| 计算节点 | compute / 192.168.108.11 |
| 默认区域 | RegionOne |
| 默认域 | Default(另有 heat 域) |
| 管理员 | admin(密码统一设为 huawei) |
| 网络后端 | OVN,租户网络 Geneve 封装 |
| 块存储后端 | LVM(卷组 cinder-volumes) |
| 数据库/消息队列 | MariaDB / RabbitMQ |
四、核心组件全景(OpenStack 服务地图)
4.1 七大核心服务 + 一个控制台
#mermaid-svg-Lpul3vFbG1KxqpSl{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Lpul3vFbG1KxqpSl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Lpul3vFbG1KxqpSl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Lpul3vFbG1KxqpSl .error-icon{fill:#552222;}#mermaid-svg-Lpul3vFbG1KxqpSl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Lpul3vFbG1KxqpSl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Lpul3vFbG1KxqpSl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Lpul3vFbG1KxqpSl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Lpul3vFbG1KxqpSl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Lpul3vFbG1KxqpSl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Lpul3vFbG1KxqpSl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Lpul3vFbG1KxqpSl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Lpul3vFbG1KxqpSl .marker.cross{stroke:#333333;}#mermaid-svg-Lpul3vFbG1KxqpSl svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Lpul3vFbG1KxqpSl p{margin:0;}#mermaid-svg-Lpul3vFbG1KxqpSl .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Lpul3vFbG1KxqpSl .cluster-label text{fill:#333;}#mermaid-svg-Lpul3vFbG1KxqpSl .cluster-label span{color:#333;}#mermaid-svg-Lpul3vFbG1KxqpSl .cluster-label span p{background-color:transparent;}#mermaid-svg-Lpul3vFbG1KxqpSl .label text,#mermaid-svg-Lpul3vFbG1KxqpSl span{fill:#333;color:#333;}#mermaid-svg-Lpul3vFbG1KxqpSl .node rect,#mermaid-svg-Lpul3vFbG1KxqpSl .node circle,#mermaid-svg-Lpul3vFbG1KxqpSl .node ellipse,#mermaid-svg-Lpul3vFbG1KxqpSl .node polygon,#mermaid-svg-Lpul3vFbG1KxqpSl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Lpul3vFbG1KxqpSl .rough-node .label text,#mermaid-svg-Lpul3vFbG1KxqpSl .node .label text,#mermaid-svg-Lpul3vFbG1KxqpSl .image-shape .label,#mermaid-svg-Lpul3vFbG1KxqpSl .icon-shape .label{text-anchor:middle;}#mermaid-svg-Lpul3vFbG1KxqpSl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Lpul3vFbG1KxqpSl .rough-node .label,#mermaid-svg-Lpul3vFbG1KxqpSl .node .label,#mermaid-svg-Lpul3vFbG1KxqpSl .image-shape .label,#mermaid-svg-Lpul3vFbG1KxqpSl .icon-shape .label{text-align:center;}#mermaid-svg-Lpul3vFbG1KxqpSl .node.clickable{cursor:pointer;}#mermaid-svg-Lpul3vFbG1KxqpSl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Lpul3vFbG1KxqpSl .arrowheadPath{fill:#333333;}#mermaid-svg-Lpul3vFbG1KxqpSl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Lpul3vFbG1KxqpSl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Lpul3vFbG1KxqpSl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Lpul3vFbG1KxqpSl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Lpul3vFbG1KxqpSl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Lpul3vFbG1KxqpSl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Lpul3vFbG1KxqpSl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Lpul3vFbG1KxqpSl .cluster text{fill:#333;}#mermaid-svg-Lpul3vFbG1KxqpSl .cluster span{color:#333;}#mermaid-svg-Lpul3vFbG1KxqpSl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Lpul3vFbG1KxqpSl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Lpul3vFbG1KxqpSl rect.text{fill:none;stroke-width:0;}#mermaid-svg-Lpul3vFbG1KxqpSl .icon-shape,#mermaid-svg-Lpul3vFbG1KxqpSl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Lpul3vFbG1KxqpSl .icon-shape p,#mermaid-svg-Lpul3vFbG1KxqpSl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Lpul3vFbG1KxqpSl .icon-shape .label rect,#mermaid-svg-Lpul3vFbG1KxqpSl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Lpul3vFbG1KxqpSl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Lpul3vFbG1KxqpSl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Lpul3vFbG1KxqpSl :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
所有服务都向 Keystone 认证
OpenStack 业务服务(按调用方向自上而下分层)
HorizonWeb 控制台(用户入口)
Heat编排(自动化)
Nova计算(生命周期核心)
Neutron网络
Cinder块存储
Glance镜像
Swift对象存储
Keystone认证 + 服务目录(横切)
| Horizon | 地平线 | 控制台 | 提供基于 Web 的图形化管理界面 | horizon(Apache + mod_wsgi) | 控制节点 |
| Keystone | 钥匙石 | 身份认证 | 认证、鉴权、服务目录、令牌管理 | keystone(httpd/uwsgi) | 控制节点 |
| Glance | 一瞥 | 镜像 | 镜像的注册、检索、元数据与存储管理 | glance-api(registry 已整合) | 控制节点 |
| Nova | 新星(超新星) | 计算 | 虚拟机全生命周期管理(核心) | nova-api、nova-scheduler、nova-conductor、nova-compute、placement | 控制 + 计算 |
| Neutron | 中子 | 网络 | 网络即服务(NaaS):二层/三层/负载均衡/防火墙/VPN | neutron-server、ML2 插件、各类 Agent、OVN | 控制 + 网络 + 计算 |
| Cinder | 煤渣(块) | 块存储 | 为 VM 提供持久化逻辑卷(类似云硬盘) | cinder-api、cinder-scheduler、cinder-volume、cinder-backup | 控制 + 存储 |
| Swift | 雨燕 | 对象存储 | 海量、高可用、分布式的静态对象存储 | proxy-server、account/container/object-server | 存储节点 |
| Heat | 热 | 编排 | 基于声明式模板(HOT)自动化编排整套资源 | heat-api、heat-api-cfn、heat-engine | 控制节点 |
4.2 更多常见服务(了解即可,按需学习)
| Ceilometer / Aodh / Gnocchi | 遥测计量、告警、时序指标存储(Telemetry) |
| Octavia | 负载均衡即服务(LBaaS 的新一代实现,替代旧的 neutron-lbaas) |
| Designate | DNS 即服务(域名管理) |
| Ironic | 裸金属(物理机)即服务 |
| Manila | 共享文件系统即服务(NFS/CIFS 等) |
| Trove | 数据库即服务 |
| Sahara | 大数据(Hadoop/Spark)即服务 |
| Barbican | 密钥管理即服务 |
| Magnum | 容器编排引擎(K8s)即服务 |
| Zun | 容器服务 |
| Kuryr | 容器与 Neutron 网络的桥接 |
| Placement | 资源提供者库存与用量统计(Nova 拆分出的独立服务) |
4.3 基础设施(支撑组件)
| MariaDB / MySQL | 关系型数据库,存放各服务的状态与元数据 |
| RabbitMQ | AMQP 消息队列,服务内部进程间 RPC 通信 |
| Memcached | 分布式内存缓存(Keystone 缓存 Token 等) |
| etcd | 分布式键值库(部分场景做协调/锁,如 OVN、部分网络后端) |
| HAProxy + Keepalived | 控制节点高可用(VIP、负载分发、故障切换) |
五、组件协作关系
5.1 服务间的依赖与认证
- Keystone 是所有服务的"门卫":任何服务收到请求,都会先向 Keystone 校验请求携带的 Token 是否有效、角色是否足够;各服务内部再用 policy(policy.json / policy.yaml) 做基于角色的细粒度授权。
- 各服务启动时,会用自己的服务账号(nova、glance、cinder、neutron 等)向 Keystone 认证,并在**服务目录(Service Catalog)**中注册自己的 Endpoint(端点 URL)。
- 用户拿到 Token 后,也就从 Keystone 拿到了"所有服务的地址簿"。
#mermaid-svg-IV9Hp0S99WodncRX{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IV9Hp0S99WodncRX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IV9Hp0S99WodncRX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IV9Hp0S99WodncRX .error-icon{fill:#552222;}#mermaid-svg-IV9Hp0S99WodncRX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IV9Hp0S99WodncRX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IV9Hp0S99WodncRX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IV9Hp0S99WodncRX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IV9Hp0S99WodncRX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IV9Hp0S99WodncRX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IV9Hp0S99WodncRX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IV9Hp0S99WodncRX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IV9Hp0S99WodncRX .marker.cross{stroke:#333333;}#mermaid-svg-IV9Hp0S99WodncRX svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IV9Hp0S99WodncRX p{margin:0;}#mermaid-svg-IV9Hp0S99WodncRX .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-IV9Hp0S99WodncRX .cluster-label text{fill:#333;}#mermaid-svg-IV9Hp0S99WodncRX .cluster-label span{color:#333;}#mermaid-svg-IV9Hp0S99WodncRX .cluster-label span p{background-color:transparent;}#mermaid-svg-IV9Hp0S99WodncRX .label text,#mermaid-svg-IV9Hp0S99WodncRX span{fill:#333;color:#333;}#mermaid-svg-IV9Hp0S99WodncRX .node rect,#mermaid-svg-IV9Hp0S99WodncRX .node circle,#mermaid-svg-IV9Hp0S99WodncRX .node ellipse,#mermaid-svg-IV9Hp0S99WodncRX .node polygon,#mermaid-svg-IV9Hp0S99WodncRX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IV9Hp0S99WodncRX .rough-node .label text,#mermaid-svg-IV9Hp0S99WodncRX .node .label text,#mermaid-svg-IV9Hp0S99WodncRX .image-shape .label,#mermaid-svg-IV9Hp0S99WodncRX .icon-shape .label{text-anchor:middle;}#mermaid-svg-IV9Hp0S99WodncRX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IV9Hp0S99WodncRX .rough-node .label,#mermaid-svg-IV9Hp0S99WodncRX .node .label,#mermaid-svg-IV9Hp0S99WodncRX .image-shape .label,#mermaid-svg-IV9Hp0S99WodncRX .icon-shape .label{text-align:center;}#mermaid-svg-IV9Hp0S99WodncRX .node.clickable{cursor:pointer;}#mermaid-svg-IV9Hp0S99WodncRX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IV9Hp0S99WodncRX .arrowheadPath{fill:#333333;}#mermaid-svg-IV9Hp0S99WodncRX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IV9Hp0S99WodncRX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IV9Hp0S99WodncRX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IV9Hp0S99WodncRX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IV9Hp0S99WodncRX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IV9Hp0S99WodncRX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IV9Hp0S99WodncRX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IV9Hp0S99WodncRX .cluster text{fill:#333;}#mermaid-svg-IV9Hp0S99WodncRX .cluster span{color:#333;}#mermaid-svg-IV9Hp0S99WodncRX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IV9Hp0S99WodncRX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IV9Hp0S99WodncRX rect.text{fill:none;stroke-width:0;}#mermaid-svg-IV9Hp0S99WodncRX .icon-shape,#mermaid-svg-IV9Hp0S99WodncRX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IV9Hp0S99WodncRX .icon-shape p,#mermaid-svg-IV9Hp0S99WodncRX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IV9Hp0S99WodncRX .icon-shape .label rect,#mermaid-svg-IV9Hp0S99WodncRX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IV9Hp0S99WodncRX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IV9Hp0S99WodncRX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IV9Hp0S99WodncRX :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
1. 认证(用户名/密码)
2. 返回 Token + 服务目录 Endpoints
3. 携带 Token 请求
4. 校验 Token / 查角色
5. 相互调用(HTTP)
用户
Keystone
Nova / Glance / Neutron / Cinder …
Glance 取镜像 / Neutron 配网络 / Cinder 挂卷
5.2 资源之间的关系(记忆模型)
- 镜像 Image:装好了操作系统的"模板";规格 Flavor:CPU/内存/磁盘的"尺码";实例 Instance:用镜像 + 规格创建出来、正在运行的"虚拟机"。
- Project(租户) 拥有:若干实例、网络、卷、镜像……
- Neutron:Project 1 : m Network(网络)1 : m Subnet(子网)1 : m Port(端口)1 : 1 VIF(虚拟网卡),多个 VIF 属于 1 个 Instance。
- Cinder:卷(Volume)可挂载到实例,可由快照创建;Swift:账户 → 容器 → 对象三级。
六、一台虚拟机是如何诞生的(端到端流程概览)
这是 OpenStack 最核心的"主线剧情",务必建立整体印象。
6.1 简单流程(6 步)
#mermaid-svg-OMrZjCVdIrBb58e7{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OMrZjCVdIrBb58e7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OMrZjCVdIrBb58e7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OMrZjCVdIrBb58e7 .error-icon{fill:#552222;}#mermaid-svg-OMrZjCVdIrBb58e7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OMrZjCVdIrBb58e7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OMrZjCVdIrBb58e7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OMrZjCVdIrBb58e7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OMrZjCVdIrBb58e7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OMrZjCVdIrBb58e7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OMrZjCVdIrBb58e7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OMrZjCVdIrBb58e7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OMrZjCVdIrBb58e7 .marker.cross{stroke:#333333;}#mermaid-svg-OMrZjCVdIrBb58e7 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OMrZjCVdIrBb58e7 p{margin:0;}#mermaid-svg-OMrZjCVdIrBb58e7 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-OMrZjCVdIrBb58e7 .cluster-label text{fill:#333;}#mermaid-svg-OMrZjCVdIrBb58e7 .cluster-label span{color:#333;}#mermaid-svg-OMrZjCVdIrBb58e7 .cluster-label span p{background-color:transparent;}#mermaid-svg-OMrZjCVdIrBb58e7 .label text,#mermaid-svg-OMrZjCVdIrBb58e7 span{fill:#333;color:#333;}#mermaid-svg-OMrZjCVdIrBb58e7 .node rect,#mermaid-svg-OMrZjCVdIrBb58e7 .node circle,#mermaid-svg-OMrZjCVdIrBb58e7 .node ellipse,#mermaid-svg-OMrZjCVdIrBb58e7 .node polygon,#mermaid-svg-OMrZjCVdIrBb58e7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OMrZjCVdIrBb58e7 .rough-node .label text,#mermaid-svg-OMrZjCVdIrBb58e7 .node .label text,#mermaid-svg-OMrZjCVdIrBb58e7 .image-shape .label,#mermaid-svg-OMrZjCVdIrBb58e7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-OMrZjCVdIrBb58e7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OMrZjCVdIrBb58e7 .rough-node .label,#mermaid-svg-OMrZjCVdIrBb58e7 .node .label,#mermaid-svg-OMrZjCVdIrBb58e7 .image-shape .label,#mermaid-svg-OMrZjCVdIrBb58e7 .icon-shape .label{text-align:center;}#mermaid-svg-OMrZjCVdIrBb58e7 .node.clickable{cursor:pointer;}#mermaid-svg-OMrZjCVdIrBb58e7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OMrZjCVdIrBb58e7 .arrowheadPath{fill:#333333;}#mermaid-svg-OMrZjCVdIrBb58e7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OMrZjCVdIrBb58e7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OMrZjCVdIrBb58e7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OMrZjCVdIrBb58e7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OMrZjCVdIrBb58e7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OMrZjCVdIrBb58e7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OMrZjCVdIrBb58e7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OMrZjCVdIrBb58e7 .cluster text{fill:#333;}#mermaid-svg-OMrZjCVdIrBb58e7 .cluster span{color:#333;}#mermaid-svg-OMrZjCVdIrBb58e7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OMrZjCVdIrBb58e7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OMrZjCVdIrBb58e7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-OMrZjCVdIrBb58e7 .icon-shape,#mermaid-svg-OMrZjCVdIrBb58e7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OMrZjCVdIrBb58e7 .icon-shape p,#mermaid-svg-OMrZjCVdIrBb58e7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OMrZjCVdIrBb58e7 .icon-shape .label rect,#mermaid-svg-OMrZjCVdIrBb58e7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OMrZjCVdIrBb58e7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OMrZjCVdIrBb58e7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OMrZjCVdIrBb58e7 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
1. 请求创建 VM
2. 发消息
3. 取消息、调度选主机
4. 发消息:在节点 A 建机
5. 取消息
6. 经 KVM Driver 创建 VM
查询/更新 DB
用户
nova-api
RabbitMQ
nova-scheduler
nova-compute(节点 A)
Instance
nova-conductor
6.2 详细流程(认证 + 资源准备 + 建机,概览)
CinderNeutronGlancenova-computenova-conductornova-schedulernova-apiKeystone用户CinderNeutronGlancenova-computenova-conductornova-schedulernova-apiKeystone用户#mermaid-svg-7XufTwJkwFS00xSm{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7XufTwJkwFS00xSm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7XufTwJkwFS00xSm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7XufTwJkwFS00xSm .error-icon{fill:#552222;}#mermaid-svg-7XufTwJkwFS00xSm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7XufTwJkwFS00xSm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7XufTwJkwFS00xSm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7XufTwJkwFS00xSm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7XufTwJkwFS00xSm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7XufTwJkwFS00xSm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7XufTwJkwFS00xSm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7XufTwJkwFS00xSm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7XufTwJkwFS00xSm .marker.cross{stroke:#333333;}#mermaid-svg-7XufTwJkwFS00xSm svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7XufTwJkwFS00xSm p{margin:0;}#mermaid-svg-7XufTwJkwFS00xSm .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7XufTwJkwFS00xSm text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-7XufTwJkwFS00xSm .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-7XufTwJkwFS00xSm .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-7XufTwJkwFS00xSm .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-7XufTwJkwFS00xSm .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-7XufTwJkwFS00xSm #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-7XufTwJkwFS00xSm .sequenceNumber{fill:white;}#mermaid-svg-7XufTwJkwFS00xSm #sequencenumber{fill:#333;}#mermaid-svg-7XufTwJkwFS00xSm #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-7XufTwJkwFS00xSm .messageText{fill:#333;stroke:none;}#mermaid-svg-7XufTwJkwFS00xSm .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7XufTwJkwFS00xSm .labelText,#mermaid-svg-7XufTwJkwFS00xSm .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-7XufTwJkwFS00xSm .loopText,#mermaid-svg-7XufTwJkwFS00xSm .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-7XufTwJkwFS00xSm .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-7XufTwJkwFS00xSm .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-7XufTwJkwFS00xSm .noteText,#mermaid-svg-7XufTwJkwFS00xSm .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-7XufTwJkwFS00xSm .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7XufTwJkwFS00xSm .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7XufTwJkwFS00xSm .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7XufTwJkwFS00xSm .actorPopupMenu{position:absolute;}#mermaid-svg-7XufTwJkwFS00xSm .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-7XufTwJkwFS00xSm .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7XufTwJkwFS00xSm .actor-man circle,#mermaid-svg-7XufTwJkwFS00xSm line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-7XufTwJkwFS00xSm :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}1. 提交认证信息2. 返回 Token3. 携带 Token 请求 boot4-5. 校验 Token / 角色6-7. 初始化 VM 数据库记录8. rpc.call 请求选主机9-11. 查资源、过滤+权重、选定主机12-13. rpc.cast 下发建机14-19. 经 conductor 取 VM 信息20-22. 认证并获取镜像23-25. 认证并获取网络信息26-28. 认证并获取存储信息29. 调用 KVM 驱动创建虚拟机
四阶段记忆法:
七、OpenStack 怎么部署
| Packstack | RHEL/CentOS 系的快速部署工具,基于 Puppet,用一个应答文件(answer file)一键部署 | 本课程使用;POC、学习、小规模 |
| DevStack | 官方开发/演示用脚本,All-in-One,快速但不适合生产 | 开发、体验、调试 |
| Kolla / Kolla-Ansible | 把各服务打包成 Docker 容器,用 Ansible 部署,提供容器化、可升级的生产方案 | 生产、容器化运维 |
| OpenStack-Ansible (OSA) | 官方 Ansible 剧本,LXC 容器化部署,生产级高可用 | 生产 |
| TripleO(“OpenStack on OpenStack”) | 用 OpenStack 自己部署/管理 OpenStack(undercloud/overcloud),偏大规模 | 大规模生产(已逐步进入维护期) |
| 手动部署 | 严格按官方安装文档逐组件配置 | 学习原理,不推荐生产 |
生产高可用(HA)要点:控制节点服务多实例部署,前端用 HAProxy + Keepalived(VIP) 做负载均衡与故障切换;数据库用 MariaDB Galera 集群;消息队列做 RabbitMQ 集群;计算节点故障时由 Nova 触发 evacuate 在其他节点重建实例。
八、版本生态与云原生
- OpenStack 与 Kubernetes 的关系:
- OpenStack 解决"虚拟机/基础设施(IaaS)"的管理,擅长资源虚拟化、多租户、网络与存储;
- Kubernetes 解决"容器(PaaS/CaaS)"的编排,擅长应用的弹性、调度与微服务;
- 二者互补而非替代:常见架构是"OpenStack 提供 VM/网络/存储底座,K8s 跑在 VM 或裸金属上";OpenStack 也通过 Magnum、Kuryr、Zun、Kata Containers 等项目与容器生态融合。
- 云原生(Cloud Native):以容器、微服务、不可变基础设施、声明式 API 为核心的应用构建与运行方式;代表技术 CNCF 生态(K8s、容器、服务网格、DevOps)。
- 常见搭配:OpenStack + Ceph(统一的块/对象/文件存储)、OpenStack + OVN(SDN 网络)、OpenStack + K8s。
九、学习路线与分篇导航
9.1 建议学习顺序
十、本篇小结
- 云计算是按需、池化、弹性、可计量的资源服务模式;SPI 三层(IaaS/PaaS/SaaS)中,OpenStack 属于开源 IaaS 平台。
- OpenStack 由 Rackspace + NASA 于 2010 年发起,微服务、API 驱动、消息队列、可插拔是其核心设计哲学;本实验为 CentOS-Stream-8 + Victoria,Packstack 部署。
- 总体架构 = 控制平面 + 数据平面 + RabbitMQ + MariaDB;物理上分为控制、计算、存储、网络四类节点。
- 七大核心服务:Keystone(认证)、Glance(镜像)、Nova(计算)、Neutron(网络)、Cinder(块存储)、Swift(对象存储)、Heat(编排),加上 Horizon(界面)。
- 创建 VM 的主线:认证 → 调度(过滤+权重)→ 取镜像/网络/存储 → KVM 建机。
十一、重点速记(考前/复习必看)
| OpenStack 定位 | 开源 IaaS 云平台,“云数据中心操作系统” |
| 起源 | 2010.7,Rackspace + NASA;Nova 来自 NASA、Swift 来自 Rackspace |
| 基金会 | OpenStack 基金会,2020 改名 OpenInfra |
| 实验版本 | Victoria,CentOS-Stream-8,Packstack |
| 节点 | 控制(大脑)、计算(肌肉)、存储(仓库)、网络(门卫) |
| 组件代号 | 钥匙石 Keystone、一瞥 Glance、新星 Nova、中子 Neutron、煤渣 Cinder、雨燕 Swift、热 Heat、地平线 Horizon |
| 通信 | 服务内 RabbitMQ(RPC);服务间 REST + Keystone 认证;状态存 MariaDB |
| 调度 | FilterScheduler = 过滤 Filter + 权重 Weight |
| 建机流程 | 认证 → 调度 → 取镜像/网络/存储 → KVM 建机 |
| 默认 Hypervisor | KVM/QEMU |
十二、自测题(先自己答,再回看正文)
1. 名词解释:云计算、IaaS、Hypervisor、OpenStack、节点、Endpoint。
2. 选择题
(1) OpenStack 属于哪一类云服务模型?( )
A. SaaS B. PaaS C. IaaS D. DaaS
(2) OpenStack 由哪两家机构于 2010 年联合发起?( )
A. Google + Amazon B. Rackspace + NASA C. IBM + 微软 D. Red Hat + Intel
(3) 本课程实验环境使用的 OpenStack 版本是?( )
A. Newton B. Train C. Victoria D. Wallaby
(4) 真正运行虚拟机、安装 KVM 的是哪类节点?( )
A. 控制节点 B. 计算节点 C. 网络节点 D. 存储节点
(5) Nova 服务内部 nova-api 与 nova-scheduler 之间主要通过什么通信?( )
A. 直接共享内存 B. 消息队列 RabbitMQ C. 写文件 D. 串口
3. 简答题
参考答案(自测题)
2(1) C;(2) B;(3) C;(4) B;(5) B。
简答题见正文对应章节:SPI 模型见 1.2;架构与节点见第三部分;建机流程见第六部分;设计哲学见 2.4。

