天天看點

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

本文主要示範如何在阿裡雲Kubernetes服務上快速搭建jenkins持續內建環境,并基于提供的示例應用快速完成應用源碼編譯、鏡像建構和推送以及應用部署的流水線。

前置條件

已經建立了ACK叢集。

建議: 建議使用者先按照以下文檔安裝部署ack-jenkins應用, 然後成功運作建構任務示例demo-pipeline, 再依照此建構任務示例改造自己的建構任務配置。

1. 快速部署ack-jenkins

在容器服務-Kubernetes -> 市場 -> 應用目錄 -> ack-jenkins:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

點選 參數 菜單修改 AdminPassword 字段, 選擇Kubernetes叢集、填寫命名空間和釋出名稱并點選建立:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

通路jenkins服務:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

使用使用者名密碼登入jenkins系統:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

ps:如未設定登陸密碼,則可在部署完畢後使用如下命名檢視:

$ printf $(kubectl get secret --namespace ci jenkins-ci-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo      

在 新手入門頁面點選安裝推薦的插件(已預設安裝了所有推薦的插件)

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

在 執行個體配置頁面 點選儲存并完成。

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

點選開始使用Jenkins:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

進入Jenkins系統後,可以看到名為demo-pipeline的建構任務,可以直接點選建構,測試Kubernetes叢集動态配置設定jenkins slave pod、jenkins slave pod自動連接配接jenkins master是否正常。首先點選建構任務進入建構任務詳情頁面,點選Build with Parameters,保持建構參數不動,點選開始建構。

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

執行建構後,Jenkins開始從Kubernetes叢集動态建立一個slave pod運作本次建構任務。示例應用代碼:

https://github.com/AliyunContainerService/jenkins-demo

https://code.aliyun.com/haoshuwei/jenkins-demo.git
阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

若建構成功則驗證Jenkins on Kubernetes運作正常。

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

2. 配置 Kubernetes Cloud的配置說明

下面我們對Kubernetes Cloud的配置做簡單說明,這些配置在部署ack-jenkins的時候已經自動化配置完畢。

Jenkins使用Kubernetes Plugin連接配接Kubernetes叢集并動态生成和釋放slave pod,關于slave pod的模闆配置需要在 系統管理 -> 系統配置 -> 雲 中進行配置

- 名稱:kubernetes;

- Kubernetes 位址:

https://kubernetes.default.svc.cluster.local:443

;jenkins 系統安裝在目前叢集中,可以使用内部服務端點通路叢集的 API Server

- Kubernetes 命名空間:jenkins;動态 slave pod 會在命名空間 jenkins 下生成和銷毀

點選 `測試` 按鈕驗證連接配接無誤:

![image.png](https://ucc.alicdn.com/pic/developer-ecology/33a3278bcce14602a9427bf72551c9fe.png)

- Jenkins 位址:http://ack-jenkins-default:8080;slave pod連接配接jenkins master使用的服務端點

- Jenkins 通道:ack-jenkins-default-agent:50000;slave pod使用jnlp連接配接jenkins master

![image.png](https://ucc.alicdn.com/pic/developer-ecology/feaa326c78584138be6273f9ac804598.png)

- Pod Templates -> 名稱: slave-pipeline; slave pod名稱

- Pod Templates -> 命名空間:jenkins

- Pod Templates -> 标簽清單:slave-pipeline;jenkins 建構任務通過此标簽選擇使用哪個模闆生成slave pod

![image.png](https://ucc.alicdn.com/pic/developer-ecology/7ba9e66fd12e4249a3b81492f892e857.png)

- Pod Templates -> 容器清單 -> jnlp;用于jnlp連接配接jenkins master

![image.png](https://ucc.alicdn.com/pic/developer-ecology/0c6da0eae15748ebb8eb54e32410f59f.png)

- Pod Templates -> 容器清單 -> kaniko;用于建構和推送容器鏡像

![image.png](https://ucc.alicdn.com/pic/developer-ecology/a345e4828be54bf6bdfaae9a393fec1f.png)

- Pod Templates -> 容器清單 -> maven:用于maven建構和打包應用

![image.png](https://ucc.alicdn.com/pic/developer-ecology/e6c9c5c3a339424cbaca7efc399a2f2c.png)

- Pod Templates -> 容器清單 -> kubectl:用于kubectl指令行部署應用

![image.png](https://ucc.alicdn.com/pic/developer-ecology/195c2756e870455bb6d18d194fc73a55.png)

3. 如何為slave pod配置maven緩存

由于slave pod是在Kubernetes叢集中動态生成的,可能運作于叢集的任何一個worker節點,是以要保證每次動态生成slave pod時都能使用到maven緩存,就必須使用共享存儲持久化存儲卷,如何建立NAS共享存儲卷請參考:

https://help.aliyun.com/document_detail/144398.html

例如,本示例中我們的Jenkins系統部署在jenkins命名空間下,那麼首先需要在jenkins命名空間下建立一個NAS持久化存儲卷,如下所示:

kubectl -n jenkins get pvc
NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
ack-jenkins-default   Bound    d-2ze8xhgzuw1t278jjzbj                     20Gi       RWO            alicloud-disk-efficiency   3h16m
nas-csi-pvc           Bound    nas-c6c3e703-58a9-484e-8ce5-630486ea265d   20Gi       RWX            alicloud-nas-subpath       4m17s      

存儲卷ack-jenkins-default是Jenkins Master的/var/jenkins_home目錄的持久化存儲,nas-csi-pvc則是我們為maven緩存NAS持久化存儲卷。

在Jenkins的 系統管理->系統配置->Kubernetes Cloud配置頁面中,點選Pod Templates details,如下圖所示:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

在Pod Template中添加Persistent Volume Claim類型挂載,申明值為NAS存儲聲明的名字,本示例為nas-csi-pvc,挂載路徑為maven預設緩存路徑/root/.m2/repository。如下圖所示:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

點選SAVE,儲存配置。

下面測試maven緩存是否生效。

首先編輯demo-pipeline建構任務,選擇Jekinsfile.maven檔案進行建構,如下圖所示:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

儲存并執行建構,可以看到第一次maven建構時,需要花費一段時間下載下傳所有依賴包:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

再次進行maven建構,則會引用緩存的依賴包,快速完成源碼打包:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

如果您需要為jenkins slave pod挂載自定義settings檔案,則可以先建立Configmap,然後再配置到Pod Template上:

kubectl -n jenkins create configmap maven-config --from-file=settings.xml       
阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

4. 如何使用kaniko建構和推送容器鏡像

使用kaniko推送鏡像時,需要設定鏡像倉庫的通路權限,在本示例中,首先需要在Linux環境下(請注意不要在MacOS下生成)生成通路鏡像倉庫的config.json檔案,例如我們需要建構和推送一個鏡像registry.cn-hangzhou.aliyuncs.com/haoshuwei24/jenkins-demo:20200428,則生成config.json檔案的指令為:

$ docker login -u xxx -p xxx registry.cn-hangzhou.aliyuncs.com
Login Succeeded      

在jenkins命名空間下使用生成的config.json檔案建立名為jenkins-docker-cfg的Secret:

kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json      

在Pod Template中添加挂載配置和環境變量設定:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

下面測試kaniko建構和推送鏡像。

首先修改demo-pipeline使用Jenkinsfile.kaniko檔案進行建構。

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

請将建構參數修改為您實際的鏡像倉庫相關資訊并執行建構:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

檢視kaniko建構日志如下所示:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

也可以在容器鏡像倉庫檢視是否已經成功推送:

阿裡雲Kubernetes服務上搭建jenkins環境并完成應用建構到部署的流水線作業

5. jenkins更新

如果您的jenkins環境需要更換jenkins-master鏡像,請先為/var/jenkins_home目錄對應的雲盤存儲卷做快照備份,因為新版本的jenkins master會有自動化腳本往/var/jenkins_home目錄寫資料的動作,防止覆寫已有資料。