使用Kubernetes-Jenkins實現CI/CD
Author: Ramit Surana DevOps Zone
DevOps Zone讓你成為Sonatype Nexus的合作伙伴,Nexus套件能幫助你擴充套件DevOps交付過程,持續的將元件智慧的整合到開發工具中,包括:Eclipse, IntelliJ, Jenkins, Bamboo, SonarQube等等,請看演示
關於持續整合和持續釋出,Martin Fowler給出了最好的定義:
“持續整合是一種軟體開發實踐,團隊成員可以頻繁的整合他們的工作,通常每個人一天至少一次整合甚至多次整合。每次整合都通過自動化構建和測試進行驗證,以儘快檢測整合錯誤。許多團隊發現,這種方法可以顯著減少整合的問題,並允許團隊更加快速的開發。”
簡介
本文將討論和探索兩個令人驚奇和相當有趣的技術。一個是Jenkins,一個流行的持續整合/釋出的工具,另一個是Kubernetes,一個流行的容器編排引擎。另外一個驚喜,我們發現了Fabric8——一個酷炫的微服務平臺。現在,讓我們開始吧!
警告:在下文的幾個步驟中,你的伺服器可能會中途掛起幾次,請選擇配置高的PC。
方法論
有很多方法,可以讓我們實現CI/CD,在本文中,我們重 點介紹Kubneretes-Jenkins外掛和Fabric8。
總體架構
在開始我們的工作之前,讓我們花一點時間分析開始使用Jenkins使用Kubernetes容器所需的工作流。Kubernetes對於開發者來說是一個驚人的開源容器編排引擎。Kubernetes是由Google發起的,這使Kubernetes在使用多個開源容器專案方面有一個驚人的優勢。預設情況下,Docker更受Kubernetes的使用者支援和青睞。使用Docker容器的工作流程如下圖所示:
與使用rkt容器(rktnetes)類似,如下圖:
目前,Jenkins還沒有支援RKT容器的外掛,但我認為工作流在其實現後也將保持不變。
Kubernetes-Jenkins外掛
在你的主機上安裝Kubernetes
在主機上安裝Kubernetes是一個容易的任務。如果你想在本地機器上試用它,我建議你試試Minikube,這裡有快速安裝指南:
- 確認你的kubectl已經安裝完成,參考文件
- 確認已經下載完依賴的元件,參考先決條件
- 下載、安裝Minikube
Carlossg在使用Jenkins和Kubernetes的方面做了驚人的工作,他為Jenkins建立了一個特棒Kubernetes外掛,使用這個外掛,你可以很容易地直接使用Kubernetes。此外,還為使用者提供了更容易的配置選項,他已經構建了一個包含Kubernetes外掛的Jenkins映象,映象可以在Docker Hub上找到。在接下來的步驟中,我們將從Docker Hub上獲取此映象,並建立一個卷/var/jenkins/_home用於儲存Jenkins的資料。
存在一個問題
雖然我們正在做我們計劃做的一切,我們仍然會遇到一個問題。 你會注意到,每當你要關閉它後,重新啟動你的Jenkins容器,所有的資料都會丟失。 無論你做了什麼,例如建立作業,安裝外掛等等,都會丟失。 這是容器的常見問題之一。 讓我們更深入地討論它。
關於資料容器的一個詞
當談到容器時,資料是一個棘手的概念。在所有時間保證資料安全、可用性方面容器並不是一個很好的例子。過去發生了許多事件,其中已經看到容器會丟失資料。有很多種辦法能解決這個問題,其中之一是使用Docker卷,我沒有發現使用持久卷的好處。另一個辦法是建立“資料容器”,並將其用作儲存資料的源,而不是僅僅依賴一個映象。
下圖簡單說明了我們使用“資料容器”來確保我們資料可用性的方法:
接下了的步驟是啟動Jenkins Kubernetes容器:
// Running jenkins using another container containing data $ docker run --volumes-from jenkins-k8s -p 8080:8080 -p 50000:50000 -v /var/jenkins_home csanchez/jenkins-kubernetes // Created a container for containing jenkins data with // the image name csanchez/jenkins-kubernetes $ docker create --name jenkins-k8s csanchez/jenkins-kubernetes
開啟瀏覽器輸入http://localhost:8080,你會看到如下介面:
Jenkins的Kubernetes外掛設定
現在,Jenkins已經預先配置好了Kubernetes外掛,所以我們直接跳到下一步。使用Jenkins GUI,使用Manage Jenkins > Configure System > Cloud > Add a new Cloud > Kubernetes。介面如下圖中的幾個步驟:
接下來按照下圖的設定進行配置:
如果你想使用Jenkins slave,可以在Docker hub上下載jnlp-slave映象。它提供了簡單安裝Slave節點的模板。你可以通過建立模板來配置一個Slave節點,如下圖所示:
為了讓Jenkins slave能參與任務排程,當在Jenkins上建立一個任務的時候,向下圖所示設定你的任務:
Fabric8
Fabric8是一個基於Docker,Kubernetes和Jenkins的開源微服務平臺。 它是由Red Hat建立的。 該專案的目的是通過持續交流水線輕鬆建立,構建,測試和部署微服務,然後使用持續改進和ChatOps執行和管理它們。
Fabric8會自動安裝並配置一下內容:
- Jenkins
- Gogs
- Fabric8 registry
- Nexus
- SonarQube
下圖是Fabric8的架構圖:
為了開始我們的演示,你需要使用命令列工具安裝Fabric8(gofabric8)。下載gofabric8,解壓之後執行命令:
$ sudo cp /usr/local/bin/ gofabric8
在終端上檢查$ gofabric8命令是否安裝成功:
$ gofabric8 deploy -y
執行命令後,終端上會顯示:
建立祕鑰:
$ gofabric8 secrets -y
終端返回:
使用kubectl檢視pod執行狀態:
你可以使用Kubernetes Dashboard提供的頁面檢視所有Pod的狀態,開啟瀏覽器,輸入:http://192.168.99.100:30000:
相似的,可以開啟Fabric8的頁面:
我們來分析一下上面的命令的執行過程,可以通過一個工作流圖展示:
實現CI/CD
說起來容易做起來難。從源頭構建Jenkins並整合Kubernetes實現持續整合(CI)僅僅是故事的一部分,但是實現持續釋出(CD)時另外一個非常不同而且更加複雜的故事了。
這裡有一些關於使用Jenkins外掛的技巧,他們能幫你更加容易地實現Jenkins的持續交付。
Pipeline Plugin
Pipeline是由Jenkins社群構建的核心外掛。此外掛確保任何編排引擎與你的環境整合,而且複雜性很低。目前,我相信這僅僅是個開始,因為不同的社群已經為這種引擎構建不同的外掛,這些外掛都圍繞Jenkins UI展開。使用Pipeline外掛,使用者可以在Jenkinsfile中實現他們專案的整個構建/測試/部署的流水線,並將這個檔案跟程式碼儲存在一起,作為程式碼的一部分放進程式碼控制中。
GitHub Plugin
這些天,大多數工作都使用GitHub作為原始碼管理(SCM)工具。我建議你使用GitHub外掛,它可以幫助你的Jenkins從GitHub拉取程式碼,並分析和測試。為了實現鑑權訪問,我建議你看看GitHub OAuth外掛。
Docker Plugin
對於Docker來說,這是最適合的外掛之一,幫助你做幾乎一切與Docker有關的事情。 這個外掛還能幫助你使用Docker容器作為Jenkins Slave節點。還有幾個其他的Docker外掛,根據時間和你的用法,可以在它們之間切換。
AWS Plugin
AWS人員推出了一個名為AWS Pipeline的超棒的服務。 此特定服務可幫助您使用AWS實現持續交付。 目前,這個外掛正在大量開發,可能不適合生產環境。 另外,可以檢視AWS CodeCommit關注進度。
OpenStack
對於OpenStack使用者,OpenStack外掛適合使用OpenStack的環境配置。
Google Cloud Platform
可以在Google Cloud Platform上提供了部署管理器,使用部署管理器,你可以建立靈活的宣告性模板,這些模板可以部署各種雲平臺,例如Google Cloud Storage, Google Compute Engine和Google Cloud SQL。部署管理器還可以將資源的使用定義儲存在釋出模板中。這是一個非常新的外掛,但是我認為他是一個值得嘗試好工具,如果你希望實現自動化和Google的雲服務。
本文轉自中文社群-使用Kubernetes-Jenkins實現CI/CD
相關文章
- gitlab 實現CI/CDGitlab
- 純 Git 實現前端 CI/CDGit前端
- 簡述如何使用ArgoCD實現CI/CD部署? - redditGo
- 使用Github Actions + Watchtower 實現專案CI/CDGithub
- 使用Kubernetes實現CI/CD幾個注意點 - harness
- Docker 整合 Jenkins Gitlab 實現 CI/CDDockerJenkinsGitlab
- 詳解CI、CD & CD
- 基於OpenStack+Docker設計與實現CI/CD——基於Docker技術的CI&CD實踐Docker
- GitOps:Weaveworks通過開發者工具實現CI/CDGit
- 開發.NET Core NuGet包並實現CI/CD
- 使用 Gitlab CI/CD 實現自動化釋出站點到 IISGitlab
- CI/CD理解
- Azure Data Factory(三)整合 Azure Devops 實現CI/CDdev
- 應該使用什麼 CI/CD 工具?
- 使用Github Action 進行CI-CDGithub
- 基於 GitLab CI 的前端工程CI/CD實踐Gitlab前端
- CI Weekly #6 | 再談 Docker / CI / CD 實踐經驗Docker
- CI/CD 持續整合部署實踐
- .Net微服務實戰之CI/CD微服務
- 使用gitlab自帶的ci/cd實現.net core應用程式的部署Gitlab
- 基於Drone實現CI/CD【0到1架構系列】架構
- Flutter App 使用 Github Actions 進行 CI/CDFlutterAPPGithub
- 如何使用通用軟體簡化CI/CD?
- GitLab-CI/CD入門實操Gitlab
- Azure DevOps+Docker+Asp.NET Core 實現CI/CD(二.建立CI持續整合管道)devDockerASP.NET
- 5.新增Koa專案的CI指令碼,提交到gitlab實現CI&CD指令碼Gitlab
- 4.新增Angular專案的CI指令碼,提交到gitlab實現CI&CDAngular指令碼Gitlab
- 透過雲效 CI/CD 實現微服務全鏈路灰度微服務
- Serverless 實戰 —— Funcraft + OSS + ROS 進行 CI/CDServerRaftROS
- 實踐分享!GitLab CI/CD 快速入門Gitlab
- 5步實現規模化的Kubernetes CI/CD 流水線
- CI Weekly #8 | CI/CD 技能進階路線
- Gitlab-CI/CD 2Gitlab
- 前端初探 Gitlab CI/CD前端Gitlab
- java ci/cd環境搭建Java
- 什麼是 CI/CD? - reddit
- 簡談企業Power BI CI/CD實施框架框架
- CI和CD之間的真正區別 -Fire CI