[關(guān)鍵詞]流水線;全流程自動化;持續(xù)集成;持續(xù)交付;動態(tài)伸縮
[中圖分類號]TP39 [文獻(xiàn)標(biāo)志碼]A [文章編號]2095–6487(2024)11–0166–03
當(dāng)前,信息系統(tǒng)建設(shè)大多采用微服務(wù)架構(gòu),隨著業(yè)務(wù)的增加,微服務(wù)數(shù)量也隨之增加,尤其是大型系統(tǒng),微服務(wù)的數(shù)量多以百計,人工管理已不現(xiàn)實,需通過合理使用工具進行自動化管理,從而提高工作效率。信息化系統(tǒng)建設(shè)多以云原生技術(shù)體系、自主可控為原則設(shè)計,結(jié)合容器編排系統(tǒng)K8S,微服務(wù)架構(gòu)與DevOps工具鏈實現(xiàn)全流程自動化管理。其中,文章DevOps工具鏈用到的云原生組件包括禪道、GitLab、Nexus、Maven、Jenkins等。技術(shù)組件選型基于云原生技術(shù)體系,包含較多云原生組件,在項目中可根據(jù)項目實際需要結(jié)合項目特點選擇合適的組件。
1總體架構(gòu)
使用DevOps工作模式可實現(xiàn)信息系統(tǒng)建設(shè)的全生命周期系統(tǒng)化、自動化管理。要實現(xiàn)DevOps工作模式落地實施需要借助云原生組件構(gòu)建DevOps 工具鏈,實現(xiàn)計劃階段、需求階段、設(shè)計階段、開發(fā)階段、測試階段、交付部署階段的系統(tǒng)化管理,做到各階段工作有跡可循。DevOps工具鏈集成與工作流程如圖1 所示。
信息系統(tǒng)項目的計劃、需求階段文檔以及最終成型的交付物在禪道中管理,需求及設(shè)計評審?fù)ㄟ^后將需求與設(shè)計共同打包形成開發(fā)任務(wù),通過禪道將開發(fā)任務(wù)分配給開發(fā)人員;開發(fā)人員通過禪道領(lǐng)取開發(fā)任務(wù)。開發(fā)階段,使用GitLab作為代碼托管工具,使用Maven與Nexus管理微服務(wù)使用的依賴包,微服務(wù)的最終交付物是鏡像,在DevOps工具鏈中引入Jenkins作為CI/CD工具,實現(xiàn)代碼構(gòu)建、鏡像制作持續(xù)集成、持續(xù)構(gòu)建的工作。為了保障開發(fā)人員的代碼質(zhì)量,在代碼構(gòu)建過程中,在Jenkins中集成SonarScan 客戶端工具自動掃描代碼進行代碼質(zhì)量檢查,確保交付的代碼無漏洞、無代碼缺陷,并將掃描結(jié)果同步到SonarQube服務(wù)端,便于代碼審計;代碼構(gòu)建完成后引用Dockerfile 文件制作微服務(wù)鏡像,并將鏡像推送到鏡像倉庫,供測試人員部署到容器云平臺中進行系統(tǒng)功能及性能測試,測試完成的鏡像作為最終交付物,待上線交付用戶使用。
開發(fā)階段是持續(xù)的過程,通過圖1工具鏈的集成與協(xié)作,實現(xiàn)了信息系統(tǒng)的持續(xù)集成與繼續(xù)交付,以及信息系統(tǒng)全過程系統(tǒng)化管理。
2系統(tǒng)化項目管理
在項目建設(shè)過程中,項目管理至關(guān)重要,貫穿項目全生命周期,其好壞直接影響著項目的進度、成本及質(zhì)量。如何高效地進行項目管理需重點關(guān)注。通過自動化項目管理工具,將項目計劃、需求及工作任務(wù)相關(guān)聯(lián)可實現(xiàn)項目的簡約化管理。為了實現(xiàn)這一目標(biāo),需要引入系統(tǒng)化管理工具,將項目管理納入到全流程系統(tǒng)化管理中,從而做到項目計劃明晰,項目需求明確,項目組內(nèi)成員溝通順暢,同時也可實現(xiàn)項目管理過程留痕。
在項目管理過程中通過如下步驟實現(xiàn)項目的簡約、高效管理:①制訂項目管理里程碑,將項目劃分為需求、實施、測試及上線試運行階段,通過工具對需求進行管理。②將每個階段拆分成詳細(xì)的工作計劃,并將計劃與需求進行關(guān)聯(lián),從而得到需求落地時間線,便于掌握項目總體進度。③將項目組成員的工作任務(wù)進行系統(tǒng)化管理,在分配任務(wù)時,將任務(wù)與計劃和需求關(guān)聯(lián),便于明確項目組成員的工作狀況和對應(yīng)計劃及需求的狀態(tài)。
3代碼托管與代碼質(zhì)量管理
代碼托管與代碼質(zhì)量管理是項目實施過程中不可或缺的兩個重要環(huán)節(jié),尤其是大型、多團隊合作的項目,如何做好代碼管理與代碼質(zhì)量管理尤其重要。
在實際項目實施過程中,單個服務(wù)的代碼可分為開發(fā)分支(dev)、測試分支(test)、預(yù)生產(chǎn)分支(premaster)及生產(chǎn)分支(master)。項目開發(fā)時初始代碼均由master 分支拉取,開發(fā)人員在dev 分支按模塊或開發(fā)人員賬號創(chuàng)建單獨的分支,本地開發(fā)自測完成后將本地代碼檢入dev 分支并在開發(fā)環(huán)境發(fā)版進行線上測試;dev 分支完成后將代價檢入test 分支提交測試人員在測試環(huán)境發(fā)布測試,如此依次進行預(yù)生產(chǎn)、生產(chǎn)環(huán)境的代碼檢入和各自對應(yīng)預(yù)生產(chǎn)環(huán)境和生產(chǎn)環(huán)境的發(fā)布。master 分支是最終的成品庫,在該分支進行代碼的版本管理和產(chǎn)品功能發(fā)布。當(dāng)測試、預(yù)生產(chǎn)及生產(chǎn)環(huán)境出現(xiàn)bug時,需在對應(yīng)分支創(chuàng)建hotfix 分支進行bug修改,功能測試通過后將hotfix 分支的代碼檢入master、premaster、test 及dev 分支。
代碼質(zhì)量管理指通過一系列過程和工具確保軟件產(chǎn)品滿足用戶需求,符合預(yù)期質(zhì)量標(biāo)準(zhǔn)。在持續(xù)集成階段,通過代碼質(zhì)量檢查實現(xiàn)對代碼的靜態(tài)掃描,得到代碼中的漏洞、缺陷,形成質(zhì)量報告,指導(dǎo)開發(fā)人員規(guī)范編碼。集成測試與系統(tǒng)測試屬于動態(tài)測試,動態(tài)測試可幫助及時發(fā)現(xiàn)系統(tǒng)運行時的缺陷。靜態(tài)與動態(tài)兩種檢查模式,保障開發(fā)的系統(tǒng)滿足安全性、健康性和可靠性的要求。
4"Jenkins流水線
通過流水線方式實現(xiàn)自動化構(gòu)建最常用的工具是Jenkins。通過Jenkins 工具可將DevOps 工具鏈中各組件集成到一起,Jenkins通過集成DevOps 工具鏈中的GitLab、Naven、Nexus、SonarScan 并結(jié)合K8S 實現(xiàn)流水線式一鍵和自動化部署上線,集成以上組件需要在Jenkins 中安裝相關(guān)組件的插件。
Jenkins 作為常用的CI/CD工具,常用的方式有自由風(fēng)格和流水線(Pipeline)。其中,Pipeline是一套運行時工作流框架,將原本獨立運行的單個或多個節(jié)點任務(wù)連接起來,實現(xiàn)單個任務(wù)難以完成的復(fù)雜流程編排和流程可視化。實現(xiàn)流水線模式需要進行流水線腳本編寫,可采用腳本式和聲明式兩種模式,流水線腳本可在Jenkins 系統(tǒng)通過頁面方式編寫shell 腳本,也可以在工程中創(chuàng)建Jenkinsfile 文件,使用者選用哪種方式可根據(jù)自身掌握程度進行選擇。
在編寫流水線腳本時主要包含以下步驟。
(1)拉取GiaLab代碼并調(diào)用Maven工具進行代碼構(gòu)建。
(2)調(diào)用SonarScan掃描代碼進行代碼質(zhì)量檢查。
(3)調(diào)用Dockerfile 文件基于基礎(chǔ)鏡像制作業(yè)務(wù)鏡像。
(4)將業(yè)務(wù)鏡像推送到鏡像倉庫。
(5)將鏡像部署到K8S平臺中。
以上方式需要手動觸發(fā)構(gòu)建,在開發(fā)過程中,為了提高開發(fā)效率,需要開發(fā)人員在提交代碼時自動構(gòu)建、交付和部署。實現(xiàn)這種方式需要在GitLab 中配置觸發(fā)Jenkins自動構(gòu)建的webhook,配置流程如下。
(1)在GitLab 中創(chuàng)建訪問Token。
(2)在Jenkins 系統(tǒng)設(shè)置中配置GitLab訪問地址以及輸入步驟1生成的Token。
(3)配置Jenkins 中Pipeline 工程,在構(gòu)建觸發(fā)器中設(shè)置webhook 觸發(fā)。
(4)在GitLab 中集成模塊配置webhook 鉤子及觸發(fā)方式。
通過流水線可視化模式,便于在構(gòu)建過程中快速定位問題,從而節(jié)省排查問題的工作量,通過自動化構(gòu)建模式減少了項目組內(nèi)部溝通成本,節(jié)省了開發(fā)過程中重復(fù)機械乏味的工作,提高了開發(fā)速度和效率。
5容器云平臺的能力
當(dāng)前容器技術(shù)已較為成熟,且應(yīng)用廣泛,尤其是對于微服務(wù)架構(gòu)來說,容器部署已成為必選,而使用Docker 與K8S 結(jié)合搭建容器云平臺幾乎成為微服務(wù)架構(gòu)的標(biāo)配。DevOps與容器化是云原生生態(tài)的兩大技術(shù)體系,兩者可結(jié)合使用。
容器云平臺提供了應(yīng)用程序的部署、擴展和管理,包涵容器編排、資源調(diào)度、彈性伸縮、部署管理、服務(wù)發(fā)現(xiàn)等一系列功能,基于云化部署的信息化全流程管理,使得應(yīng)用部署更簡單高效。K8S 中的自我修復(fù)特性保障了應(yīng)用的可用性,動態(tài)擴縮容能力保障了應(yīng)用的健壯性。
5.1部署Jenkins
將Jenkins部署在容器云平臺之前需要制作Jenkins與Maven的鏡像,將兩者打包到一個鏡像中,在配置K8S的Deployment 配置文件時需要完成以下配置項。
(1)掛載jenkins_home 目錄到宿主機(如有共享存儲可掛載到共享存儲數(shù)據(jù)卷)。
(2)掛載宿主機的docker 進程到j(luò)enkins 的/run/docker.sock。
(3)掛載maven 的settings.xml 到maven 工作目錄/conf/settings.xml。
(4)掛載/etc/docker/daemon.json保證能夠訪問harbor倉庫。
(5)配置節(jié)點選擇器,將pod調(diào)度到指定的工作節(jié)點上,保證pod銷毀重建時jenkins的數(shù)據(jù)不丟失。
5.2自動擴縮
在基于云化部署的信息化系統(tǒng)中,除了保證基本的容器云平臺能力之外,還需要保障應(yīng)用的高可用性,做到訪問高峰期自動擴容,低谷期自動縮容,實現(xiàn)動態(tài)自動擴縮容。
K8S 中根據(jù)適用擴縮對象實現(xiàn)自動擴縮容,分工作節(jié)點和工作負(fù)載。基于工作節(jié)點的擴縮適用于K8S工作節(jié)點在資源不滿足調(diào)度時,通過增加工作節(jié)點的方式增加系統(tǒng)資源,在工作節(jié)點資源閑置時,通過減少工作節(jié)點釋放系統(tǒng)資源,從而保證硬件資源的高效利用?;诠ぷ髫?fù)載的擴縮,主要實現(xiàn)自動更新工作負(fù)載資源以滿足需求,最終體現(xiàn)在對Pod 的資源調(diào)度,擴縮Pod 資源可采用垂直擴縮和水平擴縮,垂直擴縮即資源緊張時將更多資源(例如,內(nèi)存或 CPU)分配給已經(jīng)為工作負(fù)載運行的 Pod,資源閑置時縮減Pod 的資源,水平擴縮通多增加和減少Pod 的數(shù)量滿足需求,在實際生產(chǎn)環(huán)境中,大多采用水平Pod 數(shù)量擴縮。
水平Pod數(shù)量擴縮實現(xiàn)時有HPA、KPA 和VPA3 種方式。HPA(Horizontal Pod Autoscaling)主要通過監(jiān)測工作節(jié)點的內(nèi)存或CPU 等資源實現(xiàn),在部署應(yīng)用時增加HorizontalPodAutoscaler 控制器并配置相應(yīng)的度量指標(biāo)實現(xiàn)。KPA(Knative Pod Autoscaler)基于請求數(shù)對Pod自動擴縮容。VPA(Vertical PodAutoscaler)基于Pod 的資源使用情況自動為集群設(shè)置資源占用的限制,其會根據(jù)容器資源使用率自動設(shè)置Pod的CPU和內(nèi)存的requests,從而允許在節(jié)點上進行適當(dāng)調(diào)度,以便為每個Pod 提供適當(dāng)?shù)目捎霉?jié)點。
基于容器云平臺的云化部署能力,可實現(xiàn)應(yīng)用的一鍵部署,不必關(guān)注服務(wù)器硬件及中間件等繁瑣的集成配置等工作,為基于云化部署的信息化系統(tǒng)全流程管理提供了一站式解決方案。
6結(jié)束語
文章對基于云化部署的信息系統(tǒng)自動化管理平臺設(shè)計進行了探討,基于云平臺設(shè)計,項目全生命周期得到了有效管理,從項目計劃、需求、設(shè)計、開發(fā)、測試、部署全過程實現(xiàn)了自動化管理,做到需求快速響應(yīng),項目管理過程有跡可循。實現(xiàn)了從敏捷開發(fā)、敏捷交付到敏捷運維,降低了人員流動引起的風(fēng)險。