關鍵詞
封閉網(wǎng)絡:一個相對封閉的網(wǎng)絡環(huán)境,僅可以使用有限的資源如:maven鏡像倉庫、Centos/Ubuntu源等,無法連接互聯(lián)網(wǎng)的網(wǎng)絡環(huán)境。
一鍵部署:這里所說的“一鍵式部署”不僅僅是指這樣的場景:“編碼 –> 測試 –> 提交–> CI/CD –> 部署完成”。這里更多的是在描述:“在一個離線的網(wǎng)絡環(huán)境下,運行一個deploy.sh的文件,就可以看到所有基礎設施服務如:Nexus、Gitlab、Mongodb等已部署完成,然后在你編輯業(yè)務代碼并提交至遠程倉庫時,會觸發(fā)CI、編譯、測試、打包、部署,至此所有的業(yè)務模塊部署成功”,實現(xiàn)基礎設施即代碼。
背景
在這個互聯(lián)網(wǎng)無處不在的時代,網(wǎng)絡安全尤為重要,特別是在金融和電信領域,出現(xiàn)網(wǎng)絡安全問題將會帶來不可估量的損失。
基于對數(shù)據(jù)安全性、保密性和獨立性的考慮,為了更好地提供服務,同時有效地保護內部網(wǎng)絡的安全,我們需要將這些對外開放的主機與內部的眾多網(wǎng)絡設備分隔開來,制定安全策略限制互聯(lián)網(wǎng)連接。這樣便能在對外提供友好服務的同時,最大限度地保護內部網(wǎng)絡,這也導致了內網(wǎng)無法連接互聯(lián)網(wǎng)而形成一個“封閉網(wǎng)絡”。
痛點
我們通常會有這樣的需求:在一個無法連接互聯(lián)網(wǎng)的環(huán)境下setup一套dev、qa、staging包括搭建CI等環(huán)境來供不同的角色使用,但是由于安全策略或其他安全限制導致一些基礎服務無法從互聯(lián)網(wǎng)獲取,如Kubenetes、Mongodb、Kafka等基礎組件服務,這就給自動化部署和持續(xù)交付帶來了不便,特別是在系統(tǒng)對第三方服務依賴較多的情況下。
本文通過部署一套復雜系統(tǒng)為例,來描述如何在封閉網(wǎng)絡環(huán)境下實現(xiàn)一鍵式部署。
解決方案
基于最主要的原因: “更輕松的遷移和擴展”, 我們使用Docker來部署基礎組件服務。
對于一個封閉的網(wǎng)絡環(huán)境來說,要獲取基礎服務鏡像如上文提到的Mongodb鏡像是不可能完成的任務。當然,我們可以使用docker save將構建好的鏡像保存成tar包,使用U盤等介質將tar包復制到內網(wǎng)然后使用docker load命令還原鏡像。
對于較復雜(依賴相對較多的基礎組件)的系統(tǒng)來說,如果每個組件都如此操作將會帶來很大的工作量,并且更容易出錯,對于后期維護來說也是一個很大的挑戰(zhàn)。所以使用Nexus是一個很好的選擇,將Nexus作為Docker倉庫保存所有的基礎組件鏡像。 這樣不僅可以解決離線網(wǎng)絡無法下載安裝包的問題,同時可以簡化配置,并保持內網(wǎng)環(huán)境與開發(fā)環(huán)境的一致性,給一鍵式部署提供了前提。
解決了網(wǎng)絡問題,接下來就是部署和配置管理。同樣的道理,如果每個基礎服務都需要手動部署往往比較耗時,難以實現(xiàn)故障排查,并且可能帶來潛在錯誤。所以我們需要一個自動化部署工具來提高工作效率,降低維護成本。
經(jīng)過對主流的自動化工具做橫向對比,最終選擇使用Ansible作為配置管理和自動化部署工具。那么Ansible是什么?下文會給出詳細描述。
解決了上述問題,就可以實施離線網(wǎng)絡自動化部署了,將整個過程分為3階段,依次是:
-
Base Deploy。主要部署所有服務所依賴的基礎組件Docker、Nexus和Gitlab,Docker作為基礎平臺,Nexus和Gitlab也部署在Docker平臺上,Nexus作為私有Maven倉庫和私有Docker倉庫,Gitlab作為私有遠程代碼庫。
Infrastructure Deploy。此階段主要使用Ansible部署集群所依賴的基礎服務如Kubernetes(Pass平臺)、Kafka和Mongodb等服務。
Business Deploy。最后一個階段測試持續(xù)集成和持續(xù)部署的階段,使用GoCD作為CI工具,在CI上實現(xiàn)業(yè)務服務模塊的自動化部署。
實踐如下圖所示:
Base Deploy
如上文所述,使用Nexus作為私有的Docker Registry和Maven Repository,Nexus是倉庫管理器,它極大地簡化了自己內部倉庫的維護和外部倉庫的訪問。利用Nexus你可以只在一個地方就能夠完全控制訪問和部署在你所維護倉庫中的每個Artifact。
Nexus存儲著所有基礎設施的鏡像文件,如Kubernetes、Mongodb、Zookeeper和Kafka的鏡像等,同時需要一個Nexus鏡像文件用來部署Nexus。為Infrastructure Deploy提供基礎環(huán)境和部署中所有的依賴組件。
同時為了方便Nexus的遷移和維護,我們將Nexus也部署在Docker平臺上。使用一個簡單的Shell腳本完成Base Deploy,一次部署Docker、Nexus和Gitlab(Gitlab作為私有的git倉庫)。Deploy.sh 代碼如下:
PS: 運行deploy.sh 之前所有主機需要配置ssh public key登錄, 避免自動化過程中提示輸入密碼。
運行deploy.sh即可部署Nexus和Gitlab。Nexus如下圖所示,可以運行docker pull 獲取所有組件的鏡像包括kubernetes、ansible等
Git Lab如下圖所示,也可以運行git clone 獲取所有的代碼倉庫包括Infrastructure Deploy的部署腳本。
如果條件允許可以為Nexus和Gitlab創(chuàng)建DNS記錄,或者可以通過修改本地/etc /hosts文件來通過使用特定域名訪問Nexus和Gitlab,如下文中使用的nexus-server訪問Nexus、gitlab-server訪問Gitlab。
Infrastructure Deploy
上文提到我們使用Ansible來實現(xiàn)基礎設施的自動化部署,我們知道目前主流的自動化部署工具包括Puppet、Chef、Ansible。 對比來說,Chef對于開發(fā)人員要更加“友好”,而Puppet則更適合運營和系統(tǒng)管理類的任務,但是我們選擇Ansible,主要的原因是:
Ansible是通過ssh進行所有操作,不需要在遠程服務器上安裝客戶端,而使用Chef引擎和Puppet時,都需要在其管理的服務器上安裝客戶端(雖然Chef聲稱其可以不安裝,但其無代理agent-less版本支持的功能十分有限),Ansible則會充分利用現(xiàn)有的東西,而且沒有其他任何要求[注]。
通俗的說Ansible的部署過程就是在一臺或者幾臺服務器上,執(zhí)行一系列的命令而已。Ansible playbook是Ansible更為強大的配置管理組件,實現(xiàn)基于文本文件編排執(zhí)行的多個任務,且多次重復執(zhí)行。所以我們選擇Ansible作為配置管理和自動化部署工具。
Ansible工作原理如下圖:
(圖片來自Ansible官網(wǎng))
使用Ansible使整個過程透明化,每個部署工作都實現(xiàn)為獨立的ansible playbook role,這樣可以在不同的環(huán)境里部署指定的服務,提高部署代碼的復用性。同時與Nexus配合使用,形成自動化部署的閉環(huán),不依賴網(wǎng)絡即可提供部署中依賴的所有組件,所有的應用程序都會以Docker image的方式提供。
在離線環(huán)境下使用Ansible是完全可行的,但是離線環(huán)境也無法直接安裝Ansible,為了統(tǒng)一管理我們也使用Docker鏡像來提供Ansible。在內網(wǎng)成功部署了Nexus后,使用docker pull nexus-server:5000/:即可獲得Ansible鏡像。同時Ansible所需playbook role文件則保存在Gitlab中,執(zhí)行git clone gitlab-server:2289/.git 下載deploy代碼庫。 deploy代碼庫結構如下:
運行以下命令即可實現(xiàn)基礎設施的一鍵自動部署:
docker run –rm -v WORKDIR:$(pwd) ansible:2.2.1 ansible-playbook -i uat/inventory all.yml
Business Deploy
最后Business Deploy就是標準的持續(xù)集成/交付過程,使用GoCD作為CI/CD工具,完成業(yè)務模塊的持續(xù)集成和部署。關于持續(xù)集成和持續(xù)交付,請參考https://en.wikipedia.org/wiki/Continuous_delivery/
總結
玩過紅警的朋友應該知道,在開局的時候你只有一個基地,需要采集資源、升級建筑、造兵攻打直到消滅所有的國家,一切都是自給自足。當然紅警是可以離線玩的, 上文描述的過程和紅警很類似,你只有一個基地,就是將所有部署所需要的文件如Nexus data、Gitlab repo等按照特定的目錄結構打成的zip包,使用U盤或者其他存儲介質拷貝到離線的網(wǎng)絡環(huán)境,就像雙擊紅警基地一樣,運行deploy.sh即可一鍵部署所有的基礎設施服務。
對于所有組件的升級,也比較容易,我們只需要將升級后的Docker鏡像拷貝到內網(wǎng),重新執(zhí)行Ansible腳本即可實現(xiàn)基礎服務的更新。
注:關于Ansible與其他工具的對比部分引用自:
http://blog.csdn.net/bvboca/article/details/53374244
https://www.upguard.com/articles/ansible-vs-chef
文/ThoughtWorks蘇開
原文鏈接:http://insights.thoughtworks.cn/offline-one-click-deployment/
版權聲明:本文內容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。