本文主要描述如何在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。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