久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

基于Jenkins和Kubernetes的CI工作流怎么實現(xiàn)

171次閱讀
沒有評論

共計 7401 個字符,預(yù)計需要花費 19 分鐘才能閱讀完成。

本篇內(nèi)容主要講解“基于 Jenkins 和 Kubernetes 的 CI 工作流怎么實現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“基于 Jenkins 和 Kubernetes 的 CI 工作流怎么實現(xiàn)”吧!

摘要

Jenkins 作為最為流行的持續(xù)集成工具,在結(jié)合使用容器技術(shù),Kubernetes 集群的基礎(chǔ)上,該如何發(fā)揮出新的能力,在應(yīng)用微服務(wù)化的基礎(chǔ)上,提供更好的 CI 方式,值得我們每一個開發(fā)人員去持續(xù)不斷的摸索。 

Jenkins 和 Kubernetes

Jenkins 作為最流行的持續(xù)集成工具,有著豐富的用戶群、強大的擴展能力、豐富的插件,是開發(fā)人員最為常見的 CI 工具。在 Jenkins 加強其 Pipeline 功能后,更是可以通過豐富的 step 庫,實現(xiàn)各種復雜的流程。同時隨著 Docker 的流行,Jenkins 內(nèi)也增加了對 Docker 的支持,可以實現(xiàn)容器內(nèi)流程的執(zhí)行。

而 Kubernetes 隨著版本迭代的速度越來越快,在容器圈內(nèi)的熱度也越來越高,同時每次版本發(fā)布,所新增的功能也不斷增加。做為當前主流的容器管理平臺,其強大的能力無需在此多做介紹。

應(yīng)用容器化和應(yīng)用微服務(wù)化設(shè)計思考

容器化不意味著微服務(wù)化,傳統(tǒng)單體應(yīng)用也可以容器化,但是很難享受到容器化后帶來的好處。微服務(wù)化也不是一定要容器化,應(yīng)用拆解為微服務(wù)后,一樣可以不利用容器而是通過傳統(tǒng)的運維來完成系統(tǒng)構(gòu)建和部署。當微服務(wù)化和容器化相結(jié)合之后,就能充分利用各方優(yōu)勢,帶來了彈性伸縮,簡化部署,易于擴展,技術(shù)兼容等優(yōu)點。

我們在針對應(yīng)用進行微服務(wù)化拆分的過程中,主要先考慮到的是功能點、控制對象、開發(fā)組的人員配置安排,產(chǎn)品路線圖規(guī)劃等。例如,針對現(xiàn)有開發(fā)組人員人數(shù)、分配和各自的技能熟練程度,就可以考慮到服務(wù)模塊數(shù)量的控制,安排好服務(wù)模塊開發(fā)小組;針對功能點和中遠期產(chǎn)品規(guī)劃,就可以將特定功能歸納到一個服務(wù)模塊中,并在版本開發(fā)迭代的過程中,通過擴展這個服務(wù)模塊的能力,來完成產(chǎn)品功能的開發(fā),或者暫時將部分功能整合在一個模塊中,隨著功能增加或迭代開發(fā),再進行進一步的模塊拆分或拆解。

對于模塊開發(fā)的要求,由于使用了容器技術(shù),對于開發(fā)語言或特定框架的選型,可以交給具體的模塊開發(fā)人員。在團隊內(nèi),我們不做強制要求,但是做建議要求,避免出現(xiàn)過多的技術(shù)棧,導致后期的維護困難。在我們團隊內(nèi),就只集中在兩種后端開發(fā)語言的使用,相應(yīng)的框架或主要的開發(fā)庫,也都有相應(yīng)而且明確的選擇。對于模塊的 API 接口,使用 REST,并且至少按照成熟度模型 LEVEL2 提供 API。

容器環(huán)境下的編譯和單元測試

我們整個 CI 工作流的驅(qū)動,都是由 Jenkins 完成,并且使用了 Jenkins Pipeline。第一,Pipeline 可以更好的組合 job 內(nèi)的 Stage,重復利用模塊間相同的部分,并且隨著開發(fā)復雜度的增加來逐步增加擴展 stage,實現(xiàn)更多所需的功能;第二,將 Pipeline Groovy 腳本來源設(shè)置為源代碼內(nèi),可以根據(jù)源代碼功能點來控制流程,同時也完成了對腳本的版本管理。

