OpenStack 不是虚拟化,是云操作系统!一文吃透架构与 11大核心组件(附完整部署实战)
摘要:OpenStack 是虚拟机、裸金属和容器的云基础架构,能够控制整个数据中心的大型计算、存储和网络资源池,所有资源通过 API 或 Web 界面管理。本文从 2010 年 NASA 与 Rackspace 的合作说起,带你了解 OpenStack 的起源与版本演进,深入拆解其逻辑架构与设计理念,并用表格对比它与虚拟化、云计算的区别。随后逐一对 Horizon、Keystone、Glance、Nova、Cinder、Swift、Neutron、Heat、Ceilometer 九大核心组件进行解读,最后以"创建一台虚拟机"为例展示各服务如何协同工作,帮你真正理解 OpenStack 为什么被称为云操作系统。
一、OpenStack 到底是什么?
一句话概括:OpenStack 是虚拟机、裸金属和容器的云基础架构。
它具备以下几个核心特征:
| 特征 | 说明 |
|---|---|
| 资源池化 | 可控制整个数据中心的大型计算、存储和网络资源池 |
| 统一管理 | 所有资源都通过 API 或 Web 界面进行管理 |
| 多资源类型 | 同时支持虚拟机、裸金属服务器、容器 |
| 开放集成 | 可部署第三方服务,也可使用内置工具 |
通俗理解:如果把数据中心比作"一堆零散的硬件零件",OpenStack 就是把这些零件组装成一台"能自助取用资源的超级电脑"的管理系统。
二、起源:从 NASA 走出的开源云计算
OpenStack 的诞生和云计算的发展紧密相关,几个关键时间节点:
| 时间 | 事件 | 意义 |
|---|---|---|
| 2006 年 | 亚马逊推出 AWS | 正式开启云计算新纪元 |
| 2010 年 7 月 | NASA (美国国家航空航天局)与 Rackspace 合作,共同宣布 OpenStack 开放源码计划 | 开启属于 OpenStack 的时代 |
OpenStack 从诞生之初就对标 AWS,一直在向 AWS 学习,同时通过开放接口去兼容各种 AWS 服务。
三、OpenStack 能做什么?
OpenStack 通过一组相互关联的服务提供**基础设施即服务(IaaS)**解决方案,每个服务都提供了应用程序编程接口(API)来促进集成。
它的项目目标非常明确:
- ✅ 实施简单
- ✅ 可大规模扩展
- ✅ 功能丰富
- ✅ 标准统一的云计算管理平台
- ✅ 适用于所有类型云的开源平台
四、OpenStack 的工作原理
理解 OpenStack 的工作原理,关键在于搞清它和"脚本、虚拟化、操作系统"三者的关系:
text
OpenStack = 一系列脚本命令
↓ 捆绑成
项目(软件包)
↓ 传递
创建云环境的任务
为了创建这些云环境,OpenStack 还需要使用 2 种其他类型的软件:
| 软件类型 | 作用 |
|---|---|
| 虚拟化软件 | 创建从硬件中抽象出来的虚拟资源层(如 KVM) |
| 基础操作系统(OS) | 执行 OpenStack 脚本发出的命令 |
核心结论:OpenStack 本身不会虚拟化资源,但会使用虚拟化资源来构建云。 OpenStack、虚拟化、基础操作系统,这 3 种技术协同工作来服务用户。
五、版本演进:一年两版本,命名 A-Z
OpenStack 的版本发布非常有规律:
- 每年发布两个大版本 ,一般在 4 月和 10 月中旬发布
- 版本命名从字母 A-Z 依次推进
课程中涉及的版本演进如下:
| 版本 | 发布年份 |
|---|---|
| Train | 2019 |
| Ussuri | 2020 |
| Victoria | 2020 |
| Wallaby | 2021 |
| Xena | 2021 |
| Yoga | 2022 |
六、设计理念:开放、灵活、可扩展
OpenStack 的设计理念可以总结为 10 个关键词:
| 类别 | 设计理念 |
|---|---|
| 核心原则 | 开放、灵活、可扩展、开源 |
| 架构原则 | 尽最大可能重用已有开源项目、架构可裁剪 |
| 实现方式 | 大量使用插件化方式进行架构设计与实现 |
| 组织方式 | 由多个相互独立的项目组成,每个项目包含多个独立服务组件 |
| 架构形态 | 无中心架构、无状态架构 |
七、OpenStack vs 虚拟化 vs 云计算
很多人容易混淆这三者,这里用两张表格彻底讲清楚。
7.1 OpenStack 与虚拟化
| 对比维度 | OpenStack | 虚拟化 |
|---|---|---|
| 本质定位 | 系统的控制面 | 底层技术实现手段(数据面) |
| 是否提供虚拟化技术 | ❌ 自身不提供 | ✅ 提供(Hypervisor 等) |
| 资源管理 | 调用多种技术实现多资源池管理 | 单机环境隔离、资源复用 |
| 对外接口 | 提供统一管理接口 | 降低隔离损耗、提升运行效率 |
| 关注重点 | 云资源编排与管理 | 提供高级虚拟化特性 |
关键结论 :OpenStack 不是虚拟化 ,它只是系统的控制面,不包括系统的数据面组件(如 Hypervisor、存储和网络设备等)。虚拟化是 OpenStack 底层的技术实现手段之一,但并非核心关注点。
7.2 OpenStack 与云计算
| 对比维度 | OpenStack | 云计算 |
|---|---|---|
| 关系 | 构建云计算的关键组件 | 完整的云计算体系 |
| 角色 | 内核、骨干、框架、总线 | 包含 OpenStack 在内的整套服务 |
也就是说:OpenStack 只是构建云计算的关键组件,要构建完整的云计算,还需要很多其他东西(如上层应用、计费、监控、运维等)。
八、整体逻辑架构
OpenStack 的逻辑架构有几个关键特征,管理员要设计、部署和配置 OpenStack,必须理解这些:
8.1 进程模型
- 每个 OpenStack 服务内部由多个进程组成
- 所有服务(Keystone 除外 )都至少有一个 API 进程,负责监听 API 请求、对请求进行预处理并传递给服务的其他部分
8.2 通信与存储
| 组成 | 说明 |
|---|---|
| 服务间通信 | 使用 AMQP 消息代理 |
| 状态存储 | 存储在数据库中 |
| 可选消息代理 | RabbitMQ 等 |
| 可选数据库 | MySQL、MariaDB、SQLite 等 |
8.3 用户访问方式
用户可以通过以下方式访问 OpenStack:
- Web 用户界面(Horizon)
- 命令行客户端(CLI)
- 浏览器插件 / curl 等工具 发出 API 请求
bash
# 通过 curl 直接调用 OpenStack API(示例)
curl -i -X POST http://<controller-ip>/identity/v3/auth/tokens
九、11 大核心组件详解
OpenStack 的核心服务可归结为"认、镜、算、网、存、裸、文件 + 管、编、量",下面逐一拆解。
9.1 核心组件总览表
| 组件 | 中文名 | 功能 | 首次出现版本 | 依赖 |
|---|---|---|---|---|
| Horizon | 界面管理 | 提供基于 Web 的控制界面 | Essex | Keystone |
| Keystone | 认证服务 | 身份验证、服务发现、多租户授权 | Essex | --- |
| Glance | 镜像服务 | 虚拟机镜像的发现、注册、检索 | Bexar | Keystone |
| Nova | 计算服务 | 大规模、可扩展、按需自助计算资源 | Austin | Keystone、Neutron、Glance |
| Cinder | 块存储 | 为虚拟机提供持久化块存储 | Folsom | Keystone |
| Swift | 对象存储 | 高可用、分布式、最终一致的对象存储 | Austin | --- |
| Manila | 文件存储 | 提供共享文件系统(类似 NFS/CIFS),多虚机共享访问 | Juno | Keystone、Neutron |
| Neutron | 网络服务 | 管理虚拟网络,提供网络即服务 | Folsom | Keystone |
| Heat | 编排服务 | 编排云应用的基础架构资源 | Havana | Keystone |
| Ceilometer | 计量服务 | 数据收集、计费、资源跟踪、告警 | Havana | --- |
| Ironic | 裸金属服务 | 管理裸机服务器,直接部署物理机(无需虚拟化层) | Grizzly | Keystone、Neutron、Glance |
9.2 逐个深入
1️⃣ Horizon ------ 界面管理服务
提供基于 Web 的控制界面,使云管理员和用户能够管理各种 OpenStack 资源和服务。首次出现在 Essex 版本,依赖 Keystone 认证服务。
2️⃣ Keystone ------ 认证服务
提供身份验证、服务发现和分布式多租户授权。支持 LDAP、OAuth、OpenID Connect、SAML 和 SQL 等多种认证方式。首次出现在 Essex 版本,为其他 OpenStack 服务提供认证支持。
3️⃣ Glance ------ 镜像服务
提供发现、注册和检索虚拟机镜像功能。虚拟机实例镜像可以存放在不同地方,例如本地文件系统、Swift 对象存储、Cinder 块存储等。首次出现在 Bexar 版本,依赖 Keystone 认证服务。
4️⃣ Nova ------ 计算服务(核心中的核心)
提供大规模、可扩展、按需自助服务的计算资源,支持管理裸机、虚拟机和容器 。首次出现在 Austin 版本,依赖 Keystone 认证服务、Neutron 网络服务和 Glance 镜像服务。
5️⃣ Cinder ------ 块存储服务
提供块存储服务,为虚拟机实例提供持久化存储。调用不同存储接口驱动,将存储设备转化成块存储池 ,用户无需了解存储实际部署位置或设备类型。首次出现在 Folsom 版本,依赖 Keystone 认证服务。
6️⃣ Swift ------ 对象存储服务
提供高度可用、分布式、最终一致的对象存储服务,可以高效、安全且廉价地存储大量数据,非常适合存储需要弹性扩展的非结构化数据 。首次出现在 Austin 版本。
7️⃣ Manila ------ 文件存储服务
提供共享文件系统 (类似 NFS/CIFS),让多台虚拟机可以同时挂载访问同一份数据。首次出现在 Juno 版本,依赖 Keystone、Neutron。
8️⃣ Neutron ------ 网络服务
负责管理虚拟网络,专注于为 OpenStack 提供网络即服务 。首次出现在 Folsom 版本,依赖 Keystone 认证服务。
9️⃣ Heat ------ 编排服务
为云应用程序编排 OpenStack 基础架构资源,提供 OpenStack 原生 REST API 和 CloudFormation 兼容 的查询 API。首次出现在 Havana 版本,依赖 Keystone 认证服务。
🔟 Ceilometer ------ 计量服务
一项数据收集服务,提供跨当前 OpenStack 核心组件规范化和转换数据的能力。数据可为所有 OpenStack 核心组件提供客户计费、资源跟踪和警报 功能。首次出现在 Havana 版本。
1️⃣1️⃣ Ironic ------ 裸金属服务
管理裸机服务器 (Bare Metal),通过 OpenStack API 直接对物理机进行部署和管理(基于 PXE + IPMI),无需虚拟化层 ,性能接近物理机。首次出现在 Grizzly 版本,依赖 Keystone、Neutron、Glance。
十、创建一台 VM,各服务如何协作?
这是理解 OpenStack 组件关系的最好例子。创建一台虚拟机(VM),需要多个服务协同完成:
| 服务 | 在创建 VM 中的职责 |
|---|---|
| Horizon | Provides UI for ------ 提供操作界面 |
| Keystone | Provides Auth for ------ 提供认证 |
| Glance | Provides images ------ 提供镜像 |
| Nova | Provisions ------ 创建/供应虚拟机 |
| Neutron | Provides network for ------ 提供网络 |
| Cinder | Provides volumes for ------ 提供数据卷 |
| Swift | Backups volumes in ------ 备份卷 |
| Heat | Orchestrates Cloud ------ 编排整个云环境 |
完整流程 :用户通过 Horizon 界面发起请求 → Keystone 验证身份 → Glance 提供系统镜像 → Nova 基于镜像创建虚拟机 → Neutron 分配网络 → 需要数据盘时由 Cinder 挂载卷 → 卷的备份存放在 Swift → 整个复杂环境可由 Heat 一键编排。
那么 Ironic 和 Manila 在哪里? 上面的 8 个服务是"创建普通虚拟机"的标准流程。它们属于"资源供应"角色,只是供应的资源类型不同:
| 场景 | 参与服务 | 说明 |
|---|---|---|
| 创建普通虚拟机(VM) | Nova | 走虚拟化路径,供虚拟机 |
| 创建裸金属服务器(不装虚拟化) | Ironic | 替代 Nova 的虚拟化路径,直接部署物理机 |
| 多台虚机需要共享同一份数据 | Manila | 提供共享文件系统(如 NFS),配合 Nova 挂载 |
bash
# 用命令行创建一台云主机的示例(对应上述流程)
source /root/keystonerc_admin
openstack image list # 查看镜像(Glance)
openstack network list # 查看网络(Neutron)
openstack server create --flavor m1.small \
--image cirros --network demo-net my-vm # 创建虚机(Nova)
十一、为什么称 OpenStack 为云操作系统?
类比传统操作系统与 OpenStack:
| 对比维度 | 传统操作系统 | OpenStack(云操作系统) |
|---|---|---|
| 管理对象 | 单台电脑的 CPU、内存、磁盘 | 整个数据中心的计算、存储、网络资源池 |
| 对外能力 | 通过系统调用/API 供应用程序使用 | 通过 API 供租户/应用按需使用 |
| 资源调度 | 进程/线程调度 | 虚拟机、容器、裸机调度 |
| 抽象层次 | 硬件抽象 | 云资源抽象 |
核心原因:OpenStack 统一管理和调度整个数据中心的各种资源池,并对外提供标准的 API 和 Web 管理接口,就像操作系统管理单台电脑的硬件一样------所以它被形象地称为"云操作系统"。
十二、实战:CentOS Stream 8 用 PackStack 部署 OpenStack Victoria
理论讲得再多,不如动手部署一次。本章完整演示如何在 CentOS Stream 8 上用 PackStack 一键部署 OpenStack Victoria(双节点:controller + compute),包含从 yum 源配置到登录 Dashboard 的全部步骤。
12.1 前期准备
资源清单
| 资源 | 说明 |
|---|---|
| CentOS Stream 8 | minimal 安装(镜像:CentOS-Stream-8-20240603.0-x86_64-dvd1.iso,阿里云镜像源) |
| VMware Workstation | 17.5 |
| OpenStack | Victoria 版本 |
虚拟机硬件配置
| 节点 | CPU | 内存 | 网卡 | 系统盘 |
|---|---|---|---|---|
| controller | 4 核 | 8G | NAT × 1 | 100G |
| compute | 4 核 | 8G | NAT × 1 | 100G |
内存可按个人实际情况调整,但建议不低于 8G。
网络拓扑
- VMware NAT 网络:
192.168.108.0/24,开启 DHCP - 网关:Windows 下 VMware NAT 网关为
192.168.108.2;Linux 下为192.168.108.1 /etc/hosts规划:
text
192.168.108.10 controller
192.168.108.11 compute
12.2 步骤一:准备模板虚拟机
基于 CentOS Stream 8 模板制作出模板机 openstack_template,完成以下基础配置后关机拍快照。
① 配置 yum 源
bash
rm -rf /etc/yum.repos.d/*
cat <<EOF > /etc/yum.repos.d/openstack.repo
[centos-openstack-victoria]
name=CentOS 8 - OpenStack victoria
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/cloud/x86_64/openstack-victoria/
gpgcheck=0
enabled=1
[highavailability]
name=CentOS Stream 8 - HighAvailability
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/HighAvailability/x86_64/os/
gpgcheck=0
enabled=1
[nfv]
name=CentOS Stream 8 - NFV
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/NFV/x86_64/os/
gpgcheck=0
enabled=1
[rt]
name=CentOS Stream 8 - RT
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/RT/x86_64/os/
gpgcheck=0
enabled=1
[resilientstorage]
name=CentOS Stream 8 - ResilientStorage
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/ResilientStorage/x86_64/os/
gpgcheck=0
enabled=1
[extras-common]
name=CentOS Stream 8 - Extras packages
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/extras/x86_64/extras-common/
gpgcheck=0
enabled=1
[extras]
name=CentOS Stream $releasever - Extras
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/extras/x86_64/os/
gpgcheck=0
enabled=1
[centos-ceph-pacific]
name=CentOS - Ceph Pacific
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/storage/x86_64/ceph-pacific/
gpgcheck=0
enabled=1
[centos-rabbitmq-38]
name=CentOS-8 - RabbitMQ 38
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/messaging/x86_64/rabbitmq-38/
gpgcheck=0
enabled=1
[centos-nfv-openvswitch]
name=CentOS Stream 8 - NFV OpenvSwitch
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/nfv/x86_64/openvswitch-2/
gpgcheck=0
enabled=1
[baseos]
name=CentOS Stream 8 - BaseOS
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/BaseOS/x86_64/os/
gpgcheck=0
enabled=1
[appstream]
name=CentOS Stream 8 - AppStream
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/AppStream/x86_64/os/
gpgcheck=0
enabled=1
[powertools]
name=CentOS Stream 8 - PowerTools
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/PowerTools/x86_64/os/
gpgcheck=0
enabled=1
EOF
yum clean all
yum makecache
② 安装基础软件包
bash
yum install -y bash-completion vim open-vm-tools net-tools chrony.x86_64
source /usr/share/bash-completion/bash_completion
③ 设置 hosts / 关闭 SELinux / 配置网卡
bash
echo '192.168.108.10 controller' >> /etc/hosts
echo '192.168.108.11 compute' >> /etc/hosts
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
vim /etc/sysconfig/network-scripts/ifcfg-ens160
# TYPE=Ethernet
# BOOTPROTO=dhcp
# NAME=ens160
# DEVICE=ens160
# ONBOOT=yes
④ 清除密钥与 Machine ID,拍快照
bash
cd /etc/ssh/ && rm -rf ssh_host_*
cat /dev/null > /etc/machine-id
poweroff # 关机后拍摄快照,作为干净的模板
12.3 步骤二:准备 OpenStack 节点
从模板完整克隆 出 openstack_controller 与 openstack_compute 两台机器(注意:两节点的 CPU 都要开启虚拟化支持),然后分别配置不同的主机名与 IP。
① 配置主机名
bash
# controller 节点
hostnamectl set-hostname controller
# compute 节点
hostnamectl set-hostname compute
② 配置静态 IP(ifcfg-ens160)
bash
# controller:192.168.108.10
vim /etc/sysconfig/network-scripts/ifcfg-ens160
# BOOTPROTO=dhcp 改为 BOOTPROTO=none
# IPADDR=192.168.108.10
# NETMASK=255.255.255.0
# GATEWAY=192.168.108.2
# DNS1=192.168.108.2
nmcli connection reload ens160
nmcli connection up ens160
bash
# compute:192.168.108.11(参数同 controller,仅 IPADDR 不同)
# IPADDR=192.168.108.11
nmcli connection reload ens160
nmcli connection up ens160
③ 配置 NTP 时间同步
bash
# controller:以阿里云 NTP 为上游
vim /etc/chrony.conf
# 注释掉 # pool 2.centos.pool.ntp.org iburst
# 添加 server ntp.aliyun.com iburst
# 添加 allow 192.168.108.0/24
systemctl restart chronyd
systemctl enable chronyd
chronyc sources -v
bash
# compute:以 controller 为上游
vim /etc/chrony.conf
# 注释 pool 行,添加 server controller iburst
systemctl restart chronyd
systemctl enable chronyd
chronyc sources -v
配置完成后两节点关机拍快照。
12.4 步骤三:安装 OpenStack 并测试
① 控制节点安装 packstack
bash
yum install -y openstack-packstack
② 生成应答文件
bash
packstack --gen-answer-file=answers.txt
提示:如选择 OVN Neutron 后端,应答文件会提示该后端不支持 VPNaaS 插件,租户网络将使用 Geneve 封装,属正常现象。
③ 修改应答文件(4 处关键参数)
bash
vim answers.txt
| 行号 | 参数 | 修改值 | 作用 |
|---|---|---|---|
| 60 | CONFIG_HEAT_INSTALL |
y |
安装 Heat 编排组件 |
| 97 | CONFIG_COMPUTE_HOSTS |
192.168.108.10,192.168.108.11 |
指定两台计算节点 |
| 909 | CONFIG_NEUTRON_OVN_BRIDGE_IFACES |
br-ex:ens160 |
OVN 外部网桥绑定物理网卡 |
| 1169 | CONFIG_PROVISION_DEMO |
n |
不自动创建 demo 示例项目 |
统一所有服务密码为 huawei(测试环境方便记忆):
bash
sed -i.bak -r 's/(.+_PW)=[0-9a-z]+/\1=huawei/g' answers.txt
④ 关闭 NetworkManager(两节点都要)
bash
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl mask NetworkManager
原因:CentOS 8 默认使用 NetworkManager 管理网络,它会和 OpenStack 网络组件产生冲突,导致告警或错误。
⑤ 开始部署
bash
packstack --answer-file=answers.txt
- 安装日志:
/var/tmp/packstack/20240920-*/openstack-setup.log - 部署过程中会提示输入各节点的 root 密码(本教程为
huawei) - ⏳ 关键提示 :
Testing if puppet apply is finished ... controller.pp这一步会停留 40~50 分钟,属正常现象,耐心等待即可,其他步骤都很快
⑥ 安装完成后的配置
bash
# 开启 network 服务(controller、compute 两节点都要)
systemctl start network
systemctl enable network
# 配置 openstack 命令补全(仅 controller)
openstack complete >> /etc/bash_completion.d/complete
⑦ 登录测试
- 浏览器访问 Horizon 控制台:
http://192.168.108.10/dashboard - 账号:
admin密码:huawei
⑧ 收尾
- 两个节点关机,分别拍摄快照,作为部署完成后的干净状态。
- 🎉 至此,一套 OpenStack Victoria 双节点云平台部署完成!
十三、总结与学习建议
通过本文,你应当掌握:
- ✅ OpenStack 的起源 (NASA + Rackspace,2010 年)与版本演进规律(一年两版、A-Z 命名)
- ✅ OpenStack 的定位:虚拟机/裸金属/容器的云基础架构,IaaS 开源平台
- ✅ OpenStack 不是虚拟化,而是控制面;是构建云计算的关键组件而非云计算本身
- ✅ 逻辑架构:多进程、AMQP 通信、数据库存储、统一 API
- ✅ 11 大核心组件的名称、功能、版本与依赖关系
- ✅ 创建 VM 时各服务的协作流程
- ✅ 用 PackStack 在 CentOS Stream 8 上完整部署 OpenStack Victoria 的实战能力
学习建议 :理论讲完一定要动手。建议按本文第十二章的实战教程,在 VMware 中用 CentOS Stream 8 + PackStack 完整部署一套 OpenStack Victoria(内存 8G+),亲自走一遍"建项目 → 建网络 → 传镜像 → 创建 VM"的流程,才能真正理解组件间的关系。
bash
# 部署完成后,用命令验证组件是否就绪
source /root/keystonerc_admin
openstack service list # 查看已注册服务
openstack endpoint list # 查看服务端点
openstack network list # 查看网络