OpenStack 核心组件详解
本文详细介绍 OpenStack 六大核心组件的架构原理、关键概念和配置管理。
Keystone 认证服务
Keystone 是 OpenStack 的统一身份认证服务,提供用户管理、项目管理、角色管理和 Token 验证等功能。
架构概述
Keystone 采用分层架构设计:
┌─────────────────────────────────────────┐
│ Client (CLI/Horizon) │
└──────────────────┬──────────────────────┘
│ HTTPS
┌──────────────────▼──────────────────────┐
│ Keystone API │
│ ┌─────────────────────────────────┐ │
│ │ Public API (5000) │ │
│ │ Admin API (35357) │ │
│ │ Token API (5000/v3/tokens) │ │
│ └─────────────────────────────────┘ │
└──────────────────┬──────────────────────┘
│
┌──────────────────▼──────────────────────┐
│ Backend (LDAP/SQL) │
└─────────────────────────────────────────┘核心概念
User(用户):系统中的实体,可以是人类用户或服务账号。每个用户属于一个或多个项目。
Project(项目):资源容器,用于隔离资源和配额。用户必须通过项目来访问资源。
Role(角色):定义用户对资源的权限。角色可以分配给用户或用户组。
Token(令牌):用户身份的有效凭证,具有时效性。Token 包含用户身份、项目范围和角色信息。
Domain(域):用户的顶层容器,用于实现多租户隔离和 SSO。
Token 机制
Keystone 支持多种 Token 类型:
UUID Token(传统方式):
- 长度 32 字节的随机字符串
- 无状态,Token 信息存储在数据库
- 每次验证需要查询数据库
- 性能较差,逐渐被淘汰
PKI/PKIZ Token:
- 包含签名信息的 X.509 证书
- 可缓存,减少数据库查询
- Token 体积较大
- 已废弃
Fernet Token(推荐):
- 对称加密的 Token
- 无状态,无需数据库存储
- 体积小,性能优秀
- 支持 Token 轮换
配置示例(/etc/keystone/keystone.conf):
[token]
provider = fernet
driver = sql
expiration = 3600LDAP 集成
企业环境通常将 Keystone 与 LDAP/Active Directory 集成,实现统一身份管理:
[ldap]
url = ldap://ldap.example.com
user = cn=admin,dc=example,dc=com
password = secret
suffix = dc=example,dc=com
query_scope = sub
user_tree_dn = ou=Users,dc=example,dc=com
user_filter = (memberOf=cn=openstack-users,ou=Groups,dc=example,dc=com)
group_tree_dn = ou=Groups,dc=example,dc=com
[identity]
driver = ldap常用操作
# 创建用户
openstack user create --domain default --password-prompt admin
# 创建项目
openstack project create --domain default myproject
# 创建角色并分配
openstack role create member
openstack role add --project myproject --user admin member
# 获取 Token
openstack token issue
# 查看 Token 详情
openstack token show <token_id>
# 创建服务
openstack service create --name neutron --description "OpenStack Network" networkNova 计算服务
Nova 是 OpenStack 的计算服务,负责虚拟机的生命周期管理、调度和资源分配。
架构组件
┌─────────────────────────────────────────────────────────┐
│ Nova-API (8774) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ API Server │ │ Metadata │ │ Console Auth │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ Nova-Conductor │ │Scheduler│ │ Nova-Cell │
│ (任务调度) │ │(主机选择)│ │ (Cell 架构) │
└────────┬────────┘ └───┬────┘ └────────┬────────┘
│ │ │
│ ┌──────▼──────┐ │
│ │ Placement │ │
│ │ (资源追踪) │ │
│ └──────┬──────┘ │
│ │ │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ Nova-Compute │ │Neutron │ │ Nova-Compute │
│ (计算节点) │ │Cinder │ │ (计算节点) │
└─────────────────┘ └────────┘ └─────────────────┘调度器 Filter/Weight
Nova Scheduler 负责选择最合适的计算节点来运行虚拟机,采用 Filter 和 Weight 两阶段筛选:
Filter 阶段:过滤不符合条件的候选主机
常用 Filter:
RetryFilter:排除已失败的主机AvailabilityZoneFilter:按可用区过滤ComputeFilter:检查计算服务状态ComputeCapabilitiesFilter:匹配计算能力ImagePropertiesFilter:匹配镜像属性ServerGroupAntiAffinityFilter:反亲和组ServerGroupAffinityFilter:亲和组AggregateMultiTenancyIsolation:聚合多租户隔离DiskFilter:磁盘空间检查RAMFilter:内存检查CoreFilter:CPU 核心数检查
Weight 阶段:对通过 Filter 的主机进行权重排序
默认权重:ram_weight(内存剩余量越多权重越高)
# 自定义权重插件示例
class CustomWeigher(weights.Weigher):
def _weigh_object(self, host_state, weight_properties):
# 基于 CPU 利用率计算权重
cpu_usage = host_state.cpu_usage_percent
return 100 - cpu_usage调度配置示例(/etc/nova/nova.conf):
[scheduler]
driver = filter_scheduler
available_filters = nova.scheduler.filters.all_filters
enabled_filters = AvailabilityZoneFilter,ComputeFilter,RAMFilter,DiskFilter,CoreFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
[filter_scheduler]
host_weight = ram_weight虚拟机启动流程
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 用户请求 │───▶│ Nova-API│───▶│Conductor│───▶│Scheduler│───▶│Placement│
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └────┬────┘
│
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ 创建 │◀───│ 同步 │◀───│ 同步 │◀───│ 返回 │◀──────┘
│ 完成 │ │ 状态 │ │ 主机 │ │ 主机 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘详细步骤:
- 用户通过 API 发起创建虚拟机请求
- Nova-API 接收请求,验证参数,创建数据库记录
- Nova-Conductor 接收任务,避免直接暴露 Compute
- Scheduler 调用 Placement API 获取可用主机列表
- Filter 阶段过滤不符合条件的主机
- Weight 阶段对候选主机排序
- 选择最优主机,返回主机信息
- Nova-Conductor 通知目标 Compute 创建虚拟机
- Nova-Compute 调用 Neutron 创建网络端口
- Nova-Compute 调用 Cinder 挂载卷(如果有)
- Nova-Compute 调用 Glance 获取镜像
- Nova-Compute 调用 libvirt/KVM 创建虚拟机
- 更新数据库状态,返回结果给用户
Cell 架构
Cell 架构用于支持大规模部署,将 Nova 划分为多个独立的 Cell:
┌─────────────────────────────────────────┐
│ API Cell │
│ ┌─────────────────────────────────┐ │
│ │ Nova-API / Nova-Conductor │ │
│ │ Nova-Scheduler / Placement │ │
│ └─────────────────────────────────┘ │
└──────────────────┬──────────────────────┘
│ Cell Message Bus
┌─────────────┼─────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ Cell 1 │ │ Cell 2 │ │ Cell N │
│ Nova- │ │ Nova- │ │ Nova- │
│ Compute │ │ Compute │ │ Compute │
└─────────┘ └─────────┘ └─────────┘Cell 配置:
# API Cell 的 nova.conf
[api]
cell_type = api
transport_url = rabbit://openstack:password@api-cell-rabbit
# Compute Cell 的 nova.conf
[api]
cell_type = compute
transport_url = rabbit://openstack:password@compute-cell-rabbit
[database]
connection = mysql+pymysql://nova:password@cell-db/nova?charset=utf8Cell 管理命令:
# 列出所有 Cell
nova-manage cell_v2 list_cells
# 创建 Cell
nova-manage cell_v2 create_cell --name cell1 --transport-url rabbit://... --database_connection mysql://...
# 映射主机到 Cell
nova-manage cell_v2 map_cell_instance --cell-cell1 --host compute1 --cell_uuid <uuid>Neutron 网络服务
Neutron 是 OpenStack 的网络服务,提供虚拟网络的创建、管理和 SDN 功能。
架构概述
┌─────────────────────────────────────────────────────────┐
│ Neutron Server (9696) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ REST API │ │ Plugin │ │ Extension Mgr │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ ML2 Plugin │ │DHCP Agent│ │ L3 Agent │
│ (机制驱动) │ │(DHCP服务)│ │ (路由/NAT) │
└────────┬────────┘ └───┬────┘ └────────┬────────┘
│ │ │
│ ┌──────▼──────┐ │
│ │ OVS/OVN │ │
│ │ (交换机) │ │
│ └──────┬──────┘ │
│ │ │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ Compute Node │ │Network │ │ Compute Node │
│ (OVS Agent) │ │ Node │ │ (OVS Agent) │
└─────────────────┘ └────────┘ └─────────────────┘ML2 机制驱动
ML2(Modular Layer 2)是 Neutron 的核心插件,支持多种机制驱动:
Open vSwitch(OVS):
- 最常用的 Linux 虚拟交换机
- 支持 VLAN、VXLAN、GRE 隧道
- 性能优秀,社区活跃
OVN(Open Virtual Network):
- OVS 的新一代控制器
- 分布式架构,无需 L3 Agent
- 支持 ACL、负载均衡等高级功能
- 性能优于传统 OVS
Linux Bridge:
- 传统 Linux 桥接
- 简单稳定
- 功能相对有限
配置示例(/etc/neutron/plugins/ml2/ml2_conf.ini):
[ml2]
type_drivers = flat,vlan,vxlan,gre
tenant_network_types = vxlan
mechanism_drivers = openvswitch,linuxbridge
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:200
[ml2_type_vxlan]
vni_ranges = 1001:2000
[agent]
tunnel_types = vxlan,greProvider 网络 vs Self-service 网络
Provider 网络(提供者网络):
- 由管理员创建,映射到物理网络
- 直接使用物理网络的 VLAN
- 不支持 DHCP 和浮动 IP
- 适用于需要直接访问物理网络的场景
# 创建 Provider 网络
openstack network create --provider-network-type vlan \
--provider-physical-network physnet1 \
--provider-segment 100 \
provider-networkSelf-service 网络(自助服务网络):
- 租户自行创建的网络
- 通过 Overlay(VXLAN/GRE)隔离
- 支持 DHCP、浮动 IP、NAT
- 适用于大多数场景
# 创建 Self-service 网络
openstack network create self-service-network
openstack subnet create --network self-service-network \
--subnet-range 192.168.100.0/24 \
self-service-subnetDVR 分布式路由
DVR(Distributed Virtual Router)将路由功能分布到每个计算节点,消除网络节点单点瓶颈:
传统模式:所有流量经过网络节点 DVR 模式:流量直接在计算节点路由
# 启用 DVR
[agent]
enable_distributed_routing = True
[l3]
ha_enabled = FalseFloating IP 浮动 IP
浮动 IP 允许虚拟机从外部网络访问:
# 创建浮动 IP
openstack floating ip create public-network
# 关联浮动 IP 到虚拟机
openstack server add floating ip vm1 203.0.113.100
# 解除关联
openstack server remove floating ip vm1 203.0.113.100
# 释放浮动 IP
openstack floating ip delete 203.0.113.100常用操作
# 查看网络列表
openstack network list
# 查看子网列表
openstack subnet list
# 查看端口列表
openstack port list
# 查看路由器列表
openstack router list
# 创建安全组
openstack security group create web-sg
# 添加安全组规则
openstack security group rule create --ingress \
--protocol tcp --dst-port 80 web-sgCinder 块存储服务
Cinder 是 OpenStack 的块存储服务,为虚拟机提供持久化存储卷。
架构概述
┌─────────────────────────────────────────────────────────┐
│ Cinder API (8776) │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ Cinder Scheduler │
│ (选择合适的存储后端) │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ Cinder Volume │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ LVM Driver │ │ Ceph RBD │ │ iSCSI/FC │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ 存储后端 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ LVM VG │ │ Ceph Pool │ │ NetApp FAS │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘多后端支持
Cinder 支持多种存储后端:
LVM(本地块设备):
[lvm]
volume_backend_name = lvm
volume_group = cinder-volumes
target_helper = lioadmCeph RBD:
[rbd]
volume_backend_name = ceph
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = <uuid>NFS:
[nfs]
volume_backend_name = nfs
nfs_shares_config = /etc/cinder/nfs_shares
nfs_mount_point_base = /var/lib/cinder/nfsiSCSI/FC:
[iscsi]
volume_backend_name = iscsi
iscsi_ip_address = 192.168.100.10
iscsi_port = 3260
target_helper = lioadmCeph 集成
Cinder 与 Ceph 集成是生产环境最常见的方案:
# /etc/cinder/cinder.conf
[ceph]
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = <secret-uuid>
[backend]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes创建卷类型:
# 创建卷类型
openstack volume type create ceph
# 设置卷类型规格
openstack volume type set ceph --property volume_backend_name=ceph常用操作
# 创建卷
openstack volume create --size 50 --type ceph my-volume
# 挂载卷到虚拟机
openstack server add volume server1 my-volume
# 从镜像创建卷
openstack volume create --image <image-id> --size 20 from-image-volume
# 创建卷快照
openstack volume snapshot create --volume my-volume my-snapshot
# 扩展卷
openstack volume set my-volume --size 100Glance 镜像服务
Glance 是 OpenStack 的镜像服务,负责虚拟机镜像的存储、注册和分发。
架构概述
┌─────────────────────────────────────────────────────────┐
│ Glance API (9292) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ REST API │ │ Registry │ │ Image Cache │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ File Store │ │Ceph RBD│ │ Swift │
│ (本地文件系统) │ │ │ │ (对象存储) │
└─────────────────┘ └────────┘ └─────────────────┘镜像格式
| 格式 | 描述 | 适用场景 |
|---|---|---|
| raw | 无格式的磁盘镜像 | 性能最佳,推荐使用 |
| qcow2 | QEMU 写时复制格式 | 支持压缩、快照,KVM 默认 |
| vhd | VMware 虚拟磁盘格式 | VMware 迁移场景 |
| vmdk | VMware 虚拟磁盘格式 | VMware 兼容 |
| iso | 光盘镜像 | 光盘启动 |
| aki/ari/ami | Amazon 镜像格式 | AWS 迁移场景 |
镜像优化
镜像预处理:
# 安装 cloud-init
yum install cloud-init
# 配置 SSH 密钥注入
echo "ssh_pwauth: true" >> /etc/cloud/cloud.cfg
echo "disable_root: false" >> /etc/cloud/cloud.cfg
# 清理云元数据
virt-sysprep -d <domain-name>镜像转换:
# 转换为 qcow2 格式
qemu-img convert -O qcow2 input.vmdk output.qcow2
# 压缩镜像
qemu-img convert -O qcow2 -c input.raw output.qcow2
# 调整镜像大小
qemu-img resize output.qcow2 +10G常用操作
# 上传镜像
openstack image create --file centos7.qcow2 \
--disk-format qcow2 --container-format bare \
--min-disk 20 --min-ram 2048 \
centos7
# 列出镜像
openstack image list
# 查看镜像详情
openstack image show centos7
# 下载镜像
openstack image save centos7 --file centos7-download.qcow2
# 更新镜像属性
openstack image set centos7 --property hw_video_model=vgaSwift 对象存储
Swift 是 OpenStack 的对象存储服务,提供高可用的分布式存储。
架构概述
┌─────────────────────────────────────────────────────────┐
│ Swift Proxy (8080) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ Auth Middle │ │ TempURL │ │ Form Post │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ Account Server │ │Container│ │ Object Server │
│ (账户服务) │ │ Server │ │ (对象服务) │
└─────────────────┘ └─────────┘ └─────────────────┘
│ │ │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ Storage Node │ │Storage │ │ Storage Node │
│ (数据节点) │ │ Node │ │ (数据节点) │
└─────────────────┘ └────────┘ └─────────────────┘Ring 一致性哈希
Swift 使用 Ring 来管理数据分布,每个 Ring 维护一个一致性哈希环:
Ring 文件结构:
account.ring.gz:账户服务 Ringcontainer.ring.gz:容器服务 Ringobject.ring.gz:对象服务 Ring
Ring 配置参数:
# 创建 Account Ring
swift-ring-builder account.builder create 10 3 1
# 添加设备
swift-ring-builder account.builder add \
z1-192.168.1.10:6002/device 100
# 重新平衡
swift-ring-builder account.builder rebalanceRing 参数说明:
part_power:分区数指数(2^part_power 个分区)replicas:副本数min_part_hours:最小分区移动间隔(小时)
常用操作
# 创建容器
swift post mycontainer
# 上传对象
swift upload mycontainer file.txt
# 下载对象
swift download mycontainer file.txt
# 列出容器内容
swift list mycontainer
# 删除对象
swift delete mycontainer file.txt
# 设置容器元数据
swift post mycontainer -H "X-Container-Read: .r:*"与 Ceph 对象存储对比
| 特性 | Swift | Ceph RGW |
|---|---|---|
| 架构 | 纯软件定义 | 统一存储平台 |
| 一致性 | 最终一致 | 强一致 |
| 性能 | 小文件优化 | 大块顺序写优化 |
| 运维 | 简单 | 复杂 |
| S3 兼容 | 需要配置 | 原生支持 |