由于有容器這么個工具,我們各個模塊的編譯環(huán)境,單元測試環(huán)境,也都放到了容器中。各個模塊均可以安裝自身模塊的運行特性或環(huán)境要求,準備自身的編譯環(huán)境、單元測試環(huán)境、運行環(huán)境,因此,代碼庫內(nèi)會分別留存相應(yīng)的 Dockerfile,通過不同的 Dockerfile 完成不同環(huán)境鏡像的準備。

同時,jenkins 現(xiàn)在也可以通過 Docker Pipeline 插件,支持在容器內(nèi)運行 Step,因此我們利用其功能完成的實際的編譯和測試流程是這樣的:

1. 使用編譯環(huán)境的 Dockerfile 構(gòu)建編譯環(huán)境鏡像。

2. 使用編譯環(huán)境鏡像啟動容器并在容器內(nèi)完成編譯,完成編譯的中間產(chǎn)物也暫存在 Workspace 中。

3. 使用測試環(huán)境的 Dockerfile 構(gòu)件單元測試環(huán)境鏡像。

4. 使用單元測試環(huán)境鏡像啟動容器并在容器內(nèi)運行單元測試,單元測試腳本來源于代碼庫,同時也使用到編譯時生成的中間產(chǎn)物。

5. 使用發(fā)布 Dockerfile 構(gòu)建實際發(fā)布鏡像并上傳鏡像庫。

其中由于編譯環(huán)境和單元測試環(huán)境不是經(jīng)常變更,也可以抽出編譯環(huán)境鏡像準備和單元測試環(huán)境鏡像準備兩個步驟放到獨立的 CI job 中去,需要時手工觸發(fā)即可。

服務(wù)部署和升級

對于 CI 流程,在完成編譯和打包后,需要做的就是服務(wù)啟動和測試了。我們利用的是 Kubernetes Deployment 和 Service,在每次 CI 流程完成編譯和打包后,通過拿到 Build 號,作為鏡像的 Tag,完成鏡像的上傳歸檔;同時利用 Tag,修改 Kubernetes 中已經(jīng)創(chuàng)建的 Deployment,利用 Deployment 的 Rolling Update,完成升級。

對 kubernetes 服務(wù)模版和服務(wù)配置的擴展  

我們在實際使用 Kubernetes Deployment 升級的方式進行服務(wù)部署的過程中,發(fā)現(xiàn)其中還是存在很多不方便的地方。例如:Kubernetes 內(nèi)的同名問題,Kubernetes Deployment 升級時的鏡像 tag 變更問題,等等各處需要隨著 CI 流程可能存在變更的地方。例如在有相同名字的 Deployment 存在的情況下,后來的 Deployment 會無法創(chuàng)建,這導致如果想以啟動新的 Deployment 的方式來測試某個版本,需要修改名稱,對于與 Deployment 相關(guān)的 Service 也一樣,在啟動新的命名后的 Deployment,也需要啟動與其對應(yīng)的 Service 用于暴露服務(wù)。對于 Deployment 升級所需的鏡像 Tag 修改,需要每次隨著 CI 生成了新的鏡像 Tag 而做變更,因而每次需要修改相應(yīng) Yaml 文件內(nèi)的鏡像 Tag,修改為實際 CI 流程中生成的值,然后再使用升級功能完成服務(wù)升級。

針對這些問題,我們使用了一套文本模板引擎,部署或升級用的 Yaml 文件本身寫成為模板,可能有變化或者需要根據(jù) CI 流程變化的位置,使用模板標識占位,而具體的模板數(shù)據(jù)內(nèi)容,則或者通過 Jenkins 的 CI 流程獲取,或者使用特定的配置文件讀取,或者從具體的輸入?yún)?shù)來獲取;同時,模板數(shù)據(jù)內(nèi)容,也會在實際部署時,做為 Kubernetes 的 Configmap 設(shè)置到系統(tǒng)中,因此數(shù)據(jù)內(nèi)容也可以通過 Kubernetes 使用 Configmap 的方式來用到環(huán)境變量或啟動命令中。通過文本模板引擎,將模板和數(shù)據(jù)合并后,生成的 Yaml 文件,再作為后續(xù) Kubernetes 操作所使用的內(nèi)容。

