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 動態分配資源需要實現下述功能:
- 資源分配:jenkins 根據任務屬性自動創建臨時 docker 容器,並作為 slave 節點加入 jenkins 集群,實現資源的分配;
- 資源釋放:任務執行結束后,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 也消失了。