virtlet 是什么?virtlet 如何管理虚拟机?
随着 Docker 和 Kubernetes 生态圈的发展,云计算领域对容器的兴趣达到了狂热的程度。容器技术为应用程序提供了隔离的运行空间,每个容器内都包含一个独享的完整用户环境空间,容器内的变动不会影响其他容器的运行环境。因为容器之间共享同一个系统内核,当同一个库被多个容器使用时,内存的使用效率会得到提升。基于物理主机操作系统内核的,那就意味着对于不同内核或者操作系统需求的应用是不可能部署在一起的。虚拟化技术则是提供了一个完整的虚拟机,为用户提供了不依赖于宿主机内核的运行环境。对于从物理服务器过渡到虚拟服务器是一个很自然的过程,从用户使用上并没有什么区别。
目前 Redhat 开源的 kubevirt 和 Mirantis 开源的 virtlet 都提供了以容器方式运行虚拟机的方案。kubevirt 是 Redhat 开源的以容器方式运行虚拟机的项目,以 k8s add-on 方式,利用 k8s CRD 为增加资源类型 Virtual Machine Instance(VMI), 使用容器的 image registry 去创建虚拟机并提供 VM 生命周期管理。 用 pod 管理能力,要自主去实现,目前 kubevirt 实现了类似 RS 的功能。
Virtlet 是什么?
Virtlet 来自于 Mirantis,跟 kubevirt 的不同之处在于它使用 POD 来描述一个 VM(Virtual Machine,虚拟机)。Virtlet 是 Kubernetes 一个运行时服务,能够根据 QCOW2 映像运行 VM 工作负载。Virtlet 是是 K8S 的一个插件,CRI 接口兼容的插件,能够在 Kubernetes 集群上运行基于虚拟机的 Pods。
Virtlet 的架构
CRIProxy 作为代理,可以实现在一个节点上支持多种 CRI。
kubelet 会去调用 CRIProxy,由 CRIProxy 根据 pod image 前缀(默认 virtlet.cloud)决定将请求发给 virtlet process 还是 dockershim server,从而去创建虚拟机或者容器。
每个节点上会由 daemonset 负责启动 virtlet pod,该 virtlet pod 包括三个容器:
virtlet:接收 CRI 调用,管理 VM
libvirt:接收 virtlet 的请求创建、停止或销毁 VM
VMs:所有 virtlet 管理的 VM 都会在这个容器的命名空间里
vm 的确在 vms container 下,可以看到对应/proc/{id}/ns/下都是一致的,其实其他 container ns 只有 mnt ns 是不一样的。
Virtlet 如何管理虚拟机
虚拟机生命周期管理流程
virtlet 使用原生的 workload(deployment,statefulset)去管理 vm pod,vm 的生命周期与 pod 一致。vm 随着 pod 的创建而创建,随着 pod 的销毁而销毁。
整体流程:
1.deploy、statefulset 等 workload 创建出对应的 pod;
2.kubelet list-watch 发现了调度到该节点的 pod,根据 cri 调用 criproxy;
3.criproxy 会根据 pod image 前缀判断是将请求发给 virtlet 还是 docker,比如 pod image 为 virtlet.cloud/library/cirrors, 根据前缀匹配到 virtlet.cloud,则将请求转给 virtlet;
4.virtlet process 会根据请求去调用 libvirt api 通过 qemu-kvm 去创建/输出虚拟机
虚拟机存储
virtlet 支持原生存储范畴:
emptydir
hostpath
pvc, 需要 mode 类型是 block
flexvolumes
secret,configmap
可以通过 annotation 字段去配置磁盘驱动以及系统磁盘大小:
metadata:
name: my-vm
annotations:
kubernetes.io/target-runtime: virtlet.cloud
VirtletRootVolumeSize: 4Gi
VirtletDiskDriver: virtio
....
VirtletRootVolumeSize 定义了根卷的磁盘大小,VirtletDiskDriver 定义了磁盘驱动,常规磁盘驱动默认为 virtio-scsi。
其中 virtlet 也支持 cloud-init 进行初始化配置,定义 ssh 密码以及相关用户、网络等初始化:
apiVersion: v1kind: Podmetadata:name: ubuntu-vmannotations:kubernetes.io/target-runtime: virtlet.cloud
virtlet 管理的虚拟机与容器如何实现整体交互
virtlet 与常规 CRI 一样,也是使用 CNI 管理虚拟机的网络。
virtlet 去调用 cni 之前,会创建出新的 network namespace,通过 tap 设备连接虚拟机,veth pair 连接主机网络与 cni 网络模型。
当前连通 virtlet 管理的虚拟机方式:
根据 virtlet pod IP 地址,直接 ssh 形式
kubectl attach 命令, virtlet 提供 attach 接口,能够以类似 console 形式访问
virtletctl 命令,提供 ssh,vps 形式
虚拟机镜像
virtlet 支持 qcow 格式的镜像文件,但需要在 pod image 定义中指定 virtlet.cloud 前缀。virtlet 会将对镜像进行名称转换, 将名称转换成虚拟机镜像下载地址。
当前 virtlet 支持两种镜像名称转换的方式:
静态配置:默认 kube-system 会创建名为 virtlet-image-translations 的 configmap
translations:
- name: cirros
url: https://github.com/mirantis/virtlet/releases/download/v0.9.3/cirros.img
- name: fedora
url: https://dl.fedoraproject.org/pub/fedora/linux/releases/29/Cloud/x86_64/images/Fedora-Cloud-Base-29-1.2.x86_64.qcow2
举个例子:
当你将 image 配置成 virtlet.cloud/cirrors, virtlet 会将该镜像转换成https://github.com/mirantis/virtlet/releases/download/v0.9.3/cirros.img,virtlet 根据该地址去下载,下载完毕后从而去创建虚拟机。
自定义对象配置:virtlet 提供 VirtletImageMapping 资源对象,相对来说,优先级会高于静态配置
apiVersion: "virtlet.k8s/v1"
kind: VirtletImageMapping
metadata:
name: primary
namespace: kube-system
spec:
prefix: ""
translations:
- ...
- ...
默认的是,virtlet 是基于文件系统进行存储虚拟机镜像,镜像存储地址如下:
/var/lib/virtlet/images
links/
example.com%whatever%etc -> ../data/2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881
example.com%same%image -> ../data/2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881
anotherimg -> ../data/a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa
data/
2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881
a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa
镜像名称中/字段转换成 %,并软连接到匹配的数据文件。
Virtlet 优缺点
优点
沿用原生 workload,virtlet 可无缝接入已有平台
复用 CRI 能力,侵入性小
缺点
引入 CRIPROXY 链路风险
限于 CRI 的整体框架内,无法灵活扩展
不支持 CSI,仅支持 flexvolume 存储驱动
不支持备份与迁移等能力
社区活跃度低,已不再继续维护
整体来说,virtlet 是一种接入成本低,能够快速融入已有云平台的方式,但由于社区已不维护且本身 CRI 方式对接的局限性,对后续的可扩展性以及迭代开发来说,其可扩展方式不够优雅且低,迭代开发难度相对来说大。
版权声明: 本文为 InfoQ 作者【谐云】的原创文章。
原文链接:【http://xie.infoq.cn/article/344042f9308222face3d24bf0】。文章转载请联系作者。
评论