作者 | Sudip Sengupta
譯者 | 火火醬,責編 | Carol
封圖 | CSDN 下載自視覺中國
在本文中,我們將一起完成在Kubernetes上配置Jenkins的工作。作為一款被廣泛使用的開源CI伺服器,Jenkins提供了數百個插件,能夠為我們項目的構建、部署和自動化提供有力支持。
接下來,我們將:
1.使用minikube創建一個Kubernetes集群(這步不是必須的,如果你已經有Kubernetes集群了的話,可以跳過這一步)。
2.為Jenkins創建命名空間和持久卷。
3.使用Helm安裝Jenkins。
4.設置並運行pipeline,對一個簡單的web應用程式進行測試。
先決條件
1.Docker。有關安裝Docker的詳細信息,請參閱下方「Docker安裝」頁面。
https://docs.docker.com/get-docker/
2.Kubernetes集群。如果沒有運行中的Kubernetes集群的話,請參閱章節「使用minikube創建Kubernetes集群」
3.HelmCLI。可以按照下方連結中的步驟安裝Helm CLI。
https://helm.sh/docs/intro/install/?ref=hackernoon.com
用minikube創建一個Kubernetes集群(可選)
Minikube是一款在計算機上創建單節點Kubernetes集群的工具。如果沒有Kubernetes集群的話,可以按照以下步驟進行創建:
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. 然後就可以輸入以下命令,創建minikube集群
minikube start minikube v1.5.2on Darwin 10.15.2 Automatically selected the 'hyperkit' driver (alternates: [virtualbox]) Creating hyperkit VM (CPUs=2, Memory=2000MB, Disk=20000MB) ... Preparing Kubernetes v1.16.2on Docker '18.09.9' ... Pulling images ... Launching Kubernetes ... Waiting for: apiserver Done! kubectl isnow configured touse"minikube"
4. 創建完集群後,可以輸入以下代碼來驗證其狀態:
minikube status
如果一切順利的話,應該會看到:
host: Runningkubelet: Runningapiserver: Runningkubeconfig: Configured
我們還可以通過使用內置的Kubernetes用戶界面來了解集群概況:運行以下命令:
minikube dashboardVerifying 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...
打開的網頁中包含了Kubernetes集群的狀態信息:
我們還可以使用儀錶盤(dashboard)與Kubernetes集群進行交互。但是,這就有點超綱了。如果想要了解更多如何使用Kubernetes儀錶盤創建或修改Kubernetes資源的信息,可以看看下方「 Web UI (Dashboard)」連結。
https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/?ref=hackernoon.com
為Jenkins做好準備
按照以下步驟設置Jenkins:
創建一個命名空間,從而在Kubernetes集群中將Jenkins與其他部署分離開。創建PersistentVolume以存儲Jenkins數據,方便我們在重新啟動時保留數據。按照以下步驟為Jenkins設置好部署環境:
1. 運行以下命令,創建一個名為jenkins-namespace.yaml的文件:
apiVersion: v1kind: Namespacemetadata: name: jenkins
2. 輸入以下命令以規範應用:
kubectl apply -f jenkins-namespace.yamlnamespace/jenkins created
3. 將以下代碼粘貼到jenkins-volume.yaml文件中:
apiVersion: v1kind: PersistentVolumemetadata: name: jenkins-pv namespace: jenkinsspec: storageClassName: jenkins-pv accessModes: - ReadWriteOnce capacity: storage: 10Gi persistentVolumeReclaimPolicy: Retain hostPath: path: /data/jenkins-volume/
4.輸入以下命令以規範應用:
kubectlapply-fjenkins.volume.yaml
需要注意的是,hostPath使用節點/data/jenkins-volume/來模擬附屬網絡存儲。這種方法只適合於開發和測試階段。在生產階段,需要提供網絡資源(如Google Compute Engine持久盤,或Amazon Elastic Block Store卷)。
安裝Jenkins
Jenkins部署通常由一個主節點和一個或多個代理節點(可選)組成。Jenkins是一個依賴於多個組件的複雜應用程式,我們可以通過Helm來簡化Jenkins部署。
(Helm:https://helm.sh/?ref=hackernoon.com)
Helm是Kubernetes的一個包管理器,其打包格式被稱為chart。在GitHub上能夠找到許多社區開發的chart。
(GitHub:https://github.com/helm/charts?ref=hackernoon.com)
1. 創建一個覆蓋文件,並將其作為實參傳給Helm CLI。將 https://raw.githubusercontent.com/kubernetes/charts/master/stable/jenkins/values.yaml中的內容粘貼到values.yaml文件中。
然後在你喜歡的文本編輯器中打開values.yaml文件,將以下行:
storageClass:
修改為:
storageClass: jenkins-pv
2.現在,我們可以通過運行helm install命令來安裝Jenkins,並傳遞以下參數:
helm install jenkins -f values.yaml stable/jenkins --namespace jenkins
會得到類似以下輸出:
NAME: jenkinsLAST DEPLOYED: Mon Dec 3017:26:082019NAMESPACE: jenkinsSTATUS: deployedREVISION: 1NOTES:1. Get your 'admin' user password by running:printf $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo2. 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:8080 kubectl --namespace jenkins port-forward $POD_NAME 8080:80803. Login with the password from step 1 and the username: admin
3.根據你環境的不同,Jenkins可能需要一定時間才能完成初始化,輸入以下命令來檢查Pod狀態:
kubectl get pods --namespace=jenkins
Jenkins安裝後,狀態應像以下輸出這樣為Running:
kubectl get pods --namespace=jenkinsNAME READY STATUS RESTARTS AGEjenkins-645fbf58d6-6xfvj 1/1 Running 02m
4.需要通過以下命令檢索密碼,才可以訪問Jenkins伺服器:
printf $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echoUm1kJLOWQY
注意,你的密碼應該是不一樣的。
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}")
這將創建名為POD_NAME的環境變量,將其值設置為運行Jenkins的Pod名稱。
6. 使用kubectl命令設置埠轉發:
kubectl --namespace jenkins port-forward $POD_NAME8080:8080Forwarding from 127.0.0.1:8080 -> 8080Forwarding from [::1]:8080 -> 8080
添加Executor
Jenkins將executor定義為「用於在節點上執行由Pipeline或Pipeline定義的工作槽。一個節點可以配置零個或多個Executor,與在該節點上能夠執行的Project或Pipeline數量相對應。」
接下來,我們將向Jenkins節點添加executor。
1. 瀏覽器打開http://localhost:8080,使用用戶名admin和之前檢索到的密碼進行登錄。
2. 在左側導航欄中,選擇Jenkins -> Manage Jenkins -> Manage Node
3. 選擇「Master 」,然後單擊「Configure」
4. 在 # of executors 輸入框中輸入「1」,然後單擊「Save 」
安裝並配置Node.js插件
在本教程中,我們將使用Node.js插件來部署並測試一個用Express.js編寫的簡單web應用程式。
按照以下步驟安裝Node.js插件:
1. 左側導航欄Jenkins -> Manage Manage Jenkins -> Manage Plugins -> Available Plugins,選擇NodeJS 插件,然後單擊「Install without restart」
2. 安裝完成後,會出現以下界面:
3. 左側導航欄Jenkins -> Manage Jenkins -> Global Tool Configuration,選擇Add NodeJS。輸入NodeJS安裝名稱,然後選擇一個NodeJS版本,選好後單擊「Save 」。
HelloWorld 存儲庫
為了展示Jenkins 的工作原理,我們創建了一個監聽埠3000並輸出「Hello World!」的簡單Express.js 伺服器。然後我們編寫了一個單元測試,檢查該web 應用程式是否能夠按預期工作。同時,我們還更新了package.json 文件,以便Jenkins 可以通過npm test命令執行單元測試。
最後,我們用以下命令創建了一個Jenkinsfile:
pipeline { agent any tools {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' } } }}
以上構建了一個三階段CD pipeline:
首先,克隆了HelloWorld Git存儲庫然後,通過運行npm install 安裝了依賴項最後,執行了單元測試接下來,我們將配置Jenkins以運行該腳本。
創建並運行Pipeline
Pipeline為交付軟體提供了可重複且一致的流程。藉助Jenkins,我們可以用Groovy程式語言將pipeline作為DSL腳本來編寫。
按照以下步驟創建和運行pipeline:
1. 選擇Jenkins -> New Item,然後輸入pipeline名稱(HelloWorld),完成後單擊「OK」。
2. 下一頁,選擇「Pipeline script from SCM」,並將Repository URL 設置為「https://github.com/andreipope/HelloWorld」。這是一個公共存儲庫,所以我們不需要配置任何證書憑證。
Jenkins會自動檢索位於存儲庫根目錄中的Jenkinsfile。
3. 現在,我們可以手動運行pipeline了:
4. 等它運行完後,應該會看到控制臺輸出類似內容:
+ npm test> HelloWorld@1.0.0 test /var/jenkins_home/workspace/HelloWorld> mocha ExpressJS 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] Endof PipelineFinished: SUCCESS
恭喜你!你已經成功在Kubernetes配置了Jenkins,並用它測試了一個簡單的web應用程式。雖然看起來本文似乎包含了大量信息,但其實這只是Jenkins 和Kubernetes中最為淺顯的內容。多嘗試就會打開新世界!