江蘇自動化研究所 李南華
隨著信息技術(shù)的發(fā)展,越來越多的企業(yè)開始采用云計算的形式來替代傳統(tǒng)的硬件設(shè)備。云計算技術(shù)利用虛擬化技術(shù)將大量軟硬件資源整合在一起,形成可利用的資源池,通過創(chuàng)建虛擬機的形式為外部提供計算服務(wù),這種做法不僅節(jié)省了企業(yè)采購及后期軟硬件維護成本,同時也提高了各類硬件資源的利用率。面對輕則幾個機柜,重則整個機房的硬件設(shè)備來說,如何高效的實現(xiàn)對整個資源的監(jiān)控、運維、管理,成為使用云計算必須解決的問題。
本文在分析Docker容器的相關(guān)技術(shù)基礎(chǔ)上,基于OpenStack Ceilometer相關(guān)接口設(shè)計并實現(xiàn)了一種基于Docker的云資源監(jiān)控系統(tǒng),以滿足對云平臺運維管理的需求。
Docker首次被提出于2013年,是一種基于LXC的輕量級虛擬化技術(shù),遵循Apache2.0協(xié)議。其主要目標(biāo)是“Bulid,Shop and Run Any App,Any-where”。使用Docker容器技術(shù),可以對應(yīng)用進行高效、敏捷且自動化的部署,同時結(jié)合操作系統(tǒng)以namespaces,cgroups為代表的內(nèi)核技術(shù),保證了Docker容器的安全與資源隔離。Docker采用傳統(tǒng)的C/S架構(gòu)模式,主要包含客戶端(Docker Client)和服務(wù)端(Docker Daemon)兩部分。用戶通過Docker Client與Docker Daemon建立TCP/REST通信,并將用戶請求發(fā)送給DockerDaemon,Docker后端采用松耦合架構(gòu),不同組件之間相互組合,完成用戶請求。具體架構(gòu)如圖1所示。
圖1 Docker架構(gòu)
Docker與虛擬機的目的都是隔離應(yīng)用程序及其關(guān)聯(lián)性,構(gòu)建一個依賴性較低,不受系統(tǒng)環(huán)境及硬件限制的容納單元,保證用戶能夠更加充分、高效地使用計算資源。如圖2所示,Docker容器與虛擬機的核心差異在于架構(gòu)。從圖中可以看出,虛擬機比Docker多了一層用戶操作系統(tǒng)(Guest OS),通過對底層計算、IO、網(wǎng)絡(luò)等硬件資源進行虛擬化,實現(xiàn)虛擬機操作系統(tǒng)的運行,因此,虛擬機需要運行在一個完整的宿主操作系統(tǒng)上,無法獨立運行。Docker技術(shù)不同,其直接在本地硬件資源的基礎(chǔ)上,通過共享主機系統(tǒng)的內(nèi)核,鏈接整個軟件供應(yīng)鏈,封裝應(yīng)用所需的環(huán)境,以最簡單的方式提供高性能的服務(wù)。通過分析虛擬機與Docker容器的架構(gòu),Docker容器技術(shù)具有以下優(yōu)勢。
圖2 虛擬機與Docker架構(gòu)
(1)效率高,資源利用率高
Docker不需要對物理資源進行虛擬化,直接在宿主系統(tǒng)的基礎(chǔ)上進行內(nèi)核構(gòu)建并共享底層操作系統(tǒng),從而實現(xiàn)Docker容器的秒級快速啟動。由于沒有中間層的資源開銷,相比傳統(tǒng)虛擬機,在相同規(guī)模的硬件下,Docker可以運行更多的實例,這大大提高了資源的利用率。
(2)易用性
Docker的運行以鏡像為基礎(chǔ),只需要根據(jù)要求制作鏡像,即可在不同云環(huán)境甚至裸機上運行,搭配高效率的啟停,可以加快項目的研制周期,從而快速交付。
(3)模塊性與可擴展性
用戶可以按照功能的不同將應(yīng)用程序進行拆分,然后將各個功能進行模塊化,并使用容器進行封裝,最后通過對接各個容器來創(chuàng)建完整的應(yīng)用程序,從而實現(xiàn)應(yīng)用程序的解耦。這種應(yīng)用程序分拆封裝的方法,有利于后續(xù)對應(yīng)用進行拓展或者更新時,用戶無需對整套應(yīng)用程序進行變更修改,只需修改對應(yīng)的模塊即可完成整套程序的升級、迭代,降低工作量與工作難度。
本設(shè)計選擇主流開源云計算平臺OpenStack作為資源監(jiān)控對象,OpenStack本身自帶的監(jiān)控系統(tǒng)——Ceilometer組件可以監(jiān)控各類資源的狀態(tài),但其功能還不夠全面;一方面Ceilometer只關(guān)注資源監(jiān)控數(shù)據(jù)的采集,沒有對監(jiān)控數(shù)據(jù)進行存儲及分析,另一方面,當(dāng)采集的數(shù)據(jù)量過于集中時,Ceilometer可能出現(xiàn)性能大幅下降甚至出現(xiàn)服務(wù)不可用的情況。因此,設(shè)計思路是利用Celilometer的既有接口,將相應(yīng)的監(jiān)控信息進行匯總并二次封裝,從而實現(xiàn)資源的監(jiān)控。整個監(jiān)控軟件系統(tǒng)架構(gòu)圖如圖3所示。
圖3 監(jiān)控軟件系統(tǒng)架構(gòu)圖
從圖3可以看出,整套監(jiān)控系統(tǒng)主要用到了兩個容器,一個是數(shù)據(jù)庫容器,另一個則是監(jiān)控采集分析容器,兩個容器均運行在控制節(jié)點上。兩個控制節(jié)點均部署一套監(jiān)控系統(tǒng),根據(jù)云平臺主控節(jié)點運行,備節(jié)點上的監(jiān)控系統(tǒng)處于待機狀態(tài)。
(1)數(shù)據(jù)庫容器
數(shù)據(jù)庫容器主要是用于web管理界面登陸、資源監(jiān)控、日志等數(shù)據(jù)信息的存儲,容器中主要部署了mysql數(shù)據(jù)庫應(yīng)用以及用到的sql文件。
(2)監(jiān)控采集分析容器
監(jiān)控采集分析容器主要是用于數(shù)據(jù)的采集、匯總、展示等操作,容器中包含采集腳本clients、web服務(wù)web_server、socket服務(wù)socket_server三部分。其中,client腳本是將原生Openstack中的監(jiān)控信息進行整合封裝;socket_server負責(zé)數(shù)據(jù)信息的傳遞工作;web_server負責(zé)提供web客戶端登陸的相關(guān)服務(wù)。
本次實驗是將監(jiān)控程序部署在自制的容器內(nèi),通過容器間的協(xié)同工作,實現(xiàn)對openstack云平臺資源的監(jiān)控目的。具體實驗過程如下。
2.2.1 容器鏡像制作
通過編寫Dockfile的形式將要制作容器所需要的資源進行封裝,具體命令如下所示,鏡像做好之后,一方面可以將其上傳到docker鏡像倉庫,后續(xù)需要通過網(wǎng)絡(luò)進行拉取,另一種方式是通過docker save命令將其存下來,后續(xù)的部署中可以無需聯(lián)網(wǎng)而直接進行使用,本文采用了第二種方式。
docker build -t docker-monitor .
docker build -t project_publish .
2.2.2 容器部署
(1)容器網(wǎng)絡(luò)創(chuàng)建(圖4)
圖4 容器網(wǎng)絡(luò)創(chuàng)建
docker network create monitor_net
(2)mysql鏡像導(dǎo)入(圖5)
圖5 mysql容器導(dǎo)入
docker load (3)code鏡像導(dǎo)入(圖6) 圖6 code鏡像導(dǎo)入 docker load < project_publish.v2.tar (4)啟動mysql數(shù)據(jù)庫服務(wù)容器并更新數(shù)據(jù)庫(圖7) 圖7 mysql數(shù)據(jù)庫容器創(chuàng)建 docker run-d-p 33060:3306-e MYSQL_ROOT_PASSWORD=123456--name=monitor_mysql--restart=always-v=/home/mysql:/mysql--network=monitor_net monitor_mysql:V4.1.1 (5)啟動 web服務(wù)和 socket 服務(wù)容器(圖8) 圖8 web服務(wù)及socket容器創(chuàng)建 docker run-d-e “container=docker”--privileged=true-p 8011:8011-p 8012:8012-p 6000:6000/udp --name=project_monitor--restart=always-v /home/code:/code--network=jari_net project_publish:v2/usr/sbin/init 2.2.3 資源監(jiān)控 (1)登陸界面 從web服務(wù)容器啟動參數(shù)可以看出,web登陸端口為8011,因此打開瀏覽器,登陸10.10.10.2:8011,進入頁面。如圖9所示。 圖9 監(jiān)控系統(tǒng)登陸界面圖 (2)資源概覽 相較于原生OpenStack資源監(jiān)控,此處將CPU、內(nèi)存、存儲使用情況以及節(jié)點數(shù)量這些需要多個界面查看的內(nèi)容進行整合,如圖10所示。該資源概覽頁面集中展示了當(dāng)前云平臺的資源概覽,包含集群CPU、內(nèi)存、存儲的使用情況,虛擬機數(shù)量、計算節(jié)點運行情況以及網(wǎng)絡(luò)帶寬等。 圖10 資源概覽圖 (3)虛擬機資源利用率 對于運維管理人員來說,每個虛擬機的資源使用情況是監(jiān)控的重點,通過該信息,管理員可以清楚的看出哪個虛擬機的資源利用率過高,從而對其進行拓展或擴容操作。如圖11所示。 圖11 虛擬機資源利用率監(jiān)控圖 (4)網(wǎng)絡(luò)拓撲 對于網(wǎng)絡(luò)拓撲來說,OpenStack自帶的網(wǎng)絡(luò)拓撲無法直觀的查看當(dāng)前的網(wǎng)絡(luò)配置情況,因此本實驗在獲取到每個虛擬機網(wǎng)絡(luò)的基礎(chǔ)上進行整合,形成網(wǎng)絡(luò)新的網(wǎng)絡(luò)拓撲,如圖12所示。 圖12 網(wǎng)絡(luò)拓撲圖 本文通過將Openstack云平臺原生Ceilometer接口信息進行信息整合封裝,形成有利于用戶調(diào)用的資源監(jiān)控信息,然后通過Docker容器部署的方式,實現(xiàn)一整套云平臺資源監(jiān)控系統(tǒng)。該系統(tǒng)可以直觀的實時監(jiān)控云平臺的集群資源使用量、物理節(jié)點狀態(tài)、虛擬機的數(shù)量及運行狀態(tài)、網(wǎng)絡(luò)拓撲等。實驗表明,該種方式下的資源監(jiān)控可以解決原生云平臺監(jiān)控信息只有接口沒有界面的問題,同時提高運維人員監(jiān)控運維的效率。3 試驗總結(jié)