[系统集成] 基于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 动态分配资源需要实现下述功能:
- 资源分配: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 也消失了。