《玩转Jenkins系列》之集成K8S
前言*序
今天这篇Topic主要讲一下如何在Jenkins里面与K8S进行深度融合。目标只有一个:
动态创建编译机,提升编译集群资源利用效率
配置篇
系统管理菜单下面如下图
说明:
- 名称可以随意取。这个为后续的时候用到
- Jenkins地址,请填写Jenkins服务器访问地址
- 配置完了之后点连接测试,如果提示"Connection test successful"说明连接到集群上了
上面K8S的地址什么的都没有配置为什么就连接成功了?好奇的看官肯定会有疑问了。
『The URL of the Kubernetes API server. If not set the connection options will be autoconfigured from service account or kube config file.』 在这里我们用了kube配置文件来完成这个事情的。
登录Jenkins服务所在的容器内将APIserver的连接配置kube/config配置文件放到~/.kube/config。这样它就会自动去完成连接了。
使用篇
现在连接上了K8S了那我们先创建一个非常简单的流水线,里面就输出一条:"hello jenkins and k8s"
a)先创建一条流水线的任务
b) 我们选择用Jenkinsfile的方式
c) 编写Jenkinfiles文件
pipeline {
agent {
kubernetes {
label 'mypodx'
cloud 'yaofang_k8s_test'
yamlFile 'mpod.yaml'
}
}
stages {
stage('git clone') {
steps {
git credentialsId: '3b1cd500-c1a2-4bd6-84f0-237b0c879fbf', url: '${url}'
}
}
stage('hold') {
agent none
steps {
input "Does the staging environment look ok?"
}
}
stage('Run containers shell') {
steps {
sh '/root/bin/git.sh ${url}'
}
}
}
}
说明:
- cloud 表示我们在上面配置的名称进行关联
- yamlFile 表示通过yaml来创建Pod
以下是创建Pod的描述文件:
metadata:
labels:
some-label: some-label-value
spec:
volumes:
- hostPath:
path: /data/mvn_cache
type: ""
name: mvn-cache
containers:
- name: jnlp
alwaysPullImage: true
volumeMounts:
- mountPath: /root/repository
name: mvn-cache
image: registry.cn-shanghai.aliyuncs.com/cpaas/build_dockerfile:v5
env:
- name: CONTAINER_ENV_VAR
value: jnlp
说明:
- 通过volumes可以将宿主机的目录挂载到容器内,实现对maven编译场景下的加速
- images这个镜像是我们自定义镜像,可以用于构建自己想的编译运行环境.
d) 运行流水线
先看下K8S上面的POD变化
可以看到出来了一个POD。
再来看下流水线控制台的输出
最佳实践
基于镜像的实践,可以针对编译机的镜像做更多的扩展。比如可以集成docker工具/OSS工具等。另外针对maven编译机的加速问题也可以进一步优化,可以将.m2下面的文件放到宿主机上去,这样可以提升编译速度。
最佳实践之解决git权限方案
如果我们直接在镜像中运行一个shell脚本的话,我们会发现git clone代码的时候会报权限不足。解决办法
- 将宿主机的/root/.ssh/目录挂载到Pod的容器里面即共享公钥文件
- 将宿主机的公钥配置到GIT仓库
类似的启动如下:
docker run -itd -v /root/.ssh/:/root/.ssh/ -v /tmp/build_maven/:/root/repository/