在以往的部署方式中,Jenkins一般都是分离与k8s单独的安装集群,但是这种方式存在一些不足的地方:
- 当job比较少的时候有部分slave节点处于空闲状态,导致资源浪费。
- 当job比较多的时候slave节点可能会出现不够用的情况,将导致部分job处于等待状态。
- 当master节点出现问题之后,不能快速恢复,导致后续工作无法进行。
鉴于以上存在的问题,采用k8s的方式来部署Jenkins集群可以很好的解决,在k8s中只部署master节点,并通过pv对所用的job进行持久化存储,通过k8s-Jenkins插件实现slave节点的动态创建,当job比较多的时候新建slave节点,并且在job执行完之后进行销毁,并且即使master节点出现问题之后,也可以快速的通过deployment来快速的创建新的master并挂载到之前的pv上。从而达到master的高可用,也避免资源的浪费。
准备
1、插件安装
在前一篇文章中简单介绍了k8s插件的安装,本节中先对其安装和配置作详细介绍。登陆Jenkins之后再插件管理中搜索kubernetes,点击安装即可。
2、插件配置
点击进入Jenkins的系统配置,点击添加cloud,选择kubernets即可添加对k8s的集群的支持。
-
配置jenkins登陆k8s集群的密钥
点击进去Jenkins的凭证管理,添加凭证,类别选择Kubernetes service Acount,点击ok即可。
-
配置基本信息
这里主要配置k8s的url地址和用于认证的密钥
-
配置k8s的pod模板,主要用于生成slave节点。
在Jenkins中提供了两种方式来添加agent,一种是通过ssh(由master连接到slave来执行任务),另一种是使用JNLP(Java 网络启动协议(JNLP) 是一种允许客户端启动托管在远程Web服务器上的应用程序的协议)。这里主要采用第二种方式(由slave去链接master节点),结合docker镜像。
这里主要配置了jnlp协议所对应使用的容器镜像,同时也可以再添加多个容器,比如:用于进行maven构建的maven容器等。
3、测试
- 创建项目
在Jenkins中创建一个Freestyle类型的项目,取名为test。 - 项目配置
-
添加构建参数
-
现在项目运行的地方(只在slave中运行)
-
打印参数
-
- 执行构建,查看是否动态生成slave
返回创建好的项目,点击Build with Parameters,输入参数值,点击build。可以看到节点先有pending(等待pod的创建)再转换为执行构建
CI
在上一节中对kubernetes插件进行了简单的应用,这一节将使用github+aliyun+Jenkins来实现项目的自动构建并将生成的镜像上传到aliyun镜像仓库
- 配置阿里云镜像仓库
关于阿里云镜像仓库的使用请参照官方文档,这里新建一个叫jks的仓库。 -
配置阿里云镜像仓库密钥
点击进去Jenkins的凭证管理,添加凭证。
- 新建项目
在GitHub上新建一个项目,并将本地的maven项目推送到仓库中。这里以及准备好了一个项目,当然读者也可以自行创建自己的项目。https://github.com/tlhhup/tlhhup.git - 新建Jenkins项目
创建一个流水线类型的项目,取名为tlhhup
-
添加构建参数
-
配置流水线
podTemplate(containers: [#声明使用到的容器 containerTemplate(name: 'maven', image: 'maven:3.5-jdk-8', ttyEnabled: true, command: 'cat'), containerTemplate(name: 'docker', image: 'docker:latest', ttyEnabled: true, command: 'cat') ], serviceAccount:'jenkins',#使用的账号,在部署Jenkins时创建的 volumes: [ nfsVolume(mountPath: '/root/.m2', serverAddress: '192.168.241.144', serverPath: '/nfs-share'), # 配置nfs服务器的信息,注意必须为真是有效的 hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock') ] ) { node(POD_LABEL) { stage('Get a Maven project') { git 'https://github.com/tlhhup/tlhhup.git' container('maven') { stage('Build a Maven project') { sh 'mvn -DskipTests=true clean package' } } } stage('Build Docker Image'){ container('docker'){# 在docker容器中执行镜像构建 sh ''' mkdir context cp target/tlhhup-1.0-SNAPSHOT.jar context cp doc/Dockerfile context ''' sh 'docker build -t registry.cn-hangzhou.aliyuncs.com/gitlabci/jks:${BUILD_NUMBER} context' } } stage('Push Docker Image'){ container('docker'){ sh 'echo Push Docker Image' withCredentials([usernamePassword(credentialsId: 'dd', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {#引用配置的密钥 sh ''' docker login registry.cn-hangzhou.aliyuncs.com -u ${dockerHubUser} -p ${dockerHubPassword} docker push registry.cn-hangzhou.aliyuncs.com/gitlabci/jks:${BUILD_NUMBER} ''' } } } stage('Deploy'){ input "Does the staging environment look ok?" } } }
执行构建