通過利用這種方式,我們把需要部署的內(nèi)容分離成了模板和配置;模板一般在服務(wù)架構(gòu),使用的鏡像名,啟動方式或配置參數(shù)沒有大的變化的情況下保持不變,而通過不同配置的靈活使用,完成服務(wù)升級或拉起新部署,完成不同數(shù)據(jù)存儲使用的指向,完成對各模塊內(nèi)部配置的修改。通過利用這種方式,我們的可修改的內(nèi)容,從 Configmap 本身只能覆蓋到的環(huán)境變量或啟動命令這塊,擴展到了啟動名稱,Label,鏡像等 Yaml 文件內(nèi)的各個可填值處,以此來解決同名,鏡像修改,Label 增加或變更等各種使用 Kubernetes 時碰到的問題。

自動化測試

在通過 Jenkins 拉動完成編譯打包和服務(wù)升級部署后,就可以拉動自動化測試了。測試框架我們選擇了使用 Robotframework。測試腳本通過 Kubernetes Service 獲取到服務(wù)的具體暴露端口,然后再根據(jù)測試腳本依次執(zhí)行針對 API 的測試。測試腳本的來源,部分是從各模塊代碼庫中,由各模塊開發(fā)人員提交的針對自身模塊的 api 測試,部分是由測試人員完成撰寫提交的針對跨模塊的測試。針對自動化測試這塊,我們的完成度并不是很高,僅僅是搭建起了基本的運行框架,能夠與整個流程對接上。

版本發(fā)布

由于開發(fā)的產(chǎn)品本身就是由若干鏡像構(gòu)成,因此產(chǎn)品發(fā)布,可以歸結(jié)為鏡像的發(fā)布。在測試通過后,可以簡單的利用鏡像復制能力,將測試通過的相關(guān)鏡像的版本,通過鏡像庫間的復制,由開發(fā)測試所用的內(nèi)部鏡像庫,復制到外部發(fā)布鏡像庫,就可以完成版本發(fā)布,同時可以通過復制時的 Tag 控制,發(fā)布為指定的版本號。

總結(jié)

如上介紹,說明了我們在自身開發(fā)過程中建立 CI 流程的做法。對于整個流程的建立,我們并沒有太多需要特殊化處理的地方;對于各項工具的使用,也沒有太多突出之處;我們僅僅根據(jù)自身需求,建立了和開發(fā)過程適配的 ci 流。在此介紹我們的 ci 流程的建立,也是希望拋磚引玉,能從更多處獲得交流和向大家學習的機會。

Q A

Q1:嘉賓分享的內(nèi)容還是概括了些,有沒有具體例子?配圖說明的直觀內(nèi)容?

A:基于 K8s 的 CICD 產(chǎn)品即將發(fā)布,會提供對應(yīng)的 Demo 演示平臺,請及時關(guān)注,謝謝!

Q2:關(guān)于 Jenkins 和 Docker 集成的幾個插件可以分享一下嗎?

A:Docker Pipeline、Docker Plugin、Docker-build-step 這幾個插件。

Q3:請問有容云的鏡像復制大體思路是什么?目前我們是測試、預(yù)發(fā)布、發(fā)布共享一個倉庫。通過輔助模塊標簽實現(xiàn)的!

A:鏡像復制功能,簡單來說實現(xiàn)了不同項目間的鏡像克隆,根據(jù)我們鏡像倉庫的設(shè)計,對不同階段(開發(fā),測試,可上線)的鏡像以不同項目分類,基于鏡像復制功能即可快速實現(xiàn)不同階段的產(chǎn)品發(fā)布,也就是鏡像發(fā)布,此功能可下載 AppHouse 版本進行試用。

