1 Jenkins的Master-Slave分布式构建
1.1 什么是Master-Slave分布式构建?

- Jenkins的Master-Slave分布式构建,就是通过将构建过程分配到从属Slave节点上,从而减轻Master节点的压力,而且可以同时构建多个,有点类似负载均衡的概念。
1.2 如何实现Master-Slave分布式构建?
1.2.1 开启代理程序的TCP端口
- Manage Jenkins—>Configure Global Security。

1.2.2 新建节点
- Manage Jenkins—>Manage Nodes and Clouds—>新建节点。


- 将192.168.18.102作为从节点,需要创建一个目录作为Jenkins的从节点的远程目录:
mkdir -pv /root/jenkins


# 在agent.jar所在的目录中输入此命令
java -jar agent.jar -jnlpUrl http://192.168.209.101:8888/computer/slave1/jenkins-agent.jnlp -secret 3e49deb4948fa893a77c0f5d4cc97e732a5fbb53dad73884e01763541608bc3e -workDir "/root/jenkins"

1.3 测试节点是否可用
1.3.1 新建自由风格的项目

1.3.2 限制项目的运行节点中输入slave1

1.3.3 配置源码管理

1.3.4 点击构建

2 kubernetes实现Master-Slave分布式构建方案
2.1 传统Jenkins的Master-Slave方案的缺陷
- Master节点发生单点故障时,整个流程都不可用了。
- 每个Slave节点的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来很不方便,维护起来也非常费劲。
- 资源分配不均衡,有的Slave节点要运行的Job出现排队等待,而有的Slave节点处于空闲装填。
- 资源浪费,每台Slave节点可能是实体机或是虚拟机,当Slave节点处于空闲状态的时候,也不会完全释放掉资源。
- ……
2.2 kubernetes+Docker+Jenkins持续集成架构图


- 大致工作流程:手动/自动构建—>Jenkins调用k8s的API—>动态生成Jenkins Slave Pod—> Slave Pod拉取Git代码/编译/打包镜像—>推送到镜像仓库Harbor—>Slave工作完成,Pod自动销毁—>部署到测试或生产的kubernetes平台(完全自动化,无需人工干预)。
2.3 kubernetes+Docker+Jenkins持续集成的好处
服务高可用:当Jenkins Master出现故障时,kubernetes会自动创建一个新的Jenkins Master容器,并且将Volume分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。
动态伸缩、合理使用资源:每次运行Job时,会自动创建一个Jenkins Slave,Job完成后,Slave自动注销并删除容器,资源释放,而且kubernetes会根据每个资源的使用情况,动态分配Slave到空闲的节点上创建,降低出现因为某些节点资源利用率高,还排队等待该节点的情况。
扩展性好:当kubernetes集群的资源严重不足而导致Job排队等待的时候,可以很容易的添加一个kubernetes Node到集群中,从而实现扩展。
3 kubernetes的安装
3.1 安装环境说明
主机名称 |
IP地址 |
安装的软件 |
k8s-master |
192.168.18.100 |
k8s的主节点 |
k8s-node1 |
192.168.18.101 |
k8s的从节点 |
k8s-node2 |
192.168.18.102 |
k8s的从节点 |
代码托管仓库 |
192.168.18.103 |
Gitlab |
Docker仓库服务器 |
192.168.18.104 |
Harbor |
3.2 安装kubernetes