Skip to content

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):

ini
[token]
provider = fernet
driver = sql
expiration = 3600

LDAP 集成

企业环境通常将 Keystone 与 LDAP/Active Directory 集成,实现统一身份管理:

ini
[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

常用操作

bash
# 创建用户
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" network

Nova 计算服务

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(内存剩余量越多权重越高)

python
# 自定义权重插件示例
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):

ini
[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│
└─────────┘    └─────────┘    └─────────┘    └─────────┘    └────┬────┘

┌─────────┐    ┌─────────┐    ┌─────────┐    ┌─────────┐       │
│  创建   │◀───│  同步   │◀───│  同步   │◀───│  返回   │◀──────┘
│  完成   │    │  状态   │    │  主机   │    │  主机   │
└─────────┘    └─────────┘    └─────────┘    └─────────┘

详细步骤:

  1. 用户通过 API 发起创建虚拟机请求
  2. Nova-API 接收请求,验证参数,创建数据库记录
  3. Nova-Conductor 接收任务,避免直接暴露 Compute
  4. Scheduler 调用 Placement API 获取可用主机列表
  5. Filter 阶段过滤不符合条件的主机
  6. Weight 阶段对候选主机排序
  7. 选择最优主机,返回主机信息
  8. Nova-Conductor 通知目标 Compute 创建虚拟机
  9. Nova-Compute 调用 Neutron 创建网络端口
  10. Nova-Compute 调用 Cinder 挂载卷(如果有)
  11. Nova-Compute 调用 Glance 获取镜像
  12. Nova-Compute 调用 libvirt/KVM 创建虚拟机
  13. 更新数据库状态,返回结果给用户

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 配置

ini
# 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=utf8

Cell 管理命令

bash
# 列出所有 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):

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,gre

Provider 网络 vs Self-service 网络

Provider 网络(提供者网络)

  • 由管理员创建,映射到物理网络
  • 直接使用物理网络的 VLAN
  • 不支持 DHCP 和浮动 IP
  • 适用于需要直接访问物理网络的场景
bash
# 创建 Provider 网络
openstack network create --provider-network-type vlan \
  --provider-physical-network physnet1 \
  --provider-segment 100 \
  provider-network

Self-service 网络(自助服务网络)

  • 租户自行创建的网络
  • 通过 Overlay(VXLAN/GRE)隔离
  • 支持 DHCP、浮动 IP、NAT
  • 适用于大多数场景
bash
# 创建 Self-service 网络
openstack network create self-service-network
openstack subnet create --network self-service-network \
  --subnet-range 192.168.100.0/24 \
  self-service-subnet

DVR 分布式路由

DVR(Distributed Virtual Router)将路由功能分布到每个计算节点,消除网络节点单点瓶颈:

传统模式:所有流量经过网络节点 DVR 模式:流量直接在计算节点路由

ini
# 启用 DVR
[agent]
enable_distributed_routing = True

[l3]
ha_enabled = False

Floating IP 浮动 IP

浮动 IP 允许虚拟机从外部网络访问:

bash
# 创建浮动 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

常用操作

bash
# 查看网络列表
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-sg

Cinder 块存储服务

Cinder 是 OpenStack 的块存储服务,为虚拟机提供持久化存储卷。

架构概述

┌─────────────────────────────────────────────────────────┐
│              Cinder API (8776)                         │
└────────────────────────┬────────────────────────────────┘

┌────────────────────────▼────────────────────────────────┐
│              Cinder Scheduler                          │
│  (选择合适的存储后端)                                   │
└────────────────────────┬────────────────────────────────┘

┌────────────────────────▼────────────────────────────────┐
│              Cinder Volume                              │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐   │
│  │ LVM Driver  │ │ Ceph RBD    │ │ iSCSI/FC       │   │
│  └─────────────┘ └─────────────┘ └─────────────────┘   │
└────────────────────────┬────────────────────────────────┘

┌────────────────────────▼────────────────────────────────┐
│              存储后端                                   │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐   │
│  │ LVM VG      │ │ Ceph Pool   │ │ NetApp FAS     │   │
│  └─────────────┘ └─────────────┘ └─────────────────┘   │
└─────────────────────────────────────────────────────────┘

多后端支持

Cinder 支持多种存储后端:

LVM(本地块设备)

ini
[lvm]
volume_backend_name = lvm
volume_group = cinder-volumes
target_helper = lioadm

Ceph RBD

ini
[rbd]
volume_backend_name = ceph
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = <uuid>

NFS

ini
[nfs]
volume_backend_name = nfs
nfs_shares_config = /etc/cinder/nfs_shares
nfs_mount_point_base = /var/lib/cinder/nfs

iSCSI/FC

ini
[iscsi]
volume_backend_name = iscsi
iscsi_ip_address = 192.168.100.10
iscsi_port = 3260
target_helper = lioadm

Ceph 集成

Cinder 与 Ceph 集成是生产环境最常见的方案:

ini
# /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

创建卷类型

bash
# 创建卷类型
openstack volume type create ceph

# 设置卷类型规格
openstack volume type set ceph --property volume_backend_name=ceph

常用操作

bash
# 创建卷
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 100

Glance 镜像服务

Glance 是 OpenStack 的镜像服务,负责虚拟机镜像的存储、注册和分发。

架构概述

┌─────────────────────────────────────────────────────────┐
│              Glance API (9292)                         │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐   │
│  │ REST API    │ │ Registry    │ │ Image Cache    │   │
│  └─────────────┘ └─────────────┘ └─────────────────┘   │
└────────────────────────┬────────────────────────────────┘

         ┌───────────────┼───────────────┐
         │               │               │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ File Store     │ │Ceph RBD│ │ Swift           │
│ (本地文件系统)  │ │        │ │ (对象存储)       │
└─────────────────┘ └────────┘ └─────────────────┘

镜像格式

格式描述适用场景
raw无格式的磁盘镜像性能最佳,推荐使用
qcow2QEMU 写时复制格式支持压缩、快照,KVM 默认
vhdVMware 虚拟磁盘格式VMware 迁移场景
vmdkVMware 虚拟磁盘格式VMware 兼容
iso光盘镜像光盘启动
aki/ari/amiAmazon 镜像格式AWS 迁移场景

镜像优化

镜像预处理

bash
# 安装 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>

镜像转换

bash
# 转换为 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

常用操作

bash
# 上传镜像
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=vga

Swift 对象存储

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:账户服务 Ring
  • container.ring.gz:容器服务 Ring
  • object.ring.gz:对象服务 Ring

Ring 配置参数

bash
# 创建 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 rebalance

Ring 参数说明

  • part_power:分区数指数(2^part_power 个分区)
  • replicas:副本数
  • min_part_hours:最小分区移动间隔(小时)

常用操作

bash
# 创建容器
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 对象存储对比

特性SwiftCeph RGW
架构纯软件定义统一存储平台
一致性最终一致强一致
性能小文件优化大块顺序写优化
运维简单复杂
S3 兼容需要配置原生支持