runsisi's

technical notes

OpenStack学习

2018-12-26 runsisi#openstack

virtualization

虚拟化,与真实的、物理存在的对象相对应,用于隔离底层物理实现。其中计算机硬件虚拟化是我们所熟知的虚拟化技术,如使用 VirtualBox 等虚拟机软件创建多台 x86 虚拟机器,使用 qemu 模拟多种硬件平台(x86,PPC)等。其它常见类型的虚拟化技术包括:操作系统虚拟化(Docker,FreeBSD jail),存储虚拟化(pooling),应用软件虚拟化(virtualenv)等。

一个典型的硬件虚拟化平台的组成如图 1 所示,其中 VMM 是虚拟机监视器,hypervisor 可以理解为虚拟机监视器的监视器即运行于物理硬件上的一层虚拟机管理软件,如 Linux qemu + KVM,VMWare ESX 等。

virtual
图 1 硬件虚拟化平台

根据对 CPU(x86 平台)虚拟化技术分类,主要有如下三种虚拟化技术:

  1. full-virtualization

Guest OS 不知道自己运行在虚拟化平台之上,用户态代码直接由物理 CPU 执行,而无法虚拟化的 ring 0 特权指令通过特殊的技术进行转换并交由 hypervisor 执行。

  1. para-virtualization

需要对 Guest OS 进行修改,将无法虚拟化的 ring 0 特权指令直接替换成对 hypervisor 接口(hypercall)的调用,因此也称为 OS-assisted 虚拟化。

  1. hardware-assisted-virtualization

CPU 为支持虚拟化在原有的 3 层权限体系中新增一个比 ring 0 更高级别的特权级,Guest OS 执行的特权指令自动由 CPU 转交给 hypervisor,从而免去了特权指令转换或 hypercall 调用。

IaaS

基础设施即服务(Infrastructure-as-a-service,IaaS)是云计算的基础,在云计算应用中的层级关系如图 2 所示。

iaas
图 2 云计算服务体系

IaaS 向上层提供计算、存储等基础资源服务,OpenStack 项目的目标就是提供一个完整的云计算基础服务(即 IaaS)解决方案。通常来说这样的解释很抽象,以最简单的理解来说,就是 OpenStack 通过管理物理硬件资源,向外提供一个虚拟机管理平台,其中向外提供虚拟机是 OpenStack 的核心,而附加于虚拟机之上的存储、网络等资源,以及负载均衡、服务迁移等附加功能使得组建一个完整的 IaaS 环境成为可能。

libvirt

已有的虚拟化技术多种多样,仅 GNU/Linux 平台就存在 qemu,qemu+KVM,Xen,LXC,Docker 等多种技术,而新的虚拟化技术还不断涌现,为了封装各种虚拟化技术并向应用提供统一的 API 接口,libvirt 应运而生,libvirt 可以提供对虚拟机、虚拟网络及存储资源的管理,其与底层虚拟化技术及上层应用之间的关系如图 3 所示。

libvirt
图 3 libvirt

为了支持扩展以及稳定的 API 接口,OpenStack 不直接与底层的虚拟化实现进行交互,libvirt 作为 OpenStack 的虚拟化驱动进行加载,而且由于法律、技术等原因,libvirt 并没能做到大一统,因此对于 VMWare 等公司的虚拟化技术 OpenStack 由单独的驱动进行封装。

OpenStack

如前所述,OpenStack 简单的说就是一个 IaaS 解决方案,利用各种开源技术将已有的物理硬件资源进行封装整合,向外提供计算、网络、存储等资源,实际上也就是提供 IT 基础环境服务。

OpenStack 自身由多个服务模块组成,且每个服务模块都有自己独立的项目代号(project name / codename),简单罗列如表 1,而各主要模块之间的大致关系可以参考图 4。

service
表 1 OpenStack 主要服务模块

arch
图 4 OpenStack 服务架构

从图 4 可以明显看到整个 OpenStack 服务体系以虚拟机为中心,其它模块都为虚拟机服务。

ceph 与 OpenStack

OpenStack 中的存储服务主要包括两部分:对象存储和块存储,分别对应 Swift 和 Cinder 服务。由于 ceph 的对象存储接口兼容 Swift 接口,因此可以使用 ceph 的 rgw 替换 Swift,而 Cinder 的存储后端是可配置的,且已存在 rbd 驱动,因此可以使用 ceph 的 rbd 作为 Cinder 的存储后端。

OpenStack 的 Glance 服务用于提供虚拟机镜像服务,而这些镜像同样也需要空间进行存储,从图 4 可以看到 Glance 服务默认将虚拟机镜像存储在 Swift 后端,因此如果同时将 ceph 作为对象存储和块存储后端,则理论上可以加快虚拟机的创建,因为虚拟机的启动镜像和块设备都处于同一个存储集群之中。

对于 OpenStack 而言,所有的针对 ceph 存储集群的业务逻辑都由 ceph 驱动层或定义好的 RESTfull API 进行处理,使用 ceph 存储与使用传统磁阵或本地存储并没有区别,ceph 集群与 OpenStack 集群是一种松耦合的关系,两者的关系请参考图 5。

ceph openstack
图 5 ceph 与 OpenStack 的关系

总结

总的来说整个 OpenStack 的大体框架并不难理解,其核心是虚拟化,存储为虚拟化服务,ceph 作为一个统一存储系统应该是有不错前景的。