Q4:貴公司同步的嗎?你們的配置文件是通過配置中?你們的配置文件是通過配置中心管理還是鏡像間的環(huán)境變量實現(xiàn)的?

A:不是實時同步的,而是通過了我們公司鏡像庫產(chǎn)品的鏡像復制能力實現(xiàn)的。目前開發(fā)流程中的產(chǎn)品運行配置是通過自身增強的配置文件能力實現(xiàn)的,配置會用來修改應(yīng)用部署的 Yaml 文件,也會生成為 Configmap。

Q5:有沒有一個簡單的 Sample?可以上手跟著練習一下。

A:基于 K8s 的 CICD 產(chǎn)品即將發(fā)布,會提供對應(yīng)的 Demo 演示平臺,請及時關(guān)注,謝謝!

Q6:此次內(nèi)容的 Step by step 示例,能提供一個 Demo 嗎?

A:基于 K8s 的 CICD 產(chǎn)品即將發(fā)布,會提供對應(yīng)的 Demo 演示平臺,請及時關(guān)注,謝謝!

Q7:我的項目的版本二只是修改了幾個頁面,也是和第一次發(fā)布一樣的流程嗎?

A:是的,流程化就是代表著可重復和可自動化,而無需去關(guān)系具體的修改內(nèi)容。

Q8:你們部署的 K8s 版本是哪個?K8s 的調(diào)度服務(wù)只能覺得容器起在哪個節(jié)點上吧,Rc 是 2 的話,構(gòu)建任務(wù)運行在哪個容器中這個怎么調(diào)度,為什么我的都運行在一個容器里面?

A : 我們目前使用的是 Kubernetes1.5 版本。本身構(gòu)建任務(wù)不是跑在 Kubernetes 上的,而只是應(yīng)用自身跑在 Kubernetes 上。

Q9:你們是類似于 Openshift 那種平臺式的嗎?還是需要開發(fā)人員自己部署?

A : 本身講的是我們自身產(chǎn)品開發(fā)的流程,相關(guān)的產(chǎn)品會是類似平臺型產(chǎn)品,需要自行部署,而不是公有云產(chǎn)品。

Q10:兩個框架是開源的嗎?

A : 是的,都是開源的。

Q11:K8s 的 Yaml 的部署文件的模板怎么去替換占位符?舊版本的容器怎么處理?

A : 使用了自身開發(fā)的一套文本模板引擎,其實類似 Web 框架中的模板引擎,完成模板和配置的合并,通過使用配置中的 key-value,替換掉模板中 key 的占位符。另外由于是使用的 K8s Deployment 的 Rolling Update,升級完成后舊版本的容器 /Pod 會由 Kubernetes 自行刪除。

Q12:開發(fā)測試、部署等各個階段的鏡像,方便共享一下嗎?

A : 這些鏡像都是我們自身針對我們各應(yīng)用模塊所準備的,對其他人并沒有什么用處,編譯環(huán)境用的鏡像不少就是官方鏡像,例如 Golang:1.7, Python:2.7。

Q13:傳統(tǒng)單體應(yīng)用如何容器化改造,可否分階段實施?

A :  可以的,容器化改造或微服務(wù)化改造有很多實施方法,例如逐漸重構(gòu)拆解,或新增模塊進行微服務(wù)化和容器化,或開發(fā)新的模塊替代原有應(yīng)用的功能點,等等。各團隊均可以選擇合適自身的流程來進行改造。

Q14:數(shù)據(jù)庫可以容器化嗎?

A : 可通過將數(shù)據(jù)卷掛入容器的方式將數(shù)據(jù)庫容器化,但是現(xiàn)在實際項目中還很少見。

Q15:我們目前也是使用 jenkins 動態(tài)掛載容器來運行安卓編譯構(gòu)建作業(yè),但現(xiàn)在每次使用鏡像生成容器后因為要更新代碼,導致整體編譯時間比以前使用物理機方式要延長 10 多分鐘,我們的鏡像每天自動制作和下載,但因為代碼更新太快及并發(fā)太多,編譯時需要獨占物理機,所以機器占用也很多,大家有什么建議解決這個問題,謝謝!

