幾年前,你可以構(gòu)建一個(gè)在虛擬機(jī)中運(yùn)行應(yīng)用程序的基礎(chǔ)設(shè)施,其中一些裸機(jī)用于傳統(tǒng)應(yīng)用程序。隨著基礎(chǔ)設(shè)施的發(fā)展,虛擬機(jī)(VM)實(shí)現(xiàn)了更高水平的效率和敏捷性,但單靠虛擬機(jī)并不能完全滿足敏捷應(yīng)用部署的需求。它們繼續(xù)作為運(yùn)行許多應(yīng)用程序的基礎(chǔ),但越來(lái)越多的開(kāi)發(fā)人員關(guān)注容器的發(fā)展趨勢(shì),以更好地開(kāi)發(fā)和部署應(yīng)用程序——因?yàn)槿萜魈峁┝烁呒?jí)別的敏捷性和效率。
像Docker和Kubernetes這樣的容器技術(shù)正在成為構(gòu)建容器化應(yīng)用程序的主要標(biāo)準(zhǔn)。它們幫助企業(yè)擺脫了限制開(kāi)發(fā)敏捷性的復(fù)雜性。容器、容器基礎(chǔ)設(shè)施和容器部署技術(shù)已經(jīng)被證明是非常強(qiáng)大的抽象,可以應(yīng)用于許多不同的用例。通過(guò)使用Kubernetes等技術(shù),企業(yè)可以交付一個(gè)僅使用容器交付應(yīng)用程序的云。
但是領(lǐng)先的私有云不僅僅是容器,容器并不適合所有的工作負(fù)載和用例,F(xiàn)在,大多數(shù)私有云基礎(chǔ)設(shè)施都需要包含用于管理基礎(chǔ)設(shè)施的裸機(jī)、用于傳統(tǒng)應(yīng)用程序的虛擬機(jī)以及用于較新應(yīng)用程序的容器。支持、管理和協(xié)調(diào)這三種方法的能力是運(yùn)營(yíng)效率的關(guān)鍵。
OpenStack目前是構(gòu)建私有云的最佳選擇,它能夠管理網(wǎng)絡(luò)、存儲(chǔ)和計(jì)算基礎(chǔ)設(shè)施,支持來(lái)自一個(gè)控制平面的虛擬機(jī)、裸機(jī)和容器。雖然Kubernetes可以說(shuō)是最受歡迎的容器編排器,并且已經(jīng)改變了應(yīng)用程序交付的方式,但它取決于可靠的云基礎(chǔ)設(shè)施的可用性,而OpenStack為托管應(yīng)用程序提供了最全面的開(kāi)源基礎(chǔ)設(shè)施。OpenStack的多租戶云基礎(chǔ)設(shè)施非常適合Kubernetes,擁有多個(gè)集成點(diǎn)、部署解決方案以及跨多個(gè)云聯(lián)合的能力。
在本文中,我們將探討容器如何在OpenStack中工作,查看各種用例,并提供讓容器成為易于采用和使用的技術(shù)的OpenStack等開(kāi)源項(xiàng)目的概述。
OpenStack中容器的總體視圖
容器和OpenStack的交匯有三個(gè)主要場(chǎng)景。
第一個(gè)場(chǎng)景稱為基礎(chǔ)設(shè)施容器,允許運(yùn)維者使用容器來(lái)改善云基礎(chǔ)設(shè)施的部署、管理和運(yùn)維。在這種情況下,容器設(shè)置在裸機(jī)基礎(chǔ)設(shè)施上,并允許對(duì)主機(jī)資源進(jìn)行特權(quán)訪問(wèn)。這種訪問(wèn)使它們能夠直接利用計(jì)算、網(wǎng)絡(luò)和存儲(chǔ)資源,容器運(yùn)行時(shí)通常不為用戶所見(jiàn)。這些容器隔離了每個(gè)應(yīng)用程序所依賴的復(fù)雜的依賴關(guān)系集,同時(shí)允許基礎(chǔ)設(shè)施應(yīng)用程序直接管理和操作底層系統(tǒng)資源。當(dāng)要升級(jí)服務(wù)時(shí),可以在不改變依賴關(guān)系的情況下處理升級(jí)。
新版本的OpenStack已經(jīng)接受了這種基礎(chǔ)設(shè)施容器模型,現(xiàn)在通常使用編排工具和容器化服務(wù)的組合來(lái)管理OpenStack部署的整個(gè)生命周期。基礎(chǔ)設(shè)施容器使運(yùn)維者能夠使用容器編排技術(shù)來(lái)解決許多問(wèn)題,特別是快速迭代/升級(jí)現(xiàn)有軟件(包括OpenStack)。在容器中運(yùn)行OpenStack有助于解決時(shí)間要求較高的挑戰(zhàn),包括為服務(wù)添加新組件,快速升級(jí)軟件版本以及跨機(jī)器和數(shù)據(jù)中心快速滾動(dòng)更新。這種方法將容器的敏捷性帶入了OpenStack的部署和升級(jí)。
第二個(gè)場(chǎng)景是關(guān)于在云基礎(chǔ)設(shè)施上托管容器化的應(yīng)用程序框架。這可以包括Docker Swarm和Kubernetes等容器編排引擎(COE),或者更輕量級(jí)的容器專用服務(wù)和無(wú)服務(wù)器應(yīng)用程序編程接口(API)。無(wú)論是在裸機(jī)還是虛擬機(jī)上,OpenStack社區(qū)都致力于確保可以在安全的、租戶隔離的云主機(jī)上交付容器化應(yīng)用程序。驅(qū)動(dòng)程序促進(jìn)了這種場(chǎng)景,這些驅(qū)動(dòng)程序允許像Kubernetes這樣的項(xiàng)目直接利用OpenStack API進(jìn)行存儲(chǔ)、負(fù)載均衡和身份識(shí)別。它還包括用于按需提供托管Kubernetes集群和應(yīng)用程序容器的API。借助這些功能,開(kāi)發(fā)團(tuán)隊(duì)可以編寫新的容器化應(yīng)用程序,并在OpenStack云中快速提供Kubernetes集群。這是一個(gè)完整的應(yīng)用程序生命周期解決方案,提供開(kāi)發(fā)、測(cè)試和調(diào)試代碼所需的資源,并通過(guò)強(qiáng)大的自動(dòng)化功能將應(yīng)用程序部署到生產(chǎn)環(huán)境中。
在最后一個(gè)場(chǎng)景中,我們考慮了獨(dú)立OpenStack和COE部署之間的交互,在本文特指Kubernetes集群?鏞penStack和Kubernetes集群的API的一致性和互操作性是此場(chǎng)景成功的關(guān)鍵。例如,Kubernetes可以直接連接到OpenStack Cinder托管卷,使用OpenStack Keystone作為授權(quán)和身份驗(yàn)證后端,或者作為網(wǎng)絡(luò)覆蓋連接到OpenStack Neutron。反過(guò)來(lái),OpenStack云可能與Neutron驅(qū)動(dòng)共享相同的網(wǎng)絡(luò)覆蓋。第三種場(chǎng)景不太關(guān)注云服務(wù)的托管方式(無(wú)論是Kubernetes還是OpenStack),而是更多地關(guān)注獨(dú)立的服務(wù)如何交互。
OpenStack容器集成點(diǎn)
在容器上部署OpenStack基礎(chǔ)設(shè)施
正如介紹中指出的那樣,隨著容器的崛起,OpenStack的部署和管理發(fā)生了顯著變化,因?yàn)槿萜鲙?lái)了管理基礎(chǔ)設(shè)施代碼的新方法。以前的管理策略需要?jiǎng)?chuàng)建和維護(hù)重量級(jí)的“黃金”機(jī)器鏡像,或者使用脆弱的狀態(tài)維護(hù)配置管理系統(tǒng)。每種方法都有其復(fù)雜性和限制。進(jìn)一步增加難度的是管理一系列服務(wù),這些服務(wù)都需要各自的依賴關(guān)系,而這些依賴關(guān)系在每個(gè)發(fā)布中都會(huì)變化。如果沒(méi)有某種形式的應(yīng)用程序隔離,解決依賴關(guān)系變得很困難。
基礎(chǔ)設(shè)施容器使新的OpenStack部署項(xiàng)目能夠在兩者之間取得平衡,同時(shí)很好地解決了依賴性問(wèn)題。使用輕量級(jí)、獨(dú)立、自包含且通常為無(wú)狀態(tài)的應(yīng)用程序容器,云運(yùn)維者在部署復(fù)雜的控制平面時(shí)可獲得極大的靈活性。結(jié)合容器運(yùn)行時(shí)和編排引擎,基礎(chǔ)設(shè)施容器使得快速部署、維護(hù)和升級(jí)復(fù)雜且高度可用的基礎(chǔ)設(shè)施成為可能。
在構(gòu)建OpenStack集群時(shí),選擇部署技術(shù)要考慮多個(gè)維度。運(yùn)維者可以為其基本容器選擇Linux Containers(LXC)或Docker,使用預(yù)先構(gòu)建的或定制的應(yīng)用程序容器,并選擇用于編排的傳統(tǒng)配置管理系統(tǒng)或像Kubernetes這樣的更現(xiàn)代的方法。表1總結(jié)了現(xiàn)有的OpenStack部署項(xiàng)目及其基礎(chǔ)技術(shù)。
在這些部署系統(tǒng)之下,是為OpenStack代碼和支持服務(wù)構(gòu)建一組容器的不同方法。OpenStack Ansible(OSA)和Kolla項(xiàng)目提供了自己的項(xiàng)目托管構(gòu)建系統(tǒng),而LOCI則側(cè)重于構(gòu)建項(xiàng)目應(yīng)用程序容器,不考慮特定的編排系統(tǒng)。在高層面上,它們之間的差異是:
- OSA的獨(dú)特之處在于它依賴于較低層次的LXC容器,并且具有用于創(chuàng)建LXC應(yīng)用程序容器的自定義構(gòu)建系統(tǒng)。
- Kolla構(gòu)建系統(tǒng)生成Docker容器(每個(gè)服務(wù)都有一個(gè)容器),還有支持初始化和管理OpenStack部署的容器。Kolla容器具有高度可配置性,可選擇基本操作系統(tǒng)、源或軟件包安裝,以及用于進(jìn)一步定制的模板引擎。
- 構(gòu)建OpenStack應(yīng)用程序容器的最終選擇是LOCI。LOCI也構(gòu)建Docker容器,為每個(gè)項(xiàng)目提供一個(gè)容器。LOCI專注于快速生產(chǎn)緊湊和安全的容器,并期望它們被部署系統(tǒng)用為基礎(chǔ)。
裸機(jī)基礎(chǔ)設(shè)施——OpenStack和解決Bootstrap問(wèn)題
每個(gè)云的基礎(chǔ)中,都有一個(gè)承載基礎(chǔ)設(shè)施服務(wù)的裸機(jī)服務(wù)器數(shù)據(jù)中心。即使是“無(wú)服務(wù)器計(jì)算”,也在數(shù)據(jù)中心硬件上的云上運(yùn)行軟件。如何引導(dǎo)硬件基礎(chǔ)設(shè)施的問(wèn)題是OpenStack軟件有獨(dú)特資格來(lái)解決的一個(gè)關(guān)鍵問(wèn)題,它可以提供類似于云的裸機(jī)管理質(zhì)量。
OpenStack Ironic提供裸機(jī)即服務(wù)。作為獨(dú)立服務(wù),它可以發(fā)現(xiàn)裸機(jī)節(jié)點(diǎn),在管理數(shù)據(jù)庫(kù)中對(duì)其進(jìn)行編目,并管理整個(gè)服務(wù)器生命周期(包括注冊(cè)、提供、維護(hù)和退役)。當(dāng)用作OpenStack Nova的驅(qū)動(dòng)程序并結(jié)合全套OpenStack服務(wù)時(shí),它可以提供強(qiáng)大的類似云的服務(wù)來(lái)管理整個(gè)裸機(jī)基礎(chǔ)設(shè)施。
這引出了一個(gè)問(wèn)題:一個(gè)bootstrap OpenStack服務(wù)如何管理裸機(jī)基礎(chǔ)設(shè)施?一個(gè)典型的解決方案是使用與前面章節(jié)中所述相同的基于容器的安裝工具來(lái)創(chuàng)建種子安裝。這個(gè)通常被稱為“undercloud”的種子可以用來(lái)完全自動(dòng)化裸機(jī)集群的管理,就好像它是一個(gè)虛擬化的云。
這帶來(lái)了機(jī)會(huì),不僅可以在裸機(jī)云上運(yùn)行OpenStack虛擬化,而且還可以運(yùn)行裸機(jī)Kubernetes安裝(可以通過(guò)OpenStack服務(wù)充分利用身份、存儲(chǔ)、網(wǎng)絡(luò)和其他可用的云API)。
在OpenStack上交付基于容器的應(yīng)用程序
基礎(chǔ)設(shè)施容器和裸機(jī)基礎(chǔ)設(shè)施都很重要,但是當(dāng)大多數(shù)人想到容器時(shí),他們想到的是應(yīng)用程序容器。容器提供的隔離、封裝和易維護(hù)性使其成為交付應(yīng)用程序的理想解決方案。但是,容器仍然需要一個(gè)主機(jī)平臺(tái)來(lái)為它們提供服務(wù),無(wú)論是裸機(jī)、公有云還是私有云。
Kubernetes是一個(gè)交付應(yīng)用程序的平臺(tái),可以與云API一起使用,從而實(shí)現(xiàn)關(guān)鍵基礎(chǔ)設(shè)施的自動(dòng)交付(如永久存儲(chǔ)、負(fù)載均衡器、網(wǎng)絡(luò)和動(dòng)態(tài)分配計(jì)算節(jié)點(diǎn))。OpenStack提供云基礎(chǔ)設(shè)施,無(wú)論是作為本地私有云還是通過(guò)任何可用的公有或托管OpenStack云。
OpenStack是Kubernetes的首批上游云提供商之一,其活躍的開(kāi)發(fā)團(tuán)隊(duì)維護(hù)著“Kubernetes / Cloud Provider OpenStack”插件。這個(gè)插件允許Kubernetes利用Cinder塊存儲(chǔ)、Neutron和Octavia Load Balancers,以及使用Nova直接管理計(jì)算資源。使用非常簡(jiǎn)單,只需將驅(qū)動(dòng)程序部署到Kubernetes安裝中,設(shè)置一個(gè)標(biāo)志來(lái)加載驅(qū)動(dòng)程序,并提供本地用戶云憑證。
在OpenStack上安裝Kubernetes和其他應(yīng)用程序框架有許多解決方案。提供容器框架的最簡(jiǎn)單方法之一是使用Magnum——這是一個(gè)OpenStack項(xiàng)目,它提供了一個(gè)簡(jiǎn)單的API來(lái)部署完全受管理的、有多個(gè)應(yīng)用程序平臺(tái)(包括Kubernetes)選擇的集群。這是一個(gè)依賴于OpenStack API和云提供商插件的Kubernetes部署系統(tǒng)的例子。例如,現(xiàn)在它被用在CERN的OpenStack現(xiàn)場(chǎng)云以及合作伙伴云上管理超過(guò)200個(gè)獨(dú)立和聯(lián)合的Kubernetes安裝。如果你在首選OpenStack云中沒(méi)有可用的Magnum API,你可以使用任何其他Kubernetes安裝工具(例如kubeadm、Kubernetes Anywhere、Cross-Cloud或Kubespray)在OpenStack上安裝和管理Kubernetes集群。因?yàn)槊總(gè)用戶都使用標(biāo)準(zhǔn)的Kubernetes,所以很容易啟用云提供商接口來(lái)利用存儲(chǔ)和負(fù)載均衡。
另一個(gè)OpenStack項(xiàng)目Zun提供了一個(gè)輕量級(jí)的容器服務(wù)API,用于管理單個(gè)容器,而無(wú)需管理服務(wù)器或集群。OpenStack托管的Kubernetes集群具有彈性,因?yàn)樗梢灾苯油ㄟ^(guò)Nova API向集群添加或刪除云資源來(lái)動(dòng)態(tài)調(diào)整大小。另外,Kubernetes可以作為OpenStack Zun的容器后端,將pod基礎(chǔ)設(shè)施的管理轉(zhuǎn)交給Zun。它提供了一個(gè)更輕量級(jí)和多租戶容器服務(wù)API,用于運(yùn)行容器而無(wú)需直接創(chuàng)建服務(wù)器。與Neutron和Cinder的直接集成被用于為單個(gè)容器提供網(wǎng)絡(luò)和卷。
最后,Qinling項(xiàng)目提供了“Function as a Service”,旨在提供一個(gè)支持無(wú)服務(wù)器功能的平臺(tái),類似于Lambda、Azure Functions或Google Cloud Functions。它進(jìn)一步抽象了容器的管理,允許用戶通過(guò)事件驅(qū)動(dòng)的、無(wú)需服務(wù)器的計(jì)算體驗(yàn)來(lái)加速開(kāi)發(fā)(這種體驗(yàn)可按需伸縮)。Qinling支持不同的容器編排后端(如Kubernetes和Docker swarm)、各種流行的功能包存儲(chǔ)后端(如本地存儲(chǔ)和OpenStack Swift)。
Kata Containers——通過(guò)虛擬化保證應(yīng)用安全
Kata Containers是一個(gè)新的開(kāi)源項(xiàng)目。它是一個(gè)輕量級(jí)虛擬機(jī)的新穎實(shí)現(xiàn),可無(wú)縫集成到容器生態(tài)系統(tǒng)中。Kata Containers與容器一樣輕而快,并與容器管理層(包括Docker和Kubernetes等常用編排工具)集成,同時(shí)還提供了虛擬機(jī)的安全優(yōu)勢(shì)。Kata Containers符合開(kāi)放容器倡議(OCI)標(biāo)準(zhǔn)——OpenStack基金會(huì)是其中的一個(gè)活躍成員。Kata Containers由OpenStack基金會(huì)托管,但它是OpenStack項(xiàng)目之外的獨(dú)立項(xiàng)目,擁有自己的治理和社區(qū)。
轉(zhuǎn)向容器帶來(lái)了獨(dú)特挑戰(zhàn),即在多租戶環(huán)境中保護(hù)用戶工作負(fù)載(有可信任和不可信任的工作負(fù)載)。Kata Containers使用硬件支持的隔離作為每個(gè)容器或pod中容器集合的邊界。這種方法解決了傳統(tǒng)容器架構(gòu)中共享內(nèi)核的安全問(wèn)題。
Kata Containers非常適合基于事件的按需部署(如持續(xù)集成/持續(xù)交付)和更長(zhǎng)時(shí)間運(yùn)行的Web服務(wù)器應(yīng)用程序。Kata還簡(jiǎn)化了從傳統(tǒng)虛擬化環(huán)境向容器的過(guò)渡,因?yàn)樗С謧鹘y(tǒng)訪客內(nèi)核和設(shè)備通過(guò)功能。Kata Containers提供增強(qiáng)的安全性、可擴(kuò)展性和更高的資源利用率,同時(shí)帶來(lái)堆棧的整體簡(jiǎn)化。
并行的OpenStack和Kubernetes集成
選擇開(kāi)源平臺(tái)的一個(gè)主要優(yōu)勢(shì)在于,跨平臺(tái)標(biāo)準(zhǔn)部署的接口的穩(wěn)定性。OpenStack基金會(huì)和CNCF都在為OpenStack云和Kubernetes集群維護(hù)互操作標(biāo)準(zhǔn),確保庫(kù)、應(yīng)用程序和驅(qū)動(dòng)程序可以在所有平臺(tái)上運(yùn)行,而不用管它們?cè)谀睦锊渴。這為并行集成創(chuàng)造了機(jī)會(huì),允許OpenStack和Kubernetes利用彼此的資源。
Kubernetes社區(qū)中的OpenStack特別興趣小組(SIG-OpenStack)維護(hù)Cloud Provider OpenStack插件。除了在OpenStack上運(yùn)行Kubernetes的云提供商接口外,它還保留了幾個(gè)驅(qū)動(dòng)程序,允許Kubernetes利用單個(gè)OpenStack服務(wù)。這些驅(qū)動(dòng)程序包括:
- 兩個(gè)獨(dú)立的Cinder驅(qū)動(dòng)程序。Flex Volume驅(qū)動(dòng)程序使用基于exec的模型與驅(qū)動(dòng)程序進(jìn)行交互,為容器編排系統(tǒng)使用標(biāo)準(zhǔn)接口的Container Storage Interface(CSI)驅(qū)動(dòng)程序?qū)⑷我獯鎯?chǔ)系統(tǒng)暴露給其容器工作負(fù)載。通過(guò)支持70多種存儲(chǔ)驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序可以通過(guò)一個(gè)Cinder API與大量經(jīng)過(guò)測(cè)試的專有和開(kāi)源存儲(chǔ)設(shè)備連接。
- 基于webhook的Keystone認(rèn)證和授權(quán)接口。每個(gè)模式、認(rèn)證和授權(quán),都可以彼此獨(dú)立配置。雖然這項(xiàng)工作還在進(jìn)行中,但該接口支持軟多租戶(使用OpenStack Keystone支持Kubernetes RBAC)。
OpenStack和Kubernetes都支持由多種驅(qū)動(dòng)程序支持的高度動(dòng)態(tài)網(wǎng)絡(luò)模型。由于有這些標(biāo)準(zhǔn)網(wǎng)絡(luò)接口,可以輕松構(gòu)建具有強(qiáng)大網(wǎng)絡(luò)集成的獨(dú)立OpenStack和Kubernetes集群。在OpenStack中,Kuryr項(xiàng)目生成了一個(gè)Common Network Interface(CNI)驅(qū)動(dòng)程序,可將Neutron網(wǎng)絡(luò)提供給Docker和Kubernetes。另一方面,像Calico這樣的項(xiàng)目提供Neutron驅(qū)動(dòng)程序,通過(guò)標(biāo)準(zhǔn)的Neutron API提供對(duì)Kubernetes網(wǎng)絡(luò)覆蓋的直接訪問(wèn)。