4.2.3.6. 配置 Jenkins Kubernetes 插件
OpenShift Container Platform Jenkins 镜像包含预装的 Kubernetes 插件,支持使用 Kubernes 和 OpenShift Container Platform 在多个容器主机上动态置备 Jenkins 代理。
为了使用 Kubernetes 插件,OpenShift Container Platform 提供了适合用作 Jenkins 代理的五个镜像: Base、Maven 和 Node.js 镜像。如需更多信息,请参阅 Jenkins 代理。
jenkins-slave-maven-* 和 jenkins-slave-nodejs-* 镜像在 v3.10 发行周期中被标记为已弃用。临时镜像仍会存在,因此用户可以将其应用程序迁移到较新的 jenkins-agent-maven-* 和 jenkins-agent-nodejs-* 镜像中。
Maven 和 Node.js 代理镜像均会在 OpenShift Container Platform Jenkins 镜像的 Kubernetes 插件配置中自动配置为 Kubernetes Pod 模板镜像。该配置包含各个镜像的标签,可应用于 “Restrict where this project can be run” 设置下的任何 Jenkins 任务。如果应用了标签,则指定任务的执行将在运行相应代理镜像的 OpenShift Container Platform pod 下执行。
Jenkins 镜像还为 Kubernetes 插件提供附加代理镜像的自动发现和自动配置。使用 OpenShift Sync 插件,Jenkins 上的 Jenkins 镜像会在其正在运行的项目中搜索,或搜索在插件配置中特别列出的项目:
-
将标签
role
设置为jenkins-slave
的镜像流。 -
将注解
role
设置为jenkins-slave
的镜像流标签。 -
将标签
role
设置为jenkins-slave
的 ConfigMaps。
当找到具有适当标签的镜像流或带有适当注解的镜像流标签时,它会生成对应的 Kubernetes 插件配置,以便您可以将 Jenkins 任务分配在运行镜像流提供的容器镜像的 pod 中运行。
镜像流或镜像流标签的名称和镜像引用映射到 Kubernetes 插件 pod 模板中的名称和镜像字段。您可以通过使用 slave-label
键在镜像流或镜像流标签对象上设置注解,来控制 Kubernetes 插件 pod 模板的标签字段。否则,名称将用作标签。
当找到具有适当标签的 ConfigMap 时,它会假定 ConfigMap 的键值数据有效负载中的任何值都包含与 Jenkins 和 Kubernetes 插件 pod 模板的配置格式一致的 XML。使用 ConfigMaps 而非镜像流或镜像流标签时,需要注意的一个关键区别在于您可以控制 Kubernetes 插件 pod 模板的所有字段。
以下是 ConfigMap 示例:
kind: ConfigMap apiVersion: v1 metadata: name: jenkins-agent labels: role: jenkins-slave data: template1: |- <org.csanchez.jenkins.plugins.kubernetes.PodTemplate> <inheritFrom></inheritFrom> <name>template1</name> <instanceCap>2147483647</instanceCap> <idleMinutes>0</idleMinutes> <label>template1</label> <serviceAccount>jenkins</serviceAccount> <nodeSelector></nodeSelector> <volumes/> <containers> <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> <name>jnlp</name> <image>openshift/jenkins-agent-maven-35-centos7:v3.10</image> <privileged>false</privileged> <alwaysPullImage>true</alwaysPullImage> <workingDir>/tmp</workingDir> <command></command> <args>${computer.jnlpmac} ${computer.name}</args> <ttyEnabled>false</ttyEnabled> <resourceRequestCpu></resourceRequestCpu> <resourceRequestMemory></resourceRequestMemory> <resourceLimitCpu></resourceLimitCpu> <resourceLimitMemory></resourceLimitMemory> <envVars/> </org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> </containers> <envVars/> <annotations/> <imagePullSecrets/> <nodeProperties/> </org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
启动后,OpenShift Sync 插件会监控 OpenShift Container Platform 的 API 服务器用于对 ImageStreams
、ImageStreamTags
和 ConfigMaps
的更新,并调整 Kubernetes 插件的配置。
特别是将应用以下规则:
-
从
ConfigMap
、ImageStream
或ImageStreamTag
中移除标签或注解会导致从 Kubernetes 插件配置中删除任何现有的PodTemplate
。 - 如果删除了这些对象,相应配置也会从 Kubernetes 插件中删除。
-
以前,创建适当标记或注解的
ConfigMap
、ImageStream
或ImageStreamTag
对象,或者在初始创建后添加标签,都会导致在 Kubernetes-plugin 配置中创建PodTemplate
。 -
对于使用
ConfigMap
表单的PodTemplate
,对PodTemplate
的ConfigMap
数据的更改将应用到 Kubernetes 插件配置中的PodTemplate
设置,,并将覆盖在ConfigMap
更改之间临时通过 Jenkins UI 对PodTemplate
所做的任何更改。
要将容器镜像用作 Jenkins 代理,该镜像必须运行 slave 代理,作为入口点。有关此方面的更多详情,请参阅官方 Jenkins 文档。
4.2.3.6.1. 权限注意事项
在以前的版本中,Pod 模板 XML 的 <serviceAccount>
元素是用于生成的 Pod 的 OpenShift Container Platform 服务账户。挂载到 Pod 的服务帐户凭证,以及与服务帐户关联的权限,控制允许从 Pod 针对 OpenShift Container Platform master 执行的操作。
考虑使用 OpenShift Container Platform Jenkins 镜像中运行的 Kubernetes 插件启动的用于 Pod 的服务帐户:
-
如果您使用 OpenShift Container Platform 提供的 Jenkins 示例模板,则
jenkins
服务帐户将由运行 Jenkins 的项目的edit
角色定义,且 master Jenkins Pod 已挂载了该服务帐户。 - 注入 Jenkins 配置的两个默认 Maven 和 NodeJS Pod 模板也被设置为使用与 master 相同的服务帐户。
- 由于镜像流标签(tag)具有所需标签或注解,其服务帐户被 OpenShift 的服务帐户设置为 master 的服务帐户,因此 OpenShift Sync 插件会自动发现任何 Pod 模板。
- 对于其他方法,您可在 Jenkins 和 Kubernetes 插件中提供 Pod 模板定义,但必须明确指定要使用的服务帐户。
-
其它方法包括 Jenkins 控制台、由 Kubernetes 插件提供的
podTemplate
管道 DSL,或标记其数据为 Pod 模板的 XML 配置的 ConfigMap。 -
如果没有为服务帐户指定值,则将使用
default
服务帐户。 - 确保所使用的任何服务帐户均具有 OpenShift Container Platform 中定义的必要权限、角色等,以操作您选择从 Pod 中操作的任何项目。