A : 容器化編譯就是將編譯環(huán)境封裝起來了,這種情況下一臺物理機同步跑多個 Job 也行,可以看看怎么提高對物理機的利用率。

Q16:請問項目中存在多個鏡像,是如何做關(guān)聯(lián)發(fā)布的?

A : 我們是使用了 Jenkins 的 Mutil Pipeline,另外由于我們的模塊的微服務(wù)拆解,對應(yīng)同步發(fā)布鏡像的需求并不高。

Q17:有這樣一個場景,兩個服務(wù)有依賴關(guān)系,服務(wù) A 依賴于服務(wù) B,如何保證服務(wù) A 和 B 的啟動順序的?

A : 良好的設(shè)計是使得 A 服務(wù)啟動后自行完成對 B 服務(wù)的檢測發(fā)現(xiàn)和調(diào)用, 而不是強依賴其啟動順序。

Q18:Kubernetes 的服務(wù)的模板和配置,這個模板怎么來的,是用戶自己編排?還是自己事先準備好的?配置數(shù)據(jù)是怎么存儲的?

A :  因為當前模板和配置只用來啟動我們自身開發(fā)的應(yīng)用,因此這個模板是我們自己為我們的應(yīng)用準備的。配置數(shù)據(jù)以文件的形式存儲,但同時在使用文本引擎做模板和配置合并時,也可以接受參數(shù)作為配置。

Q19:什么是 CI 和 CD?

A : CI 更多是偏向應(yīng)用編譯、代碼檢查、單元測試等動作,CD 是偏向于應(yīng)用部署、運行流程,我們的開發(fā)過程在編譯打包完成后,實際也會將應(yīng)用跑起來用于測試,也可以算是針對測試的 CD。

Q20:使用容器打包 Jenkins 流程的主要收益是什么?

A :  由于不同程序?qū)τ诰幾g環(huán)境的依賴各有不同,原有使用 Jenkins 方法是在 Jenkins Node 上完成環(huán)境準備,現(xiàn)在可以利用容器完成環(huán)境準備,對于 Jenkins Node 的依賴可以進一步降低。同時環(huán)境變更也可以由開發(fā)人員自行控制。

Q21:多編譯環(huán)境是用的不同鏡像么?如何處理 pipeline 處理編譯環(huán)境的問題?

A :  是的。由于我們本身產(chǎn)品開發(fā)各個模塊有各個模塊的開發(fā)語言和框架,因此各模塊都要維護自身的編譯環(huán)境鏡像。使用 Pipeline 在進行編譯時,是通過使用鏡像運行容器然后在容器內(nèi)編譯的方式來使用編譯環(huán)境的。

Q22:產(chǎn)品發(fā)布的產(chǎn)出為鏡像,如果有很多鏡像,最終會在鏡像上打上統(tǒng)一的 Tag 么代碼上的 Tag 什么時機打呢?

A :  我們是在產(chǎn)品發(fā)布時, 進行鏡像復制時統(tǒng)一打發(fā)布 Tag 的,這時候從開發(fā)測試庫會復制到發(fā)布庫,利用了我們公司自身鏡像庫產(chǎn)品的鏡像復制能力。

Q23:請問 Jenkins 也是部署在 Docker 里面的嗎?如果 Jenkins 在 Docker 里面怎么樣在 Docker 里面使用 Docker 執(zhí)行 CI?

A :  是的,我們也在摸索將 Jenkins 本身放到容器中運行。在這種情況下,Jenkins 容器內(nèi)使用 Root 權(quán)限,掛載 Docker.Sock 和 Docker 數(shù)據(jù)目錄到容器中就可以了。

Q24:使用 Pipeline 先構(gòu)建編譯環(huán)境鏡像,再編譯,是否會導致整個流程需要很長時間?是否有優(yōu)化方案?

A : 編譯鏡像由于不會經(jīng)常變動,因此這個鏡像的構(gòu)建通常使用 Cache 就能直接完成。另外我們也把編譯環(huán)境鏡像打包這個步驟抽出來單獨作為 Job 執(zhí)行了,這樣在實際編譯流程中就無需再進行編譯環(huán)境構(gòu)建。

