这是 TCP CLOUD 联合创始人 & 前 CTO Jakub Pavlik 于 2017 年 7 月 9 日发布于 www.mirantis.com 的文章。本文主要介绍了 Virtlet 及其未来与 Kubernetes 相结合的一些想法。感谢文森特翻译和才云 CTO 邓德源校对。
不久前,我和一位潜在客户(非通信行业)开了一次会。该公司刚刚宣布了一个计划,意在取代现有的 OpenStack 发行版。当我们开始讨论在 Stackalytics 中找到 OpenStack 的最大贡献者时,我们发现了问题的根本,并意识到他们并不需要从最大供应商那边找到 OpenStack 发行版。
他们需要在大规模生产中运行单个应用负载。
换句话说,他们不需要多租户,自管理服务,Murano,Trove 等功能或项目。客户甚至都不想使用 OpenStack,因为通过 OpenStack 来通过不可变虚拟机镜像发布应用的方式太过复杂。
另一方面,使用 Kubernetes 来代替 OpenStack 也不是正确的方式,因为它们的应用还不能微服务化,就算要做,也至少需要 6 个月的时间来重写,重新测试和验证所有的工具。
当时我意识到在 Kubernetes 中使用标准虚拟机,并与 OpenStack SDN 相结合会有多么强大。通过这两个平台的优势,我们可以想象如何简化控制平面堆栈,去适用于诸如边缘计算,视频流等功能;这些功能目前都是以虚拟机的方式部署。这甚至可能帮 NFV 找到一个新方向。
什么是 Virtlet ?
正如我上一篇博客所说,之前的真实例子证实了我们的客户暂时还没准备好进入真实的微服务世界。为了解决这个问题,我们在 Mirantis Cloud Platform 上增加了一个名为 Virtlet 的新功能。Virtlet 是 Kubernetes 一个运行时服务,能够根据 QCOW2 映像运行 VM 工作负载。
Virtlet 是 Mirantis K8S 的伙伴们在一年前启动的项目,第一个版本通过 Flannel 实现。换句话说,Virtlet 是一个 Kubernetes CRI (Container Runtime Interface) 的实现,能够在 Kubernetes 集群上运行基于虚拟机的 Pods。( CRI 能够令 Kubernetes 运行非 Docker 的容器,例如 Rkt )
为了简化部署,Virtlet 本身作为 DaemonSet 运行,充当管理程序使 CRI 代理服务器可用于运行虚拟机,实现 Docker 和非 Docker pods 在同一个节点上运行。
下图展示了 Virtlet 的结构:
Virtlet 包含了下列的组成部分: Virtlet manager:实现虚拟化和镜像处理的 CRI 接口 Libvirt:标准 libvirt 库 Vmwrapper:为模拟器准备环境 Emulator:qemu 结合 KVM 实现的模拟器(可以禁用 KVM 嵌套虚拟化测试) CRI proxy:提供在同一 K8S node 上混合部署 docker-shim 和基于 VM 的工作负载
你可以在 github docs ( https://github.com/Mirantis/virtlet/tree/master/docs )上找到更多详细信息,但在最新的发布中,Virtlet 支持以下功能: Volumes:Virtlet 使用自定义的 FlexVolume (virtlet/flexvolume_driver) ( https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md )驱动来指定虚拟机的块设备,它支持: qcow2 ephemeral volumes raw devices Ceph RBD files stored in secrets or config maps
环境变量:你可以为你的 pods 定义环境变量,当虚拟机启动时,virtlet 使用 cloud-init 将这些值写入 / etc / cloud / environment 文件。
演示 Lab 架构
为了演示所有的功能是如何运转,我们创建了一个 lab 包含了: 3 个运行在 HA 模式中的 OpenContainer 3.1.1.x 的控制器 3 个 Kubernetes master 或 minion nodes 2 个 Kubernetes minion nodes
Kubernetes 采用 1.6 版本,使用 OpenContrail Container Network Interface (CNI) 。为了演示 Virtlet 的功能,我们同时部署基于 Ubuntu VM 的 Pod 以及基于标准容器环境的 Nginx Pod。
最终,我们在同一个 Kubernetes 集群上运行容器和虚拟机,并运行在同一个 OpenContrail 虚拟网络上。
总体而言,整个过程呈现如下: 建立包括 k8s masters,minions 以及一个 OpenContrail controllers 的基础架构。运行 Virtlet DaemonSet 的节点有特定的标签。我们使用了 extraRuntime = virtlet。(之后我们会需要) 为虚拟机创建一个 pod,在 nodeAffinity 参数中指定 extraRuntime 键,以便其在具有 Virtlet DaemonSet 的节点上运行 完成,没有第三步了。
结论
所以我们现在已经有了基本认知,我们对于如何在未来做有关 Virtlet 和 OpenContrail Kubernetes 的集成有了几个大致的想法,例如: 在 Kubernetes 中对虚拟机进行性能验证,例如将 OpenStack 上的容器化虚拟机与标准虚拟机进行比较 支持基于 iSCSI 磁盘储存 启用 OpenContrail vRouter DPDK 和 SR-IOV,扩展 OpenContrail CNI,使其可以创建先进的 NFV 集成 Virtlet 的 CPU pinning 和 NUMA 优化资源处理,例如内存的硬限制和 qemu 线程的限制 Callico 技术支持
正如你所看到的,Mirantis 正在专注于解决实际问题,并将这些解决方案推回到社区,而不是随机的贡献代码。我也想要特别感谢 Ivan Shvedunov,Dmitry Shulyak 及所有 Mirantis Kubernetes 团队,他们在这次整合中出色地完成了工作。