Jenkins是一款开源 CI&CD 软件,用于自动化各类任务,包括构建、测试和部署软件。
本文将Jenkins的master与slave置于Pod中,部署在namespace:jenkins下,jenkins slave 构建时,启动slave运行代码克隆,项目构建,镜像构建,上传仓库等一系列命令。构成完成之后删除pod。也就是Docker In Docker
可直接使用本文提供的编排文件构建Jenkins,有经过helm管理kubernetes组件的,可以使用本文提供的char。
️搭建不是关键,关键是趟坑。java
请查看做者以前的文章《kubernetes搭建Harbor无坑及多中心Harbor仓库同步》中helm搭建部分git
git clone https://github.com/yuenandi/Jenkins.git
这是做者从https://github.com/helm/charts.git
单独拿出的,因为国内helm的Jenkins资源版本太低,没有选择使用,便clone了1.6版本。整个git项目过大,很容易clone失败,也浪费了一些时间找办法轻量的下载,为了给小伙伴提供些方便,直接用我git的就好。
直接经过helm安装Jenkinsgithub
kubectl create -f jenkins-pv.yaml helm install . --debug --namespace jenkins --name jenkins
或
运行helm生成jenkins.yaml,生成后删除jenkins.yaml中无用的部分(不知道有没有更聪明的办法用来生成编排文件)shell
helm install . --debug --dry-run -n jenkins --namespace jenkins --name jenkins |sed 'w jenkins.yaml'
kubectl create -f jenkins-pv.yaml kubectl create -f jenkins.yaml
查看service/LoadBalancer的NodePort,kubectl get svc -n jenkins
,也能够设置helm的value.yaml,建立ingress来访问,很简单就不阐述了
访问http://masterIp:43563
如图:
api
Manage Jenkins ->Configure System->Cloud->kubernetes
服务器
1. Kubernetes 地址:app
- 若是Jenkins Master部署在Kubernetes以外,则输入Kubernetes Master API Server URL,可运行kubectl cluster-info得到Kubernetes Master API Server URL
- 本文是部署在Kubernetes上,则输入Kubernetes域名方式,格式https://
. .svc. ,好比https://kubernetes.default.svc.cluster.local,或短名称https://kubernetes.default
Kubernetes 服务证书 key:将kubernetes的ca.crt的内容填写到jenkins kubernetes的Kubernetes server certificate key栏中。
️本文Jenkins Master运行在Kubernetes上可跳过此步
生成ca.crt文件,若知道kubernetes的ca.crt位置,不用建立
在Kubernetes Master上,cd ~/.kube/config
,运行如下命令生成Kubernetes server certificate key
,并保存在ca.crt文件中:
echo "<certificate-authority-data>" | base64 -d > ca.crt
2. 凭据:生成cert.pfx上传到jenkinsdom
️本文Jenkins Master运行在Kubernetes上可跳过此步测试
- 生成Kubernetes Client P12 Certificate File
在Kubernetes Master上,cd~/.kube/config
:# 复制client-certificate-data的内容,运行如下命令生成client.crt echo "<client-certificate-data>" | base64 -d > client.crt] # 复制client-key-data的内容,运行如下命令生成client.key echo "<client-key-data>" | base64 -d > client.key # 根据前面步骤生成的ca.crt, client.crt和client.key来生成PKCS12格式的cert.pfx # 如下命令运行时,须要输入4位以上的密码 openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt将生成的Kubernetes Client P12 Certificate Filecert.pfx复制到Jenkins Master服务器上,好比复制到/var/lib/jenkins/kubernetes_cert/cert.pfxspa
- 在Jenkins上配置Kubernetes Credential
- 在Jenkins上增长一个Credential,选择类型为Certificate
- 选择“From a PKCS#12 file on Jenkins master”,输入上面生成的cert.pfx文件在Jenkins Master服务器上的路径,好比/var/lib/jenkins/kubernetes_cert/cert.pfx。
- 输入生成cert.pfx文件时输入的密码
- 输入一个有意义的ID,好比kubernetes-cluster
- 输入有意义的Description
️若以后环境的Pod就在jenkins本环境,不用给予cluster-admin的权限
#授予serviceaccount 权限,Jenkins对kube-apiserver 其余namespace的权限认证 kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:jenkins
因为不是同一namespace下经过域名访问
http://jenkins.jenkins.svc.cluster.local:8080
jenkins-agent.jenkins.svc.cluster.local:50000
最后apply,save
️简单测试如下,后续发pipeline的使用,从git->jenkins->kuberbetes流水线可先查看Kubernetes+Gitlab+Jenkins构建镜像并建立Pod 仍是很详细的。
save or apply
️若是报错查看4.3.
项目建立成功
slave的Pod
slave的日志
jenkins的日志
️jnlp-slave会将项目代码进行拷贝、打包镜像、上传仓库等等一系列任务,咱们能够经过命令定制(本文没有进行任何操做),任务结束后,pod删除,主机消失,在console output 会看到执行结果:
能够看到咱们以前输出命令也打印了出来
jnlp-slave pod建立失败,会一直从新建立,查看pod日志,发现是链接不上jenkins,jenkins日志以下:
- 抛 java.nio.channels.ClosedChannelException 异常的缘由是 Jenkins Slave Pod 在 Jenkins Job 运行时忽然挂掉,而后 Master Pod 没法和 Slave Pod 进行通讯。那么解决方法就是找到 Slave Pod 常常挂掉的缘由,经排查是 Slave Pod 的资源限制不合理,配置的 CPU 和内存过小,致使 Pod 在运行是很容易超出资源限制,而后被 k8s Kill 掉。️也多是域名或认证没有配置好,具体须要看jnlp-slave和jenkins的日志
- 解决方法
打开 Jenkins 设置 Slave Pod 模版的资源限制:
Jenkins->系统管理->系统设置->云->镜像->Kubernetes Pod Template->Container Template->高级,而后根据实际状况调整 CPU 和内存需求。
文中没有说起的问题,可评论笔者
!!!手码不易,对您有帮助的话,给个赞呦,且有更多k8s相关文案!!!