戴洁
许多IT专业人士想走向原生云,但是,有传统的工作负载,比如单体,它只能在虚拟机上运行。可以为云原生工作负载和遗留工作负载维护单独的环境。但是,如果能找到一种方法将虚拟机集成到云原生设置中,这样就可以无缝地管理它们。
在研究这些工具之前,看看为什么在由容器化、松散耦合、云原生工作负载组成的环境中运行虚拟机很重要。
主要原因很简单:承载遗留工作负载的虚拟机不会消失,但维护单独的托管环境以运行它们是一种负担,同时,转换遗留工作负载以满足云原生标准可能是必须的。虽然理论上会有时间和资源来重构遗留工作负载,以便它们可以在云原生环境中本机运行,但这在现实世界中并不总是可行的。因此,需要一些工具,比如下面描述几种开源解决方案,它们可以让遗留虚拟机工作负载与云原生工作负载和平共处。
在云原生环境中部署虚拟机的最流行解决方案可能是KubeVirt。
KubeVirt的工作原理是在Kubernetes pod内运行虚拟机。如果想在容器旁边运行虚拟机,那么只需将KubeVirt安装到现有的Kubernetes集群中。
然后,创建并应用一个YAML文件,该文件描述了要运行的每个虚拟机。KubeVirt在一个容器中执行每台机器,因此从Kubernetes的角度来看,VM只是一个常规的pod。然而,仍然可以获得虚拟机镜像、持久存储以及固定的CPU和内存分配,就像使用传统虚拟机一样。
这意味着KubeVirt基本上不需要更改虚拟机,要做的就是安装KubeVirt并为虚拟机创建部署,使其作为pod运行。
Virtlet
如果想真正地将虚拟机做为pod,你可能会喜欢Mirantis的开源工具Virtlet。
与KubeVirt相似,因为Virtlet还允许在Kubernetes pod内运行虚拟机。这2种工具之间的关键区别在于,Virtlet将虚拟机更深入地集成到Kubernetes pod规范中。这意味着可以使用Virtlet进行操作,例如将虚拟机作为守护程序集或复制集的一部分进行管理,而这是使用原生KubeVirt无法完成的。KubeVirt具有相同的功能,但它们是附加组件,而不是Kubernetes的原生部分。
如果不想将虚拟机当作容器来管理,该怎么办?如果想把它们像虚拟机一样对待,同时仍然允许它们与微服务轻松集成,该怎么办?
最好的解决方案是将虚拟机连接到Istio,即开源服务网格。在这种方法下,可以使用标准虚拟机工具部署和管理虚拟机,同时仍然可以通过Istio管理网络、均衡负载等。
不幸的是,将虚拟机连接到Istio的过程相对繁琐,目前很难实现自动化,它需要为每个要连接的虚拟机安装Istio,为它们配置命名空间,然后将每个虚拟机连接到Istio。
另一种方法是采用非云原生平台运行虚拟机,然后将云原生工具移植到该平台上。
如果在OpenStack上同时运行VM和容器,就会得到这样的结果。OpenStack最初设计用于部署虚拟机和其他类型的资源以构建私有云。但是OpenStack现在也可以托管Kubernetes。
因此,可以使用OpenStack部署和管理虚拟机,同时通过Kubernetes在OpenStack上运行云原生容器化工作负载。最终会有2个编排层:底层OpenStack安装和Kubernetes环境,因此从管理角度来看,这种方法更为复杂。
它的好处是可以使虚拟机和容器彼此相对独立,因为虚拟机不是Kubernetes的一部分,也不会局限于使用Kubernetes工具來管理虚拟机,可以将虚拟机视为标准虚拟机,将容器视为标准容器。
开源生态系统提供了许多方法来帮助虚拟机与云原生工作负载共存。一般来说,最佳解决方案取决于是想采取以Kubernetes为中心的方法(在这种情况下,KubeVirt或Virtlet是最好的选择),还是想允许虚拟机与容器共存,而不与容器紧密集成(在这种情况下OpenStack最有意义)。如果只想在网络级别而不是编排级别进行集成,请考虑将虚拟机连接到Istio服务网格。