咱們知道在使用dev_setup部署cloudfoundry過程當中存在不少的重複工做,分機運行腳本不只效率低下,且cloudfoundry版本不能控制。這對於大規模的生產環境來說,部署運維的工做量很是龐大,在這種狀況下極大的限制了cloudfoundry推向產品化的發展。爲了解決這個問題,Vmware本身研發了BOSH做爲自動化部署cloudfoundry,它可以給cloudfoundry的部署帶來極大的便利。html
官方文檔給BOSH的定義是:BOSH是一個針對大規模分佈式系統的部署和生命週期管理的開源工具,其基礎是「a tool of release engineering"。由其定義能夠看出,雖然BOSH的誕生出自cloudfoundry的部署難題,但BOSH能作的不僅是部署cloudfoundry這一個產品。別的分佈式系統只要提供給bosh一個release,BOSH同樣能夠作到系統的部署和生命週期的管理。因此,這裏不要陷入一個誤區。git
這篇文檔適合剛開始接觸BOSH,並對cloudfoundry相對了解的開發人員。本文的基礎是BOSH的官方文檔,其中加入了我對相關概念的認識。其中的不足之處,還望指正。github
主要介紹了以下的幾部份內容:數據庫
主要參考資料:網絡
看完本文若是你想着手開始部署BOSH的話:架構
咱們先來看BOSH的總架構圖,有一個直觀的概念: 運維
對Cloudfoundry相對熟悉的讀者能夠發現,BOSH在總體架構上跟CF有着很多類似之處。圖中的Message Bus組件沒有明確指出這裏使用的是哪種消息中間件,實際上BOSH仍使用了NATS作消息部分的處理。主要的組件有以下幾個,咱們逐一分析。分佈式
CLI相似於CF的vmc,是用戶客戶端的一個命令終端,它提供了BOSH的命令界面。命令的格式是:ide
$ bosh [--verbose] [--config|-c<FILE>] [--cache-dir <DIR>] [--force] [--no-color] [--skip-director-checks] [--quiet] [--non-interactive]
有關CLI的完整命令介紹能夠參見BOSH官方文檔的BOSHCommand Line Interface部分。工具
Director組件是BOSH的核心,其做用是負責虛擬機的建立、部署和其餘軟件和服務生命期的管理。若是和CF類比的話,Director扮演的角色有點相似於CF的cloud_controller。
Agent運行在已經建立出的VM上,每一個BOSH建立的虛擬機都一個Agent。它是BOSH在VM上的代理,經過從Director獲取配置信息,使虛擬機分配不一樣的角色。好比,在部署cloudfoundry集羣的時候,我須要添加一個DEA節點。這時BOSH先會建立並啓動一個VM,其中也運行着BOSH的Agent。而後Director就會發送一個命令到VM的Agent,明確告知這個VM須要安裝有關DEA的組件和軟件包,以及詳細的配置信息。Agent就會根據這些信息建立一個配置好的DEA節點,這樣VM就分配好了角色。
HealthMonitor從Agent接收狀態和生命週期信息,而且能夠發送警告報警。這裏的Health Monitor是一個簡單的事件機制,當一個組件更新時,不會產生報警。
Blobstore是用來存儲用戶上傳的Release。用戶經過CLI的上傳Release指令,經過Director將Release存儲到Blobstore中。當你對上傳的Release進行部署時,BOSH將在Blobstore中排列這些編譯包和存儲結果。當BOSH部署一個job到VM上時,Agent將從Blobstore中拿出指定的BOSH Jobs和相關的資源包。
BOSH也使用Blobstore做爲大型有效載荷的中間存儲,好比日誌文件,Agent處超過消息總線最大尺寸的輸出。
如今有三種Blobstore支持BOSH:Atmos、S三、simple blobstore server。
BOSH用來存儲有關VM的元數據的數據庫。
這裏就是BOSH CPI(Cloud Provide Interface)的部分。CPI封裝了一套IaaS的API,它使得BOSH可以經過對CPI的調用從而實際調用IaaS的API。CPI包括了下面的方法:
create_stemcell / delete_stemcell create_vm / delete_vm / reboot_vm configure_networks create_disk / delete_disk / attach_disk / detach_disk
有關的詳細分析,請見文章開頭的參考文檔4
一個集成了Agent的VM模板,BOSH建立的VM就是以這個模板來進行建立的。Director經過CPI建立VM以前須要上傳stemcell,也就是說stemcell處於部署過程的開始階段,它初始化了BOSH的運行環境。stemcell在建立VM時會傳遞網絡和存儲的配置,以及NATS和Blobstore的位置
BOSH是一個release engineering的工具,其面向的對象天然是Releases。BOSH 的一個Release包含了源碼,配置信息和啓動腳本等內容。
目錄 | 內容 |
jobs | 有關job(做業)的定義 |
packages | 有關資源包的定義 |
config | release的配置文件 |
releases | 最終的release |
src | 源代碼 |
blobs | 大的源代碼包 |
jobs:jobs是packages的具體實現,其中包括了運行資源包的二進制文件的配置和啓動腳本,官方的翻譯是「做業」。job和VM的關係是一對多的關係,也就是說每個VM上只能對應一個job。拿Cloudfoundry的release舉例來講,總共有包括Cloud_controller,DEA,health_manager,router,NATS等jobs。每當一個VM啓動後,Agent就根據Director分配的job,讓VM擔當不一樣的任務。BOSH使用了monit監視job的進程。
pakages:packages是一個源代碼和編譯安裝腳本的集合。
src:包含了package裏的源代碼。
blobs:最終的release會放置於releases文件下面,可是可能會出現文件目錄下出現過多的腫脹二進制文件。因此,這裏會把這些較大的文件放在blobs裏,而後在上傳到blobstore時一塊兒上傳過去。
這裏可能會有一個理解誤區。看到Release這個單詞,可能會有一種感受是BOSH是將整個release上傳到blobstore而後進行部署。實際上並非這樣。BOSH的一個release也是一個工程,對於這個工程,還須要使用命令bosh create release以後BOSH才能使用。因此,BOSH的Release也須要生成最終的一個release,而後在上傳到Blobstore中。
此外,在一個BOSH的release裏,一般都使用git進行源碼管理。
這張圖很好的說明了BOSH的運行機制。右邊是cloudfoundry的release,它包含了cloudfoundry的jobs。上面在介紹組件時已經講到一些,在這裏咱們在詳細總結一下關鍵的幾個運行步驟。
在BOSH部署的整個週期處在最上環的是stemcell的上傳。首先開發人員經過命令bosh download stemcell將官方提供的stemcell下載到本地,而後BOSH經過調用CPI的create_stemcell方法,將本地的stemcell上傳至IaaS的鏡像存儲。這時,BOSH已經具備了一個VM的模板,其中有最關鍵的bosh agent。
Director首先會查看是否存在編譯的版本,若是不存在,Director就會啓動一個VM做爲編譯機。從blobstore中取出後編譯,而後將編譯好的package放在blobstore裏。在這裏,package的編譯依靠的是一個叫作packaging的腳本,它跑在編譯機上,會從agent中獲得兩個變量:BOSH_INSTALL_TARGET和BOSH_COMPILE_TARGET。第一個變量說明在何處安裝package生成的文件,會被設置成/var/vcap/data/packages/<package name>/<package version>;第二個變量說明哪一個文件包含了源代碼。
BOSH會根據主配置文件bosh_manifest.yml獲得新增節點的job信息以及相關網絡和資源池信息,並根據這些信息配置部署新增節點。
咱們仍是拿上面說到的DEA的例子。這時BOSH先會調用CPI,根據網絡資源池等信息建立並啓動一個VM,其中也運行着BOSH的Agent。而後Director就會根據job的信息發送一個命令到VM的Agent,明確告知這個VM須要安裝有關DEA的組件和軟件包,以及詳細的配置信息。Agent就會根據這些信息建立一個配置好的DEA節點,這樣VM就完整的部署完成。
因此咱們看出,bosh_manifest.yml是整個BOSH的關鍵配置信息,詳細的對分佈式系統(cloudfoundry)的部署進行了安排計劃。目前因爲龐大系統的部署信息量較大,manifest的配置是一個比較麻煩的工做,不過在未來相信這一點必定會進行改善。下面是基於vsphere部署bosh的一個manifest模板:
https://github.com/cloudfoundry/oss-docs/blob/master/bosh/tutorial/examples/bosh_manifest.yml
從總體上看,BOSH的運行主要是Director和blobstore的交互,director和agent的交互。其中設計的精妙之處在於stemcell內嵌agent的作法,從而作到VM執行不一樣的部署任務。因此,學習BOSH應在嘗試搭建的基礎上,儘可能搞懂bosh agent和director交互的原理,才能理解BOSH在實現release engineering的設計思路。從而才能進一步爲本身研發CPI,實現cloudfoundry的自動部署鋪平道路。