这是 TCP CLOUD 联合创始人 & 前 CTO Jakub Pavlik 于 2017 年 7 月 9 日发布于 www.mirantis.com 的文章。本文主要介绍了 Virtlet 及其将来与 Kubernetes 相结合的一些想法。感谢文森特翻译和才云 CTO 邓德源校对。node
不久前,我和一位潜在客户(非通讯行业)开了一次会。该公司刚刚宣布了一个计划,意在取代现有的 OpenStack 发行版。当咱们开始讨论在 Stackalytics 中找到 OpenStack 的最大贡献者时,咱们发现了问题的根本,并意识到他们并不须要从最大供应商那边找到 OpenStack 发行版。git
他们须要在大规模生产中运行单个应用负载。github
换句话说,他们不须要多租户,自管理服务,Murano,Trove 等功能或项目。客户甚至都不想使用 OpenStack,由于经过 OpenStack 来经过不可变虚拟机镜像发布应用的方式太过复杂。docker
另外一方面,使用 Kubernetes 来代替 OpenStack 也不是正确的方式,由于它们的应用还不能微服务化,就算要作,也至少须要 6 个月的时间来重写,从新测试和验证全部的工具。服务器
当时我意识到在 Kubernetes 中使用标准虚拟机,并与 OpenStack SDN 相结合会有多么强大。经过这两个平台的优点,咱们能够想象如何简化控制平面堆栈,去适用于诸如边缘计算,视频流等功能;这些功能目前都是以虚拟机的方式部署。这甚至可能帮 NFV 找到一个新方向。网络
什么是 Virtlet?架构
正如我上一篇博客所说,以前的真实例子证明了咱们的客户暂时还没准备好进入真实的微服务世界。为了解决这个问题,咱们在 Mirantis Cloud Platform 上增长了一个名为 Virtlet 的新功能。Virtlet 是 Kubernetes 一个运行时服务,可以根据 QCOW2 映像运行 VM 工做负载。app
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/v...)上找到更多详细信息,但在最新的发布中,Virtlet 支持如下功能:
Volumes:Virtlet 使用自定义的 FlexVolume (virtlet/flexvolume_driver) (https://github.com/kubernetes...)驱动来指定虚拟机的块设备,它支持:
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 团队,他们在此次整合中出色地完成了工做。