Glance项目全部由Python编写,读者需要掌握Python语法和wsgi、evenlet、webob、paste等类库,生产环境的镜像一般存在分布式存储中因此还会涉及部分Ceph基础知识。
作用与用法
深入学习一个项目前,我们要了解这个项目的作用和使用方法。Glance提供了镜像上传和下载功能,也就是说管理员可以通过Glance来上传镜像,而普通用户可以通过Glance下载镜像进而启动虚拟机,还有用户的虚拟机快照也是保存在Glance中的。有人可能要问Glance是否实现了自己的存储引擎,实际上Glance只提供API和管理功能,并通过灵活的插件机制可以将镜像保存在本地硬盘、Ceph或者商业存储中。
Glance服务都可以通过同名的命令行工具来使用,最常用的几个命令分别是上传镜像、列举镜像和删除镜像。
# Upload image glance image-upload --file ./cirros.img --progress # List images glance image-list # Delete image glance image-delete $id |
除了glance-api和glance-registry本身的进程外,镜像服务还依赖认证服务Keystone、数据库MySQL和底层存储Ceph,注意与其他OpenStack项目相比Glance相对简单并不依赖消息队列RabbitMQ。
这些进程组合起来就实现了OpenStack的镜像服务,首先用户通过命令行工具或RESTful API发送请求,中间会经过Keystone实现的多租户认证,授权后会访问glance-api,这个服务会处理所有的API请求然后转发给glance-registry,这个服务实现了policy、quota等特性并把用户数据保存在数据库中,如果用户上传或下载镜像则会根据管理员的配置调用不同的后端存储driver,例如访问本地文件系统或者访问Ceph集群。
Glance架构相对简单,glance-api和glance-registry职责和定位也很清晰,通过driver的抽象目前已经支持LVM、Swift、S3、Ceph、Sheepdog和SAN等存储系统。
安装和部署Glance很简单,但在实际的生产环境中我们需要高可用的部署架构,我们的推荐架构是在三个API节点上分别部署glance-api和glance-registry,使用Systemd启动来保证进程持续运行,通过HAproxy和VIP实现负载均衡,而HAproxy和VIP都通过pacemaker管理以实现高可用。由于glance-api和glance-registry都是无状态的,因此在HA架构中可以实现多活同时提供服务。
在本地能够部署和体验镜像服务后,我们可以深入源码,解读OpenStack服务的实现机理。对于源码不理解的地方,我们可以通过pdb单步调试,进一步熟悉项目源码。
OpenStack项目最重要的入口时间是setup.cfg,通过glance-api脚本启动会调用glance.cmd.api库的main()函数,我们对代码进行适当的简化。
总结
最后总结下,Glance是标准的OpenStack项目架构,通过wsgi启动HTTP服务,通过paste来定制使用的组件,使用数据库来保存关键数据,熟悉Glance源码实现后看其他OpenStack项目也将更加得心应手。