摘要: KVM 虚拟化服务实践
kvm 虚拟化服务
1. 架构
2. 控制层
控制层负责对外提供虚拟机相关 API。
例如在接收到创建虚拟机请求后,会封装为相应的任务,会存储在 ETCD 中。
2.1 调度
- 节点选择
- 24 小时平均 cpubusy < 50
- 15 分钟平均单核负载 < 80
- 节点数超出预设值
- 可用内存小于 1GB
- 节点内存是否足够其使用(保留内存 当前节点任务队列的已需求内存 新来的节点内存 > 物理机总内存 超卖内存)
- 磁盘是否足够使用
- 调度策略
- 按照主机域(zone)调度
- 扩容/批量多台机器选择在不同节点
- 最优节点选择
- 选择物理机已存在实例较少的
- 较少的区间里去选择cpu空闲的
3. DB
ETCD 负责存储数据。
基于 etcd 实现了任务的状态机,也存储了部分计算后的结果对外提供查询。
4. Agent
订阅了 etcd ,例如在监听到删除虚拟机的任务后,负责执行对虚拟机的指令操作。
4.1 创建虚机
获取flavor配置(4c-4g-80g)
创建对应的disk
创建基础配置
代码语言:javascript复制# tree /data/kvm/instances/
---- uuid(实例id)
---- config_drive
---- openstack
---- latest
---- meta_data.json(password/id/name/secret)
---- network_data.json
---- user_data(init script)
---- disk
---- disk.config(mkisofs)
---- libvirt.xml(kvm instance xml)
---- _base(base os image)
构建 libvirt.xml
调用 kvm 的 go-libvirt 工具库方法 DomainDefineXMLFlags
实现对虚机的创建
4.2 销毁虚机
调用 kvm 的 go-libvirt 工具库方法 DomainDestroy
实现对虚机的销毁
5. OS 管理
每个机房会部署一个程序负责镜像的存储,会分发到不同的节点。
5.1 宿主机 os 管理
宿主机在第一台虚机创建时,会去当前所在机房拉取镜像,拉完缓存在宿主机本地磁盘中,当前宿主机的所有 vm 实例(进程) 只有一个基础镜像。
Qcow2(QEMU Copy On Write) 是格式镜像是 qemu 模拟器支持的一种镜像,和普通的 Raw 格式镜像相比,具有以下优点:
- 更小的空间占用
- 支持 Copy On Write.
- 支持多级快照
- 支持压缩
- 支持 AES
当前采用的镜像格式就是 Qcow2,共享一个基础镜像,写时Copy On Write