从单体应用,到Spring Cloud,再到Kubernetes,我们的平台正在一点一点追赶别人的脚步。但是由于网络隔离等外部因素影响,CI/CD一直是实施比较困难的环节。最近稍微空闲一些,准备一鼓作气做一次整体代码迁移,打通代码仓库和应用部署环境。在技术选型方面,jenkins的入门门槛最低,同时由于我们已经将应用部署在Kubernetes了,因此选择了集群方式的Jenkins部署。主要部署参考文档: 初试 Jenkins 使用 Kubernetes Plugin 完成持续构建与发布
下面我主要对Jenkins部署过程中的关键点、Jenkins使用过程中Pipeline和slave的定制方面分享一下心得。
1 Jenkins在Kubernetes上的部署
首先最好单独新建一个CICD namespace以便将Jenkins和生产应用独立开。
当Jenkins以集群方式部署时候,我们将Master以Deployment的方式部署在Kubernetes中。要点如下:
1.1 建立ServiceAccount
建立ServiceAccount以分配权限
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: jenkins
name: jenkins-admin
namespace: cicd
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: jenkins-admin
labels:
app: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: cicd
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
1.2 配置Volume
由于Jenkins Master需要保存一些配置和插件,因此需要一个可以持久化存储的Volume并挂载在容器内,我们采用比较容易部署的nfs方式。
具体方法参考: CentOS 6.8 NFS 文件共享设置的方法
- 找一台磁盘较大的服务器作为文件服务器,并安装nfs服务(nfs-utils, rpcbind)
- 启动nfs服务
- 在集群节点上安装(nfs-utils)以便任意节点均支持nfs挂载
然后,我们在Jenkins的Deployment声明文件中挂载nfs即可 (即yaml中的volumes和volumeMounts)
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jenkins
namespace