OpenStack Neutron网络概念

一、网络模型

1、Provider Network(提供商网络)🌐

  • 定义: 直接映射到物理网络的虚拟网络,由管理员创建
  • 隔离方式: Flat(无标签)/ VLAN(802.1Q标签)
  • 特点: 依赖物理网络基础设施提供L3路由,无需虚拟路由器
  • 性能: 高,无封装开销,实例直接可达
  • 适用场景: 简单部署,物理网络直连,企业迁移环境

2、Self-Service Network(自助服务网络)🏗️

  • 定义: 完全虚拟化的Overlay网络,非特权用户可自行创建
  • 隔离方式: VXLAN(默认)/ GRE / GENEVE隧道封装
  • 特点: 多租户隔离,需虚拟路由器连接外部网络
  • NAT机制: SNAT(出站) + Floating IP / DNAT(入站)
  • 扩展性: VXLAN支持1600万+网络段,远超VLAN的4096限制

3、路由器(Router)🔀

  • 实现: 基于Linux网络命名空间(Network Namespace)的虚拟L3设备
  • 管理: 由 L3 Agent(neutron-l3-agent)在网络节点上运行
  • 功能:
    • 路由Self-Service网络间的流量
    • 连接Self-Service网络与外部/Provider网络
    • 执行SNAT和DNAT转换
  • 高可用: 支持DVR(分布式虚拟路由)和L3 HA(VRRP主备)

4、安全组(Security Group)🛡️

  • 定义: 实例端口级别的有状态虚拟防火墙
  • 默认策略: 入站皆拒,出站皆允
  • 实现: 基于iptables规则(或OVS流规则)在计算节点执行
  • 特性:
    • 支持协议/端口/IP/安全组级别规则
    • 自动添加反欺骗规则(防MAC/IP伪造/Rogue DHCP)
    • 每个项目有默认安全组,未指定则自动应用

二、ML2(Modular Layer 2)核心插件架构

架构概览

ML2 是 Neutron 的控制面核心,将网络类型实现机制彻底解耦:

1
2
3
4
5
6
7
ML2 Plugin
├── Type Manager(类型管理)
│ ├── Flat / Local / VLAN
│ └── VXLAN / GRE / GENEVE
└── Mechanism Manager(机制管理)
├── 基于代理: Linux Bridge / Open vSwitch / L2POP
└── 基于控制器: OpenDaylight / OVN / VMware NSX

类型驱动(Type Driver)

类型 说明 隔离范围
Flat 无标签网络 无隔离
Local 仅单节点 单宿主机
VLAN 802.1Q标签 4096个
VXLAN 24位VNI隧道 1600万+
GRE IP-over-IP隧道 无限制
GENEVE 灵活可扩展封装 无限制

机制驱动(Mechanism Driver)

  • Linux Bridge: 基于内核原生桥接,简单稳定
  • Open vSwitch: 基于OpenFlow流规则,功能丰富
  • L2 Population: 优化广播流量,提升VXLAN/GRE性能
  • SDN控制器: OVN / OpenDaylight / NSX 等集中控制方案

工作流程

1
2
3
4
5
6
7
8
9
用户 API 请求

Neutron Server → ML2 Plugin
├── Type Driver 校验 + 存储数据库
└── Mechanism Driver RPC 通知各节点 Agent
├── L2 Agent(虚拟交换机配置)
├── L3 Agent(路由/NAT)
├── DHCP Agent(dnsmasq分配IP)
└── Metadata Agent(元数据代理)

三、Linux Bridge 代理

数据流向

1
2
3
4
5
6
7
8
9
VM

Tap 接口(tapXXX) ← 虚拟机虚拟网卡

Linux 网桥(brqXXXX) ← 充当二层交换机

VLAN 接口(ethX.Y)或 VXLAN 接口(vxlan-Z) ← 网络隔离/隧道

物理网卡(ethX)

支持范围

  • ✅ Local / Flat / VLAN / VXLAN
  • ❌ GRE

特点

  • 架构直观,基于内核原生桥接,适合学习理解
  • 技术成熟稳定,性能高效
  • 不依赖额外用户态进程,资源占用低

四、Open vSwitch(OVS)代理

数据流向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
VM

Tap 接口(tapXXX) ← 虚拟网卡

qbr(Linux网桥) ← 安全组iptables过滤

veth对(qvbXXX ↔ qvoXXX) ← 连接Linux网桥与OVS

br-int(集成网桥) ← 核心虚拟交换机

br-ethX(物理连接网桥) ← Flat/VLAN网络
或 br-tun(隧道网桥) ← VXLAN/GRE/GENEVE网络

物理网卡(ethX)

核心机制

  • 所有虚拟机连接至同一 br-int 集成网桥
  • 通过 OpenFlow 流规则 进行VLAN转换和隧道封装
  • 无需VLAN子接口,流规则可动态下发

支持范围

  • ✅ Local / Flat / VLAN / VXLAN / GRE / GENEVE(全支持)

五、Linux Bridge vs OVS 对比

特性 Linux Bridge Open vSwitch
架构复杂度 简单 复杂
网络类型支持 Local/Flat/VLAN/VXLAN 全部支持
GRE/GENEVE
流规则控制 不支持 OpenFlow
SDN集成 困难 容易
安全组实现 iptables iptables / OVS原生流表
业界采用率 较低 主流

六、Neutron SDN 思想解析

Neutron 的 SDN 思想核心:控制面与数据面分离

传统网络 vs Neutron SDN 映射

传统网络 Neutron 实现
物理交换机/路由器 OVS / Linux Bridge 虚拟交换机
物理网线 Tap / VETH / PATCH 端口
VLAN子接口 OVS 流规则 / VXLAN 隧道
物理防火墙 安全组(iptables / OVS流表)
路由表 L3 Agent 网络命名空间
DHCP服务器 DHCP Agent(dnsmasq)

关键技术注解

  • 网络命名空间 💡: Linux内核特性,隔离网络栈(接口、路由表、iptables),Neutron用它实现路由器隔离
  • VXLAN隧道 💡: MAC-in-UDP封装,将二层帧通过三层网络传输,解决VLAN数量限制和跨物理机通信问题
  • OpenFlow流表 💡: OVS的核心,定义数据包匹配规则和动作(转发/丢弃/修改),实现可编程网络
  • RPC消息队列 💡: Neutron Server与各Agent间的通信纽带,Agent通过监听队列获取配置指令

Nova计算服务概念

Nova 是 OpenStack 中的核心计算服务(Compute Service)☁️,负责管理虚拟机(VM)实例的完整生命周期——创建、启动、停止、删除、迁移、快照等。它采用分布式、无状态、消息驱动的架构设计,各组件通过消息队列(RabbitMQ)异步通信,通过共享数据库协调状态。状态保存在数据库中,不在服务进程中。


一、四大核心组件架构

nova-api — 前端入口 🚪

