Jenkins 中使用 Kubernetes 插件动态 Slave Pod 代理详解

Jenkins 中使用 Kubernetes 插件动态 Slave Pod 代理详解

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • Jenkins 版本:2.199
  • Kubernetes 版本:1.15.3
  • Kubernetes Plugin 版本:1.20.0

参考地址:

  • Kubernetes Plugin Github 地址:https://github.com/jenkinsci/kubernetes-plugin

一、插件简介

Kubernetes 插件的目的是能够使用 Kubernetes 配合,实现动态配置 Jenkins 代理(使用 Kubernetes 调度机制来优化负载),在执行 Jenkins Job 构建时将,Jenkins Master 会在 kubernetes 中创建一个 Slave Pod 代理来执行任务。

该 Slave Pod 中可以包含多种镜像,例如需要 Maven 编译可以使用 Maven 镜像执行任务。使用 Docker 镜像构建可以使用 Docker 的镜像。操作 Kubernetes 可以使用 Kubectl 插件镜像。

所有 Job 中所需要的环境及其依赖都交由镜像提供,而不需要手动搭配这些环境。在等 Slave Pod 执行完 Job 任务后,将删除该代理 Slave Pod。所以 Kubernetes Plugin 简单用法就是,在 Kubernetes 中启动 Jenkins Slave 代理,让代理执行 Jenkins Job,执行完后释放删除 Slave 释放资源。

二、安装 Kubernetes 插件

进入 系统管理->插件管理->可选插件 中,然后插件搜索栏中输入 kubernetes 搜索 Kubernetes 插件并安装:

三、Kubernetes Plugin 参数简介

进入 系统管理->系统设置->云 中,点击 “新增一个云” 选项,然后可以看见如下图一样的配置,这里简单介绍下各个参数选项。

1、Kubernetes 插件基本配置简介

Kubernetes 插件的基本配置,可以配置 Jenkins 连接 Kubernetes API 地址、凭据、超时时间、容器数量限制等参数。

参数简介:

  • 名称: 用于该“云”配置的标识,可以配置多个“云”来对应多个 Kubernetes 环境,默认配置即可。
  • Kubernetes 地址: Kubernetes API 的地址,一般在 Kubernetes 集群内部 Kubernetes API 为 https://kubernetes.default.svc.cluster.local,集群外部 Kubernetes API 地址为 https://{K8S IP}:6443,Jenkins 如果也部署在 Kubernetes 集群中的话,可以使用内部地址,否则只能使用外部地址。
  • Kubernetes 服务证书 key: 用于访问 Kubernetes API 的 Https 证书,一般默认为空即可。
  • 禁用 HTTPS 证书检查: 设置连接 Kubernetes API 时不检查 Https 证书,一般默认不勾选即可。
  • Kubernetes 命名空间: 指定在哪个 Kubernetes 命名空间下执行任务,一般默认为空即可。
  • 凭据: 连接 Kubernetes API 的 Token 凭据,必须配置。
  • Jenkins 地址: 指定 Jenkins Master 的 URL 地址,用于 Slave 连接 Jenkins 用,如果 Jenkins 配置了前缀也要带上。
  • Jenkins 通道: Slave 节点连接到指定主机和端口,而不是直接连接到 Jenkins,一般默认为空即可。
  • Connection Timeout: 连接 Kubernetes API 超时时间,默认值即可。
  • Read Timeout: 连接 Kubernetes API 读取超时时间,默认值即可。
  • 容器数量: 运行 Slave Pod 的最大数量。为空则不限制,设置为 0 则一个都不能创建,默认是 10 个,一般推荐默认值。
  • Pod Labels: Slave Pod 的 Label 标签设置,默认标签即可。
  • Pod Retention: Pod 保留策略,在 Slave Pod 执行完任务后,是否删除或者保留策略,默认会删除,一般使用默认值即可。
  • 镜像: Pod 模板配置,可以配置 Slave Pod 中多个容器的参数值,非常灵活。

2、Kubernetes 插件 Pod 模板配置简介

此模块可以配置 Slave Pod 对象信息,可以配置 Pod 名称、Docker 镜像、Pod Label、Pod 的原始 yaml 以及 Pod RBAC 权限设定等参数。

