本文整理自Hank Hudgins,Capital One高級工程師,在JFrog 2019用戶大會上的講演《Automated Artifactory HA Pipeline》。
創(chuàng)新互聯(lián)長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為綠園企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站制作,綠園網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。Capital One是美國大的數(shù)字化銀行之一,其IT管理方法和應(yīng)用技術(shù)也極為敏捷,全球擁有上萬研發(fā),具備非常豐富的 DevOps落地經(jīng)驗。在Capital One的DevOps體系當(dāng)中,有很多類似于JFrog Aritfactory的HA(高可用)應(yīng)用服務(wù)集群。眾所周知,HA集群的運維,如升級、擴容、打補丁等工作,要想在保持用戶服務(wù)不中斷,服務(wù)水平不降級的前提下完成,尤其是在像Capital One這么大規(guī)模的DevOps系統(tǒng)當(dāng)中,是十分困難、復(fù)雜,和高風(fēng)險的。
Captital One使用的Artifactory為其DevOps體系中的制品及依賴管理提供了企業(yè)級解決方案,擁有工作(primary)和容災(zāi)(HR)兩類HA集群。Hank所在的Artifactory維護團隊,針對Artifactory HA集群維護的難點,通過建設(shè)和運行自動化的流水線,在不影響用戶使用和服務(wù)水平的前提下,自動、高效、保質(zhì)地完成了諸如版本升級、配置更新、補丁加載等工作,并且在檢測到問題時,還能夠?qū)崿F(xiàn)自動化的回滾。在本次講演中,Hank就介紹了這套自動化流水線的組成與特色。
Capital One采用這套可靠的自動化流水線,在Artifactory HA集群的維護工作中獲得了良好的收益:
首先是通過自動化加速了維護進程,使得開發(fā)人員能夠集中精力進行研發(fā),而不需要考慮重復(fù)性的部署和測試任務(wù);其次,流水線的可復(fù)用性也為維護工作提供了便捷的可擴展性,通過修改相關(guān)配置,流水線就能在新的環(huán)境中進行部署;最后,流水線還提供了可以快速檢測缺陷,并實現(xiàn)無縫、高效回滾的部署過程。
該自動化流水線是按下述方式組成的:
首先是利用Jenkins驅(qū)動整個流水線,并集成GitHub進行觸發(fā):
· 每個Pull Request會觸發(fā)小規(guī)模的測試以得到快速反饋。這些測試不是HA集群范圍的,但可以得到快速驗證;
· 每個Merge會觸發(fā)研發(fā)環(huán)境HA集群范圍的部署,并進行相關(guān)測試;
· 標(biāo)簽(Tag)被用來標(biāo)記代碼更新的驗證階段和對應(yīng)的環(huán)境。
其次,利用Terraform創(chuàng)建基礎(chǔ)設(shè)施,實現(xiàn)了“類”藍/綠的發(fā)布。
最后,利用Chef cookbook實現(xiàn)針對各種應(yīng)用服務(wù)的操作和配置更新。除了Artifactory,這些應(yīng)用服務(wù)還包括了相關(guān)用于反向代理的Nginx、監(jiān)控的Datadog,以及日志收集的Splunk。
接下來,Hank逐一介紹了這套自動化流水線各個階段的任務(wù)及實現(xiàn)方式。
首先是代碼的靜態(tài)分析,針對Pull Request和Merge運行。分析的目的是對代碼結(jié)構(gòu)進行快速驗證和反饋,確保其符合業(yè)界標(biāo)準。流水線集成了一系列的Linter來實現(xiàn)針對不同類型代碼的靜態(tài)分析。
接下來是安全測試,這在流水線當(dāng)中體現(xiàn)了“左移”的原則,能夠在真正部署之前盡早的檢測和發(fā)現(xiàn)潛在的安全漏洞。目前的安全測試分兩類,一類是靜態(tài)安全測試,即通過分析代碼結(jié)構(gòu)來發(fā)現(xiàn)如SQL注入、Cross-site腳本等安全隱患;另一類是JFrog Xray提供的依賴測試,檢測三方依賴包中是否包含已知安全漏洞,并推薦對應(yīng)的修復(fù)版本。
下一步是單元/集成測試,用于驗證代碼的更新不會破壞預(yù)期的功能。這一步測試也可以應(yīng)用于Artifactory的Custom user plugin的測試。流水線通過啟動包含Artifactory的容器,安裝并測試這些custom plugin,確保其正確工作,而不需要連接到真正的Artifactory HA集群。
在完成了上述初步的測試之后,自動化流水線進入發(fā)布過程。首先要把部署相關(guān)的文件暫存到可靠的位置,這樣在集群自動縮放的過程中不會依賴到其他系統(tǒng),也包括Artifactory自身。目前,部署的相關(guān)文件,包括二進制包和Chef cookbook,都從Artifactory下載并緩存到S3存儲上。
自動化流水線的部署階段實現(xiàn)了“類”藍/綠的部署過程,能夠保證新集群的部署不會影響到Artifactory的正常服務(wù):
1. 把用戶流量切換到容災(zāi)集群;
2. 縮容現(xiàn)有工作集群,僅保留幾個節(jié)點(保持和容災(zāi)集群的數(shù)據(jù)同步),不包括primary節(jié)點(由于Artifactory HA集群實現(xiàn)了多活的架構(gòu),每個節(jié)點都是支持讀/寫的,所以縮容primary節(jié)點并不會影響正常服務(wù))。
3. 基于同樣的數(shù)據(jù)庫和S3存儲,部署新的工作集群,包括新的primary節(jié)點。
4. 當(dāng)新的工作集群通過測試后,再把用戶流量切換回新的工作集群。
5. 之后再對容災(zāi)集群進行升級部署。
在上述部署過程中,兩個Artifactory集群之間始終保持著數(shù)據(jù)同步,所以從用戶的角度來看,部署是無縫切換的。
部署完成之后,要立即對集群中的各個應(yīng)用服務(wù)進行檢測。Jenkins通過SSH通道訪問新的服務(wù),并運行測試,確保Artifactory、Nginx等應(yīng)用服務(wù)運行正常,相關(guān)配置文件的內(nèi)容、位置、權(quán)限都部署正確,以及所有的網(wǎng)絡(luò)端口都正常開通。如果檢測失敗,將會啟動回滾過程。
接下來要運行系列的測試,確保Artifactory的各個repository都工作正常,包括能夠正確拉取Docker鏡像。同時,也要檢測新的系統(tǒng)配置是否會影響制品依賴的解析,以及對不同虛擬repository的制品上傳。
最后,還要進行性能測試,確保部署后集群性能沒有下降。目前是利用Jmeter來模擬產(chǎn)品級流量,盡可能的匹配峰值流量時的API調(diào)用頻率。常規(guī)15分鐘的負載測試作為流水線的一部分,而可選的1小時負載測試,只有大的變更時才會執(zhí)行。
性能測試的難點在于流量的建模,這是因為Artifactory的全語言特性帶來的復(fù)雜性,支持多種數(shù)據(jù)包類型,及對接相應(yīng)的包管理系統(tǒng)。通過分析Artifactory日志,獲得了用于測試的API調(diào)用序列。
最后,是自動化流水線當(dāng)中的回滾機制。目前實現(xiàn)了兩種回滾:
· In-region回滾。當(dāng)部署后的測試失敗時,馬上啟動自動化回滾,刪除新的集群,并恢復(fù)舊的集群。
· DR容錯回滾。當(dāng)工作集群升級成功后,或監(jiān)測幾天用戶流量,沒有問題的時候再更新容災(zāi)集群。如果在這幾天中發(fā)現(xiàn)問題,就會啟動容錯回滾:先把用戶流量切換到DR集群,然后把工作集群回滾到之前版本,數(shù)據(jù)庫回滾到之前的快照,再通過Artifactory Replication同步數(shù)據(jù),最后再把流量切換回回滾后的工作集群。
數(shù)據(jù)庫的回滾是個難題。在大版本的升級過程中,可能會有DB schema的變化,這時自動化的數(shù)據(jù)庫回滾很難實現(xiàn),目前暫時還是通過手工操作來完成。
Capital One通過自動化流水線實現(xiàn)Artifactory HA集群的維護工作,獲得了很好的效果和收益,加速了發(fā)布過程,提供了良好的可復(fù)用性和擴展性,也能夠啟動有效的回滾機制。
通過自動化流水線的應(yīng)用也可以看出,即使如Artifactory這樣成熟的商業(yè)化產(chǎn)品,也需要對基礎(chǔ)架構(gòu)和配置進行全面的測試。
最后,自動化流水線本身也是需要持續(xù)的投資和提升的。