00 · OpenStack 总纲——从云计算到 OpenStack 全景

00 · OpenStack 总纲------从云计算到 OpenStack 全景

本篇是整个系列的"地图"。读完本篇,你应当能回答:OpenStack 是什么、由哪些组件构成、它们如何协作、一台虚拟机是怎样被创建出来的 。

本篇重"广"(建立整体认知),各分篇重"深"(原理与实操)。建议先通读本篇,再带着全局视角进入各分篇。


本篇导读 / 学习目标

学完本篇,你将能够:

  1. 说清云计算的服务模型(IaaS/PaaS/SaaS)与部署模型(公有/私有/混合/社区云);
  2. 说清 OpenStack 的定位、发展历史、设计哲学与版本规则;
  3. 画出 OpenStack 的总体逻辑架构 ,区分控制、计算、存储、网络四类节点;
  4. 记住 7 大核心服务(Keystone / Glance / Nova / Neutron / Cinder / Swift / Heat)+ Horizon 的职责与协作关系;
  5. 完整描述创建一台虚拟机的端到端流程(认证 → 调度 → 取镜像/网络/存储 → Hypervisor 建机);
  6. 了解 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
controller

192.168.108.10

控制/存储/网络管理
compute

192.168.108.11

nova-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 业务服务(按调用方向自上而下分层)
Horizon

Web 控制台(用户入口)
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

  1. 客户向 nova-api 发请求:"创建一个 Instance";
  2. nova-api 处理后,向 RabbitMQ 发消息:"让 Scheduler 创建";
  3. nova-scheduler 取到消息,执行调度算法,从若干计算节点选出节点 A;
  4. nova-scheduler 发消息:"在节点 A 上创建";
  5. 节点 A 的 nova-compute 取到消息,通过本节点的 Hypervisor Driver(KVM) 创建 Instance;
  6. 创建过程中需要查/改数据库时,nova-compute 通过消息队列找 nova-conductor,由它访问数据库。

6.2 详细流程(认证 + 资源准备 + 建机,概览)

Cinder Neutron Glance nova-compute nova-conductor nova-scheduler nova-api Keystone 用户 Cinder Neutron Glance nova-compute nova-conductor nova-scheduler nova-api Keystone 用户 #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 驱动创建虚拟机

四阶段记忆法:

  1. 认证(Authentication):用户先向 Keystone 认证拿 Token;nova-api 收到请求后再向 Keystone 校验 Token。
  2. 调度(Scheduling) :nova-scheduler 通过"过滤 Filter + 权重 Weight"两步,选出最合适的计算节点。
  3. 资源准备(Resource Preparation) :nova-compute 分别向 Glance 取镜像、Neutron 取网络、Cinder 取持久化存储,每一步都要先过 Keystone 认证。
  4. 建机(Spawn) :nova-compute 调用 KVM/QEMU 驱动,最终创建并启动虚拟机。

七、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 建议学习顺序

  1. 先读本篇(总纲),建立全局认知;
  2. 按"认证 → 镜像 → 计算 → 存储 → 编排 → 网络"的顺序进入分篇(这也是创建 VM 时各服务被调用的顺序);
  3. 每篇先看"导读/目标",再理解原理与架构,然后对照 Dashboard 与 CLI 操作,最后做"自测题"检验;
  4. 理论 + 实验结合:每篇的实验务必亲手做一遍,用 tail -f 观察各组件日志,最能加深理解。

十、本篇小结

  • 云计算 是按需、池化、弹性、可计量的资源服务模式;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. 简答题

  1. 简述 IaaS、PaaS、SaaS 的区别,并各举一例。
  2. 画出(或口述)OpenStack 的总体逻辑架构,并说明四类节点的职责。
  3. 按"四阶段记忆法",描述创建一台虚拟机的完整过程。
  4. 为什么说 OpenStack 是"松耦合、可插拔"的?这带来什么好处?

参考答案(自测题)

2(1) C;(2) B;(3) C;(4) B;(5) B。

简答题见正文对应章节:SPI 模型见 1.2;架构与节点见第三部分;建机流程见第六部分;设计哲学见 2.4。

相关推荐
小白的码BUG之路41 分钟前
K8S -- 集群搭建环境基础
java·服务器·kubernetes
2301_780789661 小时前
SSL 卸载 + WAF + 抗 D:高防 CDN 一站式解决 HTTPS 性能与安全
网络·云原生·ddos
七夜zippoe1 小时前
Agent 网关设计:统一入口、智能路由与负载均衡
运维·ai·log4j·负载均衡·agent·网关设计
CQU_JIAKE1 小时前
10.28【A】
linux·运维·网络
大力财经1 小时前
山东山大华天软件与阿里云达成合作,旗下产品CrownCAD已接入Qoder
人工智能·阿里云·云计算
爱和冰阔落1 小时前
【Linux网络】Socket 编程前要搞懂什么?从 IP、端口到字节序与 sockaddr,一次理清网络通信基础
linux·运维·网络·tcp/ip
切糕师学AI1 小时前
K8s 滚动更新与 Spring Boot 优雅停机实战:如何做到真正的平滑发布?
spring boot·云原生·容器·kubernetes·k8s
晚风叙码1 小时前
Linux 进程概念(上):从冯诺依曼到进程调度
linux·运维·计算机外设
Z21-X2 小时前
云原生运维笔记:硬核拆解OpenStack计算与存储——从主机聚合到Cinder挂载全流程
运维·笔记·学习·云原生·openstack