基于k8s插件的jenkins容器化构建
本文主要描述如何在K8S中实现jenkins slave节点的动态构建(通过Jenkins的k8s插件)前提准备:1.jenkins部署在K8S中。2.安装jenkins的kubernetes插件jenkins在k8s中如何部署请看上一篇,《jenkins在k8s中部署》具体配置系统管理-〉系统配置-〉最下方配置cloud添加云集群->选择kuberneteskubernetes名字:可以随
本文主要描述如何在K8S中实现jenkins slave节点的动态构建(通过Jenkins的k8s插件)
前提准备:
1.jenkins部署在K8S中。
2.安装jenkins的kubernetes插件
jenkins在k8s中如何部署请看上一篇,《jenkins在k8s中部署》
具体配置
系统管理-〉系统配置-〉最下方配置cloud
添加云集群->选择kubernetes
kubernetes名字:可以随意取
kubernetes地址:填写k8s的api地址
可通过命令查看
获取k8s api 信息:curl localhost:8080/api
一般就是k8s的master节点的IP加端口6443
kubernetes命名空间就填jenkins部署的命名空间
然后可以点击连接测试
显示
connected to kubernetes vxxx
即为成功
(因为在部署jenkins时就已经加了service account ,如果部署时没有加导致没有访问权限,也可以在凭证处加上k8s的证书)
jenkins地址填写jenkins的ep地址
可通过命令
kubectl get ep -njenkins
然后点击pod template->添加pod模版
pod template名称:可以随意取,后续可以在kuboard中查看或者通过命令kubectl get pods -njenkins
命名空间:就填写jenkins所在的空间
标签列表:就是之后在pipeline中可以启动pod作为slave的依据
用法:一般选之允许绑定到这台机器的job
在容器列表中点击添加容器,接下来是container template
名称:也是可以随意取
docker镜像:如果是外网直接直接填写外网拉去镜像的地址,内网的话只能是放在本地或者通过自己搭建的harbor或其他镜像仓库
!!!!通过k8s插件来配置cloud时,需要有一个容器作为jnlp来达到链接master的作用,这个镜像可以直接拉去官网jnlp镜像或者自己制作
https://registry.hub.docker.com/r/jenkins/jnlp-slave
工作目录:可以自行修改或默认
卷:
添加卷中可以挂在本地机器的目录,也可以挂在pvc或者nfs自行设置
两个常用host path volume的挂载
可实现在pod中docker命令的使用
主机路径:/var/run/docker.sock
挂在路径: /var/run/docker.sock
可以实现kubectl命令,但是关于本命名空间的操作命令需要填写下面的service account
主机路径:/root/.kube
挂载路径:/home/jenkins/.kube
pod retention:pod节点的停留时间,一般不会选always,默认或者never
代理的空间存活时间(分):pod完成任务之后的存活时间
其他默认或者不填就行
service accoune:填写的service accoune可以自己创建,代表该pod中可以对该命名空间的一些操作权限
工作空间卷:如果不需要保留pod操作之后的数据可以无视,在pod完成任务之后会自动销毁,如果需要保留可以在该处配置挂载
然后返回首页
新建任务
选择free风格或者pipeline
1.free风格项目
需要启动slave时,只需要在job notfications中勾选限制项目的运行节点
然后在标签的表达式中填写刚才所配置的kubernetes template中的pod label。
2.pipeline
选择pipeline类型后
在流水线中定义
填写
podtemplate(){
node('jnlp'){
stage('first'){
container('jnlp'){
echo 'jnlp连接'
}
}
stage('docker'){
container('docker'){
sh 'docker ps -a'
}
}
}
}
node中填写的是pod的label。container填写容器的名称,这样就可以实现pipeline中环境的标准化和隔离性,每一个stage都可以分开容器进行。
也可以直接在pipeline中定义kubernetes cloud
podTemplate(label: ’jnlp, cloud: 'my-kubernetes-cloud',
containers: [
containerTemplate(name: 'jnlp',
ttyEnabled: true,
image: 'jenkins/jnlp-slave:alpine', imagePullPolicy: 'Always'),
containerTemplate(name: 'jnlp-mvn',
ttyEnabled: true,
command: 'cat',
image: 'jenkins/jnlp-slave-maven:v1.5', imagePullPolicy: 'Always'),
containerTemplate(name: 'jnlp-docker',
ttyEnabled: true,
command: 'cat',
image: 'jenkins/jnlp-slave-docker:v1.6', imagePullPolicy: 'Always')
],
volumes: [
hostPathVolume(hostPath: '/var/run/docker.sock', mountPath:'/var/run/docker.sock'),
hostPathVolume(hostPath: '/etc/docker/daemon.json', mountPath:'/etc/docker/daemon.json')
]
) {
stage(){}
stage(){}
}
yaml文件中的label
有三个值。
(1)deployment的label,与他人无关。
(2)service的label,与他人无关。
(3)pod的label,将会出现三次。deployment的template里有个label,以及RC的selector值,Service的selector值。
template里的label,表示deployment创建的pod标签。
RC和service里的selector=jenkins,表示deployment和service将会管理标签为jenkins的pod。
更多推荐
所有评论(0)