参数简介:

  • 名称: Pod 模板的名称。
  • 命名空间: 即 Pod 要启动到 Kubernetes 的 Namespace 名称。
  • 标签列表: 很重要的一个参数,用于 Jenkins Job 在执行任务时候,指定代理的名称,需要指定该值。
  • 用法: 控制 Jenkins 如何在这台机器上安排构建。有两个值“尽可能的使用这个节点”和“只允许运行绑定到这台机器的Job”两个选项,“尽可能的使用这个节点”会当有别的节点也能执行任务时会交由别的节点执行,而“只允许运行绑定到这台机器的Job”则是只能由这个节点执行任务。
  • 父级的 Pod 模板名称: 如果之前已经创建了 Pod 模板,这里则可以使用 Pod 模板名称引入该模板,让其当做父级模板。
  • 容器列表: 一个 Pod 中可以设置多个 Docker 容器,这里可以对这些容器进行配置。
  • 环境变量: Pod 环境设置。
  • 卷: 可以设置 Pod 中各个容器的存储挂载。
  • Concurrency Limit: 允许在 Kubernetes 集群中创建 Pod 的最大值。
  • Pod Retention: Pod 的保留策略,默认会替换基本设置中的保留策略值。
  • 代理的空闲存活时间(分): 在执行完任务后,代理将空闲,设置此值可以设置该代理可以空闲多久,当到达时间后,Pod 就可能被删掉。
  • Pod 寿命(秒): 不用 Pod 执行 Jenkins Job 任务是成功还是失败,到达这个指定时间都会将 Pod 杀死。
  • 连接 Jenkins 的超时时间(秒): Slave Pod 连接 Jenkins Master 的超时时间。
  • 注解: Slave Pod 的 Annotation 注解值。
  • Pod 的原始 yaml: 原始 Pod 模板 yaml,这个可以作为底层模板,可以在 yaml 中设置上面界面中配置的全部参数(Pod Template 中可以只配置个 yaml,就不需要对一堆界面上的东西进行配置了 )。
  • Yaml merge strategy: 对于 yaml 文件和界面上的 Pod 可视化配置的操作规则,可以将 yaml 中的配置和界面中的配置进行合并或者界面的配置替换掉 yaml 中的配置。
  • Show raw yaml in console: 是否显示 Pod 模板信息输出到控制台日志中。
  • 拉取镜像的 Secret: 拉取镜像的 Secret。
  • Service Account: Kubernetes 一般是使用 RBAC 插件管理权限,如果想对 Pod 设置一定权限,就需要配置此值。
  • 节点选择器: 节点筛选,选择 Pod 只能启动在带有特定 Label 的节点上。
  • 使用自定义的工作空间卷: 自定义 Jenkins 执行任务时候,将构建的文本,拉取的源码,编译的项目存放的地址。
  • 工具位置: 可以设置 Mavne、Docker 工具,一般不需要特别设置。

3、Kubernetes 插件 Container 配置简介

这里主要是设置上面 Pod 模板中,Pod 包含的 Container 的参数配置,可以设置多个镜像的镜像名称、工作目录、环境变量、CPU 与 Memory 限制等。

  • 名称: 容器名称。
  • Docker 镜像: Docker 镜像名称。
  • 总是拉取镜像: 是否每次执行都重新拉取镜像。
  • 工作目录: 设置在执行 Jenkins Job 时容器上的工作目录。
  • 运行的命令: 在容器启动后执行的命令。
  • 命令参数: 要执行的命令的参数。
  • 分配伪终端: 是否能带伪命令终端。
  • EnvVars: 环境变量。
  • 以最高权限运行: 是否提供 Kubernetes 中的特权。
  • CPU 需求: 预估程序使用CPU大小。
  • 内存需求: 预估程序使用内存大小,Kubernetes 会根据此值来判断一个 Pod 最多启几个这样容器。
  • CPU 限制: CPU使用上限
  • 内存限制: 内存使用上限
  • 健康检查 Exec action: 存活探针执行健康检测 Exec action 命令
  • Initial Delay Seconds: 初始化延迟的探针检测时间
  • Timeout Seconds: 探针延迟超时时间
  • Failure Threshold: 探针检测认为探测失败几次就为真正失败。
  • Period Seconds: 探针检测间隔。
  • Success Threshold: 探针检测认为探测成功几次就为真正成功。
  • 端口映射: Docker 的端口映射。

四、配置 Kubernetes 插件

进入 系统管理->系统设置->云 中,点击 新增一个云 选项,来新建一个与 Kubernetes 的连接,然后按照下面各个配置项进行配置。

1、Kubernetes Plugin 基本配置

(1)、配置连接 Kubernetes 参数

配置 Kubernetes API 地址,然后在 凭据 中添加一个新的凭据,选择 Secret Text 类型,然后输入自己连接 KubernetesToken 后保存。

然后点击连接测试,查看是否能成功连通 Kubernetes,如果返回结果 Successful 则代表连接成功,否则失败。

注意: 如果你的 Jenkins 也是安装的 Kubernetes 环境中,那么可以直接使用 Kubernetes 集群内的 Kubernetes API 地址,如果 Jnekins 是在安装在 正常物理机或者虚拟机 环境中,那么使用 集群外的 Kubernetes API 地址,两个地址如下:

  • 集群内地址:https://kubernetes.default.svc.cluster.local
  • 集群外地址:https://{Kubernetes 集群 IP}:6443

