每台计算机都可以通过虚拟化技术虚拟出多台Virtual Machine,实际上是使用了操作系统内核的namespace和cgroup技术,将进程和资源进行了隔离,这样每台虚拟机就可以当作一台真实的机器去使用。如果有很多台服务器(组建集群),每台服务器上又创建多台虚拟机,那么这么多台虚拟机如何去统一管理呢?虚拟机之间内部通信需要使用网络,如何构建虚拟网络使得它们能够彼此通信呢?这就是Openstack所要做的,它的使命就是去管理整个集群的虚拟机。
Openstack封装了内部逻辑,仅给用户暴露外部接口,用户只需要使用Horizon操作界面,就可以创建、管理虚拟机了。那么它的底层到底是如何工作的?为什么只需要调用Restful API,就可以创建虚拟机了?
Openstack创建虚拟机
当用户在前台界面(Horizon)点击“创建虚拟机”的按钮时,会向服务器后端发送http请求,调用nova提供的API,nova-api接受到该请求后,会把创建虚拟机的消息发送到RabbitMQ中(消息中间件)。这时,nova-scheduler便会从RabbitMQ中拿到消息,计算各个计算结点上的资源,以确定到底是在哪台计算结点上进行创建。决定好之后,又会把消息发送到RabbitMQ中。此时nova-compute就是从消息中间件获取消息,调用libvirt API进行真正的虚拟机创建操作。在创建vm的过程中,如果nova-compute想更新数据库信息,会通过Messaging 向 nova-conductor发送消息,nova-conductor负责数据库访问,这样就避免了 nova-compute 直接访问数据库,增加了系统的安全性(因为数据库是安装在控制结点上的,需要从计算结点携带密码过去)。如果虚拟机都是创建在计算结点上的,那么每个计算结点上都必需安装Hypervisor(KVM)。
Openstack的进程采用异步调用的方式(利用RabbitMQ),使得各个组件解耦合,提高了系统的性能和伸缩性。
基于 Driver 的框架:
OpenStack 的计算节点支持多种 Hypervisor,包括 KVM, Hyper-V, VMWare, Xen等。Nova-compute 为这些 Hypervisor 定义了统一的接口,hypervisor 只需要实现这些接口,就可以 driver 的形式即插即用到 OpenStack 中。
Openstack的核心:KVM-QEMU
服务器最底层是硬件层,上面一层是操作系统内核。kvm是内核中的一个模块,真正创建虚拟机等核心功能就是由它来完成的。但是kvm只能对cpu和内存进行虚拟化,无法对网络和io(磁盘)进行虚拟化。内核的上一层就是整个操作系统,qemu是里面的一个软件,用来进行网络和io的虚拟化。所以kvm和qemu一起共同实现了服务器的虚拟化,即kvm-qemu。libvirt是kvm的管理工具,可以理解为是libvirt在命令kvm-qume创建虚拟机。libvirt由libvirtd(后台deamon进程),API库和virsh命令行工具组成,上层(virt-manager图形化工具)可以调用api执行virsh命令,最终完成创建虚拟机的操作。Openstack的Nova,Cinder,Glance等组件则是直接调用libvirt API去创建虚拟机以及管理所有的vm。(QEMU是一个模拟器,它给虚拟机模拟了和物理硬件一样的环境,QEMU就是kvm-qemu)