k8s中安装jenkins
传统jenkins集群存在的问题
- 主master发生单点故障时,整个流程都不可用
- 每个Slave的环境配置不一样,来完成不同语言的编译打包,但是这些差异化的配置导致管理起来不方便,维护麻烦
- 资源分配不均衡,有的slave要运行的job出现排队等待,而有的salve处于空闲状态
- 资源有浪费,每台slave可能是物理机或者虚拟机,当slave处于空闲状态时,也不能完全释放掉资源
正因为上面的问题,我们需要采用一种更高效可靠的方式来完成这个CI/CD流程。
而Docker虚拟化容器技能很好的解决这个痛点,又特别是在Kubernetes集群环境下面能够更好来解决上面的问题。
k8s部署jenkins点评
如上图我们可以看到Jenkins master和Jenkins slave以Pod形式运行在Kubernetes集群的Node。
Master运行在其中一个节点,并且将其配置数据存储到一个volume上去,slave运行在各个节点上。
但是它的状态并不是一直处于运行状态,它会按照需求动态的创建并自动删除。
运行流程
1
21、当Jenkins Master接受到Build请求后,会根据配置的Label动态创建一个运行在Pod中的Jenkins Slave并注册到Master上。
2、当运行完Job后,这个Slave会被注销并且这个Pod也会自动删除,恢复到最初的状态(这个策略可以设置)优点:
服务高可用
1
21、当Jenkins Master出现故障时,Kubernetes会自动创建一个新的Jenkins Master容器。
2、然后将Volume分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用的作用。动态伸缩
1
2
31、合理使用资源,每次运行Job时,会自动创建一个Jenkins Slave。
2、Job完成后,Slave自动注销并删除容器,资源自动释放。
3、Kubernetes会根据每个资源的使用情况,动态分配slave到空闲的节点上创建,降低出现因某节点资源利用率高,降低出现因某节点利用率高出现排队的情况。扩展性好
1
当Kubernetes集群的资源严重不足导致Job排队等待时,可以很容易的添加一个k8s节点到集群,从而实现扩展。
Kubernetes安装配置Jenkins
搭建nfs服务器
1 | 1、服务端配置 |
编写yaml文件
创建命名空间
1
2kubectl create namespace jenkins-cicd
# k8s不支持"_"下划线创建jenkins持久化存储
1 | [root@master k8s-jenkins]# cat jenkins_pv.yaml |
- 创建jenkins的deployment
1 | [root@master k8s-jenkins]# cat jenkins_deployment.yaml |
- 创建serviceAccount的Jenkins用户
1 | [root@master k8s-jenkins]# cat jenkins_rbac.yaml |
- 创建jenkins svc
1 | [root@master k8s-jenkins]# cat jenkins_svc.yaml |
- 创建harbor仓库secret
1 | kubectl create secret -n jenkins docker-registry regcred --docker-server=192.168.100.2 --docker-username=admin --docker-password=xxzx@789 --docker-email=admin@qq.com |
先创建pv然后在执行rbac,再创建deployment和svc
登录jenkins
1
2
3
4# 可查看pod日志
kubectl logs -n jenkins-cicd jenkins-5458f468bf-mw6n4
# 也可在持久化目录下查看
cat /data/k8s-data/jenkins_home/secrets/initialAdminPassword安装插件
1
2# 可直接安装推荐插件也可自定义安装
需安装的插件:Kubernetes
配置动态生成slave的pod
- 添加kubernetes
1 | 进入系统管理 >系统配置 下拉,找到cloud,添加kubernetes |
1 | 这里name就是配置的名称,url这里写的是k8s内部域名。 |
- 添加jenkins slave模版
1 | Name:Pod名称 |
1 | # slave镜像Dockerfile |
1 | # 也可使用创建好的slave镜像,下载下来上传到自己的镜像仓库 |
1 | 1、容器模版的name必须为jnlp、工作目录需为/home/jenkins/agent,否则可能无法连接上jenkins slave反复重启。 |
- 添加volume卷
1
2# 镜像主要是用于kubectl,kubectl是需要kubeconfig文件,所以我们还需要创建一个volume的配置
选择Host path volume
- 配置kubectl权限
1
如果jenkins提示权限错误,请在配置中添加jenkins rbac创建的serviceaccounts
- 应用并保存
添加jenkins job并测试
- 创建一个freestyle project
- 限制运行节点
1
通过上面pod模版的label限制
添加构建 执行shell测试
1
2
3
4
5
6
7添加一个shell命令,测试docker和kubectl
echo "*******测试jenkins-slave******"
sleep 3
echo "*******测试docker******"
docker info
echo "*******测试kubectl******"
kubectl get pod -n jenkins-cicd立即构建
1
2
3
4返回项目,点击立即构建,观察。
1、先拉取指定镜像,然后创建一个slave pod
2、slave连接上后开始执行相关任务命令
3、执行完后自动释放该pod(这里设置了执行完保留3分钟,便于观察)
使用pipeline发布
准备代码
- 创建测试gitlab项目
- 客户端配置gitlab免密(本例暂未做免密)
1
将需免密登录的公钥配置到gitlab
- 上传测试代码
1
2
3
4
5
6
7
8
9
10
111、拉取代码
git clone http://192.168.100.3/root/my-demo4.git
2、下载测试代码
wget http://down.i4t.com/hello-world-war-master.zip
unzip hello-world-war-master.zip
mv hello-world-war-master/* .
rm -rf hello-world-war-master*
3、上传代码
git add .
git commit -m "xxx"
git push origin master
编写tomcat Dockerfile
1 | FROM centos |
配置jenkins pipeline
- 添加gitlab凭证
创建并配置pipeline项目任务
创建任务
添加参数化构建(需安装插件:Git Parameter Plug-In)
配置触发器(可选,生产环境不建议配置)
- 配置gitlab
1
点击push events如出现200则说明配置成功
- 配置gitlab
配置流水线(也可直接写pipeline script)
应用保存
代码提交上添加Jenkinsfile脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# 代码库上创建deploy目录及Jenkinsfile文件
node('jenkins-slave') {
stage('Git Clone'){
checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitlab_root_id', url:'http://172.20.2.195:81/root/my-demo1.git']]])
//git credentialsId: '92ae8184-9661-425d-8609-3c994ddecb21', url: 'http://192.168.100.3/root/my-demo1.git'
}
stage('Maven Build'){
echo "Maven Build"
sh '''
/usr/local/maven/bin/mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip -s settings.xml
'''
}
stage("Docker Build Stage"){
echo "Docker Build Stage"
sh '''
docker build -t 172.20.5.117/ops/tomcat:v${BUILD_NUMBER} .
docker login --username=admin 172.20.5.117 --password "xxzx@789"
docker push 172.20.5.117/ops/tomcat:v${BUILD_NUMBER}
'''
}
stage("Deploy"){
echo "K8s Deploy"
sh '''
kubectl set image -n jenkins deploy/my-tomcat my-tomcat=172.20.5.117/ops/tomcat:v${BUILD_NUMBER}
'''
}
}
创建tomcat的deploy和svc
1 | [root@master k8s-jenkins]# cat jenkins_tomcat.yaml |
1 | [root@master k8s-jenkins]# cat jenkins_tomcat_svc.yaml |
提交发布测试
- jenkins上开始构建
- 查看构建生成的镜像版本
- harbor上查看镜像推送情况
- 访问测试