如何在 Kubernetes 上配置 Jenkins?
作者 |?Sudip Sengupta
譯者 | 火火醬,責編 | Carol
封圖 | CSDN 下載自視覺中國
在本文中,我們將一起完成在Kubernetes上配置Jenkins的工作。作為一款被廣泛使用的開源CI服務(wù)器,Jenkins提供了數(shù)百個插件,能夠為我們項目的構(gòu)建、部署和自動化提供有力支持。
接下來,我們將:
1.使用minikube創(chuàng)建一個Kubernetes集群(這步不是必須的,如果你已經(jīng)有Kubernetes集群了的話,可以跳過這一步)。
2.為Jenkins創(chuàng)建命名空間和持久卷。
3.使用Helm安裝Jenkins。
4.設(shè)置并運行pipeline,對一個簡單的web應(yīng)用程序進行測試。
先決條件
1.Docker。有關(guān)安裝Docker的詳細信息,請參閱下方“Docker安裝”頁面。
https://docs.docker.com/get-docker/
2.Kubernetes集群。如果沒有運行中的Kubernetes集群的話,請參閱章節(jié)“使用minikube創(chuàng)建Kubernetes集群”
3.HelmCLI。可以按照下方鏈接中的步驟安裝Helm CLI。
https://helm.sh/docs/intro/install/?ref=hackernoon.com
用minikube創(chuàng)建一個Kubernetes集群(可選)
Minikube是一款在計算機上創(chuàng)建單節(jié)點Kubernetes集群的工具。如果沒有Kubernetes集群的話,可以按照以下步驟進行創(chuàng)建:
1.? 安裝minikube :請參照下方“ Install minikube”頁面中的步驟進行安裝。https://kubernetes.io/docs/tasks/tools/install-minikube/?ref=hackernoon.com
2.? 安裝kubectl:請參照下方“Install and Set Up kubectl ”頁面中的步驟進行安裝。
https://kubernetes.io/docs/tasks/tools/install-kubectl/?ref=hackernoon.com
3.? 然后就可以輸入以下命令,創(chuàng)建minikube集群
minikube?startminikube?v1.5.2?on?Darwin?10.15.2Automatically?selected?the?'hyperkit'?driver?(alternates:?[virtualbox])Creating?hyperkit?VM?(CPUs=2,?Memory=2000MB,?Disk=20000MB)?...Preparing?Kubernetes?v1.16.2?on?Docker?'18.09.9'?...Pulling?images?...Launching?Kubernetes?...Waiting?for:?apiserverDone!?kubectl?is?now?configured?to?use?"minikube"4. ?創(chuàng)建完集群后,可以輸入以下代碼來驗證其狀態(tài):
minikube?status如果一切順利的話,應(yīng)該會看到:
host:?Running kubelet:?Running apiserver:?Running kubeconfig:?Configured我們還可以通過使用內(nèi)置的Kubernetes用戶界面來了解集群概況:運行以下命令:
minikube?dashboard Verifying?dashboard?health?...Launching?proxy?...Verifying?proxy?health?...Opening?http://127.0.0.1:56993/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/?in?your?default?browser...打開的網(wǎng)頁中包含了Kubernetes集群的狀態(tài)信息:
? ? ? ?
我們還可以使用儀表盤(dashboard)與Kubernetes集群進行交互。但是,這就有點超綱了。如果想要了解更多如何使用Kubernetes儀表盤創(chuàng)建或修改Kubernetes資源的信息,可以看看下方“ Web UI (Dashboard)”鏈接。
https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/?ref=hackernoon.com
為Jenkins做好準備
按照以下步驟設(shè)置Jenkins:
創(chuàng)建一個命名空間,從而在Kubernetes集群中將Jenkins與其他部署分離開。
創(chuàng)建PersistentVolume以存儲Jenkins數(shù)據(jù),方便我們在重新啟動時保留數(shù)據(jù)。
按照以下步驟為Jenkins設(shè)置好部署環(huán)境:
1. 運行以下命令,創(chuàng)建一個名為jenkins-namespace.yaml的文件:
apiVersion:?v1 kind:?Namespace metadata:name:?jenkins2. 輸入以下命令以規(guī)范應(yīng)用:
kubectl?apply?-f?jenkins-namespace.yaml namespace/jenkins?created3. 將以下代碼粘貼到j(luò)enkins-volume.yaml文件中:
apiVersion:?v1 kind:?PersistentVolume metadata:name:?jenkins-pvnamespace:?jenkins spec:storageClassName:?jenkins-pvaccessModes:-?ReadWriteOncecapacity:storage:?10GipersistentVolumeReclaimPolicy:?RetainhostPath:path:?/data/jenkins-volume/4.輸入以下命令以規(guī)范應(yīng)用:
kubectl?apply?-f?jenkins.volume.yaml需要注意的是,hostPath使用節(jié)點/data/jenkins-volume/來模擬附屬網(wǎng)絡(luò)存儲。這種方法只適合于開發(fā)和測試階段。在生產(chǎn)階段,需要提供網(wǎng)絡(luò)資源(如Google Compute Engine持久盤,或Amazon Elastic Block Store卷)。
安裝Jenkins
Jenkins部署通常由一個主節(jié)點和一個或多個代理節(jié)點(可選)組成。Jenkins是一個依賴于多個組件的復雜應(yīng)用程序,我們可以通過Helm來簡化Jenkins部署。
(Helm:https://helm.sh/?ref=hackernoon.com)
Helm是Kubernetes的一個包管理器,其打包格式被稱為chart。在GitHub上能夠找到許多社區(qū)開發(fā)的chart。
(GitHub:https://github.com/helm/charts?ref=hackernoon.com)
1. ?創(chuàng)建一個覆蓋文件,并將其作為實參傳給Helm CLI。將 https://raw.githubusercontent.com/kubernetes/charts/master/stable/jenkins/values.yaml中的內(nèi)容粘貼到values.yaml文件中。
然后在你喜歡的文本編輯器中打開values.yaml文件,將以下行:
storageClass:修改為:
storageClass:?jenkins-pv2.? 現(xiàn)在,我們可以通過運行helm install命令來安裝Jenkins,并傳遞以下參數(shù):
helm?install?jenkins?-f?values.yaml?stable/jenkins?--namespace?jenkins會得到類似以下輸出:
NAME:?jenkins LAST?DEPLOYED:?Mon?Dec?30?17:26:08?2019 NAMESPACE:?jenkins STATUS:?deployed REVISION:?1 NOTES: 1.?Get?your?'admin'?user?password?by?running:printf?$(kubectl?get?secret?--namespace?jenkins?jenkins?-o?jsonpath="{.data.jenkins-admin-password}"?|?base64?--decode);echo 2.?Get?the?Jenkins?URL?to?visit?by?running?these?commands?in?the?same?shell:export?POD_NAME=$(kubectl?get?pods?--namespace?jenkins?-l?"app.kubernetes.io/component=jenkins-master"?-l?"app.kubernetes.io/instance=jenkins"?-o?jsonpath="{.items[0].metadata.name}")echo?http://127.0.0.1:8080kubectl?--namespace?jenkins?port-forward?$POD_NAME?8080:8080 3.?Login?with?the?password?from?step?1?and?the?username:?admin3.? 根據(jù)你環(huán)境的不同,Jenkins可能需要一定時間才能完成初始化,輸入以下命令來檢查Pod狀態(tài):
kubectl?get?pods?--namespace=jenkinsJenkins安裝后,狀態(tài)應(yīng)像以下輸出這樣為Running:
??kubectl?get?pods?--namespace=jenkins NAME??????????????????????READY???STATUS????RESTARTS???AGE jenkins-645fbf58d6-6xfvj???1/1?????Running???0??????????2m4.? 需要通過以下命令檢索密碼,才可以訪問Jenkins服務(wù)器:
printf?$(kubectl?get?secret?--namespace?jenkins?jenkins?-o?jsonpath="{.data.jenkins-admin-password}"?|?base64?--decode);echo Um1kJLOWQY注意,你的密碼應(yīng)該是不一樣的。
5. ?使用以下命令來獲取運行Jenkins的Pod名稱:
export?POD_NAME=$(kubectl?get?pods?--namespace?jenkins?-l?"app.kubernetes.io/component=jenkins-master"?-l?"app.kubernetes.io/instance=jenkins"?-o?jsonpath="{.items[0].metadata.name}")這將創(chuàng)建名為POD_NAME的環(huán)境變量,將其值設(shè)置為運行Jenkins的Pod名稱。6. ?使用kubectl命令設(shè)置端口轉(zhuǎn)發(fā):
kubectl?--namespace?jenkins?port-forward?$POD_NAME?8080:8080 Forwarding?from?127.0.0.1:8080?->?8080 Forwarding?from?[::1]:8080?->?8080添加Executor
Jenkins將executor定義為“用于在節(jié)點上執(zhí)行由Pipeline或Pipeline定義的工作槽。一個節(jié)點可以配置零個或多個Executor,與在該節(jié)點上能夠執(zhí)行的Project或Pipeline數(shù)量相對應(yīng)。”
接下來,我們將向Jenkins節(jié)點添加executor。
1. ?瀏覽器打開http://localhost:8080,使用用戶名admin和之前檢索到的密碼進行登錄。
2.? 在左側(cè)導航欄中,選擇Jenkins -> Manage Jenkins -> Manage Node
? ? ?
3.? 選擇“Master?”,然后單擊“Configure”
? ? ? ?
4.? 在?# of executors 輸入框中輸入“1”,然后單擊“Save?”
? ? ? ???
安裝并配置Node.js插件
在本教程中,我們將使用Node.js插件來部署并測試一個用Express.js編寫的簡單web應(yīng)用程序。
按照以下步驟安裝Node.js插件:
1.? 左側(cè)導航欄Jenkins -> Manage Manage Jenkins -> Manage Plugins -> Available Plugins,選擇NodeJS?插件,然后單擊“Install without restart”
?
2. ?安裝完成后,會出現(xiàn)以下界面:
? ? ? ? ? ? ?
3. ?左側(cè)導航欄Jenkins -> Manage Jenkins -> Global Tool Configuration,選擇Add NodeJS。輸入NodeJS安裝名稱,然后選擇一個NodeJS版本,選好后單擊“Save ”。
? ? ? ? ??
HelloWorld 存儲庫
為了展示Jenkins 的工作原理,我們創(chuàng)建了一個監(jiān)聽端口3000并輸出“Hello World!”的簡單Express.js 服務(wù)器。然后我們編寫了一個單元測試,檢查該web 應(yīng)用程序是否能夠按預(yù)期工作。同時,我們還更新了package.json 文件,以便Jenkins 可以通過npm test命令執(zhí)行單元測試。
最后,我們用以下命令創(chuàng)建了一個Jenkinsfile:
pipeline?{agent?anytools?{nodejs?"node"}stages?{stage('Cloning?Git')?{steps?{git?'https://github.com/andreipope/HelloWorld'}}?????stage('Install?dependencies')?{steps?{sh?'npm?install'}}stage('Test')?{steps?{sh?'npm?test'}}?????} }
以上構(gòu)建了一個三階段CD pipeline:
首先,克隆了HelloWorld Git存儲庫
然后,通過運行npm install 安裝了依賴項
最后,執(zhí)行了單元測試
接下來,我們將配置Jenkins以運行該腳本。
創(chuàng)建并運行Pipeline
Pipeline為交付軟件提供了可重復且一致的流程。借助Jenkins,我們可以用Groovy編程語言將pipeline作為DSL腳本來編寫。
按照以下步驟創(chuàng)建和運行pipeline:
1. ?選擇Jenkins -> New Item,然后輸入pipeline名稱(HelloWorld),完成后單擊“OK”。
? ? ? ? ? ? ?
2. ?下一頁,選擇“Pipeline script from SCM”,并將Repository URL 設(shè)置為“https://github.com/andreipope/HelloWorld”。這是一個公共存儲庫,所以我們不需要配置任何證書憑證。
? ? ? ? ? ? ?
Jenkins會自動檢索位于存儲庫根目錄中的Jenkinsfile。
3. ?現(xiàn)在,我們可以手動運行pipeline了:
? ? ? ?
4. ?等它運行完后,應(yīng)該會看到控制臺輸出類似內(nèi)容:
+?npm?test>?HelloWorld@1.0.0?test?/var/jenkins_home/workspace/HelloWorld >?mochaExpressJS?server??Prints?out?Hello?World?(291ms)1?passing?(373ms) [Pipeline]?} [Pipeline]?//?withEnv [Pipeline]?} [Pipeline]?//?stage [Pipeline]?} [Pipeline]?//?withEnv [Pipeline]?} [Pipeline]?//?withEnv [Pipeline]?} [Pipeline]?//?node [Pipeline]?End?of?Pipeline Finished:?SUCCESS恭喜你!你已經(jīng)成功在Kubernetes配置了Jenkins,并用它測試了一個簡單的web應(yīng)用程序。雖然看起來本文似乎包含了大量信息,但其實這只是Jenkins 和Kubernetes中最為淺顯的內(nèi)容。多嘗試就會打開新世界!
推薦閱讀不知道路由器工作原理?沒關(guān)系,來這看看!看不懂你捶我 | 原力計劃
秋名山老司機從上車到翻車的悲痛經(jīng)歷,帶你深刻了解什么是 Spark on Hive!| 原力計劃
出道50年+!乘風破浪的編程語言們,能二次翻紅嗎?
Service Mesh 如何重定義云原生計算?阿里服務(wù)網(wǎng)格技術(shù)大揭秘
國士無雙:賣掉美國房子,回國創(chuàng)辦姚班,他只為培養(yǎng)一流的程序員!
萬字長文帶你入門 GCN
真香,朕在看了!
總結(jié)
以上是生活随笔為你收集整理的如何在 Kubernetes 上配置 Jenkins?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想在边缘运行计算机视觉程序?先来迎接挑战
- 下一篇: 从 Dagger 到 Hilt,谷歌为何