KVM 虚拟化服务实践

摘要:
KVM 虚拟化服务实践

kvm 虚拟化服务

1. 架构

kvm-architecture

2. 控制层

控制层负责对外提供虚拟机相关 API。

例如在接收到创建虚拟机请求后,会封装为相应的任务,会存储在 ETCD 中。

2.1 调度

  • 节点选择
    1. 24 小时平均 cpubusy < 50
    2. 15 分钟平均单核负载 < 80
    3. 节点数超出预设值
    4. 可用内存小于 1GB
    5. 节点内存是否足够其使用(保留内存 + 当前节点任务队列的已需求内存 + 新来的节点内存 > 物理机总内存 + 超卖内存)
    6. 磁盘是否足够使用
  • 调度策略
    1. 按照主机域(zone)调度
    2. 扩容/批量多台机器选择在不同节点
  • 最优节点选择
    1. 选择物理机已存在实例较少的
    2. 较少的区间里去选择cpu空闲的

3. DB

ETCD 负责存储数据。

基于 etcd 实现了任务的状态机,也存储了部分计算后的结果对外提供查询。

4. Agent

订阅了 etcd ,例如在监听到删除虚拟机的任务后,负责执行对虚拟机的指令操作。

4.1 创建虚机

  1. 获取flavor配置(4c-4g-80g)

  2. 创建对应的disk

  3. 创建基础配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 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)
  4. 构建 libvirt.xml

    libvirt-cpu libvirt-devices

调用 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