Bootstrap

Jenkins on Kubernetes中的Pipeline语法以及自定义Slave的使用方式

从单体应用,到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 文件共享设置的方法

  1. 找一台磁盘较大的服务器作为文件服务器,并安装nfs服务(nfs-utils, rpcbind)
  2. 启动nfs服务
  3. 在集群节点上安装(nfs-utils)以便任意节点均支持nfs挂载
    然后,我们在Jenkins的Deployment声明文件中挂载nfs即可 (即yaml中的volumes和volumeMounts)
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins
  namespace

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;