(2)、配置 Jenkins 地址

Jenkins 在执行任务时候,会在 Kubernetes 中创建 Slave Pod 来执行 Jenkins 任务,Slave 中会和 Jenkins Master 配合,需要知道 Jnekins 的地址,所以这里我们配置下。

注意: 这里的 Jenkins 地址 是供 Slave 连接 Jenkins Master 节点用的,所以这里需要配置 Jenkins MasterURL 地址。这里和上面一样,也是考虑 Jenkins 是部署在 Kubernetes 集群内还是集群外,两个地址如下:

  • 集群内地址:https://{Jenkins Pod 名称}.{Jenkins Pod 所在 Namespace}/{Jenkins 前缀}
  • 集群外地址:https://{Kubernetes 集群 IP}:{Jenkins NodePort 端口}/{Jenkins 前缀}

由于本人 Jnekins 中配置了 /jenkins 前缀,所以这里 URL 后面加上了 /jenkins

2、Kubernetes 插件 Pod 模板配置

(1)、配置 Pod 名称和标签列表

配置 Pod 模板的名称和标签列表名,Pod 模板名可用于子模板继承,标签列表可用于 Jenkins Job 中指定,使用此 Pod 模板来执行任务。

(2)、配置 Pod 的原始 yaml

在 Pod 的原始 yaml 配置中,加入一段配置,用于改变 Kubernetes Plugin 自带的 JNLP 镜像,并指定 RunAsUser=0 来使容器以 Root 身份执行任务,并设置 privileged=true 来让 Slave Pod 在 Kubernetes 中拥有特权。

Jenkins Slave JNLP 镜像可以从地址 https://hub.docker.com/r/jenkins/slave 查找。

yaml 内容如下:

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  labels:
 5    app: jenkins-slave
 6spec:
 7  securityContext:
 8    runAsUser: 0
 9    privileged: true
10  containers:
11  - name: jnlp
12    tty: true
13    workingDir: /home/jenkins/agent
14    image: registry.cn-shanghai.aliyuncs.com/mydlq/jnlp-slave:3.35-5-alpine

3、Kubernetes 插件 Container 配置

这里以在 Pod 模板中添加一个 Maven 容器,让 Jenkins 执行 Job 任务中 Maven 编译时将项目传入该 Maven 镜像中,使用镜像中的 Maven 命令执行项目编译。下面是 Pod 配置该镜像的配置信息。

(1)、添加一个容器

Pod 模板中新增一个容器。

(2)、配置镜像名称和镜像

配置镜像名称和镜像,镜像名称可用于在执行 Pipeline 脚本时,选择使用哪个镜像执行相关任务,而镜像则是 Pod 中要启动的具体镜像。

Maven 镜像可以从地址 https://hub.docker.com/_/maven 查找。

当然,还可以添加多个容器,例如编译 .NET 需要 C 环境的镜像等等。

五、创建 Job 并写 Pipeline 脚本测试

这里为了简单介绍下用法,将创建一个流水线任务,执行 Git 拉取 Java 项目与 Maven 对项目进行编译操作,来演示如何使用 Kubernetes Plugin,下面是配置的过程。

1、创建 Jenkins Job

创建一个名为 kubernetes-test-pipeline 的流水线任务。

2、写 Pipeline 脚本

在任务的流水线脚本中添加下面脚本,脚本中流水线会执行 Git 项目拉取,和在 Maven 镜像中执行 Maven 编译。

流水线脚本如下:

关于 Kubernetes Pipeline 写法可以看该插件的 Github 地址:https://github.com/jenkinsci/kubernetes-plugin

 1def label = "jnlp-agent"
 2
 3podTemplate(label: label,cloud: "kubernetes" ){
 4    node (label) {
 5        stage('Git阶段'){
 6            git branch: "master",url: "https://github.com/my-dlq/springboot-helloworld.git"
 7        }
 8        stage('Maven阶段'){
 9            container('maven') {  
10                sh "mvn clean install -Dmaven.test.skip=true"
11            }
12        }
13    }
14}

上面脚本中 label 参数指的是之前 Kubernetes Pod 模板标签值,而 cloud 则是指的 kubernetes 基本配置的名称,container 即是选择在什么镜像内执行命令,括号里面包含的名称要和之前配置的容器配置一致,要和系统配置中云的配置对应上,否则任务将不能够顺利执行。

3、执行 Job 进行测试

点击任务的立即构建按钮,然后进入构建日志中查看构建过程,观察任务是在 Kubernetes 中创 Slave Pod 像执行任务,是否能够成功执行。

可以看到已经执行成功,用法如上,需要什么环境就添加什么容器到 Pod 模板中,然后在 Pipleline 脚本中选择要执行命令的镜像,在其内部执行特定的命令。

---END---


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。