[系統集成] 基於Kubernetes 部署 jenkins 並動態分配資源


2017年3月10日注:

這篇文章發布在去年8月,現在,jenkins kubernetes 插件已經由0.8更新到了0.11,jnlp-slave 也更新到了2.62,新版本與老版本在運行方式和功能上均發生了一些變化,請您注意參考相關文檔。

 

2017年4月7日注:

新版本的 kubernetes plugin (0.11) 以及 jnlp-slave(2.62) 仍然是可用的,有兩點需要注意:

1)建議基於官方的 jnlp-slave:2.62 構建自己的 jnlp 鏡像,然后在jenkins kubernetes 插件的 template 中設置單容器,並且將容器的名稱設置為 jnlp,否則 jenkins 會從外網下載默認的 jnlp 鏡像,耗時而且存在問題。

2)下述參數不要采用默認值,用圖中的值替換默認值

Command to run slave agent: (留空)

Arguments to pass to the command: ${computer.jnlpmac} ${computer.name}

Allocate pseudo-TTY: 不選

---- 截圖 ----

 

 

----------- 原文 -----------

基於kubernetes 部署 jenkins master 比較簡單,難點是為 jenkins 動態分配資源。基於kubernetes 為 jenkins 動態分配資源需要實現下述功能:

  1. 資源分配:jenkins 根據任務屬性自動創建臨時 docker 容器,並作為 slave 節點加入 jenkins 集群,實現資源的分配;
  2. 資源釋放:任務執行結束后,jenkins 自動刪除相關節點,並銷毀相關 docker 容器,實現資源的釋放;

整個資源分配和資源釋放過程對用戶來說是透明的,用戶只需要創建好任務就可以了,不需要操作節點;對於jenkins來說,slave 節點(容器)是臨時的,任務一結束就會銷毀。

為了實現數據持久化,建議把需要持久化的數據掛載到 NFS 或 glusterfs卷上。 

1. 准備 docker 鏡像

#jenkins master

jenkins:2.7.2

#jenkins slave

jenkinsci/jnlp-slave:2.52

2. 部署 jenkins master

分別部署 controller, service, ingress,controller 控制 master 容器,ingress 提供用戶訪問入口。

 1 kind: Deployment
 2 metadata:
 3   name: jenkins
 4 spec:
 5   replicas: 1
 6   strategy:
 7     type: RollingUpdate
 8     rollingUpdate:
 9       maxSurge: 2
10       maxUnavailable: 0
11   template:
12     metadata:
13       labels:
14         app: jenkins
15     spec:
16       imagePullSecrets:
17       - name: myregistrykey
18       containers:
19       - name: jenkins
20         image: registry.xxxxx.com/jenkins:2.7.2
21         imagePullPolicy: IfNotPresent
22         ports:
23         - containerPort: 8080
24           name: web
25           protocol: TCP
26         - containerPort: 50000
27           name: agent
28           protocol: TCP
29         volumeMounts:
30         - name: jenkinshome
31           mountPath: /var/jenkins_home
32         env:
33         - name: JAVA_OPTS
34           value: "-Duser.timezone=Asia/Shanghai"
35       volumes:
36       - name: jenkinshome
37         nfs:
38           server: 172.31.17.74
39           path: "/var/nfsshare/k8s/jenkins/home"
 1 kind: Service
 2 apiVersion: v1
 3 metadata:
 4   labels:
 5       app: jenkins
 6   name: jenkins
 7 spec:
 8   ports:
 9   - port: 8080
10     targetPort: 8080
11     name: web
12   - port: 50000
13     targetPort: 50000
14     name: agent
15   selector:
16     app: jenkins
 1 kind: Ingress
 2 metadata:
 3   name: jenkins
 4 spec:
 5   tls:
 6   - hosts:
 7     - jenkins.xxxxx.com
 8     secretName: jenkins-secret
 9   rules:
10   - host: jenkins.xxxxx.com
11     http:
12       paths:
13       - backend:
14           serviceName: jenkins
15           servicePort: 8080
16         path: /

3. 安裝 jenkins Kubernetes 插件

登錄 jenkins master,根據頁面提示,輸入 /home/jenkins_home/下的密鑰文件里的密鑰,進入插件安裝界面,選擇 Kubernetes Plugin 安裝。

4. 創建 jenkins Kubernetes 雲

jenkins-系統管理-系統設置-雲-Kubernetes:

Name: k8s_cluster
Kubernetes URL: https://kubernetes.default
Kubernetes Namespace: default
Jenkins URL: http://jenkins.default:8080

images - Kubernetes Pod Template:
Name: jnlp-slave
Labels: jnlp-slave
Docker image: registry.xxxxx.com/jenkinsci/jnlp-slave:2.52
Jenkins slave root directory: /home/jenkins

 

5. 查看無任務狀態

5.1 jenkins 

節點中只有一個master,沒有 slave節點

 

5.2 kubernetes

只有 jenkins master pod

6. 創建測試任務

該任務選擇標簽為 jnlp-slave 的鏡像作為執行任務的容器的鏡像,構建動作是 ping www.baidu.com 

 

建好后執行該任務

7. 查看任務執行狀態

7.1 jenkins

jenkins 自動創建了一個slave節點

7.2 kubernetes

kubernetes pod中多出一個jnlp-slave-開頭的pod

8. 結束任務

結束任務后,剛才看到的slave 節點被自動刪除,kubernetes 中 jnlp-slave 開頭的 pod 也消失了。


免責聲明!

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



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