Jenkins 配合 Kubernetes 實現服務持續集成的實踐和建議




Kubernetes 自己是一個以服務擴容見長的容器編排系統,若是不能跟其它 CI/CD 工具結合起來,從根本上說仍是不能提高開發部署效率,達到持續集成,持續交付的目的,本文以 Jenkins 配合 Kubernetes 完成 Java 服務持續集成和部署過程碰到一些問題,進行說明和總結。javascript



是否須要把 Jenkins 集成 Kubernetes 集羣中進行統一管理?java

當你在網上搜索 Jenkins 持續集成 dockers/kubernetes 時,80% 答案是在Kubernetes集羣中容器化 Jenkins ,在我看來,對於業務服務數量有限的互聯網公司,前期的話,不是特別建議把Jenkins直接安裝到kubernetes集羣當中,特別是在沒有使用 Kubernetes 容器雲平臺以前已經有了自動化構建工具,有如下緣由:

首先早階段開發、測試、生產環境已經部署了Jenkins,已經習慣了這種使用方式,Jenkins自己呢,只是執行一些命令,自己不會耗費太多資源,不須要多個副本和橫向擴展的能力,把須要持續交付的服務實現容器化再說吧。

再者若是你把 Jenkins 放到 Kubernetes 集羣中執行,你須要把 Jenkins 打成鏡像,放到 Pod 中執行,而通常狀況下根據鏡像的最小化原則,鏡像裏面不會包含 docker 組件,因此若是你在宿主機上打包能夠正常執行,而放到Pod 中可能會出現沒法 docker build ,固然這也是能夠解決的,由於 docker 自己是 B/S 架構,你能夠經過在鏡像內部掛載 docker 命令,調用宿主機 docker socket 端口;更簡單方法,直接遠程到一臺包含 docker 基礎服務的服務器上執行,但不管如何,你可能都要折騰一下,改變現有使用方式。


Jenkins如何搭配 Kubernetes 實現持續集成?nginx


總體流程以下圖所示:
簡單分爲五個過程
一、需求原型開發完成,開發人員介入開發;
二、開發人員將代碼提交到代碼倉庫 git/SVN;
三、鉤子觸發 jenkins master 啓動一次構建,或者開發人員自行點擊構建,根據狀況自行選擇,jenkins 拉取代碼、maven 編譯;

這裏假設你已經完成 Jenkins 安裝、遠程工具、java 編譯環境配置等。若是沒有配置,網上找找,資料特別多。這部分其實相對來講和以前使用Jenkins 的方式區別不大,若是你使用 git,這裏仍是 git 拉取代碼,以前是 maven/ant 進行打包,那麼這裏仍是 maven/ant 進行打包。

四、docker 鏡像構建、鏡像提交到倉庫;
docker 鏡像在構建須要區別與之前的形式,若是你已經在 Jenkins 上安裝了 docker 插件,直接在當前機器構建便可,若是沒,也沒問題,遠程 SSH 到一臺可以構建 docker 鏡像的服務器進行鏡像打包。

docker build -t docker.hub.com/dev/tomcat-webapps:$version .docker push docker.hub.om/dev/tomcat-webapps:$version

打包過程須要注意兩點
  • 第一點,docker 構建鏡像須要 tag ,這個 tag 能夠經過 Jenkins 參數化構建,在構建以前輸入版本號,若是沒有輸入,填寫默認值便可。

  • 第二點、歷史鏡像如何處理?比較建議每次鏡像構建完成以後,經過  Jenkins 配置命令刪除沒有運行的鏡像。git

    具體根據使用場景處理這些中間產物。web


docker rm $(docker ps -a -q)

五、Kubernetes yaml 運行過程到倉庫拉取 docker 鏡像構建產物,從而啓動整個服務,測試人員開始全方位功能、性能測試。
kubectl apply -f config.yamlsed -i 's/image-replace-webapps/tomcat-webapps:${version}/' tomcat_deployment.yaml;kubectl apply -f tomcat_deployment.yaml

「麻雀雖小五臟俱全」一個項目功能很少,可是少不了 configmap、deployment、甚至 service,Jenkins 在打包過程確定要涉及到對這些文件的修改,問題來了,這些文件如何存放呢?docker


若是你有強大的 helm 包管理工具,固然能夠解決這些問題;若是你的項目沒有大到使用 helm 進行文件管理,能夠考慮把 yaml 配置直接放到源代碼某個目錄下面,利用 SVN/GIT 進行管理,也能夠直接放到服務器某個路徑下面,Jenkins 每次構建時 SSH 到這臺服務器進行備份、修改運行 yaml 文件。tomcat

三、在構建過程當中須要注意問題服務器

docker 每次鏡像構建 tag 不同,如何傳遞到 k8s yaml中?

docker 鏡像構建過程當中經過參數化構建已經能夠修改版本號,一樣的,首先在 k8s 編排文件鏡像部分添加可以已知佔位符;微信

而後把這個版本號動態傳遞並替換到 k8s yaml 中;網絡

sed -i 's/image-replace-webapps/tomcat-webapps:${version}/' tomcat_deployment.yaml;

在現實使用場景中,可能會存在多個Kubernetes環境,如何處理?

這時能夠根據狀況進行處理,好比線上環境和開發測試環境鏡像倉庫、集羣環境、Jenkins都是嚴格隔離的,那就能夠等到開發測試完成以後把上述流程從新走一遍。若是使用同一個 Jenkins 經過不一樣的用戶權限構建到不一樣環境也是相似道理。其實看你怎麼用,由於鏡像已經集中存儲到倉庫,正式線上環境直接拿着 yaml 就能夠跑起來,比之前上傳 war 更清爽。

四、總結

本文主要以 Jenkins 爲中心介紹了持續集成Kubernetes 過程,Jenkins自己是持續集成,持續交付工具鏈過程很是重要的一個部分,它是開源的而且提供了大量可用的插件,入門使用很是簡單,可是真正掌握好 Jenkins 使用並非一件輕鬆的事情,如何使用 Jenkins 建立出高效穩定、靈活的流水線是全部從事 DevOps 開發人員所亟待解決的問題。


推薦


Kubernetes排障指南

DevOps實踐帶來的好處和挑戰

DevOps成就卓越

雲計算交付模型知多少 - IaaS、PaaS、SaaS

docker bridge 到 k8s pod 跨節點網絡通訊機制演進

Kubernetes入門培訓(內含PPT)

從Ice到Kubernetes容器技術,微服務架構經歷了什麼?



原創不易,隨手關注或者」在看「,誠摯感謝!

本文分享自微信公衆號 - 雲原生技術愛好者社區(programmer_java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。