角色:REST API 端点 / 请求编排器

  • 接收所有用户/运维操作请求(如 POST /servers 创建VM)
  • 通过 Keystone 进行身份认证 🔐
  • 校验请求参数并执行策略(Policy)
  • 将实例初始状态写入数据库(vm_state=BUILDING
  • 将任务派发至消息队列,由其他服务处理
  • 无状态,可水平扩展

nova-scheduler — 调度决策引擎 🧠

角色:确定哪台物理计算节点运行新创建的虚拟机

采用两阶段算法

阶段1:Filtering(过滤)——运行可配置过滤链,剔除不合格主机

过滤器 作用
RetryFilter 跳过之前调度失败的节点
AvailabilityZoneFilter 遵循可用域(AZ)约束
RamFilter / CoreFilter / DiskFilter 检查资源容量(支持超分比 ram_allocation_ratiocpu_allocation_ratio
ComputeFilter 仅选择 nova-compute 健康的节点
ImagePropertiesFilter 镜像属性与 Hypervisor 类型匹配
ServerGroupAntiAffinityFilter 实例分散到不同主机(高可用)
ServerGroupAffinityFilter 实例集中到相同主机
PciPassthroughFilter 仅选择支持 PCI 透传的节点

阶段2:Weighting(权重打分)——对候选主机打分,最高分胜出(默认按剩余内存最多优先)

自 Newton 版本起,资源清单追踪由独立的 Placement API 服务负责。调度器向 Placement 查询分配候选节点,再应用自身的过滤器和权重。

nova-conductor — 安全代理与编排器 🛡️

角色:数据库访问代理 + 复杂工作流协调器

引入目的:解决安全隔离问题——计算节点永远不能直接访问中央数据库,防止计算节点被攻破时数据泄露。

职责 说明
数据库代理 nova-compute 的所有数据库读写通过 RPC 路由到 conductor;计算节点强制 DISABLE_DB_ACCESS = True
任务编排 管理多步骤复杂操作:实例创建、冷迁移、在线迁移、Resize、Rebuild(通过内部 ComputeTaskManager

同样无状态,可水平扩展。⚠️ 禁止部署在 nova-compute 所在节点。

nova-compute — 实际执行者 ⚙️

角色:真正的 Hypervisor 管理器——唯一直接操作虚拟机的组件

  • 运行在每个计算节点(物理服务器)上
  • 监听消息队列获取工作指令
  • 调用 Hypervisor 驱动(如 libvirt.LibvirtDriver for KVM/QEMU)
  • 管理实例全生命周期:创建、销毁、暂停、挂起、Resize、迁移、快照
  • 定期向 Placement API 报告资源使用情况
  • 不能直接访问数据库——所有 DB 操作经 nova-conductor

二、完整工作流:创建一台虚拟机 🔄

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
用户 → nova-api          发送 POST /servers(含 flavor、image、network)
nova-api → Keystone 认证 Token
nova-api → 数据库 创建实例记录(vm_state=BUILDING)
nova-api → 消息队列 发送 boot RPC 消息
nova-scheduler ← 队列 拾取 boot 任务
nova-scheduler → Placement 查询 /allocation_candidates(找合适主机)
Placement → nova-scheduler 返回候选主机列表及资源信息
nova-scheduler → 数据库 过滤 + 权重打分,选出最佳主机
nova-scheduler → 消息队列 发送 build_and_run_instance 到目标主机
nova-compute ← 队列 拾取构建任务
nova-compute → conductor RPC 请求完整实例详情
conductor → 数据库 读取实例数据
conductor → nova-compute 返回实例对象
nova-compute → Placement 提交 /allocations(锁定资源)
nova-compute → Libvirt 调用 spawn()——创建磁盘、启动虚拟机
nova-compute → 数据库 更新 vm_state=ACTIVE(经 conductor)

关键特性:这是异步、最终一致性架构。API 立即返回 202 Accepted,实际 VM 创建在后台进行。


三、虚拟化技术支持 💻

Hypervisor 驱动方式 说明
KVM libvirt 最常用,基于内核的虚拟化,将 Linux 转变为 Hypervisor
QEMU libvirt 机器模拟器,与 KVM 配合提供设备模拟和 I/O 操作
Xen libvirt / XenAPI Type-1 Hypervisor,支持 libvirt 驱动或 XenAPI
VMware vCenter VMwareAPI 集成 vSphere 虚拟化环境
Hyper-V HyperVDriver Windows Server 虚拟化平台
Ironic IronicDriver 裸金属管理(非虚拟化,直接管理物理机)
LXC/LXD LXDDriver Linux 容器虚拟化

关键虚拟化机制

  • KVM/QEMU 模式: nova-compute 通过 libvirt 库调用 KVM/QEMU,libvirt 提供统一 API 屏蔽底层差异
  • Emulator Threads 策略(Pike+ 版本): hw:cpu_emulator_threads 规格标签可设置:
    • share(默认) — 模拟器线程与 vCPU 共享物理 CPU
    • isolate — 模拟器线程固定在专用物理 CPU(适合实时性要求高的场景)
  • Xen 特殊处理: 重启 Xen 虚拟机时会先后发射 STOPPEDSTARTED 事件,Nova 延迟处理 STOPPED 事件避免误停 VM

四、调度策略详解 🎯

过滤阶段核心过滤器

过滤器 作用场景
RetryFilter 防止失败节点被重新选中
AvailabilityZoneFilter 将实例调度到指定可用域
RamFilter 检查内存是否充足(含超分比)
DiskFilter 检查磁盘空间
CoreFilter 检查 vCPU 是否充足
ComputeCapabilitiesFilter 根据计算节点额外特性过滤
ImagePropertiesFilter 确保镜像与 Hypervisor 兼容
ServerGroupAntiAffinityFilter 实现实例反亲和性分散
ServerGroupAffinityFilter 实现实例亲和性集中
NumInstancesFilter 限制单节点最大实例数
IoOpsFilter 避免 I/O 繁忙节点
PciPassthroughFilter 仅选择支持 PCI 透传节点

权重打分

过滤后的候选主机进入权重阶段,默认策略:

  • ram_weight_multiplier(默认 1.0)— 剩余内存越多权重越高
  • 可自定义:cpu_weight_multiplierdisk_weight_multiplier

五、Cells v2 架构(生产部署) 🏗️

对于大规模部署(数百上千计算节点),Nova 使用 Cells v2 横向分区:

层级 组件
全局(Global) nova-api、Placement API、全局数据库(记录 Cell 映射)
每个 Cell Cell 数据库(实例元数据)、Cell 消息队列、scheduler、conductor、compute
  • Cell0 — 特殊 Cell,存放调度失败实例记录,避免污染主数据库
  • 每个 Cell 拥有独立的消息队列和数据库,避免单点瓶颈
  • 实现真正水平扩展能力

六、组件特性对比

服务 主要职责 有状态? 可扩展? 数据库访问
nova-api REST 端点、请求校验 水平扩展 是(读写)
nova-scheduler 主机选择(过滤+权重) 水平扩展 是(只读)
nova-conductor 数据库代理、任务编排 水平扩展 是(读写)
nova-compute VM 生命周期、Hypervisor 调用 是(本地) 增加计算节点 经 conductor

七、使用场景

  • 虚拟机全生命周期管理 🖥️:从创建、运行、迁移到销毁
  • 多 Hypervisor 统一管理 🔧:同一 Nova 集群可混用 KVM、VMware、Xen 等
  • 弹性伸缩 📈:水平扩展计算节点,结合调度策略优化资源利用率
  • 高可用部署 🛡️:Cells v2 + Anti-Affinity 策略实现跨物理机/跨可用域部署

一句话概括

nova-api 是入口,nova-scheduler 决定在哪运行,nova-conductor 安全代理数据库,nova-compute 是真正干活的。四者通过消息队列 + Placement API 协作,支撑起 OpenStack 的计算服务能力。

OpenStack Ceilometer(监控计量)详解

一、Ceilometer 概述 📊

Ceilometer 是 OpenStack Telemetry(遥测)服务的核心组件,采用 Agent 架构,所有服务均可水平扩展。核心职责是采集云平台中所有资源的计量数据,为监控、告警、计费、性能分析提供数据基础。

Telemetry 生态组件

组件 职责
Ceilometer 数据采集(Polling + Notification)
Gnocchi 时序数据存储(Time-Series DBaaS)
Aodh 告警服务(基于阈值触发动作)
Panko 事件存储(已逐步废弃)
CloudKitty 计费引擎(Rating-as-a-Service)

二、数据采集两大机制 🔄

1. Notification Agent(通知代理)— 推荐方式 ✅

原理:OpenStack 各组件在执行操作时向消息队列发送通知,Notification Agent 监听并转换为 Samples/Events。

工作流程

  1. 各服务发通知到消息队列(topic: notifications.infonotifications.sample 等)
  2. Notification Agent 加载 ceilometer.notification 命名空间的 Listener 插件
  3. 根据 event_type 过滤,分发给对应 Endpoint 处理
  4. 通过 Pipeline 进行转换(Transform)和发布(Publish)

Meter 配置示例(meters.yaml) 📋

1
2
3
4
5
6
7
metric:
- name: "disk.read.bytes"
event_type: "compute.instance.create.end"
type: "cumulative"
unit: "B"
volume: "$.payload.size"
resource_id: "$.payload.instance_id"
特性 说明
触发方式 被动监听消息队列
数据来源 其他 OpenStack 服务发出的通知
负载影响 无额外负载(推荐)
适用场景 操作事件(创建/删除/快照等)

2. Polling Agent(轮询代理)— 补充方式 ⏱️

原理:对于通知无法覆盖的指标(如 VM CPU/内存使用率等资源使用数据),Polling Agent 定期主动轮询 获取。

三种 Polling Agent

Agent 命名空间 部署位置 采集目标
Compute Agent ceilometer.poll.compute 每个计算节点 轮询本地 Hypervisor(libvirt/KVM),采集 VM CPU/内存/磁盘 IO
Central Agent ceilometer.poll.central 控制节点 轮询各 OpenStack 服务 REST API(网络、存储等)
IPMI Agent ceilometer.poll.ipmi 计算节点 轮询 IPMI 传感器数据、硬件功耗

注意:Kilo 版本起统一为 ceilometer-polling,通过 --polling-namespaces 参数区分。

Polling 配置示例(polling.yaml) 📋

1
2
3
4
5
6
7
8
9
10
11
sources:
- name: "compute_source"
interval: 300 # 轮询间隔(秒)
meters:
- "cpu_util"
- "memory.resident"
- "disk.read.bytes"
resources:
- "list of resource urls"
discovery:
- "local_instances"
特性 说明
触发方式 主动定时轮询
数据来源 Hypervisor / REST API / IPMI
负载影响 对 API 服务有负载(需合理配置间隔)
适用场景 资源持续使用数据(CPU/内存/磁盘)

三、Pipeline 数据处理管道 📦

无论是 Notification 还是 Polling 采集的数据,都经过 Pipeline 统一处理:

1
采集(Agent)→ 转换(Transform)→ 发布(Publish)→ 目标存储

1. 数据转换(Transform)

支持的转换器:

转换器 说明 典型场景
rate_of_change 计算变化速率 CPU 使用率增量
delta 计算差值 网络流量增量
unit_conversion 单位换算 byte → MB
arithmetic 算术运算 聚合计算
accumulator 累积计算 累积流量

2. 数据发布(Publish)— 支持多发布者

Publisher 目标 典型场景
gnocchi Gnocchi 时序数据库 推荐,长期存储与查询
notifier 消息队列 外部系统消费
http/https REST API 对接第三方系统
kafka Apache Kafka 高吞吐流处理
prometheus Prometheus Pushgateway 容器化监控
file 本地文件 调试
udp UDP 数据包 轻量传输

3. Pipeline 配置示例(pipeline.yaml) 🔧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sources:
- name: "cpu_source"
interval: 300
meters:
- "cpu_util"
sinks:
- "cpu_sink"
sinks:
- name: "cpu_sink"
transformers:
- name: "rate_of_change"
publishers:
- "gnocchi://"
- "notifier://"

四、Gnocchi 时序数据存储 🗄️

Gnocchi 替代了 Ceilometer 早期数据库存储后端,提供高性能时序数据存储和查询。

特性 说明
归档策略(Archive Policy) 定义数据的保留周期和聚合粒度
查询性能 O(1) 时间复杂度查询
存储空间 可预测、可控
高可用 支持水平扩展
资源类型 支持自定义 resource_typeattribute

归档策略示例

1
2
3
4
5
6
gnocchi archive-policy create \
--back-window 0 \
--granularity 60:1h \
--granularity 3600:30d \
--granularity 86400:365d \
name: 'low-resolution'

归档策略解释

粒度 保留时长 说明
60s(1 分钟) 1 小时 最细粒度,实时监控
3600s(1 小时) 30 天 中期趋势分析
86400s(1 天) 365 天 长期容量规划

常用查询命令

1
2
3
4
gnocchi measures show -r RESOURCE_ID -m METRIC_NAME
gnocchi measures show --aggregation mean -r RESOURCE_ID -m cpu_util
gnocchi resource list --type instance
gnocchi status

五、Aodh 告警系统集成 🚨

Aodh 基于 Ceilometer 采集、Gnocchi 存储的数据,提供灵活的阈值告警服务。

告警类型

告警类型 说明
gnocchi_aggregation_by_resources_threshold 按资源聚合阈值(最常用)
gnocchi_aggregation_by_metrics_threshold 按指标聚合阈值
event 事件类型告警
combination 组合多个告警条件
threshold 简单阈值告警(兼容旧版)

支持的动作

动作类型 格式 说明
日志 log:// 记录告警日志
Webhook webhook://URL HTTP/HTTPS 回调(对接邮件、短信、PagerDuty 等)
消息队列 notifier:// 发送到消息队列
复合 组合多个动作 同时触发多种通知

告警创建示例

1
2
3
4
5
6
7
8
9
10
11
12
13
aodh alarm create \
--type gnocchi_aggregation_by_resources_threshold \
--name cpu_high \
--metric cpu_util \
--threshold 80 \
--comparison-operator ge \
--evaluation-periods 3 \
--period 300 \
--aggregation-method avg \
--resource-type instance \
--query '{"=": {"id": "INSTANCE_UUID"}}' \
--alarm-action 'webhook://https://hooks.example.com/alarm' \
--ok-action 'webhook://https://hooks.example.com/ok'

参数说明

参数 含义
--threshold 80 阈值 80%
--comparison-operator ge 大于等于触发
--evaluation-periods 3 连续 3 次触发
--period 300 评估周期 300s
--alarm-action 告警触发时执行的动作
--ok-action 告警恢复时执行的动作

六、CloudKitty 计费系统集成 💰

计量计费三步骤

步骤 组件 说明
① Metering(计量) Ceilometer → Gnocchi 采集并存储资源使用数据
② Rating(定价) CloudKitty 根据计费策略计算费用
③ Billing(出账) 外部计费系统 生成账单,提供 API

CloudKitty 架构

1
Ceilometer/Gnocchi → Tenant Fetcher → Collector → Rating Engine → Storage → Dashboard/API
模块 功能
Tenant Fetcher 获取所有租户信息
Collector 从 Ceilometer/Gnocchi 拉取资源使用数据
Rating Engine 计费引擎,支持多种模块
Storage 存储计费结果(InfluxDB 等)
Dashboard Horizon 面板可视化

Rating Engine 计费模块

模块 说明 适用场景
hashmap 基于标签/项目的固定定价,通过键值对匹配 标准定价,按规格/镜像固定价格
pyscript Python 脚本自定义策略,灵活度最高 复杂计费逻辑,差异化定价
noop 无操作,返回零费用 测试用

Dynamic Pollster 高级采集

对于自定义计费场景,Ceilometer 提供 Dynamic Pollster,可在运行时动态定义新采集指标,无需重启代理:

1
2
3
4
5
6
# polling.yaml — dynamic pollster 示例:采集卷的 IOPS
sources:
- name: "volume_iops"
interval: 60
meters:
- "volume.iops"

配合 CloudKitty 的 hashmap 规则,可实现基于标签(tag)的差异计费(如按项目、按客户级别、按操作系统类型差异化定价)。


七、整体数据流总览 🌐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
┌──────────────────────────────────────────────────────────────────┐
│ OpenStack 各组件 │
│ Nova / Glance / Cinder / Neutron / Swift / Keystone / Heat │
└───────┬────────────────────────────────────────┬─────────────────┘
│ 发送通知 │ 提供 REST API
▼ ▼
┌────────────────────┐ ┌──────────────────────────┐
│ Notification Agent │ │ Polling Agent │
│ (监听消息队列) │ │ (compute/central/ipmi) │
│ ↓ 转换为 samples │ │ ↓ 轮询生成 samples │
└─────────┬──────────┘ └──────────┬───────────────┘
│ │
└──────────┬──────────────────────────────┘

┌──────────────────────┐
│ Pipeline 处理 │
│ (Transform + Publish)│
└──────────┬───────────┘

┌───────────────┬───────────────┬───────────────┐
▼ ▼ ▼ ▼
Gnocchi Aodh CloudKitty 外部系统
(时序存储) (阈值告警) (计费引擎) (Kafka/HTTP)
│ │ │
▼ ▼ ▼
监控面板 告警通知 账单/报表
(Grafana) (邮件/Webhook) (客户计费)

八、性能调优 🚀

优化项 建议 说明
采集方式选择 优先使用 Notification 减少 API 负载,仅在必要时开启 Polling
Polling 间隔 根据指标重要性设置 60s-600s CPU 使用率可 60s,磁盘容量可 600s
Pipeline 批处理 增大 batch_size 提高发布效率(默认 100 可增至 500-1000)
Gnocchi 归档策略 合理配置聚合粒度 细粒度短期、粗粒度长期,控制存储成本
水平扩展 增加 Polling Agent、Gnocchi-metricd 实例 根据数据量线性扩展
Kafka 缓冲 引入 Kafka 发布者 解耦采集与存储,应对流量峰值
消息队列优化 使用 RabbitMQ 或 Kafka 集群 提高消息吞吐能力

Pipeline 批处理配置优化

1
2
3
4
5
6
[notification]
batch_size = 500
batch_timeout = 5

[collector]
workers = 4

九、常用 CLI 命令 🖥️

Ceilometer 命令

1
2
3
ceilometer meter-list
ceilometer sample-list -m cpu_util
ceilometer statistics -m cpu_util -p 3600

Gnocchi 命令

1
2
3
4
gnocchi metric list
gnocchi measures show -r RESOURCE_ID -m cpu_util
gnocchi archive-policy list
gnocchi resource list --type instance

Aodh 命令

1
2
3
4
aodh alarm list
aodh alarm show ALARM_ID
aodh alarm update --name ALARM_ID --threshold 90
aodh alarm delete ALARM_ID

CloudKitty 命令

1
2
3
4
5
6
openstack rating module list
openstack rating hashmap service create --name compute
openstack rating hashmap field create --service compute \
--key flavor --type flat
openstack rating hashmap mapping create \
--field-id FIELD_ID --value m1.small --cost 0.5

十、最佳实践 💡

  1. 优先使用 Notification 采集,减少对 OpenStack API 的额外负载
  2. 合理配置 Polling 间隔,重要指标(CPU)用短间隔,次要指标(磁盘容量)用长间隔
  3. 使用 Gnocchi 归档策略控制存储成本,细粒度数据短期保留,粗粒度数据长期保留
  4. 开启 Pipeline 批处理,增大 batch_size 提升吞吐量
  5. 引入 Kafka 缓冲层,解耦采集与存储,应对大规模集群流量峰值
  6. 水平扩展 Agent,Compute Agent 随计算节点自动扩展,Central Agent 根据 API 负载调整
  7. 告警策略设置连续评估周期evaluation-periods),避免误告警
  8. CloudKitty 计费规则需手动创建 hashmap 或 pyscript 规则,否则不产生计费结果
  9. 利用 Dynamic Pollster 动态定义自定义采集指标,无需重启代理服务
  10. 监控 Ceilometer 自身性能,关注消息队列积压和 Pipeline 处理延迟

OpenStack Cinder块存储详解

一、Cinder核心架构概览

Cinder是OpenStack的块存储核心组件,为虚拟机提供持久化、高性能的块级存储设备。通过与Nova协作,Cinder实现了计算与存储的解耦——虚拟机实例的磁盘数据独立于计算节点存在,即使虚拟机被删除,卷中的数据依然保留。🔲

架构全景图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
                  ┌──────────┐
│ Keystone │
└────┬─────┘
│ AUTH
┌────▼─────┐
USER ──REST API──► CINDER-API│
└────┬─────┘

┌─────▼──────┐
│ Message │
│ Queue │ ◄── RabbitMQ(异步解耦)
└─────┬──────┘

┌──────────┼──────────┐
▼ ▼ ▼
CINDER- CINDER- CINDER-
SCHEDULER VOLUME BACKUP
│ │ │
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ DB │ │ 存储 │ │ 备份 │
│ MySQL │ │ 后端 │ │ 后端 │
└────────┘ └────────┘ └────────┘

┌────────────────┼────────────────┐
▼ ▼ ▼
LVM/iSCSI Ceph RBD NFS/FC
(本地存储) (分布式存储) (网络存储)

核心组件一览表

组件 职责 说明
cinder-api RESTful API入口 处理所有卷操作请求,验证身份权限,转发至消息队列
cinder-scheduler 调度器 基于 Filter + Weight 算法,智能选择最优存储后端节点
cinder-volume 卷管理器 直接与底层存储交互,通过驱动管理卷的完整生命周期
cinder-backup 备份服务 将卷备份到其他存储系统(Ceph/Swift/TSM等),支持恢复
Message Queue 消息队列(RabbitMQ) 各服务间异步通信,实现解耦与高可用
Database 数据库(MySQL) 存储卷、快照、备份等的状态元数据

架构设计哲学 — 控制与数据分离

1
2
3
4
5
6
7
8
9
10
11
块存储 = 控制平面 (Control Plane) + 数据平面 (Data Plane)

控制平面 → cinder-api + cinder-scheduler + 消息队列
├── 请求路由与调度
├── 权限验证与配额管理
└── 元数据持久化 (MySQL)

数据平面 → cinder-volume + 存储后端驱动
├── 实际执行 I/O 操作
├── 通过驱动层屏蔽后端差异
└── 数据路径不经过控制平面

关键设计理念: cinder-api 和 cinder-scheduler 仅负责请求调度,实际的 I/O 由 cinder-volume 通过后端驱动完成。当卷挂载到虚拟机后,数据传输直接在 Nova 计算节点与存储后端之间完成,不经过 cinder-volume 中转。🚀


二、四大核心组件深度解析 🧩

1️⃣ cinder-api — 请求入口

cinder-api 是用户与 Cinder 交互的唯一入口,对外提供 RESTful API。

1
2
3
4
5
6
cinder-api 工作流程:
1. 接收 HTTP 请求 (POST/GET/PUT/DELETE)
2. Keystone 身份验证(校验 TOKEN)
3. 请求参数校验与反序列化
4. 将 API 调用转换为消息发布到消息队列
5. 异步等待执行结果并返回响应

核心 API 端点:

API 方法 功能
/v3/{PROJECT_ID}/volumes POST 创建卷
/v3/{PROJECT_ID}/volumes/{VOLUME_ID} GET 查询卷详情
/v3/{PROJECT_ID}/volumes/{VOLUME_ID}/action POST 挂载/卸载/扩展等操作
/v3/{PROJECT_ID}/snapshots POST 创建快照
/v3/{PROJECT_ID}/backups POST 创建备份

2️⃣ cinder-scheduler — 调度引擎

调度器负责为每个卷创建请求选择最优的存储节点,采用 Filter + Weight 两阶段机制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
创建卷请求 → cinder-scheduler

┌───────▼────────┐
│ Phase 1: Filter │
│ 过滤掉不满足条件 │
│ 的存储节点 │
└───────┬────────┘

┌───────▼────────┐
│ Phase 2: Weight │
│ 对剩余节点进行 │
│ 权重计算排序 │
└───────┬────────┘

┌───────▼────────┐
│ 选择最优节点 │
│ → cinder-volume │
└────────────────┘

内置 Filter 列表:

Filter 功能
CapacityFilter 过滤剩余容量不足的节点
CapabilitiesFilter 按卷类型特性匹配(如 SSD/HDD)
AvailabilityZoneFilter 按可用域过滤
DriverFilter 检查驱动是否支持请求的操作
InstanceLocalityFilter 优先选择与目标虚拟机在同一节点的存储
DifferentBackendFilter 确保卷分布在不同的后端

Weighter(权重计算器):

Weighter 说明
CapacityWeigher 剩余容量越大权重越高(默认)
ChanceWeigher 随机权重(均匀分布)
GoodnessWeigher 基于用户自定义的 goodness 函数

3️⃣ cinder-volume — 卷管理核心

cinder-volume 是真正与存储硬件交互的服务,运行在存储节点上。它通过插件化驱动架构支持多种存储后端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cinder-volume 内部架构:

┌────────────────────────────────────────┐
│ cinder-volume 服务 │
├────────────────────────────────────────┤
│ Manager(协调层) │
│ ├── RPC 消息处理 │
│ ├── 任务队列管理 │
│ └── 状态上报 │
├────────────────────────────────────────┤
│ 驱动抽象层(Volume Driver API) │
│ ├── create_volume() │
│ ├── delete_volume() │
│ ├── attach_volume() / detach_volume() │
│ ├── create_snapshot() │
│ ├── create_volume_from_snapshot() │
│ └── extend_volume() │
├────────────────────────────────────────┤
│ 具体驱动实现 │
│ ┌──────┬──────┬──────┬──────┬──────┐ │
│ │ LVM │ Ceph │ NFS │ FC │其他 │ │
│ │ iSCSI│ RBD │ │ SAN │厂商 │ │
│ └──────┴──────┴──────┴──────┴──────┘ │
└────────────────────────────────────────┘

4️⃣ cinder-backup — 备份服务

提供卷的跨区域备份与恢复能力,支持多种备份后端:

备份后端 说明
Ceph (RBD) 直接利用 Ceph 池差异备份
Swift 备份到 OpenStack 对象存储
NFS 备份到 NFS 共享目录
Google Cloud Storage 云存储备份
IBM Tivoli Storage Manager 企业级备份集成

三、Cinder 卷生命周期管理 📋

创建卷的完整流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1. 用户执行:
openstack volume create --SIZE 100 --TYPE ssd my-volume

2. cinder-api:
├── 校验用户 TOKEN(调用 Keystone)
├── 校验请求参数(SIZE、TYPE 等)
├── 创建数据库中初始记录(STATUS=CREATING)
└── 发送 "volume.create" 消息到消息队列

3. cinder-scheduler:
├── 消费消息队列中的创建请求
├── Filter 阶段:
│ ├── CapacityFilter → 检查可用容量
│ ├── CapabilitiesFilter → 匹配 volume type
│ └── AvailabilityZoneFilter → 可用域匹配
├── Weight 阶段:
│ └── CapacityWeigher → 按剩余容量排序
└── 发送 "volume.create_on_backend" 到选定节点

4. cinder-volume (选定节点):
├── 接收消息
├── 调用对应驱动的 create_volume() 方法
├── LVM: lvcreate / Ceph: rbd create
├── 更新数据库状态为 available
└── 返回成功响应

挂载卷到虚拟机(Nova 协调)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
卷挂载流程(Cinder ↔ Nova 协作):

1. 用户请求挂载:
openstack server add volume <SERVER> <VOLUME>

2. Nova 调用 Cinder 的 os-attach API:
├── Cinder 将卷状态置为 attaching
└── Cinder 返回连接信息(connector)

3. Nova 根据 connector 信息连接存储后端:
├── iSCSI: 发现 iSCSI target → 登录 → 挂载本地设备
├── Ceph: 通过 RBD map 或 librbd 直接访问
└── NFS: mount NFS 共享目录

4. Nova 将设备附加到虚拟机:
├── libvirt 定义 disk 设备
└── 卷以 /dev/vdb, /dev/vdc 等出现在 VM 内

5. Cinder 更新状态为 in-use

卷状态机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
                ┌──────────┐
│ creating │ ── 正在创建
└────┬─────┘

┌────▼─────┐
┌──────────► available│ ── 可用,等待挂载
│ └────┬─────┘
│ │
┌────┴─────┐ ┌──────▼──────┐
│ attaching│ │ in-use │ ── 已挂载到虚拟机
└────┬─────┘ └──────┬──────┘
│ │
┌────▼─────┐ ┌──────▼──────┐
│detaching │ │ deleting │ ── 正在删除
└────┬─────┘ └──────┬──────┘
│ │
│ ┌────▼─────┐
│ │ deleted │ ── 已删除
│ └──────────┘

┌────┴───────────┐
│ error / │
│ error_deleting │
└────────────────┘

其他中间状态:

状态 说明
reserved 预留(正在创建时使用)
extending 正在扩容
backing-up 正在备份
restoring 正在从备份恢复
retyping 正在变更卷类型
maintenance 维护模式

常用管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# ─── 卷管理 ───

# 创建卷
openstack volume create --SIZE 100 --TYPE ssd my-volume
# ├── --SIZE 卷容量(GB)
# ├── --TYPE 卷类型(关联后端存储)
# ├── --AVAILABILITY-ZONE 指定可用域
# ├── --BOOTABLE 标记为可启动卷
# └── --PROPERTY 自定义元数据

# 列出卷
openstack volume list
# ├── --ALL-PROJECTS(管理员)查看所有项目
# ├── --NAME 按名称筛选
# └── --STATUS 按状态筛选(available/in-use)

# 查看卷详情
openstack volume show <VOLUME_ID_OR_NAME>
# └── 显示 ID、大小、状态、挂载点、卷类型等

# 删除卷
openstack volume delete <VOLUME_ID_OR_NAME>
# └── 仅 available 状态的卷可删除

# 扩展卷
openstack volume set --SIZE <NEW_SIZE> <VOLUME_ID_OR_NAME>
# └── 支持在线扩展(in-use 状态也可)

# 重命名/更新卷属性
openstack volume set --NAME new-name --property key=value <VOLUME_ID>

# ─── 挂载与卸载 ───

# 挂载卷到虚拟机
openstack server add volume <SERVER> <VOLUME>
# └── Nova 自动完成 iSCSI/Ceph 连接和 libvirt 配置

# 从虚拟机卸载卷
openstack server remove volume <SERVER> <VOLUME>
# └── 先卸载卷,再断开后端连接

# ─── 快照管理 ───

# 创建快照
openstack volume snapshot create --VOLUME <VOLUME> <SNAPSHOT_NAME>
# ├── --NAME 快照名称
# └── --FORCE 强制创建(in-use 状态)

# 从快照创建新卷
openstack volume create --SNAPSHOT <SNAPSHOT> --SIZE <SIZE> <VOLUME_NAME>
# └── 快照的写时复制机制,秒级创建

# ─── 备份管理 ───

# 创建备份
openstack volume backup create --VOLUME <VOLUME_ID> --NAME <BACKUP_NAME>
# └── 支持增量备份

# 从备份恢复
openstack volume backup restore <BACKUP_ID> <VOLUME_ID>
# └── 恢复到已有卷或创建新卷

四、卷类型与多后端存储 🔌

Volume Type 体系

Cinder 通过**卷类型(Volume Type)**实现存储策略的抽象,用户创建卷时选择类型,Cinder 自动路由到对应后端。

1
2
3
4
5
6
7
8
9
10
11
12
Volume Type = 名称 + 元数据(key-value)

内置元数据:
├── volume_backend_name → 关联存储后端(核心关联字段)
├── capabilities:SSD → 性能标签
└── capabilities:replication → 复制能力

可扩展元数据(Extra Specs):
├── qos:total_iops_sec → QoS IOPS 上限
├── qos:total_bytes_sec → QoS 带宽上限
├── compression:gzip → 压缩策略
└── replication_type:sync → 同步复制

多后端配置与管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建卷类型
openstack volume type create --property volume_backend_name=LVM lvm-type
# └── lvm-type 将自动路由到 LVM 后端

openstack volume type create --property volume_backend_name=RBD ceph-type
openstack volume type create --property volume_backend_name=FC_SAN fc-type

# 创建 QoS 规格
openstack volume qos create --consumer front-end high-iops \
--property total_iops_sec=5000

# 将 QoS 关联到卷类型
openstack volume type set --qos high-iops ceph-type

# 使用指定类型创建卷
openstack volume create --TYPE ceph-type --SIZE 100 my-db-volume

cinder.conf 多后端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[DEFAULT]
# 启用多个后端(用逗号分隔)
enabled_backends = lvm,ceph,nfs,fc

# ─── LVM 后端(开发测试) ───
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
volume_backend_name = LVM
target_protocol = iscsi
target_helper = lioadm

# ─── Ceph RBD 后端(生产推荐) ───
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 457eb76a-9e0d-4a8a-9b0d-9d3a8c9e1b2f
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
volume_backend_name = RBD

# ─── NFS 后端 ───
[nfs]
volume_driver = cinder.volume.drivers.nfs.NfsDriver
nfs_shares_config = /etc/cinder/nfs_shares
nfs_qcow2_volumes = true
nfs_mount_options = rw,sync,noatime,nolock
volume_backend_name = NFS

# ─── FC SAN 后端 ───
[fc]
volume_driver = cinder.volume.drivers.fibrechan.FibreChannelDriver
volume_backend_name = FC_SAN
use_multipath_for_image_xfer = true

五、后端存储深度对比 💾

总览对比表

特性 LVM (iSCSI) Ceph RBD NFS FC SAN
访问粒度 块级 块级 文件级 块级
HA高可用 ❌ 单点 ✅ 多副本 ⚠️ 依赖服务 ✅ 多路径
横向扩展 ❌ 单机 ✅ PB级 ⚠️ 有限 ✅ 依赖SAN
数据冗余 ❌ 无 ✅ CRUSH复制 ❌ 无 ✅ SAN复制
克隆/快照 ✅ LVM快照 ✅ RBD快照 ❌ 有限 ✅ SAN快照
性能 ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐
运维复杂度 ⭐简单 ⭐⭐⭐中等 ⭐⭐ ⭐⭐⭐⭐高
成本
典型场景 开发测试 生产环境 轻量共享 企业已投建

LVM (iSCSI) — 参考实现

1
2
3
4
5
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
target_protocol = iscsi
target_helper = lioadm

准备:

1
2
pvcreate /dev/sdb /dev/sdc
vgcreate cinder-volumes /dev/sdb /dev/sdc

命令行操作:

1
2
3
4
5
6
# 查看卷组
vgs
# 查看逻辑卷
lvs
# 手动创建 LVM 卷(Cinder 自动化此操作)
lvcreate -L 100G -N volume-<UUID> cinder-volumes

⚠️ 生产警告: LVMVolumeDriver 是官方参考实现,不推荐用于生产。LVM 为单机解决方案,无高可用。服务器不可用时所有托管卷不可用。内核/iSCSI 升级会导致存储连接中断。

Ceph RBD — 生产首选

1
2
3
4
5
6
7
8
9
10
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 457eb76a-9e0d-4a8a-9b0d-9d3a8c9e1b2f
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1

Ceph 端准备:

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 创建存储池
ceph osd pool create volumes 128
ceph osd pool application enable volumes rbd

# 2. 创建 Cinder 用户并授权
ceph auth get-or-create client.cinder \
mon 'profile rbd' \
osd 'profile rbd pool=volumes, profile rbd pool=vms' \
-o /etc/ceph/ceph.client.cinder.keyring

# 3. 获取 secret UUID(用于 Nova 配置)
ceph auth get-key client.cinder

核心优势:

  • 弹性扩展: 支持 PB 级存储池,单集群承载数千虚拟机
  • 数据冗余: CRUSH 算法跨节点复制(默认 3 副本)
  • 写时复制: RBD 克隆秒级创建新卷
  • 零额外路径: Nova 通过 librbd 直接读写 Ceph 集群

NFS — 共享场景

1
2
3
4
5
6
7
[nfs]
volume_driver = cinder.volume.drivers.nfs.NfsDriver
nfs_shares_config = /etc/cinder/nfs_shares
nfs_qcow2_volumes = true
nfs_mount_options = rw,sync,noatime,nolock
nfs_snapshot_support = true
nas_secure_file_operations = false

NFS 共享文件 (/etc/cinder/nfs_shares):

1
2
192.168.1.100:/export/cinder
192.168.1.101:/export/cinder

注意: 必须使用 NFS v4 及以上版本,不要使用 NFS v3。需注意 SELinux 上下文配置。

iSCSI (外部 SAN) — 企业集成

1
2
3
4
5
6
7
8
9
10
[iscsi]
volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver
# 或对应厂商驱动(NetApp/Dell EMC/HPE 等)
volume_backend_name = ISCSI_BACKEND
target_protocol = iscsi
target_helper = lioadm
san_ip = 192.168.1.100
san_login = admin
san_password = password
use_multipath_for_image_xfer = true

多路径配置(生产必需):

1
2
3
4
5
6
7
8
9
10
11
# 安装 multipath-tools
apt-get install multipath-tools

# 配置 multipath.conf
echo 'defaults {
user_friendly_names yes
find_multipaths yes
}' > /etc/multipath.conf

systemctl enable multipathd
systemctl start multipathd

六、快照与克隆 📸

快照机制

Cinder 快照基于**写时复制(Copy-on-Write)**技术,创建时间恒定在秒级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
快照创建前:
┌─────────────────────────────────┐
│ 原始卷 (Volume) │
│ ┌───┬───┬───┬───┬───┬───┬───┐ │
│ │ A │ B │ C │ D │ E │ F │ G │ │
│ └───┴───┴───┴───┴───┴───┴───┘ │
└─────────────────────────────────┘

快照创建后(COW):
┌─────────────────────────────────┐
│ 原始卷: 新写入 → 新分配块 │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ 快照: 冻结在某个时间点的数据状态 │
│ ┌───┬───┬───┬───┬───┬───┬───┐ │
│ │ A │ B │ C │ D │ E │ F │ G │ │ ← 原始数据不变
│ └───┴───┴───┴───┴───┴───┴───┘ │
└─────────────────────────────────┘

快照操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建快照
openstack volume snapshot create --VOLUME my-volume my-snap
# └── 秒级完成,不中断 I/O

# 强制快照(in-use 状态)
openstack volume snapshot create --VOLUME my-volume --FORCE my-snap
# ⚠️ --FORCE 可能产生不一致快照
# 建议配合应用层面的一致性检查

# 列出快照
openstack volume snapshot list

# 查看快照详情
openstack volume snapshot show <SNAPSHOT_ID>

# 从快照创建新卷
openstack volume create --SNAPSHOT my-snap --SIZE 100 restored-volume
# └── RBD 后端利用 COW,不拷贝数据

# 删除快照
openstack volume snapshot delete <SNAPSHOT_ID>

一致性组 (Consistency Group)

保证多个卷的原子性快照,适用于数据库等跨多卷的一致性敏感场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建一致性组
openstack volume group create --NAME db-consistency-group \
--VOLUME-TYPE ceph-type

# 添加卷到组
openstack volume group add volume <GROUP_ID> <VOLUME1> <VOLUME2>

# 创建一致性组快照(原子操作)
openstack volume group snapshot create --GROUP <GROUP_ID> cg-snap
# └── 所有卷在同一个时间点被快照

# 从一致性组快照批量恢复
openstack volume group create --NAME restored-group \
--GROUP-SNAPSHOT <CG_SNAPSHOT_ID>

Ceph RBD 克隆深度

1
2
3
4
5
6
7
8
9
10
11
Template Volume (golden image)

├── Snapshot (base snap)
│ │
│ ├── Clone VM-1 (COW from snapshot)
│ ├── Clone VM-2 (COW from snapshot)
│ └── Clone VM-3 (COW from snapshot)
│ │
│ └── Snapshot of VM-3 → Clone VM-3-1 (嵌套克隆)

└── rbd_max_clone_depth = 5(默认最大嵌套深度)

配置控制:

1
2
3
4
5
6
rbd_flatten_volume_from_snapshot = false
# false: COW 模式,创建快照体积小但性能略降
# true: 创建时 flatten(解除依赖),性能恢复但占用全量空间

rbd_max_clone_depth = 5
# 限制克隆嵌套深度,避免过长的 COW 链降低性能

七、备份与恢复 💾

快照 vs 备份

特性 快照 (Snapshot) 备份 (Backup)
存储位置 与卷在同一后端 独立的备份后端
依赖关系 依赖原始卷 独立存在
恢复能力 可恢复,需原始卷 可恢复,独立
跨站点 ❌ 不能 ✅ 支持
增量 ✅ COW ✅ 增量备份
删除原始卷 快照失效 备份依然有效

备份操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建备份(默认增量)
openstack volume backup create --NAME db-backup --VOLUME my-volume
# ├── --INCREMENTAL 增量备份(仅传变更数据)
# └── --FORCE 强制备份(in-use 状态)

# 列出备份
openstack volume backup list

# 查看备份详情
openstack volume backup show <BACKUP_ID>

# 从备份恢复到已有卷
openstack volume backup restore <BACKUP_ID> <VOLUME_ID>

# 删除备份
openstack volume backup delete <BACKUP_ID>

# 导出备份信息(用于跨区域迁移)
openstack volume backup record export <BACKUP_ID>

增量备份策略

1
2
3
4
5
6
7
8
9
备份策略示例(每周循环):

周一 22:00: 全量备份 (full) → 10GB
周二 22:00: 增量备份 (incr-1) → 200MB(仅当日变更)
周三 22:00: 增量备份 (incr-2) → 150MB
周四 22:00: 增量备份 (incr-3) → 300MB
周五 22:00: 增量备份 (incr-4) → 100MB
─────────────────────────────────────
总占用: ~10.75GB (vs 全量×4=40GB)

恢复时 Cinder 自动按时间线回放增量链。


八、Cinder 与 Nova 的深度协作 🔗

启动卷(Boot from Volume)

Nova 支持从 Cinder 卷直接启动虚拟机,实现计算与状态完全分离

1
2
3
4
5
6
7
8
9
10
# 从镜像创建可启动卷
openstack volume create --IMAGE ubuntu-22.04 --SIZE 50 --BOOTABLE boot-volume

# 从可启动卷创建虚拟机
openstack server create --VOLUME boot-volume --FLAVOR m1.medium my-server
# └── VM 状态完全保存在 Cinder 卷中

# 一步到位:从镜像创建 VM + 自动创建可启动卷
openstack server create --IMAGE ubuntu-22.04 --FLAVOR m1.medium \
--BOOT-FROM-VOLUME 50 my-server

启动卷优势:

  • 计算节点故障时,卷可立即挂载到其他 VM
  • 支持实时迁移(Live Migration)无需共享存储
  • VM 删除后数据保留

临时盘 vs 持久卷

特性 临时盘 (Ephemeral) Cinder 持久卷
生命周期 跟随虚拟机 独立于虚拟机
数据持久性 VM 删除即销毁 持久保存
性能 计算节点本地盘,延迟最低 网络存储,有网络延迟
迁移 不支持实时迁移 支持
备份 需镜像备份 快照+备份
适用场景 无状态应用、缓存 数据库、有状态应用

卷迁移

1
2
3
4
5
6
7
8
9
10
11
# 在线迁移卷(不同后端之间)
openstack volume migrate --HOST <TARGET_HOST@BACKEND> <VOLUME_ID>
# └── 在 cinder-volume 之间迁移数据

# Nova 冷迁移(迁移到不同计算节点)
openstack server migrate <SERVER_ID>
# └── 卷作为独立资源自动跟随,无需重新挂载

# Nova 实时迁移
openstack server live-migration <SERVER_ID>
# └── 需使用共享存储或 Ceph RBD

九、加密卷 🔒

Cinder 加密支持

Cinder 支持卷级别的数据加密,确保静态数据安全:

1
2
3
4
5
6
7
8
9
# 创建加密卷类型
openstack volume type create encrypted-type \
--encryption-provider luks \
--encryption-cipher aes-xts-plain64 \
--encryption-key-size 256 \
--encryption-control-location front-end

# 使用加密类型创建卷(数据自动加密)
openstack volume create --TYPE encrypted-type --SIZE 100 secure-volume

加密方式对比:

方式 说明 管理方
前端加密 Nova 计算节点进行加密/解密 密钥通过 Barbican 管理
后端加密 存储后端原生加密(如 Ceph OSD 加密) 存储运维方
LUKS Linux Unified Key Setup,磁盘级加密 Cinder + Barbican

十、QoS 质量保障 ⚡

QoS 规格管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建 QoS 规格
openstack volume qos create --consumer front-end high-iops \
--property total_iops_sec=5000 \
--property total_bytes_sec=104857600

# 参数说明:
# ├── total_iops_sec → IOPS 上限(每秒 I/O 次数)
# ├── read_iops_sec → 读 IOPS 上限
# ├── write_iops_sec → 写 IOPS 上限
# ├── total_bytes_sec → 带宽上限(字节/秒)
# ├── read_bytes_sec → 读带宽上限
# └── write_bytes_sec → 写带宽上限

# consumer 类型:
# ├── front-end → Nova/libvirt 层限速(推荐)
# ├── back-end → 存储后端驱动限速
# └── both → 两端同时限速

# 关联 QoS 到卷类型
openstack volume type set --qos high-iops premium-storage

# 查看 QoS
openstack volume qos show high-iops

# 解除关联
openstack volume type unset --qos premium-storage

十一、生产部署最佳实践 ✅

实践 说明
生产用 Ceph RBD 高可用、分布式、COW 克隆秒级创建,避免单点故障
控制与存储分离 cinder-api/scheduler 部署在控制节点,cinder-volume 部署在存储节点
多后端策略 高频盘用全闪存 Ceph,归档盘用 HDD/NFS,按 Volume Type 隔离
专用存储网络 分离管理网与存储网(iSCSI 专用 VLAN / Ceph 公共网络)
启用多路径 iSCSI/FC 后端必须配置 multipathd,防止单路径故障
使用一致性组 数据库等跨多卷应用保证快照原子性
定期快照策略 依据 RPO 设定快照频率(如每小时),配合 cinder-backup 长期归档
QoS 隔离租户 关键业务设定高 IOPS QoS,防止 “噪声邻居” 问题
卷配额管理 按项目设置配额(卷数量 + 总容量 + 快照数量)
定期 cleanup 清理 orphan 卷、过期快照、未使用备份

配额管理

1
2
3
4
5
6
7
8
9
10
11
12
# 查看项目配额
openstack quota show <PROJECT_ID>

# 设置项目配额(管理员)
openstack quota set --volumes 100 --gigabytes 1000 --snapshots 50 <PROJECT_ID>
# ├── --VOLUMES 最大卷数量
# ├── --GIGABYTES 最大总容量(GB)
# ├── --SNAPSHOTS 最大快照数量
# └── --BACKUPS 最大备份数量

# 查看 Cinder 后端当前的容量使用
cinder get-pools --detail

十二、版本演进趋势 🚀

版本 核心变化
Grizzly Cinder 从 Nova-volume 独立为独立项目
Havana 引入 cinder-backup,支持多种备份后端
Juno 引入一致性组(Consistency Group)
Kilo 支持卷加密(LUKS + Barbican)
Liberty QoS Specs 标准化,replication v2 API
Newton Ceph RBD 驱动大幅优化,NFS 驱动增强
Ocata 引入 image-volume 缓存,提升从镜像创建卷性能
Pike 引入卷迁移 API,多后端调度优化
Queens 加密卷增强,备份增量支持
Stein 卷类型 extra specs 增强,支持 provider_id
Train 支持 DP 设备,iSCSI 多路径增强
Wallaby 一致性组重构,备份性能优化
Xena 弃用 Legacy RBD driver,统一为 RBDDriver
Yoga NVMe/TCP 驱动引入
2024.2 Dalmatian 存储策略引擎增强,QoS 细粒度控制
2025.1 Epoxy Ceph Quincy 兼容,NFS v4 支持增强
2026.1 Gazpacho 持续优化 NVMe-oF 与 RDMA 集成,AI 存储场景增强

💡 技术解析

  • 术语: Filter Scheduler — Cinder 的调度算法,分为两阶段:Filter(过滤阶段)排除不满足条件的后端,Weighter(权重阶段)对剩余后端打分排序。通过可插拔的 Filter/Weighter 链实现灵活调度策略,如 CapacityFilter 排除容量不足节点、CapabilitiesFilter 匹配卷类型特性、AvailabilityZoneFilter 确保可用域亲和性。

  • 术语: Volume Type — Cinder 的存储策略抽象机制,通过 Extra Specs(键值对元数据)关联 QoS 策略、后端名称、复制策略等。用户创建卷时指定类型,Cinder 自动调度到对应的存储后端。核心关联字段为 volume_backend_name

  • 术语: Copy-on-Write (COW) — 写时复制技术,Cinder 快照和 RBD 克隆的基础。创建快照时不拷贝数据,仅当原始卷有数据写入时,才将旧数据复制到快照预留区域。秒级创建快照,显著节省存储空间。

  • 术语: RBD Clone — Ceph RBD 的快照克隆技术,基于 COW 从快照直接创生新卷。支持嵌套克隆,受 rbd_max_clone_depth 限制(默认5层)。可选项 rbd_flatten_volume_from_snapshot=true 解除 COW 依赖以恢复全性能。

  • 术语: Consistency Group(一致性组) — 将多个卷组织为一个逻辑组,保证组内所有卷快照的原子性。解决数据库等多卷应用的时间点一致性问题,确保恢复时所有卷处于同一个一致的业务状态。

  • 术语: Multipath I/O — 多路径 I/O 技术,通过多条物理路径访问同一存储设备,提供路径冗余和负载均衡。在 Cinder 中通过 device-mapper-multipath 实现,生产环境 iSCSI/FC 后端的必选项。

  • 术语: Cinder Driver — Cinder 的存储后端插件化驱动接口,核心抽象包括 create_volume()delete_volume()extend_volume()create_snapshot()create_volume_from_snapshot() 等方法。OpenStack 社区维护 30+ 种驱动,商业存储厂商提供各自的认证驱动。

  • 术语: Boot from Volume — Nova 从 Cinder 卷启动虚拟机的模式,根磁盘位于 Cinder 卷而非计算节点的临时盘上。实现计算与状态完全分离,支持在线迁移、卷快照备份、故障恢复。

  • 命令: openstack volume create — 创建 Cinder 卷,--SIZE 指定容量(GB),--TYPE 指定卷类型关联后端,--IMAGE 从镜像创建可启动卷,--SNAPSHOT 从快照创建,--BOOTABLE 标记为可启动,--AVAILABILITY-ZONE 指定可用域,--PROPERTY 添加自定义元数据。

  • 命令: openstack server add volume — 将 Cinder 卷挂载到 Nova 虚拟机,内部流程涉及 Nova 调用 Cinder os-attach API → Cinder 返回连接信息 → Nova 执行 iSCSI 登录/RBD map/NFS mount → libvirt 定义 disk 设备。挂载后卷以 /dev/vdX 出现在虚拟机内部。

  • 命令: openstack volume snapshot create — 创建卷快照,--VOLUME 指定源卷,--FORCE 允许 in-use 状态强制快照(谨慎使用,可能数据不一致)。快照基于 COW 技术秒级完成。

  • 命令: openstack volume qos create — 创建 QoS 规格,--CONSUMER 指定限速层级(front-end Nova 层/back-end 存储层/both),--PROPERTY 设置 total_iops_sectotal_bytes_secread_iops_secwrite_iops_sec 等限速参数。通过 Volume Type 关联到具体卷。

OpenStack Glance镜像服务详解

Glance是OpenStack的镜像服务核心组件,提供虚拟机镜像的发现、注册、检索和交付能力。采用元数据与数据分离的架构设计,通过可插拔的 glance_store 适配层实现后端存储的灵活切换。📸


一、Glance核心架构概览

组件全景图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                  ┌──────────┐
│ Keystone │
└────┬─────┘
│ AUTH
┌────▼─────┐
USER ──REST API──► GLANCE-API│
└────┬─────┘

┌─────────▼──────────┐
│ GLANCE.STORE │ ◄── 存储抽象层
├────────────────────┤
│ 元数据 → SQL DB │ ◄── MySQL(镜像元信息)
│ 镜像数据 → 后端 │ ◄── 可插拔后端存储
└────────────────────┘

┌────────────────┼────────────────┐
▼ ▼ ▼
FILE存储 SWIFT CEPH RBD
(本地磁盘) (对象存储) (分布式存储)

核心组件一览表

组件 职责 说明
glance-api RESTful API入口 处理镜像查询/上传/删除等所有请求,对接Keystone认证
glance-registry 元数据存储服务 Newton版本后为可选组件,旧版负责镜像元数据读写
glance.db 元数据库(MySQL) 存储镜像ID、名称、格式、checksum、location等元信息
glance.store 存储后端适配层 核心抽象层,实现镜像数据与后端存储的解耦

架构设计哲学 — 元数据与数据分离

1
2
3
4
5
6
7
8
9
10
11
12
13
镜像 = 镜像元数据 (Metadata) + 镜像数据 (Data)

元数据 → 存储在 glance.db (MySQL)
├── id, name, disk_format, container_format
├── size, status, visibility
├── checksum (MD5), os_hash_value (SHA512)
├── properties (自定义属性)
└── locations (指向后端存储的 URI)

镜像数据 → 存储在后端存储中
├── file:///var/lib/glance/images/<UUID>
├── swift://account/container/<UUID>
└── rbd://pool/image/<UUID>

关键设计理念: Nova 启动虚拟机时根据 location 直接从后端存储读取数据,不经 glance-api 中转,避免额外网络跳转和数据拷贝。🚀


二、镜像格式详解 🗂️

Glance 支持多种镜像格式,覆盖主流虚拟化平台:

格式 扩展名 特性 适用场景
QCOW2 .qcow2 QEMU原生格式,稀疏文件(按需分配)、快照链、写时复制 最常用,KVM/QEMU 虚拟化首选
RAW .raw 无格式裸磁盘镜像,性能最优 高性能计算、数据库等I/O密集型场景
VMDK .vmdk VMware虚拟磁盘格式 VMware 虚拟机迁移到 OpenStack
VHD/VHDX .vhd Microsoft Hyper-V 格式 与 Hyper-V 平台互操作
ISO .iso 光盘归档格式 安装介质注入(如 cloud-init)
AKI/ARI/AMI - Amazon kernel/ramdisk/image AWS 镜像兼容
Ploop - Virtuozzo/Parallels 格式 容器化虚拟化场景
Docker - Docker 容器格式 (已逐步淘汰)

QCOW2 vs RAW 深度对比 ⚡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
QCOW2:
├── 创建时仅占用实际使用的空间(稀疏文件)
├── 支持快照链(snapshot chain)
├── 支持写时复制(copy-on-write, COW)
├── 支持 AES 加密(不推荐生产使用)
├── 支持压缩(qemu-img convert -c)
└── 有小幅性能开销(约 5-10%)

RAW:
├── 创建时即分配全部空间
├── 无格式转换开销,I/O 性能最高
├── QEMU/KVM 直通效率最高
├── 可通过 qemu-img 转换为任意格式
└── 占用磁盘空间较大

经验建议: 日常虚拟机用 QCOW2(节省空间、支持快照),高性能数据库类用 RAW,VMware 对接用 VMDK。✅


三、镜像上传与下载 📥📤

上传镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 上传 QCOW2 格式镜像(最常用)
openstack image create "cirros-0.6.2" \
--file cirros-0.6.2-x86_64-disk.img \
--disk-format qcow2 \
--container-format bare \
--public

# 通过 URL 导入(需配置 glance-api 允许外部源)
openstack image create "ubuntu-22.04" \
--location https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img \
--disk-format qcow2 \
--container-format bare \
--public

# 上传 RAW 格式
openstack image create "centos-stream-raw" \
--file CentOS-Stream-8-x86_64.raw \
--disk-format raw \
--container-format bare

# 上传 ISO 格式(用于安装引导)
openstack image create "windows-server-iso" \
--file windows-server-2022.iso \
--disk-format iso \
--container-format bare

create 参数详解:

参数 说明 可选值
--DISK-FORMAT 磁盘格式 qcow2 / raw / vmdk / vhd / iso
--CONTAINER-FORMAT 容器封装格式 bare / ovf / aki / ari / ami / docker
--PUBLIC 公开可见 所有项目可访问
--PRIVATE 私有镜像 仅本项目和被共享项目可见
--PROTECTED 保护模式 禁止删除(需取消保护后方可删除)
--PROPERTY 自定义属性 --property architecture=x86_64
--STORE 指定存储后端 多后端环境下指定目标后端(Stein+)
--MIN-DISK 最小磁盘要求 启动该镜像所需的最小磁盘 GB
--MIN-RAM 最小内存要求 启动该镜像所需的最小内存 MB
--SIGNATURE 签名文件 镜像完整性签名
--TAG Glance元数据标签 与元定义配合实现镜像分类

下载镜像

1
2
3
4
5
6
7
8
9
10
11
12
# 列出当前可用镜像
openstack image list
# └─ 列出所有可见镜像(可加 --PUBLIC / --PRIVATE 筛选)

# 查看镜像详细信息
openstack image show <IMAGE_ID_OR_NAME>
# └─ 显示镜像 ID、状态、disk_format、checksum 等完整信息

# 下载镜像到本地
openstack image save --file myimage.qcow2 <IMAGE_ID>
# ├─ --file 指定本地保存路径
# └─ 注意大镜像需要足够磁盘空间

镜像格式转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# qemu-img 格式转换(在本地操作,非 OpenStack 命令)
qemu-img convert -f qcow2 -O raw source.qcow2 target.raw
# ├─ -f 源格式(SOURCE FORMAT)
# ├─ -O 目标格式(OUTPUT FORMAT)
# └─ 支持 qcow2/raw/vmdk/vhd/qed 等

qemu-img convert -f vmdk -O qcow2 source.vmdk target.qcow2

qemu-img convert -f raw -O qcow2 -c source.raw target.qcow2
# └─ -c 压缩目标镜像(COMPRESS)

# 查看镜像信息
qemu-img info image.qcow2
# └─ 输出格式类型、虚拟大小、实际占用、快照列表

四、镜像共享 👥

4.1 项目间共享

Glance 提供细粒度的镜像共享机制,支持三种可见性级别:

级别 权限要求 行为
public admin 所有项目自动可见
private 镜像所有者 仅本项目和显式共享的项目可见
shared 镜像所有者 通过 member 机制授予特定项目访问

4.2 CLI 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 将镜像共享给指定项目
openstack image set --share --project <TARGET_PROJECT_ID> <IMAGE_ID>
# ├─ --share 开启镜像共享
# └─ --project 指定目标项目 ID

# 使用 member 管理
openstack image add project <IMAGE_ID> <TARGET_PROJECT_ID>
# └─ 将项目添加为镜像的 member

# 查看镜像的共享成员列表
openstack image member list <IMAGE_ID>
# └─ 列出所有可访问该镜像的项目及其状态

# 接受共享的镜像(目标项目操作)
openstack image set --accept <IMAGE_ID>
# └─ 项目接受共享镜像后即可使用

# 移除共享
openstack image remove project <IMAGE_ID> <TARGET_PROJECT_ID>
# └─ 撤销指定项目的镜像访问权限

# 批量查看镜像成员
openstack image member list --image <IMAGE_ID>

4.3 社区镜像共享最佳实践

  • 基础公共镜像(如 Ubuntu Cloud、Cirros)设为 public
  • 自定义业务镜像设为 private,通过 member 精确控制
  • 使用 --PROTECTED 防止关键镜像被误删 🛡️

五、后端存储架构 💾

5.1 解耦设计 — glance.store 适配层

Glance 的核心架构优势在于 镜像存储与镜像管理解耦,通过 glance.store 实现插拔式后端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌─────────────────────────────────────────────────┐
│ 用户 / Nova(REST API) │
├─────────────────────────────────────────────────┤
│ glance-api │
├─────────────────────────────────────────────────┤
│ glance.store 抽象层 │
│ ┌───────────┬───────────┬───────────┬────────┐ │
│ │ FILE │ SWIFT │ CEPH RBD │ 其它 │ │
│ │ 本地文件 │ 对象存储 │ 分布式存储 │ NFS.. │ │
│ └───────────┴───────────┴───────────┴────────┘ │
├─────────────────────────────────────────────────┤
│ glance.db (MySQL) │
│ 存储镜像元数据 + locations │
└─────────────────────────────────────────────────┘

5.2 后端存储配置

配置位于 /etc/glance/glance-api.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[glance_store]
# 默认存储后端
default_backend = file

# 启用的存储后端列表(多后端支持,Stein+)
enabled_backends = file:file, swift:swift, ceph:rbd

# ─── 本地文件存储 ───
[file]
filesystem_store_datadir = /var/lib/glance/images/
filesystem_store_file_perm = 1

# ─── Swift 对象存储 ───
[swift]
swift_store_container = glance
swift_store_create_container_on_put = True
swift_store_auth_address = http://controller:5000/v3
swift_store_user = service:glance
swift_store_key = <PASSWORD>
swift_store_endpoint_type = internalURL

# ─── Ceph RBD 存储 ───
[rbd]
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8
rados_connect_timeout = 30

5.3 各后端对比

特性 本地 File Swift Ceph RBD
高可用 ❌ 单点 ✅ 多副本 ✅ 多副本/EC
分布式
性能 ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐
扩展性 单机磁盘限制 水平扩展 水平扩展
支持克隆 ✅ (RBD clone)
运维复杂度 ⭐(简单) ⭐⭐⭐ ⭐⭐⭐
典型规模 测试/小规模 中规模 大规模生产
数据路径优化 Nova本地读取 Nova从Swift拉取 Nova RBD clone零拷贝

生产推荐: ✅ Ceph RBD > Swift > 本地文件

5.4 多后端存储(Stein+)

Stein 版本开始支持多后端存储,不同镜像可选不同后端:

1
2
3
4
5
6
7
8
9
10
11
[glance_store]
enabled_backends = fast:ssd, standard:sata, archive:nfs

[ssd]
filesystem_store_datadir = /var/lib/glance/fast_images/

[sata]
filesystem_store_datadir = /var/lib/glance/standard_images/

[nfs]
filesystem_store_datadir = /mnt/nfs/glance_images/

创建镜像时指定后端:

1
2
3
4
5
openstack image create "fast-io-image" \
--file high_perf.qcow2 \
--store ssd \
--disk-format qcow2 \
--container-format bare

5.5 Location 机制 — 解耦的关键 🔑

Glance 在数据库中记录镜像数据的 存储位置 URI,Nova 根据该 URI 直接访问:

1
2
3
4
5
6
7
1. 用户上传镜像 → glance-api 接收数据流
2. glance_store 根据配置写入后端存储
3. 数据库记录 location 和 checksum
4. Nova 启动 VM 时:
- 从 glance 获取镜像元数据(ID, location, checksum)
- 根据 location 直接从后端存储读取数据
- 不需要经过 glance-api 中转(直接访问)

核心优势: Glance 不参与数据路径 — 虚机启动时 Nova 直接从 Ceph/Swift 拉取镜像数据,这是大规模 OpenStack 部署的关键性能优化。⚡


六、Ceph RBD 与 Glance 深度集成 🔗

6.1 RBD 零拷贝克隆

使用 Ceph RBD 后端时,Nova 可以直接从 Ceph 克隆镜像生成虚拟机磁盘:

1
2
3
4
5
6
7
8
GLANCE: images pool (rbd)

├── image-a (template)

└── NOVA: rbd clone ──→ vms pool (rbd)
├── vm-1-disk (COW snapshot of image-a)
├── vm-2-disk (COW snapshot of image-a)
└── vm-3-disk (COW snapshot of image-a)

这意味着:

  • 无需实际拷贝镜像数据,创建虚机秒级完成 🚀
  • 写时复制技术,存储空间按需分配
  • 百台虚机从同一镜像启动仅占一份全量空间

6.2 Ceph 配置步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 创建 Ceph 池
ceph osd pool create images 128
ceph osd pool application enable images rbd

# 2. 创建 glance 用户并授权
ceph auth get-or-create client.glance \
mon 'allow r' \
osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' \
-o /etc/ceph/ceph.client.glance.keyring

# 3. 将密钥复制到计算节点
ceph auth get-or-create client.glance | \
tee /etc/ceph/ceph.client.glance.keyring

# 4. 配置 glance-api.conf
# 见上方 [rbd] 配置段

6.3 Ceph 场景性能优势

指标 本地文件 Swift Ceph RBD
100台VM启动时间 ~30min ~15min ~30s
镜像存量占用 100% 100% ~1%(COW)
Nova读取路径 NFS/CIFS远程挂载 HTTP拉取 RBD kernel直接读
快照支持 ✅ RBD快照

七、镜像缓存策略 📦

7.1 glance-cache 机制

Glance 提供缓存层,将常用镜像缓存到本地磁盘,加速部署:

1
2
3
4
5
6
7
8
9
10
11
12
# 缓存管理命令
glance-cache-manage --host=controller list-cached
# └─ 列出当前缓存的所有镜像

glance-cache-manage --host=controller queue-image <IMAGE_ID>
# └─ 将指定镜像加入缓存队列

glance-cache-manage --host=controller delete-cached-images
# └─ 清除所有缓存镜像

glance-cache-manage --host=controller fetch-all
# └─ 立即拉取所有已排队的缓存镜像

7.2 缓存配置

1
2
3
4
5
6
# /etc/glance/glance-cache.conf
[ DEFAULT]
image_cache_dir = /var/lib/glance/image-cache
image_cache_driver = sqlite
image_cache_max_size = 10737418240
# └─ 缓存最大容量(10GB)

八、镜像签名与安全验证 🔒

8.1 镜像签名

OpenStack Mitaka 版本开始支持镜像签名验证:

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 生成签名
openssl dgst -sha512 -sign private_key.pem \
-out image.signature image.qcow2

# 2. 上传签名镜像
openstack image create "signed-image" \
--file image.qcow2 \
--sign-key-url http://keyserver/signing-key.pem \
--sign-cert-url http://keyserver/certificate.pem \
--signature image.signature \
--disk-format qcow2 \
--container-format bare

8.2 镜像完整性校验

1
2
3
4
5
6
# 查看镜像的 checksum 和哈希值
openstack image show <IMAGE_ID> -c checksum -c os_hash_algo -c os_hash_value

# 本地校验
sha512sum downloaded-image.qcow2
# └─ 对比与 glance image show 输出的 os_hash_value 是否一致

九、镜像生命周期管理 📋

vm_image 状态机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
           ┌──────────┐
│ queued │ ── 镜像元数据已创建,数据未上传
└────┬─────┘

┌────▼─────┐
│ saving │ ── 正在上传镜像数据
└────┬─────┘

┌────▼─────┐
┌─────► active │ ── 镜像可用
│ └────┬─────┘
│ │
┌────▼───┐ ┌──▼──────┐
│ deactivated│ │pending_delete│── 软删除
└──────────┘ └─────────┘

┌────▼─────┐
│ deleted │ ── 已删除(不可恢复)
└──────────┘

常用管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 列出镜像
openstack image list
# ├─ --PUBLIC 仅显示公共镜像
# ├─ --PRIVATE 仅显示私有镜像
# └─ --STATUS ACTIVE 按状态筛选

# 编辑镜像属性
openstack image set --name NEW_NAME \
--property architecture=arm64 \
--property hypervisor_type=kvm \
<IMAGE_ID>

# 删除镜像
openstack image delete <IMAGE_ID_OR_NAME>
# └─ 若镜像被保护,需先去除 --PROTECTED

# 镜像去激活/重新激活(不删除但禁止使用)
openstack image deactivate <IMAGE_ID>
openstack image reactivate <IMAGE_ID>

# 查看镜像使用情况(哪些虚拟机在使用)
openstack server list --image <IMAGE_ID>

十、生产部署最佳实践 ✅

实践 说明
生产用 Ceph RBD 避免本地文件存储的单点故障,利用 COW 提升性能
上传前校验格式 qemu-img info 确认格式正确,避免启动失败
使用 SHA512 校验 镜像完整性验证,防止数据损坏
设置 protected 防止关键镜像被误删 🛡️
细粒度共享 敏感镜像设为 private + member 精确赋权
镜像签名 对关键镜像启用签名验证
清理未使用镜像 定期清理废弃镜像,释放存储空间
监控 glance 日志 /var/log/glance/api.log 关注上传/下载错误
多后端策略 高频镜像放 SSD,归档镜像放 HDD/NFS
启用镜像缓存 多计算节点场景显著加速部署

十一、版本演进趋势 🚀

版本 核心变化
Newton 引入 glance_store 架构,registry 变为可选
Ocata 新增镜像去激活功能(deactivate/reactivate)
Pike 支持多后端存储
Queens 镜像导入/导出流程标准化
Stein 多后端正式稳定,image import API 成熟
Train 镜像签名验证增强
Wallaby 支持镜像加密(使用 Barbican)
2025.1 Epoxy 强化镜像加密与签名校验
2026.1 Gazpacho 持续优化 Ceph 集成与性能提升

💡 技术解析

  • 术语: glance_store — Glance 的存储抽象层,独立的 oslo 库(glance_store),所有后端存储通过该插件化接口接入。这是实现镜像与后端存储解耦的关键架构组件。所有后端实现只需实现核心 CRUD 接口即可无缝集成。
  • 术语: QCOW2 — QEMU Copy-On-Write v2,支持稀疏文件(仅分配实际写入的块)、内部快照链(snapshot chain)、写时复制克隆(backing file)、AES 加密和 zlib 压缩。相较于 QCOW(v1),QCOW2 支持快照和更大的虚拟磁盘。
  • 术语: Copy-on-Write (COW) — 写时复制技术,克隆时不复制源数据,仅写入新数据时才按需分配空间。Glance + Ceph 场景的核心性能保障,秒级创建百台虚机。
  • 术语: RBD Clone — Ceph RBD 的快照克隆机制,基于 COW 技术从镜像快照直接创生虚拟机磁盘,无需拷贝源数据,是 Nova 与 Glance 协同优化的核心亮点。
  • 术语: Location (存储位置) — glance.db 中记录镜像数据实际存储位置的 URI 字段(如 rbd://pool/image/uuid),Nova 根据该 URI 直接从后端读取镜像数据,实现 Glance 不参与数据路径。
  • 术语: Container Format — 镜像的容器封装格式,bare 表示无封装(裸镜像),ovf 表示 OVF 标准封装;aki/ari/ami 对应 AWS 内核/ramdisk/机器镜像。
  • 术语: Multibackend (多后端) — Stein+ 版本功能,enabled_backends 配置多个存储后端,创建镜像时通过 --STORE 参数指定目标后端,实现不同存储策略(SSD 高性能 / SATA 大容量 / NFS 归档)。
  • 术语: Glance Cache — 将远端存储的热门镜像缓存到本地磁盘的加速机制,通过 glance-cache-manage 管理,适用于 Swift 后端的多计算节点场景。Yoga 版本后已标记废弃,推荐使用 Ceph RBD 替代。
  • 命令: openstack image create — 创建并上传镜像,--FILE 指定本地路径,--DISK-FORMAT 指定 qcow2/raw/vmdk/iso,--CONTAINER-FORMAT 指定 bare/ovf,--PUBLIC/--PRIVATE 控制可见性,--PROPERTY 添加自定义元数据。
  • 命令: openstack image save — 将远程镜像下载到本地,--FILE 指定保存路径。注意大镜像需确保本地磁盘空间充足,且下载路径不宜跨网络(建议在计算节点或 controller 节点直接操作)。
  • 命令: openstack image set --share — 跨项目共享镜像,--PROJECT 指定目标项目 ID,目标项目需 openstack image set --accept 接受后方可使用。
  • 命令: qemu-img convert — 磁盘镜像格式转换工具,-f 指定源格式,-O 指定目标格式,-c 启用压缩(仅目标为 qcow2 时有效)。支持的格式对:qcow2↔raw↔vmdk↔vhd↔qed。

OpenStack Heat(编排)详解

一、核心思想 🌟

Heat 是 OpenStack 的编排服务(Orchestration Service),核心思想是**”基础设施即代码”(Infrastructure as Code)**,通过 HOT 模板定义一组云资源,实现一键式创建、更新、删除。

概念 说明
Stack(栈) 一组被统一管理的云资源的集合,是 Heat 编排的最小部署单元
Resource(资源) 栈中的单个云资源(如虚拟机、网络、磁盘),每个资源有唯一的 type
Parameter(参数) 模板的输入变量,允许用户自定义配置而不修改模板本身

二、HOT 模板结构 📄

HOT(Heat Orchestration Template)使用 YAML 格式,包含四个核心段:

1. 模板版本

1
heat_template_version: 2015-04-30
版本 对应 OpenStack 版本 主要特性
2014-10-16 Juno 初始稳定版
2015-04-30 Kilo 常用稳定版,支持条件函数
2016-10-14 Newton 增强 if 函数
2018-08-31 Rocky 新增 yaql 支持
2021-04-16 Wallaby if 两参数变体

2. 参数定义

1
2
3
4
5
6
7
8
9
10
11
12
parameters:
key_name:
type: string
label: Key Name
description: SSH 密钥对名称
default: my_key
hidden: false
constraints:
- allowed_values: [m1.small, m1.medium, m1.large]
description: 规格必须为可选值之一
- length: { min: 6, max: 8 }
description: 密码长度 6-8

参数类型stringnumberjsoncomma_delimited_listboolean

常用修饰符

  • default — 设置默认值
  • hidden: true — 隐藏输入(如密码)
  • immutable: true — 创建后不可修改
  • constraints — 约束条件

3. 资源定义 🧱

1
2
3
4
5
6
7
8
9
resources:
my_instance:
type: OS::Nova::Server
properties:
name: MyServer
image: { get_param: image_id }
flavor: { get_param: flavor }
key_name: { get_param: key_name }
depends_on: [my_volume]

常用资源类型速查

资源类型 OpenStack 服务 说明
OS::Nova::Server Nova 计算实例
OS::Neutron::Net Neutron 网络
OS::Neutron::Subnet Neutron 子网
OS::Neutron::Port Neutron 端口
OS::Neutron::Router Neutron 路由器
OS::Cinder::Volume Cinder 云硬盘
OS::Cinder::VolumeAttachment Cinder 磁盘挂载
OS::Heat::AutoScalingGroup Heat 自动伸缩组
OS::Heat::RandomString Heat 随机字符串
OS::Keystone::User Keystone 用户
OS::Swift::Container Swift 对象存储容器

4. 输出定义

1
2
3
4
5
6
7
outputs:
instance_ip:
description: 实例 IP 地址
value: { get_attr: [my_instance, first_address] }
instance_id:
description: 实例 UUID
value: { get_resource: my_instance }

三、内置函数 🔧

函数 用途 类比 CloudFormation
get_param 获取参数值 Ref
get_attr 获取资源属性 Fn::GetAtt
get_resource 获取资源引用 Ref(资源本身)
get_file 嵌入外部文件
str_replace 字符串模板替换 Fn::Sub
str_split 字符串分割 Fn::Split
digest 哈希计算
repeat 循环生成值
list_join 列表拼接 Fn::Join
yaql YAML 查询语言(v2018+)

条件函数示例

1
2
3
4
5
6
7
8
conditions:
create_volume: { equals: [{ get_param: volume_size }, "0"] }
large_flavor: { not: { equals: [{ get_param: flavor }, "m1.small"] } }

resources:
my_instance:
type: OS::Nova::Server
condition: large_flavor

四、AWS CloudFormation 兼容性 🔄

Heat 在设计上明确兼容 AWS CloudFormation 模板格式:

对比项 HOT(Heat 原生) CFN(CloudFormation 兼容)
格式 YAML(.yaml) JSON(.json)
资源类型前缀 OS::* AWS::*
函数风格 get_param, get_attr Ref, Fn::GetAtt
API 端点 heat-api heat-api-cfn
  • 通过 heat-api-cfn 组件提供 CloudFormation 兼容 API
  • 已有的 AWS CloudFormation 模板可直接提交给 Heat 执行
  • 支持资源类型映射:AWS::EC2::InstanceOS::Nova::Server

五、Stack 操作生命周期 🔄

1
2
3
4
5
6
7
创建(Create)→ 创建中 → 创建完成

更新(Update)→ 更新中 → 更新完成

回滚(Rollback)→ 回滚中 → 回滚完成

删除(Delete)→ 删除中 → 删除完成

常用 CLI 命令 🖥️

1
2
3
4
5
6
7
openstack stack create -t TEMPLATE.YAML -e ENV.YAML MY_STACK
openstack stack list
openstack stack resource list MY_STACK
openstack stack resource show MY_STACK MY_INSTANCE
openstack stack update -t TEMPLATE.YAML --parameter "FLAVOR=M1.MEDIUM" MY_STACK
openstack stack event list MY_STACK
openstack stack delete MY_STACK

参数覆盖创建

1
2
3
openstack stack create -t TEMPLATE.YAML \
--parameter "KEY_NAME=MY_KEY;IMAGE=CIRROS;FLAVOR=M1.SMALL" \
MY_STACK

六、环境文件(Environment File)📁

环境文件用于分离配置与模板:

1
2
3
4
5
6
7
8
resource_registry:
"OS::Nova::Server::MyServer": myserver.yaml

parameter_defaults:
NetworkName: my_network

parameters:
MyIP: 192.168.0.1

⚠️ parameter_defaults 应用到所有嵌套栈,parameters 仅应用到顶级栈

七、模板组合(Template Composition)🧩

将大型模板拆分为可复用的子模板:

1
2
3
4
5
resources:
my_server:
type: my_nova.yaml
properties:
key_name: { get_param: key_name }

嵌套栈属性访问

1
2
3
outputs:
test_out:
value: { get_attr: [my_server, resource.server, first_address] }

八、完整编排流程图 🎯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
用户输入 HOT 模板(YAML)


Heat API(heat-api / heat-api-cfn)


Heat Engine(引擎核心)

├── 解析模板(参数绑定、条件判断)
├── 依赖排序(depends_on / 隐式依赖)
├── 逐个调用 OpenStack 服务 API
│ ├── Nova → 创建虚拟机
│ ├── Neutron → 创建网络/子网
│ ├── Cinder → 创建云硬盘
│ └── ...
├── 监控资源创建状态
└── 返回结果(资源 ID、属性等)

九、完整模板示例 📝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
heat_template_version: 2015-04-30

description: 完整的 Heat 编排模板示例

parameters:
key_name:
type: string
label: Key Name
description: 密钥对名称
default: my_key
image:
type: string
description: 镜像名称或 ID
default: cirros
flavor:
type: string
description: 实例规格
default: m1.small
constraints:
- allowed_values: [m1.small, m1.medium, m1.large]

resources:
my_instance:
type: OS::Nova::Server
properties:
name: My Cirros Instance
image: { get_param: image }
flavor: { get_param: flavor }
key_name: { get_param: key_name }

my_volume:
type: OS::Cinder::Volume
properties:
size: 1
name: my_volume

volume_attachment:
type: OS::Cinder::VolumeAttachment
properties:
volume_id: { get_resource: my_volume }
instance_uuid: { get_resource: my_instance }
mountpoint: /dev/vdb

outputs:
instance_name:
description: 获取实例名称
value: { get_attr: [my_instance, name] }
instance_ip:
description: 获取实例 IP 地址
value: { get_attr: [my_instance, first_address] }

十、最佳实践 💡

  1. 使用环境文件分离配置与模板,避免硬编码参数
  2. 合理设置 depends_on 确保资源创建顺序
  3. 使用 parameter_defaults 统一管理嵌套栈参数
  4. 为栈开启回滚(Rollback)功能,防止失败时产生残留资源
  5. 利用 stack event list 排查创建失败原因
  6. 将大型模板拆分为可复用的子模板,提升维护性
  7. 使用 constraints 对参数进行校验,提前发现错误
  8. 生产环境建议使用 TOSCA 模板或结合 tripleo-heat-templates 进行大规模部署

OpenStack Horizon(Web控制面板)详解

Horizon是OpenStack的官方Web管理界面,基于 Python Django框架 开发,为云管理员和租户用户提供图形化的可视化管理入口。


一、Horizon架构概述

Horizon采用经典的 Django MTV架构,通过REST API与各OpenStack核心服务通信:

交互组件 说明
Nova 计算服务,管理虚拟机实例
Neutron 网络服务,管理网络与安全组
Cinder 块存储服务,管理卷与快照
Glance 镜像服务,管理虚拟机镜像
Keystone 认证服务,管理用户与项目
Swift 对象存储服务,管理文件容器

设计原则

  • Core Support:内置Project、Admin、Settings三大面板
  • Extensible:通过Dashboard+Panel注册机制支持任意扩展
  • Consistent:提供可复用的模板、表单和表格基类
  • Stable:核心API保证向后兼容

二、三大核心面板

1、Project面板(项目面板)

面向 终端租户用户 的自助服务门户:

  • 💻 实例管理:创建/启动/停止/重启/删除/快照
  • 💾 卷管理:创建/挂载/卸载/删除卷及快照
  • 🌐 网络管理:网络/子网/路由器/浮动IP/安全组
  • 🖼️ 镜像管理:上传/删除/启动镜像
  • 🔑 密钥对管理:生成/导入/删除SSH密钥
  • 📊 访问与安全:安全组规则、API访问权限

2、Admin面板(管理员面板)

面向 云平台管理员 的全局管控入口:

  • 📋 资源总览:计算/存储/网络资源的全局用量
  • 👥 项目与用户管理:创建/编辑/删除项目、用户及角色分配
  • 📏 配额管理:为各项目设置CPU/内存/存储上限
  • 🖥️ 主机聚合:管理计算节点与主机聚合(Host Aggregate)
  • 🔄 实例迁移:跨计算节点的实例调度与迁移
  • 📈 系统信息:服务状态、系统用量报告

3、Settings面板(设置面板)

面向 所有用户 的个性化配置:

  • 🌍 语言与时区设置
  • 🔐 密码修改
  • 🔔 仪表板主题切换

三、部署配置

安装方式

1
pip install openstack-dashboard

配置文件路径

1
/etc/openstack-dashboard/local_settings.py

核心配置项

配置项 说明 示例值
OPENSTACK_HOST Keystone服务地址 "192.168.1.100"
OPENSTACK_KEYSTONE_URL Keystone认证URL "http://192.168.1.100:5000/v3"
OPENSTACK_KEYSTONE_DEFAULT_ROLE 默认角色 "member"
ALLOWED_HOSTS 允许访问的主机列表 ["*"]
TIME_ZONE 时区 "Asia/Shanghai"
DEBUG 调试模式开关(生产环境需关闭) False

Web服务器部署

1
2
3
4
5
# Apache部署(mod_wsgi)
apt install apache2 libapache2-mod-wsgi-py3

# Nginx + uwsgi部署
pip install uwsgi

四、主题与品牌定制

Horizon支持完整的品牌定制,覆盖Logo、颜色、字体、页脚等视觉元素。

1、基础品牌配置(local_settings.py)

1
2
3
4
5
6
7
SITE_BRANDING = "My Cloud Platform"
SITE_BRANDING_LINK = "https://cloud.example.com"

AVAILABLE_THEMES = [
("default", "Default", "themes/default"),
("mytheme", "My Custom Theme", "themes/mytheme"),
]

2、创建自定义主题

主题目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
themes/mytheme/
├── manifest.py # 品牌声明文件
├── static/
│ └── img/
│ ├── logo.png # 导航栏Logo
│ ├── logo-splash.png # 登录页Logo
│ └── favicon.ico # 浏览器图标
├── templates/
│ └── auth/
│ └── login.html # 自定义登录页
└── scss/
├── _variables.scss # 颜色/字体变量
└── _styles.scss # 自定义样式

3、主题样式变量示例(_variables.scss)

1
2
3
4
$brand-primary: #00a1c9; // 主色调
$navbar-bg-color: #2a4e77; // 导航栏背景
$body-bg-color: #f5f5f5; // 页面背景
$font-family-base: "Microsoft YaHei", sans-serif;

4、启用主题

在配置目录下创建 _12_mytheme_theme.py

1
2
3
AVAILABLE_THEMES = [
("mytheme", "My Cloud Theme", "themes/mytheme"),
]

注意:文件名中的数字前缀控制加载顺序,多个主题文件按文件名升序加载。


五、面板扩展开发

Horizon通过 Dashboard + Panel 机制实现功能扩展。

1、目录结构

1
2
3
4
5
6
7
8
9
10
my_plugin/
├── dashboard.py # 注册新Dashboard
├── panel.py # 注册Panel
├── urls.py # URL路由
├── views.py # 视图处理
├── tables.py # 数据表格
├── forms.py # 表单定义
└── templates/
└── my_plugin/
└── index.html # 模板文件

2、注册新Panel示例

dashboard.py

1
2
3
4
5
6
7
8
9
10
11
12
from django.conf import settings
from horizon.dashboards import Dashboard, panels
from openstack_dashboard.dashboards.project import dashboard


class MyPanel(panels.Panel):
name = "我的插件"
slug = "my_panel"
permissions = ("openstack.roles.member",)


dashboard.Project.register(MyPanel)

enabled/_50_my_plugin.py

1
2
3
4
5
6
7
8
ADD_INSTALLED_APPS = [
"my_plugin",
]

ADD_PANEL = {
"panel_group": "compute",
"panel": "my_panel",
}

3、Views示例

1
2
3
4
5
6
7
8
9
10
from horizon import tables
from my_plugin import tables as my_tables


class IndexView(tables.DataTableView):
table_class = my_tables.MyTable
template_name = "my_plugin/index.html"

def get_data(self):
return self.request.user.my_data

4、启用/禁用已有面板

1
2
3
4
5
6
7
8
9
10
11
# 从Admin面板中移除卷备份面板
REMOVE_PANEL = {
"openstack_dashboard.dashboards.admin.volumes.panel_volume_backups",
}

# 修改面板显示名称
UPDATE_PANEL = {
"project.volumes": {
"name": "云硬盘",
},
}

六、常用管理命令

静态文件处理

1
2
3
4
5
# 收集静态文件
python manage.py COLLECTSTATIC

# 压缩CSS/JS(修改静态资源后需执行)
python manage.py COMPRESS

调试与排障

1
2
3
4
5
6
7
8
# 检查配置正确性
python manage.py CHECK

# 开发服务器启动(仅用于开发调试)
python manage.py RUNSERVER 0.0.0.0:8080

# 查看Horizon版本
python manage.py VERSION

七、安全最佳实践

  1. 🔒 生产环境务必关闭 DEBUG = True
  2. 🛡️ 配置 ALLOWED_HOSTS 限制可访问域名
  3. 🔐 启用HTTPS,使用SSL证书加密传输
  4. 👮 严格遵循最小权限原则分配Keystone角色
  5. ⏰ 为JWT Token设置合理过期时间
  6. 📝 定期审查安全组规则与API访问日志
  7. 🔄 保持Horizon版本与OpenStack各组件版本兼容

OpenStack Keystone详解

Keystone角色定位

Keystone是OpenStack云平台的身份认证核心组件,作为整个平台的”统一门卫”🔐。用户访问任何服务(Nova计算、Glance镜像、Cinder块存储等)都必须先通过Keystone认证。Keystone一旦宕机,所有服务都将瘫痪。


六大核心概念

概念 说明 关键约束
User 访问OpenStack的个人或服务账户 用户名在所属Domain内唯一
Project 资源(计算/存储/网络)的容器(V2时代称Tenant) 项目名在所属Domain内唯一
Role 权限集合,决定User对Project资源的操作级别 全局唯一名称
Domain 顶层虚拟容器,包含Users/Groups/Projects Domain Name全局唯一
Endpoint 服务可访问的网络地址(URL) 三类接口:Public / Internal / Admin
Token 认证通过后签发的身份凭证字符串 有时效性(默认1h),可撤销

关键解读 📌:

  • User权限通过”User + Project + Role”三元组定义,缺一不可
  • Domain提供多租户隔离边界,不同部门可划分独立Domain
  • 三类Endpoint:Public面向外部用户 / Internal服务间通信 / Admin管理员专用

认证流程详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                ┌─────────────────────────────────────────────┐
│ OpenStack 云平台 │
│ │
┌───────┐ ① POST /v3/auth/tokens ┌──────────┐ ⑥ Token ┌─────────┐
│ │ ──────────────────────────────→ │ │ ←──验证请求──→ │ │
│ │ ② ← 返回 Unscoped Token │ Keystone │ │ Nova │
│ 用户 │ │ (认证) │ ⑦ ← 返回 │ (计算) │
│ │ ③ POST /v3/auth/tokens │ │ 用户信息 │ │
│ │ ─────────── (带 Scope) ────────→ │ │ ─────────────→ │ │
│ │ └──────────┘ └─────────┘
│ │ ④ ← 返回 Scoped Token + ┌─────────┐
│ │ Service Catalog + Roles │ Glance │
│ │ │ (镜像) │
│ │ ⑤ Nova API 调用 │ │
│ │ ──────── X-Auth-Token: <SCOPED_TOKEN> ─────────────────→ │ │
└───────┘ └─────────┘

标准V3认证流程(七步)

步骤 动作 说明
用户提交凭证 POST /v3/auth/tokens — 携带 username + passwordAPI Key
返回Unscoped Token 仅证明身份,不含Service Catalog和Role,不可直接访问服务
请求Scoped Token 指定Scope(projectdomain),绑定到具体Project/Domain
返回Scoped Token 附带完整Service Catalog(所有服务地址)+ Roles(当前Project权限)
访问目标服务 Scoped Token放入HTTP头 X-Auth-Token 请求Nova/Glance等服务
服务验证Token 通过keystonemiddleware中间件向Keystone校验Token有效性
返回用户上下文 Keystone返回User ID、Project ID、Roles,服务据此执行策略鉴权

Token类型演进 🚀

类型 存储方式 验证方式 状态
UUID 持久化到数据库 每次查询数据库 ❌ 已弃用
Fernet 不持久化 本地加密验证(需Keystone在线) 生产默认
PKI / PKIZ 不持久化 本地证书签名验证 ❌ 已弃用
JWS 不持久化 非对称签名验证 ⚠️ 可选

Token作用域对比

作用域 含Service Catalog? 含Roles? 适用场景
Unscoped 仅证明身份,获取Scoped Token的前置步骤
Project-scoped 日常操作(最常用)
Domain-scoped 部分 Domain级别管理操作

Keystone内部架构

六大内部服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌─────────────────────────────────────────────────────────────┐
│ Keystone 服务架构 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Identity │ │ Resource │ │Assigment │ │ Token │ │
│ │ Service │ │ Service │ │ Service │ │ Service │ │
│ │ (用户/组) │ │ (项目/域) │ │ (角色分配)│ │ (Token) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Catalog │ │ Policy │ │
│ │ Service │ │ Service │ │
│ │(端点注册)│ │(授权引擎)│ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
内部服务 管理实体 职责
Identity Users、Groups 身份凭据验证(支持SQL / LDAP / AD / 联合认证)
Resource Projects、Domains 资源容器管理
Assignment Roles、Role Assignments 角色CRUD及User-Project-Role映射
Token Tokens Token签发、验证、撤销
Catalog Services、Endpoints 服务注册与端点发现
Policy Policies、Rules 基于规则的授权引擎

认证后端选项

后端 模式 适用场景
SQL 读写 默认,Keystone管理全部身份
LDAP / AD 只读(推荐) 对接企业已有目录服务
SAML 2.0 / OpenID Connect 联合 与外部IdP(Okta、Azure AD、ADFS)集成
Keystone-to-Keystone 联合 多OpenStack云联邦信任

CLI操作速查 🛠️

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 🔹 认证测试
openstack token issue
# └─ 请求并签发一个新的 Scoped Token,验证当前认证凭据是否有效

# 🔹 服务发现
openstack catalog list
# └─ 列出所有已注册服务的 Endpoint(Public / Internal / Admin)

# 🔹 用户管理
openstack user create --domain DEFAULT --password <PASSWORD> <USERNAME>
# ├─ --domain 指定用户所属的域(若不指定则使用 default 域)
# ├─ --password 设置用户登录密码
# └─ <USERNAME> 用户名,在所属域内唯一
openstack user list
# └─ 列出当前域下所有用户(可加 --domain 指定目标域)
openstack user show <USER_ID>
# └─ 查看指定用户的完整信息(含 ID、Domain、启用状态等)

# 🔹 项目管理
openstack project create --domain DEFAULT <PROJECT>
# ├─ --domain 指定项目所属的域
# └─ <PROJECT> 项目名称,在所属域内唯一
openstack project list
# └─ 列出所有项目及其所属域

# 🔹 角色分配(核心:User + Project + Role)
openstack role add --user <USER> --project <PROJECT> <ROLE>
# ├─ --user 指定目标用户
# ├─ --project 指定目标项目
# └─ <ROLE> 要分配的角色名(如 admin、member、reader)
openstack role assignment list --names --user <USER>
# ├─ --names 以名称而非 ID 形式显示(更易读)
# └─ --user 筛选指定用户的角色分配列表

# 🔹 域管理
openstack domain list
# └─ 列出所有域及其启用/禁用状态
openstack domain create <DOMAIN>
# └─ 创建一个新域(Domain Name 全局唯一)
openstack domain set --disable <DOMAIN>
# ├─ --disable 将域设为禁用状态(删除域的前置条件)
# └─ 域被禁用后,其下的 User 和 Project 也将无法使用
openstack domain delete <DOMAIN>
# └─ 删除指定域(必须先禁用)

# 🔹 端点管理
openstack endpoint list
# └─ 列出所有服务的 Endpoint(含服务类型、区域、URL)
openstack endpoint create --region <REGION> <SERVICE> <TYPE> <URL>
# ├─ --region 指定区域(如 RegionOne)
# ├─ <SERVICE> 服务名称(如 nova、glance)
# ├─ <TYPE> 端点类型(public / internal / admin)
# └─ <URL> 端点访问地址(如 https://controller:8774/v2.1)

生产安全配置 🔒

配置项 说明
KeystonePasswordRegex 密码强度正则表达式
KeystonePasswordExpiresDays 密码有效期天数
KeystoneLockoutFailureAttempts 锁定前允许的失败认证次数
KeystoneDisableUserAccountDaysInactive 不活跃自动禁用天数
KeystoneUniqueLastPasswordCount 防止重用旧密码
KeystoneChangePasswordUponFirstUse 首次登录强制改密

生产部署建议 ✅

  • Fernet密钥至少每月轮换一次keystone-manage fernet_rotate— 重新生成 Fernet 密钥库,旧 Token 在缓存失效前仍可用)
  • 部署多控制器节点 + 负载均衡实现Keystone高可用
  • 禁用admin_token(避免无需认证的管理入口)
  • 监控日志:/var/log/keystone/keystone.log
  • 所有服务间通信建议使用Internal Endpoint,避免暴露Public API

一句话总结

Keystone是OpenStack的统一身份验证 + 服务发现中心,核心工作流为:凭据 → Token → Service Catalog → 服务访问。用户的Token就是云平台的”通行证”,服务间信任通过Keystone的Token校验来保障。🛡️

OpenStack Neutron网络服务详解

Neutron是OpenStack的网络服务核心组件,采用插件化、驱动化、分布式架构设计,为虚拟机提供L2隔离网络、L3路由转发、NAT网关与安全组等虚拟网络功能。✨

一、网络核心模型

Neutron抽象了五种核心网络资源:

  • Network: L2隔离广播域,类似物理交换机+VLAN
  • Subnet: IPv4/IPv6地址段,定义IP池与网关
  • Port: 虚拟交换机端口,VM网卡的挂载点
  • Router: L3路由转发,连接不同子网与外部网络
  • Security Group: 有状态防火墙规则集

资源关系

1
2
3
4
5
NETWORK ──┬── SUBNET (10.0.0.0/24) ── PORT (10.0.0.2) ── VM-1

└── SUBNET (172.16.1.0/24) ── PORT (172.16.1.2) ── VM-2

ROUTER ── 连接外网PROVIDER NETWORK

关键概念对比

  • Network与Subnet: 一对多关系,一个Network可包含多个Subnet(如IPv4+IPv6)
  • Port与VM: 一对一绑定,创建VM时Neutron自动分配Port
  • Router与Network: 连接Provider Network后实现内网↔外网互通

二、Provider Network

特性: 直接映射到物理网络的L2网络段,VM直接获得物理网络IP。

  • 创建者: 仅管理员
  • 网络类型: Flat(无标签)或 VLAN(802.1Q)
  • 外部访问: L2桥接直连物理网络,无需路由
  • 性能: 原生硬件转发,无封装开销
  • VLAN上限: 4096

CLI操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建FLAT类型提供者网络
openstack network create --provider-network-type FLAT \
--provider-physical-network PROVIDER \
--EXTERNAL provider-net

# 创建VLAN类型提供者网络
openstack network create --provider-network-type VLAN \
--provider-physical-network PROVIDER \
--provider-segment 100 \
provider-vlan-100

# 创建子网
openstack subnet create --network provider-vlan-100 \
--subnet-range 192.168.100.0/24 \
--gateway 192.168.100.1 \
--allocation-pool START=192.168.100.10,END=192.168.100.200 \
provider-vlan-100-subnet

适用场景: 数据中心扁平网络、高性能计算、裸金属与虚拟化混布。


三、Self-Service Network

特性: 基于Overlay隧道技术的多租户隔离虚拟网络(VPC)。

  • 创建者: 任意租户/用户
  • 网络类型: VXLAN / GRE / Geneve(默认VXLAN)
  • 外部访问: 需虚拟Router + NAT(浮动IP)
  • 隔离上限: VXLAN支持约1600万VNI(远超VLAN的4096)
  • 性能: 有封装解封装开销(VXLAN增加50B头部)

CLI操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建自服务网络(默认为VXLAN)
openstack network create selfservice-net

# 创建子网
openstack subnet create --network selfservice-net \
--subnet-range 10.0.0.0/24 \
--gateway 10.0.0.1 \
--dns-nameserver 8.8.8.8 \
selfservice-subnet

# 创建路由器并连接外网
openstack router create demo-router
openstack router set --external-gateway provider-net demo-router
openstack router add subnet demo-router selfservice-subnet

# 分配浮动IP实现外网访问
openstack floating ip create provider-net
openstack server add floating ip <SERVER_NAME> <FLOATING_IP>

适用场景: 多租户VPC、弹性虚拟网络环境。


三、路由器 — L3转发与NAT

路由器由 neutron-l3-agent 实现,运行在网络命名空间中,每个租户路由器独立隔离。

核心功能

  • SNAT: 内网→外网出站流量自动源地址转换(VM私有IP→浮动IP)
  • DNAT: 外网→内网入站流量目的地址转换(浮动IP→VM私有IP)
  • 子网路由: 路由器自动转发同一路由器下不同子网间的流量

高级部署模式

模式 说明 优势 劣势
Legacy L3 集中式路由器在网络节点 管理简单 单点瓶颈、东西流量绕行
DVR 分布式虚拟路由 东西流量本地转发 配置复杂
L3 HA 多副本Keepalived 高可用 资源消耗翻倍

CLI操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建路由器
openstack router create demo-router

# 设置外部网关
openstack router set --external-gateway provider-net demo-router

# 添加子网接口
openstack router add subnet demo-router selfservice-subnet

# 移除子网接口
openstack router remove subnet demo-router selfservice-subnet

# 删除路由器
openstack router delete demo-router

四、安全组 — 有状态虚拟机防火墙

安全组提供Port级别的状态化L2-L4防火墙,作用于虚拟机每个虚拟网卡。

默认策略

  • 入站: 全部拒绝(必须显式允许)
  • 出站: 全部允许(可配置)
  • 状态化: 允许入站响应已建立连接的流量

后端实现

实现方式 机制 适用场景
iptables_hybrid 每个VM Port插入iptables规则链 小规模、兼容性优先
openvswitch OVS流表实现防火墙规则 大规模、高吞吐
OVN ACL OVN南向流表,Port Group管理 超大规模、分布式

CLI操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 列出安全组
openstack security group list

# 创建安全组
openstack security group create web-sg \
--description "Web服务器安全组"

# 添加规则:允许HTTP
openstack security group rule create --proto TCP \
--dst-port 80 --src-ip 0.0.0.0/0 web-sg

# 添加规则:允许SSH(指定远程安全组—微隔离)
openstack security group rule create --proto TCP \
--dst-port 22 --remote-group bastion-sg web-sg

# 为服务器绑定安全组
openstack server create --security-group web-sg \
--security-group default VM_NAME

最佳实践:

  • 最小权限原则,仅开放必要端口
  • 使用 --remote-group 实现微隔离(Microsegmentation),IP变化不影响规则
  • 安全组规则上限(quota_security_group_rule)按需调整

五、ML2插件架构

ML2(Modular Layer 2)是Neutron的核心插件框架,采用双驱动模型:

  • Type Drivers(类型驱动): 定义网络技术的物理实现方式
  • Mechanism Drivers(机制驱动): 定义网络访问的具体实现机制

Type Drivers对比

驱动 隔离方式 报文格式 VLAN支持 最大网络数 MTU开销
Flat 无标签 原始以太帧 1 0
VLAN 802.1Q 以太帧+4B Tag 4094 4B
VXLAN VXLAN封装 MAC-in-UDP ~16M 50B
GRE GRE封装 MAC-in-GRE ~4G 42B
Geneve Geneve可变封装 MAC-in-UDP+TLV 理论上无限 50B+

Mechanism Drivers对比

驱动 组件 隧道支持 DPDK 复杂度
Open vSwitch OVS Agent + ovsdb VXLAN/GRE/Geneve
Linux Bridge LB Agent + bridge-utils VXLAN
SR-IOV SR-IOV Agent ❌(硬件VF直通)
MacVTap MacVTap Agent
L2 Population 辅助驱动 优化广播 N/A 辅助

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = FLAT,VLAN,VXLAN
mechanism_drivers = openvswitch,l2population
tenant_network_types = VXLAN
extension_drivers = port_security

[ml2_type_flat]
flat_networks = provider

[ml2_type_vlan]
network_vlan_ranges = provider:100:200

[ml2_type_vxlan]
vni_ranges = 1:1000000

六、Open vSwitch 深度解析

OVS是Neutron最广泛使用的虚拟交换机,提供内核态高速转发 + 用户态灵活控制的双层架构。

三种核心OVS桥接

  • br-int(集成桥): VM虚拟机的统一接入点,连接所有VM的tap设备
  • br-tun(隧道桥): Overlay隧道(VXLAN/GRE)封装与解封装
  • br-ex(外部桥): 连接物理网络的进出口

数据流转发路径

1
2
3
4
5
同节点VM通信: VM-1 tap → br-int流表匹配 → 直接转发 → VM-2 tap

跨节点VM通信(VXLAN):
VM-1 tap → br-int → br-tun封装VXLAN → 物理网卡 → 物理网络
→ 目标节点物理网卡 → br-tun解封装 → br-int → VM-2 tap

OVS Agent配置

1
2
3
4
5
6
7
8
9
# /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
bridge_mappings = provider:br-ex
local_ip = 10.0.0.1
tunnel_types = VXLAN
l2_population = True

[securitygroup]
firewall_driver = openvswitch

七、Linux Bridge 架构

Linux Bridge是内核原生网桥方案,架构更简单:

  • 实现: 内核桥接模块,无需用户态守护进程
  • 隧道: 支持VXLAN,不支持GRE
  • 安全组: 仅支持 iptables_hybrid
  • 管理工具: brctl / ip link
  • 复杂度: 低

LB Agent配置

1
2
3
4
5
6
7
8
9
10
11
12
# /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings = provider:ETH1

[vxlan]
enable_vxlan = True
local_ip = 10.0.0.1
l2_population = True

[securitygroup]
firewall_driver = iptables_hybrid
enable_security_group = True

OVS vs Linux Bridge 选型

  • OVS: 功能丰富(OpenFlow/QoS/DPDK/GRE),适合复杂SDN场景
  • Linux Bridge: 简单稳定,适合小规模部署或对复杂度敏感的环境
  • 趋势: OVN(基于OVS的SDN控制器)正逐步取代传统OVS Agent方案

八、SDN思想与虚拟网络实现

Neutron架构深刻体现了SDN的转控分离思想:

SDN原则 Neutron实现
控制与转发分离 Neutron Server ↔ Agent RPC通信,Server下发配置不参与数据转发
逻辑集中控制 统一API + ML2插件框架,全局网络视图统一策略
网络可编程 REST API创建/修改网络资源,OpenFlow流表动态下发

虚拟网络技术栈

1
2
3
4
5
6
7
8
9
10
11
物理层: 交换机 ── 路由器 ── 网卡

隔离层: VLAN (硬件) / VXLAN (软件Overlay)

虚拟交换: Open vSwitch (流表) / Linux Bridge (MAC学习)

虚拟路由: L3 Agent (命名空间+NAT) / DVR (分布式路由)

安全策略: Security Group (iptables / OVS流表 / OVN ACL)

附加服务: DHCP (dnsmasq) / Metadata Agent / Octavia (LBaaS)

完整工作流:创建VM接入网络

1
2
3
4
用户 → NOVA-API →① NEUTRON PORT-CREATE →② 分配MAC+IP
→③ NOVA-SCHEDULER选择计算节点 →④ RPC通知OVS AGENT
→⑤ OVS-VSCTL ADD-PORT创建tap设备接入br-int
→⑥ LIBVIRT启动VM插入网卡 →⑦ VM获取IP → ACTIVE

九、版本演进趋势 🚀

版本 核心变化
2025.1 Epoxy OVN成为默认ML2驱动,传统OVS Agent进入维护模式
2025.2 Flamingo OVN安全组性能增强,Port Group批量管理优化
2026.1 Gazpacho OVN稳定版,DSD-LB功能完善,8+新特性

主要趋势:

  • OVN取代传统OVS Agent: 原生分布式路由、分布式DHCP、OVN ACL安全组
  • OVN ACL取代iptables: OVS流表实现,支持万级规则规模(传统iptables约1000条即瓶颈)
  • DVR + OVN原生分布式: 东西流量完全本地转发
  • 硬件Offload: SR-IOV + OVS-DPDK加速VM网络性能逼近裸机

💡 技术解析

  • 术语: ML2 (Modular Layer 2) — Neutron核心插件框架,Type Driver定义网络技术类型,Mechanism Driver定义实现机制,双驱动支持多种L2网络技术共存。
  • 术语: VXLAN (Virtual Extensible LAN) — MAC-in-UDP隧道封装,24bit VNI支持1600万+虚拟网络,解决VLAN 4096上限问题,增加50B头部开销。
  • 术语: Network Namespace — Linux内核级隔离机制,独立网络栈。Neutron为每个路由器和DHCP服务创建独立namespace(qrouter-xxx / qdhcp-xxx),实现租户间L3隔离。
  • 术语: DVR (Distributed Virtual Router) — 分布式虚拟路由器,将L3路由分散到每个计算节点,东西流量本地转发避免绕行网络节点。
  • 术语: L2 Population — ARP/FDB表项预填充机制,替代广播泛滥,减少VXLAN/GRE网络中的BUM流量,提升大规模部署性能。
  • 术语: SNAT/DNAT — 源地址转换(SNAT)使内网VM可访问外网;目的地址转换(DNAT)使外网流量通过浮动IP到达内网VM。
  • 命令: openstack network create — 创建虚拟网络,--PROVIDER-NETWORK-TYPE 指定FLAT/VLAN/VXLAN,--PROVIDER-PHYSICAL-NETWORK 指定物理映射,--PROVIDER-SEGMENT 指定VLAN ID。
  • 命令: openstack security group rule create — 创建安全组规则,--PROTO 指定TCP/UDP/ICMP,--DST-PORT 指定端口范围,--REMOTE-GROUP 以安全组而非IP作为规则源,实现应用级微隔离。
  • 命令: openstack router set --external-gateway — 为路由器设置外部网关,结合 openstack router add subnet 将租户子网连接到路由器,实现内网与外网互通。
  • 命令: openstack floating ip create — 从外部网络分配浮动IP,openstack server add floating ip 将浮动IP绑定到VM实例,实现外网访问内网VM。

OpenStack Nova计算服务详解

一、Nova核心架构概览

Nova是OpenStack的计算编排控制器,采用 分布式、无状态、消息驱动 的设计哲学。所有核心组件通过 消息队列(RabbitMQ) 通信,状态统一存储在 SQL数据库 中。✨

架构全景图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
                       ┌──────────┐
│ Keystone │
└────┬─────┘
│ AUTH
┌────▼─────┐
USER ──REST API──► NOVA-API │
└────┬─────┘
│ PUBLISH MSG
┌─────────▼──────────┐
│ MESSAGE QUEUE │ ◄── RABBITMQ
│ (OSLO.MESSAGING) │
└──┬───┬──────┬───┬──┘
│ │ │ │
┌────────┘ │ │ └──────────┐
▼ ▼ ▼ ▼
NOVA-SCHEDULER NOVA-CONDUCTOR NOVA-COMPUTE N
│ │ │
│ │ └──► LIBVIRT/KVM
│ │ └──► XEN
│ │ └──► VMWARE
│ │
│ └──► SQL DATABASE

└──► PLACEMENT API ──► RESOURCE INVENTORY

核心组件一览表

组件 状态类型 是否可水平扩展 职责一句话
nova-api 无状态 ✅ 是 ✅ RESTful API入口网关,对接Keystone认证
nova-scheduler 无状态 ✅ 是 ✅ 决定虚拟机跑在哪台物理机上
nova-conductor 有状态 🔶 是 ✅ 数据库安全代理层,Compute不得直连DB
nova-compute 有状态 🔶 是(每节点1个) 真实执行虚拟机操作的工作节点

二、四大核心组件深度解析 🧩

1️⃣ nova-api — 全局入口网关

职责: 接收并处理用户的RESTful API请求,是外部访问Nova的唯一途径。

1
2
3
4
5
6
7
8
9
10
┌─────────────── NOVA-API ───────────────┐
│ │
│ ① 接收 POST /SERVERS 请求 │
│ ② Keystone鉴权验证 │
│ ③ Quota配额校验 │
│ ④ DB写入初始记录(VM_STATE=BUILDING) │
│ ⑤ 发布BOOT消息 → RabbitMQ │
│ ⑥ 返回202 Accepted │
│ │
└─────────────────────────────────────────┘

关键特性:

  • 支持OpenStack原生API + Amazon EC2兼容API
  • 可通过keepalived + haproxy实现高可用负载均衡
  • 响应格式:创建类请求返回 202 Accepted(异步非阻塞)

2️⃣ nova-scheduler — 调度决策者 🎯

调度算法采用经典的两步走模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ALL COMPUTE NODES


┌──────────────────────┐
│ FILTERING 过滤阶段 │ ◄── 筛选满足条件的候选节点
│ RAMFILTER │ 内存是否充足?
│ COREFILTER │ CPU核数是否够?
│ DISKFILTER │ 磁盘空间是否够?
│ AVAILABILITYZONEFIL │ 可用区约束?
│ NUMATOPOLOGYFILTER │ NUMA拓扑匹配?
└──────────┬───────────┘


┌──────────────────────┐
│ WEIGHTING 权重阶段 │ ◄── 对候选节点排序选最优
│ RAMWEIGHER │ 内存最大优先(默认)
│ CPUWEIGHER │ CPU最充裕优先
│ DISKWEIGHER │ 磁盘最大优先
│ GROUPWEIGHER │ 亲和性/反亲和性
└──────────┬───────────┘


TARGET HYPERVISOR

常用过滤器详解:

过滤器名称 过滤逻辑 典型场景
RamFilter 计算节点可用内存 ≥ 规格要求 通用场景
CoreFilter 可用CPU核数 ≥ 规格要求 通用场景
DiskFilter 可用磁盘空间 ≥ 规格要求 通用场景
AvailabilityZoneFilter 匹配用户指定的可用区 多AZ部署
NUMATopologyFilter 检查NUMA亲和性 CPU密集型工作负载
PciPassthroughFilter 检查PCI透传设备可用性 GPU/NIC透传
ImagePropertiesFilter 镜像属性匹配(架构类型等) 异构架构
AggregateInstanceExtraSpecsFilter 主机聚合标签匹配 GPU池/SSD池

调度策略组合示例:

1
2
3
4
5
6
# 调度器配置文件 /ETC/NOVA/NOVA.CONF
[DEFAULT]
scheduler_driver = task_based
scheduler_available_filters = nova.scheduler.filters.all_filters
scheduler_default_filters = RamFilter,CoreFilter,DiskFilter,AvailabilityZoneFilter,NUMATopologyFilter
scheduler_weight_classes = nova.scheduler.weights.all_weighers

3️⃣ nova-conductor — 安全代理层 🛡️

引入背景: G版本之前,nova-compute直接操作数据库带来了巨大的安全风险和升级兼容性问题。

核心价值: 禁止nova-compute直接访问数据库,所有数据库操作必须经Conductor代理。

1
2
3
4
5
6
NOVA-COMPUTE                     NOVA-CONDUCTOR                   SQL DB
│ │ │
│── RPC CALL(请求实例信息)──────► │ │
│ │── SQL QUERY ──────────────►│
│ │◄── RETURN DATA ────────────│
│◄── RPC RESPONSE(返回实例对象)─── │ │

关键职责:

  • 数据库代理: Compute对数据库的所有读写必须走Conductor
  • 复杂流程协调: 负责创建、冷迁移、热迁移、resize、rebuild等长时间运行流程
  • 滚动升级兼容: 新旧版本Compute节点可通过Conductor通信
  • 依赖链: nova-compute必须依赖nova-conductor启动成功才能正常运行

4️⃣ nova-compute — 实际执行者 ⚙️

部署方式: 每台物理计算节点上运行一个实例,是Nova的核心”工人”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌────────────── NOVA-COMPUTE ──────────────┐
│ │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ MQ CONSUMER │ │ RESOURCE TRACKER │ │
│ │ 消费消息队列 │ │ 资源统计&上报 │ │
│ └──────┬──────┘ └──────────────────┘ │
│ │ │
│ ┌──────▼──────┐ ┌──────────────────┐ │
│ │ COMPUTEDRIVER │ │ PERIODIC TASKS │ │
│ │ 虚拟化驱动层 │ │ 周期性状态同步 │ │
│ └──────┬──────┘ └──────────────────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ HYPERVISOR │ │
│ │ KVM / XEN .. │ │
│ └─────────────┘ │
└───────────────────────────────────────────┘

三、虚拟化支持详解 🖥️

Nova通过 ComputeDriver驱动模式 屏蔽底层异构硬件的差异,所有Hypervisor对上层透明:

1
2
3
4
5
6
7
8
9
NOVA-COMPUTE

└── COMPUTEDRIVER(驱动抽象基类)
├── LibvirtDriver → KVM / QEMU(主力生产驱动)
├── XenAPIDriver → Xen XCP
├── VMwareVCDriver → VMware vSphere ESXi
├── HyperVDriver → Microsoft Hyper-V
├── IronicDriver → 裸金属(无虚拟化层)
└── LXCDriver → Linux容器

KVM — 主力生产Hypervisor 🏆

1
2
3
4
5
6
7
USER REQUEST ──► NOVA-COMPUTE ──► LIBVIRT ──► KVM KERNEL MODULE
│ └── INTEL VT-X / AMD-V

└── QEMU(DEVICE EMULATION)
├── VIRTIO-NET(网卡)
├── VIRTIO-BLK(磁盘)
└── UEFI / BIOS(固件)

性能关键配置:

1
2
3
4
5
6
7
8
# /ETC/NOVA/NOVA.CONF 虚拟化配置
[libvirt]
virt_type = kvm
cpu_mode = host-passthrough
cpu_model_extra_flags = pcid,ssbd,mds=on
images_type = qcow2
live_migration_permit_post_copy = true
live_migration_permit_auto_converge = true

技术优势:

  • 利用 Intel VT-x / AMD-V 硬件虚拟化扩展,性能接近裸机
  • 支持 NUMA 亲和性、CPU pinning、大页内存(Huge Pages)
  • 通过 libvirt 统一管理(virsh命令行或API)

QEMU — 设备模拟器 🛠️

  • 与KVM的关系: QEMU提供设备模拟+用户态接口,KVM提供硬件加速,二者常组合使用(qemu-kvm)
  • 纯模拟模式: 无KVM加速时可纯软件模拟(性能较低,常用于开发测试)
  • 2026.1 Gazpacho亮点:
    • live_migration_parallel_connections 并行热迁移
    • IOThread默认启用,磁盘I/O从vCPU线程卸载
    • UEFI固件自动选择(支持Secure Boot / AMD SEV)
    • QEMU AIO模式可配置(支持NFS/FC/iSCSI卷)

Xen — 裸机型Hypervisor 🛡️

  • 架构: Type-1(裸机型),直接运行在硬件上
  • 组成: Domain 0(管理域)+ Domain U(用户虚拟机)
  • 驱动: 通过 XenAPIDriverLibvirtDriver(Xen模式)集成
  • 特点: 安全性极高,半虚拟化性能优越,市场份额较少

其他虚拟化平台

平台 集成方式 适用场景
VMware vSphere VMwareVCDriver → vCenter API 企业VMware存量迁移
Hyper-V HyperVDriver → WMI / PowerShell Windows生态整合
Ironic(裸金属) IronicDriver → PXE + IPMI 高性能计算、DB裸机部署
LXC LXCDriver → LinuxContainers 轻量容器化场景

四、虚拟机完整生命周期 📋

创建流程详解(核心链路)

POST /servers 创建虚拟机为例,展示全链路15步交互:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
STEP 1: 用户发起请求
POST /SERVERS
└── NOVA-API 接收
├── KEYSTONE 鉴权
├── QUOTA 校验
├── DB写入: VM_STATE=BUILDING
└── BOOT消息 → RABBITMQ(RPC CAST)

STEP 2: 调度决策
NOVA-SCHEDULER 消费消息
├── PLACEMENT API 查询可用资源
├── FILTER + WEIGHT 选最优节点
└── BUILD_AND_RUN_INSTANCE → 目标节点(RPC CAST)

STEP 3: 实例化执行
NOVA-COMPUTE 接收消息
├── RPC CALL → NOVA-CONDUCTOR 获取数据
├── PLACEMENT API 资源预留
├── GLANCE 下载镜像 → 创建磁盘
├── NEUTRON 配置网络(创建PORT、分配IP)
├── CINDER 对接云硬盘(若有)
└── HYPERVISOR SPAWN() → 启动VM

STEP 4: 同步状态
NOVA-COMPUTE → DB更新
├── VM_STATE = ACTIVE
└── TASK_STATE = NONE

生命周期状态机 🔄

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                ┌──────────┐
│ BUILDING │
└────┬─────┘

┌────▼─────┐
┌──────────► ACTIVE ◄──────────┐
│ └────┬─────┘ │
│ │ │
┌────▼───┐ ┌──────▼──────┐ ┌─────▼─────┐
│ PAUSED │ │ RESIZED │ │ STOPPED │
└────┬───┘ └──────┬──────┘ └─────┬─────┘
│ │ │
│ ┌────▼─────┐ ┌─────▼─────┐
│ │ VERIFY │ │ SHELVED │
│ └──────────┘ └─────┬─────┘
│ │
│ ┌────▼─────┐
└──────────────────────────► DELETED │
└──────────┘
vm_state 含义 触发操作
BUILDING 正在构建 nova boot
ACTIVE 正常运行中 创建成功
PAUSED 已暂停(内存保留) nova pause
STOPPED 已关机(磁盘保留) nova stop
RESIZED 规格调整中 nova resize
SHELVED 已搁置(释放计算资源) nova shelve
ERROR 出错状态 操作失败
DELETED 已删除 nova delete

常用管理命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建并启动虚拟机
openstack server create --flavor FLAVOR_ID --image IMAGE_ID --network NET_ID VM_NAME

# 查看虚拟机列表
openstack server list

# 暂停/恢复
openstack server pause VM_NAME
openstack server unpause VM_NAME

# 关机/开机
openstack server stop VM_NAME
openstack server start VM_NAME

# 搁置/取消搁置(释放资源保留磁盘)
openstack server shelve VM_NAME
openstack server unshelve VM_NAME

# 删除
openstack server delete VM_NAME

# 查看控制台日志
openstack console log show VM_NAME

# 获取VNC控制台URL
openstack console url show VM_NAME

五、Placement API — 资源管理独立服务 🗂️

引入版本: Newton版本从nova-scheduler中剥离

核心功能:

1
2
3
4
5
6
PLACEMENT API

├── RESOURCE PROVIDER (资源提供者)→ 物理计算节点
├── INVENTORY (库存) → CPU/RAM/DISK总量
├── ALLOCATION (分配) → 已分配给哪些实例
└── TRAIT (特征标签) → GPU/NUMA/加密等标记
  • 统一资源管理: 不仅服务于Nova,也服务于Cyborg(加速器)、Magnum(容器)等
  • 资源类型: CPU、内存、磁盘、GPU、FPGA、NUMA节点、PCI设备
  • Trait标签: 支持自定义硬件特征标签,实现trait-based调度

六、Cells v2 — 大规模部署架构 🌐

解决痛点: 单点RabbitMQ和MySQL在高并发场景下成为瓶颈。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
       ┌────────────────────────────────┐
│ API CELL(全局控制面) │
│ NOVA-API + PLACEMENT API │
│ 全局CELL映射表 DB │
└──────┬──────────────┬───────────┘
│ │
┌─────────────▼──┐ ┌─────▼─────────────┐
│ CELL 1 DC-A │ │ CELL 2 DC-B │
│ CELL DATABASE │ │ CELL DATABASE │
│ CELL MQ │ │ CELL MQ │
│ NOVA-SCHEDULER │ │ NOVA-SCHEDULER │
│ NOVA-CONDUCTOR │ │ NOVA-CONDUCTOR │
│ NOVA-COMPUTE N │ │ NOVA-COMPUTE N │
└────────────────┘ └────────────────────┘

核心优势:

  • Cell0: 特殊Cell,记录失败或未调度实例,保护主数据库
  • 隔离性: 每个Cell独立MQ+DB,单点故障不扩散
  • 水平扩展: 新增Cell即可扩展集群规模
  • 跨数据中心: 适用于多地域部署

七、RabbitMQ通信模型详解 📨

Nova的RPC通信基于 oslo.messaging 库,支持三种交换模式:

Exchange类型 路由模式 用途
nova Topic 主体通信:指向特定组件队列
reply.<UUID> Direct 同步RPC call的结果返回
compute.fanout Fanout 广播消息(如调度器缓存刷新)

路由Key示例:

1
2
3
4
5
6
7
8
# 路由到特定计算节点
ROUTING_KEY: COMPUTE.HOSTNAME01 → HOST01的NOVA-COMPUTE队列

# 路由到调度器
ROUTING_KEY: SCHEDULER → NOVA-SCHEDULER队列

# 路由到控制器
ROUTING_KEY: CONDUCTOR → NOVA-CONDUCTOR队列

八、2025-2026 版本演进 🚀

版本 发布日期 类型 核心亮点
2025.1 Epoxy 2025.04 SLURP ✅ 支持跳跃升级,打好基础
2025.2 Flamingo 2025.10 常规 机密计算、一次性设备透传
2026.1 Gazpacho 2026.04 SLURP ✅ 9大新特性,重点对标VMware替换

2026.1 Gazpacho 亮点 🌟

高频重点功能:

1
2
3
4
5
# 并行热迁移配置
[libvirt]
live_migration_permit_post_copy = true
live_migration_permit_auto_converge = true
live_migration_parallel_connections = 3
特性 影响 技术要点
🔄 并行热迁移 大幅提升迁移速度 QEMU multifd多连接传输,需QEMU≥10.1.0
🔐 vTPM热迁移 Windows 11迁移支持 Barbican托管TPM密钥,RPC传输
IOThread默认启用 磁盘I/O性能提升 每个VM独立IOThread,RT实例CPU绑定
异步挂载卷 API响应速度提升 microversion 2.101,HTTP 202非阻塞
🧵 原生线程化 服务性能与稳定性 scheduler/api默认原生线程,eventlet逐步退役
🛑 优雅关闭 零中断升级 SIGTERM处理,二次RPC Server保障
🔧 UEFI自动选择 简化固件配置 libvirt自动选型,支持Secure Boot/AMD SEV
📜 OpenAPI全覆盖 API可观测性提升 JSON Schema覆盖所有端点
🏷️ Trait调度 精准匹配硬件特征 自定义标签匹配GPU、FPGA、加密加速器

九、架构设计哲学总结 🎯

设计原则 具体实现
无状态与水平扩展 nova-api/scheduler无状态,状态全部存储在MySQL
异步通信与最终一致性 大量使用RPC cast而非call,高吞吐量优先
驱动化架构 ComputeDriver抽象层,屏蔽底层Hypervisor差异
资源供应分离 Placement API独立管理资源,调度与资源解耦
安全代理模式 nova-conductor作为DB代理,防线前移
分片隔离 Cells v2分片部署,故障域隔离
滚动升级兼容 conductor屏蔽DB差异,支持混合版本部署

💡 技术解析

  • 术语: RPC Cast vs Call — Cast是单向异步(fire-and-forget),发送后立即返回;Call是双向同步,等待响应。Nova内部默认用Cast保证吞吐量,Compute查询数据时用Call同步等待。
  • 术语: Placement API — Newton版本从Scheduler剥离的独立资源追踪服务,统一管理CPU/内存/磁盘/GPU/NUMA的分配与释放。
  • 术语: Resource Tracker — nova-compute内部资源统计模块,周期性刷新本节点可用资源并上报Placement API。
  • 术语: Cells v2 — 大规模部署的分片架构,每个Cell独立MQ + DB,Cell0记录失败实例,API Cell负责全局路由。
  • 术语: NUMA — 非统一内存访问架构,CPU访问本地内存vs远端内存延迟不同。NUMA感知调度确保vCPU和内存分配到同一NUMA节点。
  • 术语: vTPM — 虚拟可信平台模块,为虚拟机提供硬件级安全能力。Windows 11强制要求TPM 2.0。
  • 术语: Trait-based Scheduling — 通过自定义特征标签匹配工作负载与硬件特性的调度策略,如标记计算节点是否包含GPU、FPGA、加密加速器。
  • 命令: openstack server create — 创建虚拟机实例,常用参数:--FLAVOR 指定规格,--IMAGE 指定镜像,--NETWORK 指定网络,--KEY-NAME 指定密钥对,--AVAILABILITY-ZONE 指定可用区。
  • 命令: openstack server shelve — 搁置虚拟机,释放计算资源但保留磁盘和内存快照,节省资源的同时可随时恢复。
0%