更新时间:2020-07-01 19:06:21
持续构建与发布是DevOps中必不可少的一个环节,目前大多公司都采用 Jenkins 集群来搭建CI/CD 流程,传统的 Jenkins Slave 一主多从方式会存在一些问题,比如:主 Master 发生单点故障时,整个流程都不可用了;每个 Slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲;资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slave 处于空闲状态;造成资源浪费,当 Slave 处于空闲状态时,也不会完全释放掉资源。
因此,我们渴望一种更高效更可靠的方式来完成这个 CI/CD 流程,而 Docker 虚拟化容器技术能很好的解决这个问题,下图是基于Kubernetes 搭建 Jenkins 集群的简单架构图。
Jenkins Master 和 Jenkins Slave 以 Pod的形式运行在 Kubernetes 集群的节点上,Master运行在其中一个节点,并且将其配置数据存储到NFS上,Slave 运行在各个节点上,Slave并不是一直处于运行状态,它会按照需求动态的创建并自动删除。
jenkins工作流程大致为:当 Jenkins Master 接受到 Build 请求时,会根据配置的 Label 动态创建一个运行在Pod中的 Jenkins Slave并注册到Master上,当运行完Job后,这个 Slave 会被注销并且Pod也会自动删除。
本文档将演示一个java项目,从构建环境准备、代码编译、镜像构建、部署服务到Kubernetes集群的流程,展示DevOps案例。
说明:
配置完毕,可以点击 Test Connection 按钮测试是否能够连接的到 Kubernetes,如果显示 Connection test successful 则表示连接成功,配置没有问题。
freestyle类型的job需要设置Kubernetes Pod Template,在job配置时可选择下图添加的Pod Labels,从而使用准备好的镜像启动一个Pod注册为Jenkins slave。Pipeline类型的job需要在pipeline脚本中添加Jenkins slave信息。
说明:Docker image是准备好构建环境的镜像
添加Volumes,将宿主机上的目录挂载到容器中。
添加ImagePullSecrets,允许从镜像仓库pull镜。
说明:
新建一个流水线(pipeline)类型的job。
选择Pipeline script,填入pipeline脚本。或者选择Pipeline script from SCM使用代码仓库里的pipeline。
开发人员更新代码到svn、git等代码仓库。
点击构建任务,后台启动一个准备好编译环境的容器进行编译构建。
可通过shell添加测试步骤,测试通过后继续下一步。
通过用户提供的Dockerfile文件构建镜像,并上传到镜像仓库。
部署应用到K8s集群。
可将构建结果发送给相关人员。