9月6日,由深圳金融信息服務(wù)協(xié)會主辦,我公司(深圳睿云智合科技有限公司)與Rancher Labs聯(lián)合協(xié)辦的,深圳金融IT界容器技術(shù)專題研討會隆重召開并勝利閉幕!會議匯聚了國內(nèi)外知名的云計算技術(shù)大咖,以及招商銀行、平安科技、富德生命人壽、廣發(fā)證券等國內(nèi)金融科技引領(lǐng)企業(yè)的容器技術(shù)實踐團隊的經(jīng)驗分享,為150多人的在場嘉賓奉上了一場堪稱金融行業(yè)與最前沿容器技術(shù)的巔峰碰撞!除了深圳本地的金融行業(yè)技術(shù)人員,更有來自北京、上海、東北的多家金融機構(gòu)信息技術(shù)團隊積極參與,大家紛紛表示會議干貨多多,收獲頗豐。以下就是小編為大家整理的嘉賓分享內(nèi)容系列速遞,按照演講順序,今天為大家推出的是來自前Eucalyptus 架構(gòu)師&中國區(qū)技術(shù)總監(jiān),現(xiàn)睿云智合CTO,國內(nèi)云計算資深專家徐年剛(Nathan)的分享:《金融行業(yè)基于容器技術(shù)的DevOps》
究竟DevOps是什么?DevOps是如何促進開發(fā)、測試、運維一體化?在企業(yè)有哪些實踐?以及DevOps和容器技術(shù)有什么關(guān)系?CI/CD有哪些常見的解決方案?相信Nathan接下來的分享都會給大家一些重要的啟發(fā)。
DevOps 介紹和實踐
首先,Nathan簡單的介紹了軟件產(chǎn)品交付變革。在之前的軟件交付中,軟件的設(shè)計規(guī)劃,占用的時間都比較長,導(dǎo)致交付到客戶手中的時間就較長。隨著互聯(lián)網(wǎng)的飛速發(fā)展,現(xiàn)在的交付理念是:小步快跑的方式交付產(chǎn)品,收集用戶反饋,持續(xù)對產(chǎn)品進行改進。之前我們更多是在講敏捷開發(fā)、而現(xiàn)在更多是DevOps開發(fā)運維協(xié)作一體化,在企業(yè)中已經(jīng)得到了許多實踐應(yīng)用。
一
什么是DevOps?
A DevOps是英文Development和Operations的組合
B DevOps是一組過程、方法與系統(tǒng)的統(tǒng)稱:用于促進開發(fā)(應(yīng)用程序/軟件?工程)、技術(shù)運營和質(zhì)量保障(QA)部門之間的溝通、協(xié)作與整合,這才是DevOps的宗旨。
二
DevOps企業(yè)實踐
DevOps在企業(yè)中的實踐主要從四個方面來實施:
- 持續(xù)部署(CI/CD)
- 度量和反饋(持續(xù)運營)
- 組織協(xié)作(建立全功能團隊)
- 架構(gòu)解耦(系統(tǒng)解耦,技術(shù)解耦)
由于此次研討嘉賓實在大咖,而時間卻有限,所以Nathan這一次先給我們介紹CI/CD。怎么開始CI/CD實踐呢?主要是從以下5個方面。
持續(xù)集成/部署流水線
這個環(huán)節(jié)是怎么樣實現(xiàn)的呢?開發(fā)者提交代碼觸發(fā)代碼更新,然后自動CI構(gòu)建,在等待構(gòu)建成功之后,開始部署和執(zhí)行自動化功能測試。自動化部署成功之后,觸發(fā)手動部署UAT或者生產(chǎn)環(huán)境上以及非功能性測試。說這么多,流水線內(nèi)部是怎么樣的呢?如下圖:
圖1:基本CI構(gòu)建
圖2:?自動化功能、契約測試
圖3:部署手動測試
那怎樣CI/CD流水線設(shè)計才算是好的呢?
- 可視化:流水線的運行和停止,成功與失敗對所有人直觀可見;通過大顯示器投放給整個團隊
- 反饋:流水線通過顯示器,短信,郵件等多種手段及時將失敗信息傳達到相關(guān)團隊成員
- 可控制:從構(gòu)建到生產(chǎn)發(fā)布總有一些環(huán)節(jié)是需要人手動驗證的,比如UAT,發(fā)布前的批準(zhǔn)等;端到端的流水線需要某些環(huán)節(jié)可以暫停,等待手動繼續(xù)
- 門禁:流水線中任何一個環(huán)節(jié)失敗應(yīng)該讓流水線停下來,并通知團隊,比如自動化測試不通過,Schema升級失敗等
- 關(guān)注度:當(dāng)流水線發(fā)生失敗時團隊必須立刻有人關(guān)注并解決它,否則流水線的反饋對團隊的作用就會大打折扣。Time in “Red”是對流水線關(guān)注度的一個重要度量指標(biāo)
內(nèi)建質(zhì)量
內(nèi)建質(zhì)量即在軟件產(chǎn)生的各個環(huán)節(jié)中建立固化的、自動化的質(zhì)量保障體系。
我們來看下一個比較經(jīng)典的質(zhì)量控制體系案例:
- 靜態(tài)程序分析
利用代碼分析工具,不執(zhí)行代碼的情況下對其質(zhì)量進行檢查,包括重復(fù)代碼,安全漏洞,及各種代碼壞味道;
- 單元測試
直接調(diào)用應(yīng)用代碼,對程序的輸入與輸出,以及執(zhí)行過程是否符合預(yù)期進行測試;單元測試不能僅強調(diào)覆蓋率,而要進行評審,保證有效性和場景覆蓋的完整性;
- 自動化契約測試
系統(tǒng)提供的每一個接口(Web服務(wù),MQ或其他)都是與其消費者所達成的契約,都必須要有對應(yīng)的自動化測試;
- 自動化部署驗證
在生產(chǎn)環(huán)境部署完成后,通過自動化方法對其部署是否成功,應(yīng)用和服務(wù)的運行狀態(tài)進行驗證,以判斷該部署的新版本是否能夠向用戶開放;
- 自動化界面測試
通過模擬真實人在界面上與系統(tǒng)的交互,對系統(tǒng)的完整業(yè)務(wù)流程進行驗證;這種測試方法更貼近真實,但執(zhí)行效率也較低;
- 自動化非功能測試
非功能測試包括性能測試,壓力測試,安全性測試等,也應(yīng)當(dāng)集成到端到端的部署流水線中;不過并非每一個故事或特性都需要非功能測試
基礎(chǔ)設(shè)施即代碼
基礎(chǔ)設(shè)施即代碼,怎么做呢?腳本化一切可以腳本化的、用版本控制庫管理所有腳本和代碼、禁止人工操作。
- 構(gòu)建
利用Shell腳本文件(.sh)或自動構(gòu)建工具來進行應(yīng)用和服務(wù)的依賴管理,編譯,執(zhí)行測試,和生成安裝包、部署包。
不同的語言有不同的構(gòu)建工具,如Java的Maven,Gradle;C/C++/Objective C的gcc, CMake, Ruby的Rake等。
- 環(huán)境配置
利用自動化環(huán)境管理工具來進行服務(wù)器上的軟件安裝,升級,配置,服務(wù)的啟動和停止,權(quán)限設(shè)置,文件操作等各種任務(wù)。
目前成熟常用的IT自動化管理工具包括Puppet,Chef,Ansible等。
- 數(shù)據(jù)庫變更
利用數(shù)據(jù)庫自動化管理工具進行數(shù)據(jù)庫Schema的創(chuàng)建,更新,數(shù)據(jù)初始化,數(shù)據(jù)遷移等任務(wù)。
自動化部署
自動化部署主張:一次打包,隨處部署。環(huán)境配置信息必須從代碼中剝離,剝離的環(huán)境配置文件不放進應(yīng)用軟件包,以文件或獨立jar包的形式單獨部署(WebSphere,Tomcat都支持共享classpath)。且可采用配置模板文件,打包時自動替換環(huán)境參數(shù)。
- 服務(wù)器應(yīng)用部署
- 基本步驟是Server shutdown,Package upload and copy,Server startup。
- 可以采用Chef,Ansible等自動化工具進行自動部署。
- 采用其他商業(yè)化的部署工具。
- 客戶端或移動應(yīng)用
- 將應(yīng)用包上傳到特定的位置供用戶下載;如果是企業(yè)應(yīng)用發(fā)布平臺,建議由平臺提供部署服務(wù);或者提供權(quán)限進行包文件上傳。
- 如果是部署到外部應(yīng)用商店,如Google Play,由于頻率不高通常手動進行,也可以采用自動化Web測試的方法進行自動form提交部署。
- 數(shù)據(jù)庫變更
1.可以采用Flyway進行數(shù)據(jù)庫自動部署,前提是數(shù)據(jù)庫基線和所有變更都已腳本形式在版本控制庫中。
2.數(shù)據(jù)庫變更前自動備份。
3.采用NoSQL數(shù)據(jù)庫,如MongoDB等,免去Schema變更的需要。
運維監(jiān)控
? 系統(tǒng)監(jiān)控:通過監(jiān)控工具對包括服務(wù)器運行狀態(tài),比如CPU,網(wǎng)絡(luò)流量,磁盤,內(nèi)存等,進行實時監(jiān)控,并及時告警
? 應(yīng)用和服務(wù)監(jiān)控:對運行中的應(yīng)用和服務(wù)的健康度進行監(jiān)控,包括Web是否可訪問,服務(wù)是否可用,訪問并發(fā)數(shù),響應(yīng)速度等;定期進行檢測以便在用戶報告問題之前及早發(fā)現(xiàn)風(fēng)險
? 特性監(jiān)控:對某些關(guān)鍵特性的(業(yè)務(wù))正確性進行持續(xù)的驗證,監(jiān)控其數(shù)據(jù)一致性等。這一類監(jiān)控完成的,而是個持續(xù)的過程,每發(fā)布一個新特性,可能就需要增加一些監(jiān)控手段
DevOps 和容器技術(shù)
既然容器技術(shù)現(xiàn)在正在以指數(shù)的增長趨勢發(fā)展,那先來看看大家都是怎么使用容器的吧!
那容器將如何促進DevOps在企業(yè)中落地呢?
用容器打包應(yīng)用
- 應(yīng)用交付件標(biāo)準(zhǔn)化:使用鏡像,實現(xiàn)應(yīng)用的標(biāo)準(zhǔn)化交付。
- 將應(yīng)用和依賴環(huán)境封裝在一起, 解決環(huán)境依賴問題。
- Build, Ship, Run
用容器來實現(xiàn)自動化部署
利用容器,將應(yīng)用和環(huán)境封裝,解決環(huán)境部署一致性問題,方便實現(xiàn)應(yīng)用的自動化部署。
- 取代過去傳統(tǒng)的用腳本進行配置環(huán)境、應(yīng)用部署的方法。
- 在部署平臺上實現(xiàn)一整個開發(fā)/測試環(huán)境的一鍵部署。
- 在實現(xiàn)自動部署的同時,在平臺提供各種高級部署功能。
- 滾動更新,藍綠發(fā)布。
三
用容器來優(yōu)化流水線任務(wù)
- 將每個流水線任務(wù)所依賴的運行環(huán)境制作成的容器鏡像
- 流水線上的任務(wù)非常適合在容器中執(zhí)行,快速啟動,執(zhí)行完后銷毀,適合大規(guī)模,并發(fā)的流水線任務(wù)
- 靈活的流水線設(shè)計,只需要在執(zhí)行任務(wù)的時候選擇不同的基礎(chǔ)鏡像,就可以使用不同的技術(shù)堆棧來完成流水響任務(wù)
- 解決流水線任務(wù)的環(huán)境沖突,比如可以在同一個構(gòu)建系統(tǒng)里面同時用JDK8 或者JDK5 來編譯應(yīng)用
CI/CD解決方案
利用開源Jenkins 和?配套工具鏈
以Jenkins 核心,結(jié)合其他工具鏈來實現(xiàn)持續(xù)集成和部署, 包括集成:
- 代碼管理
- 質(zhì)量控制框架
- 自動化部署工具或者平臺
涌現(xiàn)的其他開源/商業(yè)方案
除了Jenkins, 目前也涌現(xiàn)非常多的以持續(xù)集成的方案
- Drone
- Go-CD
- TeamCity
- Travel-CI
- PAAS 平臺
以Jenkins 為核心研發(fā)
Jenkins 的集成能力非常強,但功能太多,以Jenkins 為核心,簡化和工具鏈的集成,整合容器技術(shù)。
我們將以睿云智合的實踐來說明。
- 開箱即用,簡化和正確地打造企業(yè)CI/CD 流水線。
- 基于容器的CI/CD集成方案,開箱即用。
- WiseBuild 簡化CI/CD各種技術(shù)棧的集成和實施,以pipeline為核心,整合各種持續(xù)部署/集成流水線相關(guān)的構(gòu)建,測試,部署技術(shù)。
- WiseBuild用于開發(fā),測試和運維團隊的提供靈活的CI/CD流失線設(shè)計平臺,應(yīng)到開發(fā),測試和運維團隊正確的設(shè)計企業(yè)持續(xù)集成,持續(xù)部署流水線。
- Rancher是成熟的容器管理平臺,為應(yīng)用的自動化部署提供成熟的功能支持
- 集成平臺– 持續(xù)集成&持續(xù)部署
- 以流水線為中心,持續(xù)集成
- Pipeline as code!靈活的流水線設(shè)計,可以為每個開發(fā)應(yīng)用定義多條流水線,分別用于持續(xù)集成和部署,流水線可以包含多個stage。每個stage 用來實現(xiàn)代碼編譯,單元測試,集成測試等。
- 集成各種質(zhì)量框架,包括代碼檢查,自動化測試框架支持自動生成容器鏡像支持從構(gòu)建物自動生成面向開發(fā)人員的開發(fā)測試環(huán)境。
- 為開發(fā)者的單元測試,集成測試提供服務(wù)集成,例如數(shù)據(jù)庫集成服務(wù)支持自動化部署各種驗收測試環(huán)境對接持續(xù)集成流水線和驗收測試環(huán)境的對接,實現(xiàn)驗收測試環(huán)境的自動更新和升級。
4.自動部署?&持續(xù)部署
- 支持從容器管理平臺導(dǎo)入各種運行環(huán)境,設(shè)計支持CaaS平臺和PaaS平臺目前支持Rancher 平臺,支持Rancher的cattle, swarm, kubernets環(huán)境。
- 支持和部署相關(guān)的流水線,可以代碼部署分支拉取代碼,編譯,部署和做自動驗證測試。
- 支持在Rancher 環(huán)境自動化部署應(yīng)用,對接應(yīng)用和部署流水線。