kubernetes(33):持續集成(2)-jenkins在k8s中動態創建slave代理


jenkins在k8s中動態創建slave代理

https://mp.weixin.qq.com/s/C82DsWV9oK23lfOJiunkhA

https://help.aliyun.com/document_detail/106712.html?spm=a2c4g.11186623.6.813.626e4330lQtSFi

 

接下來需要來配置 Jenkins,讓他能夠動態的生成 Slave 的 Pod。

Slave主要是解決單點負載的問題,分布式的master-slve架構,master主要負責負載地調度,slave執行構建任務,可以很好地解決性能問題。

 

這個創建是按需的,只要構建完成slave 的pod就會自動銷毀

 

 

1  安裝kubernetes插件

點擊 Manage Jenkins -> Manage Plugins -> Available -> Kubernetes勾選安裝即可。

 

 

 

 

2 Jenkins配置k8s信息

安裝完畢后,點擊 Manage Jenkins —> Configure System —> (拖到最下方)Add a new cloud —> 選擇 Kubernetes,然后填寫 Kubernetes 和 Jenkins 配置信息。

 

 

 

 

注意 namespace,我們這里填 kube-ops,然后點擊Test Connection,如果出現 Connection test successful 的提示信息證明 Jenkins 已經可以和 Kubernetes 系統正常通信了,然后下方的 Jenkins URL 地址:http://jenkins2.kube-ops.svc.cluster.local:8080,這里的格式為:服務名.namespace.svc.cluster.local:8080,根據上面創建的jenkins 的服務名填寫

另外需要注意,如果這里 Test Connection 失敗的話,很有可能是權限問題,這里就需要把我們創建的 jenkins 的 serviceAccount 對應的 secret 添加到這里的 Credentials 里面。

3 配置 Pod Template

 

其實就是配置 Jenkins Slave 運行的 Pod 模板,命名空間我們同樣是用 kube-ops,Labels 這里也非常重要,對於后面執行 Job 的時候需要用到該值,然后我們這里使用的是 cnych/jenkins:jnlp 這個鏡像,這個鏡像是在官方的 jnlp 鏡像基礎上定制的,加入了 kubectl 等一些實用的工具。

 

使用jenkins-slave-jnlp作為Docker鏡像。jenkins-slave-jnlp用於構建節點jnlp連接master。

 

 

 

 

 

由於新版本的 Kubernetes 插件變化較多,如果你使用的 Jenkins 版本在 2.176.x 版本以上,注意將上面的鏡像替換成cnych/jenkins:jnlp6,否則使用會報錯,配置如下圖所示:

 

 

 

 

 

 

另外需要注意我們這里需要在下面掛載兩個主機目錄,一個是/var/run/docker.sock,該文件是用於 Pod 中的容器能夠共享宿主機的 Docker,這就是大家說的 docker in docker 的方式,Docker 二進制文件我們已經打包到上面的鏡像中了,另外一個目錄下/root/.kube目錄,我們將這個目錄掛載到容器的/root/.kube目錄下面這是為了讓我們能夠在 Pod 的容器中能夠使用 kubectl 工具來訪問我們的 Kubernetes 集群,方便我們后面在 Slave Pod 部署 Kubernetes 應用。

 

 

 

另外還有幾個參數需要注意,如下圖中的Time in minutes to retain slave when idle,這個參數表示的意思是當處於空閑狀態的時候保留 Slave Pod 多長時間,這個參數最好我們保存默認就行了,如果你設置過大的話,Job 任務執行完成后,對應的 Slave Pod 就不會立即被銷毀刪除。

 

 

 

 

如果出現了權限問題,因為 Jenkins Slave Pod 中沒有配置權限,所以需要配置上 ServiceAccount,在 Slave Pod 配置的地方點擊下面的高級,添加上對應的 ServiceAccount 即可:

 

 

 

 

如果出現配置完成后發現啟動 Jenkins Slave Pod 的時候,出現 Slave Pod 連接不上,然后嘗試100次連接之后銷毀 Pod,然后會再創建一個 Slave Pod 繼續嘗試連接,無限循環,類似於下面的信息

 

 

 

到這里我們的 Kubernetes Plugin 插件就算配置完成了。

 

 

 

 

4  自由風格測試

Kubernetes 插件的配置工作完成了,接下來我們就來添加一個 Job 任務,看是否能夠在 Slave Pod 中執行,任務執行完成后看 Pod 是否會被銷毀。

在 Jenkins 首頁點擊create new jobs,創建一個測試的任務,輸入任務名稱,然后我們選擇 Freestyle project 類型的任務:

 

 

注意在下面的 Label Expression 這里要填入wx-jnlp,就是前面我們配置的 Slave Pod 中的 Label,這兩個地方必須保持一致

 

 

 

 

然后往下拉,在 Build 區域選擇Execute shell

 

echo "測試 Kubernetes 動態生成 jenkins slave"
echo "==============docker in docker==========="
docker info

echo "=============kubectl============="
kubectl get pods

 

最后點擊保存

 

 

 

 

 

現在我們直接在頁面點擊立即構建 觸發構建即可,然后觀察 Kubernetes 集群中 Pod 的變化

gnlp6這個鏡像很大,需要下載很長時間,我都是docker提前下載的,否則很容易測試失敗

kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
jenkins2-8b7f7bdb7-h9kzt   1/1     Running   0          22m
jnlp-s2kfk                 1/1     Running   0          19s

 

 

我們可以看到在我們點擊立刻構建的時候可以看到一個新的 Pod:jnlp-s2kfk 被創建了,這就是我們的 Jenkins Slave。任務執行完成后我們可以看到任務信息

 

 

 

 

到這里證明我們的任務已經構建完成,然后這個時候我們再去集群查看我們的 Pod 列表,發現 kube-ops 這個 namespace 下面已經沒有之前的 Slave 這個 Pod 了。

 

執行完成,pod自動銷毀。

 

[root@k8s-master ~]# kubectl -n kube-ops get pod
NAME                       READY   STATUS    RESTARTS   AGE
jenkins2-8b7f7bdb7-h9kzt   1/1     Running   0          84m

 

到這里我們就完成了使用 Kubernetes 動態生成 Jenkins Slave

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM