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