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