[系统集成] 基于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 也消失了。

posted @ 2016-08-27 10:20  hahp  阅读(17138)  评论(17编辑  收藏  举报