天天看點

DevOps助力雲原生應用開發實戰分享

DevOps助力雲原生應用開發實戰分享

Director會解析部署指令和模闆,然後調用CPI子產品去建立VM(ECS)執行個體,執行個體資訊會寫到Registry上。

每個VM上裝有Agent負責與Bosh互動,包括:處理Director下發的任務、上報VM的健康狀态等。

Agent從Registry拿到目前VM的資訊,包括:ID, IP等。

Director/HM和VM之間的通信是通過NATS釋出和訂閱消息。

重點: 這裡的開發任務就是實作阿裡雲CPI Provider。

Alicloud CPI實作了對雲資源以及Cloud Foundry生命周期的管理,元件結構如下圖:

DevOps助力雲原生應用開發實戰分享

CPI這一層的職責比較規整,包括:模闆解析、參數校驗、API調用、容錯與重試、傳回值加工。不過,完美內建到Bosh中并高成功率的部署叢集是一件很複雜的事兒,需要大量的驗證和測試。

CPI Provider開發流程分為: 代碼實作、Code review, 單元測試,內建測試,部署Bosh驗證CPI,部署Cloud Foundry叢集,在叢集上部署應用。

項目特點如下:

從事開源項目開發的小團隊,沒有專門的運維同學,天然的開發即運維。

立項之初組内沒有Cloud Foundry的專家,需要快速的傳遞到社群去驗證,得到回報之後快速的進行疊代。

Cloud Foundry的部署極其複雜,走一次部署流程消耗大量的人力和時間成本。需要用工具來加快開發和疊代部署的速度,減少重複的手工成本。

為了保證代碼品質的前提下快速的進行疊代開發、建構、測試、部署,那麼就需要一套實踐方法來支撐整個流程。

所謂Pipeline就是一系列手工工作的集合,這裡包括:單元測試、建構Release包、內建測試、驗收測試、端到端測試、釋出正式Release包。簡單示意圖如下:

DevOps助力雲原生應用開發實戰分享

每一項任務就是一個Job, 每個Job由輸入、輸出和若幹Task組成。Task在運作時會拉取鏡像、啟動容器、拿到輸入、執行Task、輸出結果。

拿一次CI舉例,開發人員送出代碼到Git倉庫,Git會觸發Webhook通知CI Server;CI Server會檢查Pipelie配置,根據trigger規則觸發對應的Job,并下發給CI Worker;Work解析Tasks,拉取Docker鏡像啟動容器,執行Task;最後Work收集每個Task的結果傳回給CI Server。流程入下圖所示:

DevOps助力雲原生應用開發實戰分享

接下來介紹一下在CPI Pipeline中每個Job所負責的内容,對于類似的項目有一定借鑒意義。 CPI Pipeline包括5個主要流程,分别是Unit Test, Build Candidate, Integration Test, Acceptance Test, E2E Test。下圖是這5個流程示意圖:

DevOps助力雲原生應用開發實戰分享
DevOps助力雲原生應用開發實戰分享

<a href="https://github.com/aliyun/bosh-alicloud-cpi-release/blob/master/ci/tasks/unit-tests.sh">Source Code</a>

Inputs:

bosh-cpi-src: 項目源代碼

Task:

go get -v github.com/onsi/ginkgo/ginkgo 安裝依賴

ginkgo -r -skipPackage integration src/bosh-alicloud-cpi 運作unit-test

DevOps助力雲原生應用開發實戰分享

<a href="https://github.com/aliyun/bosh-alicloud-cpi-release/blob/master/ci/tasks/build-candidate.sh">Source Code</a>

go-cpi-blobs: golang linux安裝包,是運作CPI的基礎依賴

version-semver: 用來做版本控制

bosh2 add-blob ../go-cpi-blobs/go1.8.1.linux-amd64.tar.gz go1.8.1.linux-amd64.tar.gz 加載blob依賴

bosh2 create-release --name $cpi_release_name --version $semver --tarball $cpi_release_name-$semver.tgz 打release包,根據版本号生成release包名稱

mv $cpi_release_name-$semver.tgz ${DESC}/: 把建構物上傳到遠端位址

Outputs:

bosh-cpi-dev-artifacts: 用來存儲建構物

DevOps助力雲原生應用開發實戰分享

<a href="https://github.com/aliyun/bosh-alicloud-cpi-release/blob/master/ci/tasks/run-integration.sh">Source Code</a>

stemcell: bosh light stemcell, 配置Region和ImageId的對應關系。 同一個鏡像在各個Region的分發。

terraform-metadata: 用于測試的IaaS層基礎環境,包括網絡、安全組、負載均衡等。

初始化測試資料

ginkgo src/bosh-alicloud-cpi/integration $(GINKGO_ARGS) -v 執行測試腳本

DevOps助力雲原生應用開發實戰分享

<a href="https://github.com/cloudfoundry-incubator/bosh-cpi-certification/blob/master/shared/tasks/run-bats.sh">Source Code</a>

pipelines: 準備進行BATs的配置檔案倉庫

bats: BATs測試架構的源碼倉庫

light stemcell: 維護各個region下鏡像ID的配置檔案

prepare-director

從meta-data擷取,部署Bosh所需要的IaaS資源資訊

deploy-director

擷取director資訊,寫入環境變量,供後面登陸Bosh使用 [Source Code]()

run-bats

動态生成manifest

部署一個batlight Job節點

執行bat測試

DevOps助力雲原生應用開發實戰分享

<a href="https://github.com/aliyun/bosh-alicloud-cpi-release/blob/master/ci/tasks/run-e2e.sh">Source Code</a>

blobs: 編譯Job所依賴的二進制包

登陸Bosh

把依賴包打入Blob

打release包, 然後上傳到Bosh

上傳light-stemcell, cloud-config

部署Job

執行run-errand任務

DevOps助力雲原生應用開發實戰分享

<a href="https://github.com/aliyun/bosh-alicloud-cpi-release/blob/master/ci/tasks/build-environment.sh">Source Code</a>

terraform-statement: terraform共享狀态檔案, 用來遠端存儲terraform執行結果

main-tf: terraform編排模闆

terraform根據編排模闆建立IaaS資源

對建立結果進行處理,生成JSON檔案

把terraform狀态檔案同步到遠端

繼續閱讀