Q25:直接使用 Jenkins 的 Docker 插件和直接調(diào)用腳本,自己寫 Docker 命令,如何在靈活程度和方便程度上做權(quán)衡?

A : 看個人或開發(fā)團隊的自行權(quán)衡吧,只是開發(fā)團隊內(nèi)最好統(tǒng)一,便于進行相應(yīng)維護。

Q26:Jenkins 和 Kubernetes 的用戶是怎么管理的?我的期望是用戶只能看到自己得資源,別的用戶是沒有權(quán)限的。

A :  我們本身只是使用這兩種工具,在開發(fā)環(huán)境中不對外,所有不存在用戶管理的問題。在我們公司正在開發(fā)的 CICD 產(chǎn)品中,對這塊有我們自身理解基礎(chǔ)上的設(shè)計。

Q27:Jenkins 的持續(xù)集成是怎么實現(xiàn)的?比如不同的源碼倉庫的提交觸發(fā),如 Github gitlab, 版本號怎么控制的?

A : Jenkins 的 CI 流程觸發(fā)可以有很多種,代碼提交觸發(fā)、定時觸發(fā)、手動觸發(fā)。版本號的控制也可以有很多方案,比如使用 Job 的編號、使用 Git 的 Commit 號、使用時間戳等等。

Q28:Jerkins 調(diào)用 K8s API 用了什么插件么?

A : 沒有直接使用 Jenkins 調(diào)用 Kubernetes API。

Q29:Jenkins 的 Pipeline 支持流水線執(zhí)行,一般從頭開始執(zhí)行,可以從流水線中任意一步執(zhí)行嗎?

A :  因為我們團隊的 Jenkinsfile 都是直接放置在代碼庫內(nèi)的,因此每次執(zhí)行都是從頭完成流水線的執(zhí)行。

Q30:容器化后發(fā)布也要通過 Jenkins,感覺 Docker 的發(fā)布沒有 Jenkins 方便,除了容器化的可移植,還有什么原因值得推進項目容器化?

A :  應(yīng)用容器化,其實更多的是看重應(yīng)用在容器管理平臺上運行起來后所獲得的能力,例如在 Kubernetes 上運行后的水平擴展,服務(wù)發(fā)現(xiàn),滾動升級,等等。

Q31:K8s Update 需要制定新的鏡像才能做滾服更新 (升級),如果只是更新了 Configmap,有辦法做滾服更新嗎?

A :  我們的 CI 流程完成后,各模塊的鏡像 Tag 會發(fā)生變化,我們利用具體生成的 Tag 生成配置,然后部署的 Yaml 文件寫為模板,鏡像的具體 Tag 會根據(jù)每次 CI 流程生成的配置不同而組合為不同的 Yaml 文件,然后使用組合后的 Yaml,即 Tag 已經(jīng)變更為最新版本的 Yaml 文件進行應(yīng)用的滾動升級。

Q32:Pipeline 采用在鏡像里構(gòu)建的方案,是怎么實現(xiàn)的?用 Jenkins 現(xiàn)成的插件 or 用 Groovy 腳本實現(xiàn)?

A : 使用了 Jenkins 的 Docker 插件,同時使用方式是將相應(yīng)命令寫在 Groovy 腳本里。

 例如:stage(Build){ docker.image( golang:1.7).inside { sh  ./script/build.sh  } }

到此,相信大家對“基于 Jenkins 和 Kubernetes 的 CI 工作流怎么實現(xiàn)”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-16發(fā)表,共計7401字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 台湾省| 延津县| 秦皇岛市| 沙坪坝区| 六安市| 时尚| 常熟市| 宽城| 马尔康县| 中卫市| 新宁县| 罗山县| 万宁市| 南溪县| 繁峙县| 英吉沙县| 阳新县| 曲周县| 灵川县| 漳浦县| 舞阳县| 平顺县| 赣州市| 荔波县| 延吉市| 陕西省| 中西区| 张家界市| 英德市| 磐石市| 安平县| 平果县| 巍山| 天全县| 双牌县| 枣强县| 东海县| 永靖县| 浦东新区| 蒲城县| 邢台县|