1. 为什么?
随着Jenkins被大量使用,单台打包机完全无法应对打包慢,线程不够等一系列问题
这时候可以添加固定Node的方式去解决问题,但是慢慢你会发现固定Node也无法解决问题,如果并不是超级多的打包任务,或者根本没得使用K8S的这个条件请移步Jenkins配置从节点来解决单台打包机性能不够的问题
其中最主要的矛盾如下
1.不同的打包环境指定不同的打包机
2.集中在一个时间段打包,特别是在发版本的前夕,所有项目组都在打包,显得特别无力
3.大部分时间闲置的打包负载显得有点浪费
这时候就急需一个可以动态缩放的Node来解决这个问题。
将K8S作为Jenkins负载就是为了解决动态缩放,不同环境需要指定不同打包机的问题(Windows和Mac还是需要单独处理)。
2. 配置K8S负载集群
2.1 安装插件
首先在Jenkins中搜索Kubernetes这个插件,安装上
2.2 配置Kubernetes作为负载
image.pngimage.png
image.png
配置K8S荷载
其中这个Kubernetes地址就是K8S-Api-Server的地址,可以在kube.config中找到
image.png
然后点击连接测试,出现如下就对了,但是讲道理会出现一个
找不到/var/lib/jenkins/.kube/config.json
的错误,出现这个错误就要将kubeConfig放到这个位置
(Tips:如果你是Rancher搭建的K8S集群就在这个位置找API-Server的地址和kubeConfig)
image.png
2.2 配置Pod模板
这里是比较重要的,Pod模板是为了方便打包的,jnlp
这个镜像是必须要的,没有这个镜像就无法连接上Jenkins,这个镜像是可以拓展的。
不建议再这个镜像中安装Docker,安装Dotnet,安装Java,安装NodeJs,因为这些都可以用多容器和Jenkins插件来解决
可以在这个镜像中安装例如解压缩这样的小工具。
重写的配置如下
image.png
这种K8S中的Node有一个很大的缺陷就是缓存的问题,如Nuget缓存,这时候就需要挂载一个盘去进行缓存了,有条件的建议挂载一个PVC,但是像我这样没条件的HostPath也香。
image.png2.3 配置多容器Pod用来支持不同的打包
PS:这里用Dotnet打包为例子
Dotnet打包需要用到的镜像是dotnetsdk,所以需要在jnlp的基础上再加上一个其他镜像,使用的时候就
利用container
这个指令去指定容器。后面的名称就是容器模板中定义的名称,需要唯一指定。
container('dotnet5') {
sh 'dotnet --info'
// 执行你需要的操作
}
image.png
Dotnet打包要想快就要将Nuget的包全部缓存下来,所以需要将~/.nuget 这个文件夹里面的东西用PV缓存起来(鄙人没这个条件,用的HostPath)
image.png2.3 在打包的时候选择调度到K8S的负载上
使用 node
这个命令去指定节点
('k8s-agent-dotnet') {
echo "hello-world"
}
然后再NodeManager中查看就会看到出现了一个新的节点了,这个节点就是K8S中调度的,在打包完成后就会回收掉这个Pod。
image.png
到这里为Jenkins配置K8S的负载就全部完毕了。
网友评论