遺留工作負(fù)載是否阻止你走向云原生?這里有四種解決方案,可以在云原生環(huán)境中運(yùn)行虛擬機(jī)。
許多IT專業(yè)人士想走向原生云。但是,你有傳統(tǒng)的工作負(fù)載,比如單體,它只能在虛擬機(jī)上運(yùn)行。
你可以為云原生工作負(fù)載和遺留工作負(fù)載維護(hù)單獨(dú)的環(huán)境。但是,如果你能找到一種方法將虛擬機(jī)集成到你的云原生設(shè)置中,這樣你就可以無(wú)縫地管理它們,不是更好嗎?
幸運(yùn)的是,有這樣的方法。本文介紹了在云原生環(huán)境中運(yùn)行虛擬機(jī)的四種開源解決方案,只需很少的重新配置或調(diào)整。
為什么在云原生環(huán)境中運(yùn)行虛擬機(jī)?
在研究這些工具之前,讓我們先看看為什么能夠在由容器化、松散耦合、云原生工作負(fù)載組成的環(huán)境中運(yùn)行虛擬機(jī)很重要。
主要原因很簡(jiǎn)單:承載遺留工作負(fù)載的虛擬機(jī)不會(huì)消失,但維護(hù)單獨(dú)的托管環(huán)境以運(yùn)行它們是一種負(fù)擔(dān)。
同時(shí),轉(zhuǎn)換遺留工作負(fù)載以滿足云原生標(biāo)準(zhǔn)可能是必須的。雖然理論上你會(huì)有時(shí)間和工程資源來(lái)重構(gòu)遺留工作負(fù)載,以便它們可以在云原生環(huán)境中本機(jī)運(yùn)行,但這在現(xiàn)實(shí)世界中并不總是可能的。
因此,你需要工具,比如下面描述的四種開源解決方案之一,讓遺留虛擬機(jī)工作負(fù)載與云原生工作負(fù)載和平共處。
1.使用KubeVirt運(yùn)行虛擬機(jī)
在云原生環(huán)境中部署虛擬機(jī)的最流行解決方案可能是KubeVirt。
KubeVirt的工作原理是在Kube.NETes pod內(nèi)運(yùn)行虛擬機(jī)。如果你想在容器旁邊運(yùn)行虛擬機(jī),那么只需將KubeVirt安裝到現(xiàn)有的Kubernetes集群中,其中包含:
export RELEASE=v0.35.0
# Deploy the KubeVirt operator
kubectl Apply -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml
# Create the KubeVirt CR (instance deployment request) which triggers the actual installation
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml
# wait until all KubeVirt components are up
kubectl -n kubevirt wait kv kubevirt --for condition=Available
然后,創(chuàng)建并應(yīng)用一個(gè)YAML文件,該文件描述了要運(yùn)行的每個(gè)虛擬機(jī)。KubeVirt在一個(gè)容器中執(zhí)行每臺(tái)機(jī)器,因此從Kubernetes的角度來(lái)看,VM只是一個(gè)常規(guī)的pod(有一些限制,將在下一節(jié)中討論)。然而,你仍然可以獲得虛擬機(jī)鏡像、持久存儲(chǔ)以及固定的CPU和內(nèi)存分配,就像使用傳統(tǒng)虛擬機(jī)一樣。
這意味著KubeVirt基本上不需要更改虛擬機(jī)。你所要做的就是安裝KubeVirt并為虛擬機(jī)創(chuàng)建部署,使其作為pod運(yùn)行。
2.Virtlet方法
如果你想真正致力于將虛擬機(jī)視為pod,你可能會(huì)喜歡Mirantis的開源工具Virtlet。
Virtlet與KubeVirt相似,因?yàn)閂irtlet還允許你在Kubernetes pod內(nèi)運(yùn)行虛擬機(jī)。這兩種工具之間的關(guān)鍵區(qū)別在于,Virtlet將虛擬機(jī)更深入地集成到Kubernetes pod規(guī)范中。這意味著你可以使用Virtlet進(jìn)行操作,例如將虛擬機(jī)作為守護(hù)程序集或復(fù)制集的一部分進(jìn)行管理,而這是使用原生KubeVirt無(wú)法完成的(KubeVirt具有相同的功能,但它們是附加組件,而不是Kubernetes的原生部分)。
Mirantis還說(shuō),Virtlet通常比KubeVirt提供更好的網(wǎng)絡(luò)性能,不過(guò)這很難確切知道,因?yàn)榫W(wǎng)絡(luò)配置中涉及到太多變量。
3.ISIO對(duì)虛擬機(jī)的支持
如果你不想將虛擬機(jī)當(dāng)作容器來(lái)管理,該怎么辦?如果你想把它們像虛擬機(jī)一樣對(duì)待,同時(shí)仍然允許它們與微服務(wù)輕松集成,該怎么辦?
最好的解決方案可能是將你的虛擬機(jī)連接到Istio,即開源服務(wù)網(wǎng)格。在這種方法下,你可以使用標(biāo)準(zhǔn)虛擬機(jī)工具部署和管理虛擬機(jī),同時(shí)仍然可以通過(guò)Istio管理網(wǎng)絡(luò)、均衡負(fù)載等。
不幸的是,將虛擬機(jī)連接到Istio的過(guò)程相對(duì)繁瑣,目前很難實(shí)現(xiàn)自動(dòng)化。它歸結(jié)為在每個(gè)要連接的虛擬機(jī)上安裝Istio,為它們配置命名空間,然后將每個(gè)虛擬機(jī)連接到Istio。
4.容器和虛擬機(jī)與OpenStack并排
到目前為止,我們所研究的技術(shù)包括采用Kubernetes或Istio等云原生平臺(tái),并向其添加虛擬機(jī)支持。
另一種方法是采用非云原生平臺(tái),運(yùn)行虛擬機(jī),然后將云原生工具移植到該平臺(tái)上。
如果在OpenStack上同時(shí)運(yùn)行VM和容器,就會(huì)得到這樣的結(jié)果。OpenStack最初設(shè)計(jì)用于部署虛擬機(jī)(以及其他類型的資源)以構(gòu)建私有云。但是OpenStack現(xiàn)在也可以托管Kubernetes。
因此,你可以使用OpenStack部署和管理虛擬機(jī),同時(shí)通過(guò)Kubernetes在OpenStack上運(yùn)行云原生容器化工作負(fù)載。最終會(huì)有兩個(gè)編排層——底層OpenStack安裝和Kubernetes環(huán)境——因此從管理角度來(lái)看,這種方法更為復(fù)雜。
然而,它的主要好處是,你可以使虛擬機(jī)和容器彼此相對(duì)獨(dú)立,因?yàn)樘摂M機(jī)不是Kubernetes的一部分。你也不會(huì)局限于使用Kubernetes工具來(lái)管理虛擬機(jī)。您可以將虛擬機(jī)視為標(biāo)準(zhǔn)虛擬機(jī),將容器視為標(biāo)準(zhǔn)容器。
結(jié)論
開源生態(tài)系統(tǒng)提供了許多方法來(lái)幫助虛擬機(jī)與云原生工作負(fù)載共存。對(duì)你來(lái)說(shuō),最佳解決方案取決于你是想采取以Kubernetes為中心的方法(在這種情況下,KubeVirt或Virtlet是最好的選擇),還是想允許虛擬機(jī)與容器共存,而不與容器緊密集成(在這種情況下,OpenStack最有意義)。如果你只想在網(wǎng)絡(luò)級(jí)別而不是編排級(jí)別進(jìn)行集成,請(qǐng)考慮將虛擬機(jī)連接到Istio服務(wù)網(wǎng)格。