本發(fā)明涉及docker容器的自動(dòng)部署技術(shù)領(lǐng)域,特別涉及一種高安全docker容器批量部署方法及裝置。
背景技術(shù):
docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的linux機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。
docker核心解決的問(wèn)題是利用lxc來(lái)實(shí)現(xiàn)類似vm的功能,從而利用更加節(jié)省的硬件資源提供給用戶更多的計(jì)算資源。同vm的方式不同,lxc其并不是一套硬件虛擬化方法-無(wú)法歸屬到全虛擬化、部分虛擬化和半虛擬化中的任意一個(gè),而是一個(gè)操作系統(tǒng)級(jí)虛擬化方法,理解起來(lái)可能并不像vm那樣直觀。
用戶需要考慮虛擬化方法,尤其是硬件虛擬化方法,需要借助其解決的主要是以下4個(gè)問(wèn)題:
隔離性:每個(gè)用戶實(shí)例之間相互隔離,互不影響。硬件虛擬化方法給出的方法是vm,lxc給出的方法是container,更細(xì)一點(diǎn)是kernelnamespace。
可配額/可度量:每個(gè)用戶實(shí)例可以按需提供其計(jì)算資源,所使用的資源可以被計(jì)量。硬件虛擬化方法因?yàn)樘摂M了cpu,memory可以方便實(shí)現(xiàn),lxc則主要是利用cgroups來(lái)控制資源。
移動(dòng)性:用戶的實(shí)例可以很方便地復(fù)制、移動(dòng)和重建。硬件虛擬化方法提供snapshot和image來(lái)實(shí)現(xiàn),docker(主要)利用aufs實(shí)現(xiàn)。
安全性:這里強(qiáng)調(diào)是host主機(jī)的角度盡量保護(hù)container。硬件虛擬化的方法因?yàn)樘摂M化的水平比較高,用戶進(jìn)程都是在kvm等虛擬機(jī)容器中翻譯運(yùn)行的,然而對(duì)于lxc,用戶的進(jìn)程是lxc-start進(jìn)程的子進(jìn)程,只是在kernel的namespace中隔離的,因此需要一些kernel的patch來(lái)保證用戶的運(yùn)行環(huán)境不會(huì)受到來(lái)自host主機(jī)的惡意入侵,dotcloud是利用kernelgrsecpatch解決的。
目前,linux操作系統(tǒng)中,所有容器運(yùn)行的是相同的強(qiáng)制訪問(wèn)控制類型(即selinux類型,如svirt_lxc_net_t),該類別允許所有網(wǎng)絡(luò)端口都能處于監(jiān)聽(tīng)狀態(tài),也允許所有網(wǎng)絡(luò)端口都能對(duì)外發(fā)起連接。對(duì)于容器而言,例如,在一個(gè)容器中運(yùn)行某個(gè)服務(wù)程序,一旦該服務(wù)程序被成功入侵,該服務(wù)程序進(jìn)程將會(huì)連接任何網(wǎng)絡(luò)端口并成為制造垃圾信息的機(jī)器人,也可能會(huì)通過(guò)網(wǎng)絡(luò)攻擊其他宿主機(jī)和容器,這便為容器留下了不可否認(rèn)的安全問(wèn)題。
docker容器的安全問(wèn)題本質(zhì)上就是容器技術(shù)的安全性問(wèn)題,安全性問(wèn)題90%以上可以歸結(jié)為隔離性問(wèn)題,docker容器的隔離性主要運(yùn)用namespace技術(shù)。namespace技術(shù)是linux操作系統(tǒng)提供的一種內(nèi)核級(jí)別環(huán)境隔離的方法,但是,雖然docker容器可通過(guò)namespace的方式分隔出看似是獨(dú)立的空間,然而linux操作系統(tǒng)內(nèi)核卻不能通過(guò)namespace的方式分隔,所以即使docker容器具有多個(gè)獨(dú)立的空間(container),但由于所有的linux操作系統(tǒng)調(diào)用其實(shí)都是通過(guò)主機(jī)的內(nèi)核處理,所以最終還是會(huì)為docker容器留下安全隱患。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明針對(duì)docker容器部署過(guò)程中存在的安全隱患,以及在批量docker容器部署的效率低下的問(wèn)題上,提出一種高安全docker容器批量部署方法及裝置。
本發(fā)明提出一種高安全docker容器批量部署方法,包括:
步驟1,獲取集群中每臺(tái)物理機(jī)的cpu核數(shù)、cpu的利用率、內(nèi)存使用率、帶寬的使用率;
步驟2,根據(jù)所述cpu的利用率、所述內(nèi)存使用率、所述帶寬的使用率,為每臺(tái)物理機(jī)計(jì)算權(quán)值,根據(jù)所述所述權(quán)值,計(jì)算需部署docker容器的個(gè)數(shù);
步驟3,根據(jù)需部署docker容器的個(gè)數(shù),并行創(chuàng)建docker容器。
所述步驟2中計(jì)算所述權(quán)值的公式為:
qi=(1-pi)+(1-mi)+(1-wi)
其中pi為所述cpu的利用率,mi為所述內(nèi)存使用率,wi為所述帶寬的使用率,i為第i個(gè)物理機(jī)。
所述步驟2中計(jì)算需部署docker容器的個(gè)數(shù)的公式為:
其中n為n個(gè)docker容器,qi為所述權(quán)值,i第i個(gè)物理機(jī),i為物理機(jī)的總個(gè)數(shù)。
所述步驟3包括采用創(chuàng)建多進(jìn)程的方式創(chuàng)建docker容器容器,其中進(jìn)程的個(gè)數(shù)與相對(duì)應(yīng)的物理機(jī)的所述cpu核數(shù)相同。
所述步驟3還包括為docker容器中的鏡像定義強(qiáng)制訪問(wèn)控制策略;在docker容器創(chuàng)建時(shí),將強(qiáng)制訪問(wèn)控制策略嵌入鏡像中的元數(shù)據(jù)中。
本發(fā)明還提出一種高安全docker容器批量部署裝置,包括:
獲取信息模塊,用于獲取集群中每臺(tái)物理機(jī)的cpu核數(shù)、cpu的利用率、內(nèi)存使用率、帶寬的使用率;
計(jì)算模塊,用于根據(jù)所述cpu的利用率、所述內(nèi)存使用率、所述帶寬的使用率,為每臺(tái)物理機(jī)計(jì)算權(quán)值,根據(jù)所述所述權(quán)值,計(jì)算需部署docker容器的個(gè)數(shù);
部署模塊,用于根據(jù)需部署docker容器的個(gè)數(shù),并行創(chuàng)建docker容器。
所述計(jì)算模塊中計(jì)算所述權(quán)值的公式為:
qi=(1-pi)+(1-mi)+(1-wi)
其中pi為所述cpu的利用率,mi為所述內(nèi)存使用率,wi為所述帶寬的使用率,i為第i個(gè)物理機(jī)。
所述計(jì)算模塊中計(jì)算需部署docker容器的個(gè)數(shù)的公式為:
其中n為n個(gè)docker容器,qi為所述權(quán)值,i第i個(gè)物理機(jī),i為物理機(jī)的總個(gè)數(shù)。
所述部署模塊包括采用創(chuàng)建多進(jìn)程的方式創(chuàng)建docker容器容器,其中進(jìn)程的個(gè)數(shù)與相對(duì)應(yīng)的物理機(jī)的所述cpu核數(shù)相同。
所述部署模塊還包括為docker容器中的鏡像定義強(qiáng)制訪問(wèn)控制策略;在docker容器創(chuàng)建時(shí),將強(qiáng)制訪問(wèn)控制策略嵌入鏡像中的元數(shù)據(jù)中。
由以上方案可知,本發(fā)明的優(yōu)點(diǎn)在于:
本發(fā)明在需要批量部署docker容器的場(chǎng)景下,能夠提升部署效率,減小部署時(shí)間,另外,本發(fā)明解決了docker容器的安全性問(wèn)題,部署出的容器具有高安全性。
附圖說(shuō)明
圖1是本發(fā)明流程圖。
具體實(shí)施方式
本發(fā)明在現(xiàn)有docker容器創(chuàng)建方法的基礎(chǔ)上,基于cpu核數(shù)和cpu利用率提升批量docker容器的部署效率,同時(shí)考慮到內(nèi)存、網(wǎng)絡(luò)因素,并且為創(chuàng)建的每個(gè)容器中的鏡像定義強(qiáng)制訪問(wèn)控制策略,使開(kāi)啟docker容器中的進(jìn)程時(shí)使用強(qiáng)制訪問(wèn)控制策略來(lái)加強(qiáng)docker容器的安全性。
如圖1所示,為實(shí)現(xiàn)上述目的,本發(fā)明的一種高安全docker容器批量部署方法包括下列步驟:
a.獲取集群物理機(jī)的cpu核數(shù),其實(shí)現(xiàn)方法為:
a1.統(tǒng)計(jì)集群物理機(jī)的個(gè)數(shù)n;
a2.獲取集群中每個(gè)物理的cpu的個(gè)數(shù);
a3.獲取每個(gè)物理cpu的核數(shù);
a4.計(jì)算獲取每臺(tái)物理機(jī)的cpu的總的核數(shù)ci,其中總核數(shù)=物理cpu個(gè)數(shù)×每顆物理cpu的核數(shù)。
b.獲取集群物理機(jī)的cpu的利用率,其實(shí)現(xiàn)方法為:
b1.獲取參數(shù)user:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,處于用戶態(tài)的運(yùn)行時(shí)間,不包含nice值為負(fù)進(jìn)程;
b2.獲取參數(shù)nice:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,nice值為負(fù)的進(jìn)程所占用的cpu時(shí)間;
b3.獲取參數(shù)system:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,處于核心態(tài)的運(yùn)行時(shí)間;
b4.獲取參數(shù)idle:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,除io等待時(shí)間以外的其它等待時(shí)間iowait從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,io等待時(shí)間;
b5.利用公式計(jì)算cpu利用率:
p=100*(user+nice+system)/(user+nice+system+idle);計(jì)算出集群中每臺(tái)物理機(jī)的cpu的利用率pi。
c.獲取集群中每臺(tái)物理機(jī)的內(nèi)存使用情況:首先獲取空閑內(nèi)存量memfree,然后獲取內(nèi)存總量memtotal,利用公式計(jì)算內(nèi)存使用率mi:
mi=1-memfree/memtotal
d.獲取集群中每臺(tái)物理機(jī)的網(wǎng)絡(luò)使用情況:統(tǒng)計(jì)一段時(shí)間內(nèi)receive和tramsmit的bytes數(shù)的變化,即可獲得網(wǎng)口傳輸速率,再除以網(wǎng)口的帶寬就得到帶寬的使用率wi。
e.利用每臺(tái)物理機(jī)的cpu利用率,內(nèi)存使用率,帶寬使用率,為每臺(tái)物理機(jī)計(jì)算一個(gè)權(quán)值qi,其中i為第i個(gè)物理機(jī);
qi=(1-pi)+(1-mi)+(1-wi)
f.若要批量部署創(chuàng)建n個(gè)docker容器,那么在集群中的各物理機(jī)上應(yīng)該部署的docker容器的個(gè)數(shù)ni通過(guò)公式計(jì)算出來(lái),其公式為:
由上述公式計(jì)算出集群中每臺(tái)物理機(jī)需要?jiǎng)?chuàng)建的容器的個(gè)數(shù)ni。
g.根據(jù)f中得出的集群中每臺(tái)物理機(jī)需要?jiǎng)?chuàng)建的容器的個(gè)數(shù)ni,并行的創(chuàng)建容器,采用創(chuàng)建多進(jìn)程的方式創(chuàng)建所需創(chuàng)建的容器,進(jìn)程的個(gè)數(shù)與該物理機(jī)的cpu的核數(shù)ci相同。
h.創(chuàng)建每個(gè)容器的過(guò)程如下:為docker容器中的鏡像定義強(qiáng)制訪問(wèn)控制策略,以使開(kāi)啟docker容器中的進(jìn)程時(shí)使用強(qiáng)制訪問(wèn)控制策略;在docker容器創(chuàng)建時(shí),將強(qiáng)制訪問(wèn)控制策略嵌入鏡像中的元數(shù)據(jù)中。該docker容器的創(chuàng)建方法能使進(jìn)程中運(yùn)行鏡像時(shí)能使用該強(qiáng)制訪問(wèn)控制策略,從而避免了主機(jī)內(nèi)核在不同的系統(tǒng)調(diào)用中運(yùn)行docker容器中的進(jìn)程時(shí)對(duì)docker容器的安全形成威脅,加強(qiáng)了docker容器的安全性;同時(shí)還簡(jiǎn)化了系統(tǒng)調(diào)用或訪問(wèn)docker容器中的進(jìn)程時(shí)的強(qiáng)制訪問(wèn)控制過(guò)程。
下面更進(jìn)一步描述本發(fā)明步驟,本發(fā)明的目標(biāo)是提升批量創(chuàng)建docker容器的效率,創(chuàng)建出來(lái)的容器具有高安全性。詳細(xì)實(shí)施步驟包含執(zhí)行:a、獲取集群物理機(jī)的cpu核數(shù);b、獲取集群物理機(jī)的cpu的利用率;c、計(jì)算各物理機(jī)需要?jiǎng)?chuàng)建容器的個(gè)數(shù);d、并行創(chuàng)建高安全性容器。具體的一種實(shí)施方式如下:
a.獲取集群物理機(jī)的cpu核數(shù),其實(shí)現(xiàn)方法為:
a1.通過(guò)shell腳本統(tǒng)計(jì)集群物理機(jī)的個(gè)數(shù)n;
a2.通過(guò)shell腳本獲取集群中每個(gè)物理的cpu的個(gè)數(shù);
a3.通過(guò)shell腳本獲取每個(gè)物理cpu的核數(shù);
a4.計(jì)算獲取每臺(tái)物理機(jī)的cpu的總的核數(shù)ci,其中總核數(shù)=物理cpu個(gè)數(shù)×每顆物理cpu的核數(shù)。
b.獲取集群物理機(jī)的cpu的利用率,其實(shí)現(xiàn)方法為:
b1.從linux系統(tǒng)/proc/stat文件中獲取參數(shù)user:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,處于用戶態(tài)的運(yùn)行時(shí)間,不包含nice值為負(fù)進(jìn)程;
b2.從linux系統(tǒng)/proc/stat文件中獲取參數(shù)nice:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,nice值為負(fù)的進(jìn)程所占用的cpu時(shí)間;
b3.從linux系統(tǒng)/proc/stat文件中獲取參數(shù)system:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,處于核心態(tài)的運(yùn)行時(shí)間;
b4.從linux系統(tǒng)/proc/stat文件中獲取參數(shù)idle:從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,除io等待時(shí)間以外的其它等待時(shí)間iowait從系統(tǒng)啟動(dòng)開(kāi)始累計(jì)到當(dāng)前時(shí)刻,io等待時(shí)間;
b5.利用公式計(jì)算cpu利用率:
p=100*(user+nice+system)/(user+nice+system+idle);計(jì)算出集群中每臺(tái)物理機(jī)的cpu的利用率pi。
c.獲取集群中每臺(tái)物理機(jī)的內(nèi)存使用情況:首先獲取空閑內(nèi)存量memfree,然后獲取內(nèi)存總量memtotal。利用公式計(jì)算內(nèi)存使用率mi:
mi=1-memfree/memtotal
d.獲取集群中每臺(tái)物理機(jī)的網(wǎng)絡(luò)使用情況:統(tǒng)計(jì)一段時(shí)間內(nèi)receive和tramsmit的bytes數(shù)的變化,即可獲得網(wǎng)口傳輸速率,再除以網(wǎng)口的帶寬就得到帶寬的使用率wi。
e.利用每臺(tái)物理機(jī)的cpu利用率,內(nèi)存使用率,帶寬使用率,為每臺(tái)物理機(jī)計(jì)算一個(gè)權(quán)值qi:
qi=(1-pi)+(1-mi)+(1-wi)
f.若要批量部署創(chuàng)建n個(gè)docker容器,那么在集群中的各物理機(jī)上應(yīng)該部署的docker容器的個(gè)數(shù)ni通過(guò)公式計(jì)算出來(lái),其公式為:
由上述公式計(jì)算出集群中每臺(tái)物理機(jī)需要?jiǎng)?chuàng)建的容器的個(gè)數(shù)ni;
g.并行創(chuàng)建高安全性容器。其實(shí)現(xiàn)方法如下:
g1.根據(jù)c中得出的集群中每臺(tái)物理機(jī)需要?jiǎng)?chuàng)建的容器的個(gè)數(shù)ni,并行的創(chuàng)建容器,采用創(chuàng)建多線程的方式創(chuàng)建所需創(chuàng)建的容器。線程的個(gè)數(shù)與該物理機(jī)的cpu的核數(shù)ci相同。
g2.創(chuàng)建每個(gè)容器的過(guò)程如下:為docker容器中的鏡像定義強(qiáng)制訪問(wèn)控制策略,以使開(kāi)啟docker容器中的進(jìn)程時(shí)使用強(qiáng)制訪問(wèn)控制策略;在docker容器創(chuàng)建時(shí),將強(qiáng)制訪問(wèn)控制策略嵌入鏡像中的元數(shù)據(jù)中。該docker容器的創(chuàng)建方法能使進(jìn)程中運(yùn)行鏡像時(shí)能使用該強(qiáng)制訪問(wèn)控制策略,從而避免了主機(jī)內(nèi)核在不同的系統(tǒng)調(diào)用中運(yùn)行docker容器中的進(jìn)程時(shí)對(duì)docker容器的安全形成威脅,加強(qiáng)了docker容器的安全性;同時(shí)還簡(jiǎn)化了系統(tǒng)調(diào)用或訪問(wèn)docker容器中的進(jìn)程時(shí)的強(qiáng)制訪問(wèn)控制過(guò)程。
本發(fā)明還提出一種高安全docker容器批量部署裝置,包括:
獲取信息模塊,用于獲取集群中每臺(tái)物理機(jī)的cpu核數(shù)、cpu的利用率、內(nèi)存使用率、帶寬的使用率;
計(jì)算模塊,用于根據(jù)所述cpu的利用率、所述內(nèi)存使用率、所述帶寬的使用率,為每臺(tái)物理機(jī)計(jì)算權(quán)值,根據(jù)所述所述權(quán)值,計(jì)算需部署docker容器的個(gè)數(shù);
部署模塊,用于根據(jù)需部署docker容器的個(gè)數(shù),并行創(chuàng)建docker容器。
所述計(jì)算模塊中計(jì)算所述權(quán)值的公式為:
qi=(1-pi)+(1-mi)+(1-wi)
其中pi為所述cpu的利用率,mi為所述內(nèi)存使用率,wi為所述帶寬的使用率,i為第i個(gè)物理機(jī)。
所述計(jì)算模塊中計(jì)算需部署docker容器的個(gè)數(shù)的公式為:
其中n為n個(gè)docker容器,qi為所述權(quán)值,i第i個(gè)物理機(jī),i為物理機(jī)的總個(gè)數(shù)。
所述部署模塊包括采用創(chuàng)建多進(jìn)程的方式創(chuàng)建docker容器容器,其中進(jìn)程的個(gè)數(shù)與相對(duì)應(yīng)的物理機(jī)的所述cpu核數(shù)相同。
所述部署模塊還包括為docker容器中的鏡像定義強(qiáng)制訪問(wèn)控制策略;在docker容器創(chuàng)建時(shí),將強(qiáng)制訪問(wèn)控制策略嵌入鏡像中的元數(shù)據(jù)中。