背景
随着虚拟化技术成为主流的基础架构解决方案,民生银行一直在致力于虚拟化能力提升。KVM作为主流的开源虚拟化解决方案,非常适合我们去投入精力研究。首先,Linux内核自带的虚拟化功能并不绑定厂商及硬件平台。无论是x86、arm还是其他各类服务器只要能运行Linux的平台都可以交付虚拟化对象。其次,它不像vmware这种闭源黑盒产品,我们很难深究其原理,后续的运维开发难度也比较大。第三,在国际关系新格局的大争之世环境下,“加快推进国产自主可控替代计划,构建安全可控的信息技术体系”已纳入十九大精神,国家大力发展安可生态。虚拟化技术在安可体系中还处于一个真空地带,我们没有过多的可供选择的成熟方案。基于以上三点,花一些时间深入研究KVM虚拟化,今后对于虚拟化解决方案就多了一种选择。
02
思考
1
高可用的实现
KVM是Linux内核提供的功能,它能在一台物理硬件上交付虚拟化资源,但它不具备虚拟机及宿主机的高可用。而诸如Proxmox VE、Ovirt、乃至像openstack这种IaaS云平台,它内部的高可用都是自行实现的。因此构建平台实现虚拟机及宿主机的高可用是我们要面对的核心问题之一。而高可用中如何避免故障转移或物理拓扑异常时发生虚拟机脑裂,更是我们要攻克的难关中的难关。
2
架构轻量化
我们知道openstack被诟病最多的地方是什么?架构过重,项目孵化过于纷繁。这样的架构及演进路线对运维团队要求太高了,从人力角度需要各类专家才能支撑如此庞大的软件集合。就连最初孵化openstack的NASA也选择了放弃了自己的“亲儿子”,最终openstack跌落神坛。因此架构的轻量化一直是我们追寻的目标。
3
平台对接
虚拟化平台作为一个资源交付的平台,它应该为用户提供是全生命周期基础环境服务,而其上不仅计算资源,还要有虚拟化的网络及存储资源。虽然它并不是云,但我们可以同网络团队工具、存储团队工具、流程平台、及民生IPaaS进行联动对接实现云的功能。这就面临着我们自身如何选择支持的网络类型、存储类型的选型及平台对接所用的API接口开发等一系列问题。
4
友好的运维交互
“KVM客户端命令行的参数太多了,再加上其他组件的命令行,简直没法玩根本记不住。”一位新手工程师抱怨道;“这做一次变更怎么这么多步骤啊,头大,别再操作错了。”一位正在变更的运维工程师盘算着;“有宿主机要停机换备件,我不是os岗,应该怎么弄啊?”一位不熟悉环境的值班工程师懵了。向以上情况说NO,一个成熟的平台目标就是让我们日常操作“点一点”就行,谁上都一样!
03
设计与实现
1
整体架构
确定以KVM和qemu为hypervisor,基于libvirt库开发的C/S架构实现集群构建。逻辑架构主要分为用户接口(UI)层、服务端(Server)、客户端(Client)、存储(Storage)、网络(network)共五层。
2
UI层
用户接口层主要是平台外部的交互层,它可以是平台的dashboard、可以是基础环境基础服务平台的自动化模块、也可以是IPaaS。只要调用了平台开放的API都可以使用平台相应的功能。
3
Server层
Server层主要是由自主开发的Server-agent组成Server-service,可以部署在物理机、虚拟机或者是容器上,主要功能如下:
⚫ 与client-agent定期通信进行心跳检测。确定集群内的宿主机是否有正常可以与server正常通信。
⚫ 定期收集client-agent上报的宿主机配置信息,包括:CPU、内存、运行的虚拟机。
⚫ 定期收取client-agent上报的存储租约更新情况。确定集群内的宿主机是否可以正常访问存储。
⚫ 响应外部调用,例如:批量部署虚拟机、配置虚拟机、虚拟机热迁移等。将指令下达给Client-agent并有client完成操作。
⚫ 故障转移,即在宿主机发生故障时,将虚拟机转移至最优质宿主机上。
⚫ 日志及配置记录入库。
Server端的逻辑架构图下,Server-agent为无状态应用,可组成Server-Service,通过负载均衡的Service IP对外提供服务。
4
Client层
Client层主要包括宿主机和Client-agent,宿主机为虚拟机提供硬件资源并承载Client-agent,Client-agent主要功能如下:
⚫ 定期收集各自宿主机的配置信息上报给Server-Service。
⚫ 定期更新各自宿主机的VM配置文件至共享存储。
⚫ 定期更新存储租约,用于向Server-Service上报集群内节点与存储连接的状态。
⚫ 应答Server-Service的心跳探测,用于向Server-service上报内节点的活性。
⚫ 响应Server下达的指令完成虚拟化集群对象操作。
Client的逻辑架构如下,Client-agent通过libvirt-python调用系统的libvirt库实现其各种功能。
5
存储层
存储层主要是为集群内的虚拟机提供存储空间。它可以是文件系统也可以是块设备,但必须是共享给集群内宿主机的共享存储。
存储层存放的对象共四种:
1)虚拟机的镜像及模板
将定制好的OS基础镜像作为模板放到共享存储上,后续创建虚拟机时都是基于OS基础镜像来克隆。
2)虚拟机的配置文件
理论上每个虚拟机的xml配置文件是存放在本地的,但是这就会带来一个问题,当宿主机宕机时我们无法获取xml那如何能实现快速的故障切换呢?因此在虚拟机创建后会备份一份配置文件到共享存储,并定期更新。当需要发生切换后会使用共享存储上的xml在其他宿主机节点拉起虚拟机,并同时在共享存储在创建一个新的配置文件。当故障节点恢复后,我们会将原有节点本地和存储上的配置文件都删除。保证集群内同一个虚拟机只在存储和运行虚拟机的本地各保留一份配置文件。
3)镜像锁
我们知道在使用共享存储时面临一个问题,因为存储上的数据是可以被所有节点读到的,那么在一些情况下我们虚拟机的镜像可能在集群内的两个节点同时拉起,这就会引起虚拟机损坏。所以我们需要在共享存储上引入虚拟机镜像的锁机制保证只有拿到锁的宿主机节点可以运行虚拟机。
4)存储租约
存储租约的主要是为了将节点连接存储的状态上报给server,首先,宿主机节点要定期更新本节点在存储上的租约。第二,当集群内有一台运行虚拟机的宿主机与server的通信中断成为孤岛时,通过其他能和server通信的节点将孤岛节点的存储租约更新情况上报给server。
存储的逻辑架构图如下。
6
网络层
虚拟化集群在逻辑的网络层面可以分为心跳网络、管理网络及存储网络三种。
⚫ 心跳网络,用于server到client的连接探活。
⚫ 管理网络,用于访问集群及集群操作指令下发。
⚫ 业务网络,用于虚拟机对外提供服务。
⚫ 存储网络,用于宿主机访问存储空间。
各网络状态变迁流程分支如下:
物理网络层面,服务器配置4个10G网口进行主备绑定为bond0、bond1。将逻辑网络中的管理网、心跳网及虚拟机业务网安置在bond0,存储网络安置在bond1。因bond0承载虚拟机的业务可能涉及的网段非常多,因此bond0的网络端要进行trunk接入;宿主机端使用linux-brige或Open-vswitch插件来实现虚拟机的网络出访。
04
实践
对接自动化平台实现自动化交付资源
1
引入
在创建KVM虚拟机时涉及大量的参数输入,创建虚拟机完成后还要对虚拟机的OS进行主机名、IP、网关等配置操作。通过人力完成效率低易出错。流程平台+IPaaS+自动化+虚拟化可以实现自助的虚拟机资源申请,极大提升交付效率。这里仅通过与自动化平台的对接验证资源的自动批量交付。
2
环境
Server端
vmware虚拟机一台作为部署server端使用
Client端
8 CPUs、32G物理内存储4台,每服务器万兆网卡*2、千兆兆网卡*2
存储
300G NAS存储
自动化
测试环境基础环境基础服务平台自动化模块,基于ansible的自动化平台
3
流程
4
执行
登录测试自动化平台找到提前录入的虚拟机批量创建脚本,并录入参数。创建主机名为vmautocreate81~90共10台虚拟机。
执行脚本:
参数输入,每个虚拟机均为2颗cpu、1G内存、外挂一块1G硬盘、一块网卡、操作系统为SLES 12 SP4:
从平台返回执行结果,10台虚拟机创建并配置完成共用时867秒。现有版本Client创建虚拟机是串行处理参数因此效率比较低。但是可以看到单台创建及配置平均也只需要87秒左右。对比现在生产通过IPaaS平台调度创建VMware虚拟机单台240秒左右时间效率提升近3倍。后续并行处理功能上线后,交付效率还将有飞跃式提升。
虚拟机创建完成后,虚拟机配置及网络配置完成
虚拟机均可以ping通,
05
总结
现在测试环境已经部署了一套集群,上面已经开始提供SLES12SP4及CentOS7.4的KVM虚拟机服务。存储选型暂时为NAS存储。网络使用Linux-Brige实现虚拟机外访,欢迎大家试用指导。除了Server及Client为开发完成其余均是使用Linux操作系统自带组件,架构简单。
已实现功能
⚫ 最优主机选择机制。
⚫ 基于NAS存储的镜像锁,防止虚拟机脑裂。
⚫ 宿主机高可用故障转移。
⚫ 某Client节点与Server失联后,Client节点与其连接 的存储节点状态的旁路上报机制。
⚫ 创建虚拟机的API封装。
⚫ 基于配置的Client自动发现扩容功能。
现在我们已经对于KVM虚拟化研究迈出了小小一步。后续我们将更深入的探索KVM及其解决方案,研究KVM使用分布式存储作为持久化数据层的可行性、研究Open-vswitch能为KVM虚拟化的网络带来的灵活性,同时也完善接口的开发设计。争取能在研究技术的同时,在设计上也迈出一小步,实现一个标准、轻量、可控、高效的虚拟化平台。
张希尧:任职于系统管理中心负责Linux操作系统、虚拟化运维开发、系统运维工具建设工作。