引言

Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。

本文将Jenkins的master与slave置于Pod中,部署在namespace:jenkins下,jenkins slave 构建时,启动slave运行代码克隆,项目构建,镜像构建,上传仓库等一系列命令。构成完成以后删除pod。也就是Docker In Docker

可直接使用本文提供的编排文件构建Jenkins,有通过helm管理kubernetes组件的,可使用本文提供的char。

️搭建不是关键,关键是趟坑。

一、Jenkins搭建

1. helm安装

请查看作者之前的文章《kubernetes搭建Harbor无坑及多中心Harbor仓库同步》中helm搭建部分

2. Jenkins搭建

git clone https://github.com/yuenandi/Jenkins.git

这是作者从https://github.com/helm/charts.git单独拿出的,由于国内helm的Jenkins资源版本过低,没有选择使用,便clone了1.6版本。整个git项目过大,很容易clone失败,也浪费了一些时间找办法轻量的下载,为了给小伙伴提供些方便,直接用我git的就好。



直接通过helm安装Jenkins

kubectl create -f jenkins-pv.yaml
helm install . --debug --namespace jenkins --name jenkins



运行helm生成jenkins.yaml,生成后删除jenkins.yaml中无用的部分(不知道有没有更聪明的办法用来生成编排文件)

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如图:

3. kubernetes插件设置

Manage Jenkins ->Configure System->Cloud->kubernetes

3.1. 非kubernetes部署jenkins,通过以下认证(通过本文搭建直接查看3.2. 部分):

1. Kubernetes 地址:

  • 如果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上传到jenkins

️本文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.pfx

  • 在Jenkins上配置Kubernetes Credential
  1. 在Jenkins上增加一个Credential,选择类型为Certificate
  2. 选择“From a PKCS#12 file on Jenkins master”,输入上面生成的cert.pfx文件在Jenkins Master服务器上的路径,比如/var/lib/jenkins/kubernetes_cert/cert.pfx。
  3. 输入生成cert.pfx文件时输入的密码
  4. 输入一个有意义的ID,比如kubernetes-cluster
  5. 输入有意义的Description

3.2. 安装本文kubernetes部署jenkins,通过以下认证

️若之后环境的Pod就在jenkins本环境,不用给予cluster-admin的权限

#授予serviceaccount 权限,Jenkins对kube-apiserver 其他namespace的权限认证
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:jenkins

3.3. jenkins地址设置

由于不是同一namespace下通过域名访问

  • Jenkins 地址:http://jenkins.jenkins.svc.cluster.local:8080
  • Jenkins 通道:jenkins-agent.jenkins.svc.cluster.local:50000

3.3. 设置kubernetes Pod Template





最后apply,save

4. Freestykle project

️简单测试以下,后续发pipeline的使用,从git->jenkins->kuberbetes流水线可先查看Kubernetes+Gitlab+Jenkins构建镜像并创建Pod 还是很详细的。

4.1. 创建slave







save or apply

4.2. 启动slave

️如果报错查看4.3.



项目创建成功



slave的Pod



slave的日志



jenkins的日志

️jnlp-slave会将项目代码进行拷贝、打包镜像、上传仓库等等一系列任务,我们可以通过命令定制(本文没有进行任何操作),任务结束后,pod删除,主机消失,在console output 会看到执行结果:





可以看到我们之前输出命令也打印了出来

4.3. 我遇到的报错处理

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相关文案!!!

kubernetes部署jenkins(Docker in Docker)及认证的更多相关文章

  1. [系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源

    基于kubernetes 部署 jenkins master 比较简单,难点是为 jenkins 动态分配资源.基于kubernetes 为 jenkins 动态分配资源需要实现下述功能: 资源分配: ...

  2. jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    前言:上篇已介绍了jenkins在k3s环境部署,本篇继续上篇讲述流水线构建部署流程 1.从gitlab上拉取代码步骤 在jenkins中,新建一个凭证:Manage Jenkins -> Ma ...

  3. Jenkins在Pod中实现Docker in Docker并用kubectl进行部署

    Jenkins在Pod中实现Docker in Docker并用kubectl进行部署 准备工作 安装Jenkins Jenkins的kubernetes-plugin使用方法 说明 Jenkins的 ...

  4. 二进制安装 kubernetes 1.12(二) - 安装docker, 部署Flannel网络

    在 node 节点上安装 docker 参考 https://www.cnblogs.com/klvchen/p/8468855.html Flannel 工作原理: 部署Flannel网络 在 ma ...

  5. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...

  6. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...

  7. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...

  8. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之flanneld网络介绍及部署(三)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.flanneld介绍 ...

  9. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 ...

随机推荐

  1. 简单认识Nginx---负载均衡

    中大型项目都会考虑到分布式,前面几篇文章着重介绍了数据处理的技术集群.今天来研究一下关于服务器的负载均衡–Nginx.他除了静态资源的处理外还有可以决定将请求置于那台服务上. Nginx的安装 点我下 ...

  2. 笑谈CSS的伪元素

    今晚上我们来简单的聊一聊CSS的伪元素,多说无益,开聊 GG: 话说盘古开天辟地之时. QQ:嗨,咱今天还能讲的完吗?您给来点实际的啊. GG:要听实际的是吧,得嘞,那今天咱就来聊一聊CSS里的伪元素 ...

  3. html5 placeholder属性兼容ie11

    placeholder 属性是html5的属性,用于提供描述输入字段预期值的提示信息(hint). 简单例子: <!DOCTYPE HTML> <html> <body& ...

  4. 白话--长短期记忆(LSTM)的几个步骤,附代码!

    1. 什么是LSTM 在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义.我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考.我们的思想拥有持久性.LSTM就 ...

  5. HBase 系列(七)——HBase 过滤器详解

    一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...

  6. Scrum 工件: 速度图和燃尽图

    速度图 Velocity用于衡量scrum团队持续提供业务价值的速度,可以采用历史估算的方法,衡量一个又一个sprint的速度.团队通过跟踪完成达到自己团队完成标准的故事点的数量,就可以基于相对点值对 ...

  7. seq2seq通俗理解----编码器和解码器(TensorFlow实现)

    1. 什么是seq2seq 在⾃然语⾔处理的很多应⽤中,输⼊和输出都可以是不定⻓序列.以机器翻译为例,输⼊可以是⼀段不定⻓的英语⽂本序列,输出可以是⼀段不定⻓的法语⽂本序列,例如: 英语输⼊:&quo ...

  8. egret之纹理填充模式(上下填充)

    首先,我们准备两张图片,一张作为背景“瓶子”,一张作位填充物“饮料”. 在皮肤里我们设置右边图片的填充模式为“repeat”,修改Y的缩放为:-1.,调整图片位置使之与地图重合,如下: 现在,我们可以 ...

  9. js的兼容问题以及解决方式(持续更新)

    我们在使用js操作页面的时候兼容问题是很常见的,下面将常见的兼容问题及其对应的解决方法分享给大家,并持续更新: 1.获取事件对象的兼容写法: IE中:window.event     正常浏览器中:对 ...

  10. Delphi - 通过WinAPI WinExec直接调用系统工具

    看如下代码: WinExec('mspaint.exe', SW_SHOWNORMAL); // SW_SHOWNORMAL = 1 系统画图 WinExec('write.exe', SW_SHOW ...