1.6. 配置 Jenkins Kubernetes 插件
OpenShift Jenkins 镜像包含 Jenkins 的预安装 Kubernetes 插件,以便使用 Kubernetes 和 OpenShift Dedicated 在多个容器主机上动态置备 Jenkins 代理。
为了使用 Kubernetes 插件,OpenShift Dedicated 提供了一个适合用作 Jenkins 代理的 OpenShift Agent Base 镜像。
OpenShift Dedicated 4.11 将 OpenShift Jenkins 和 OpenShift Agent Base 镜像移到 registry.redhat.io
的 ocp-tools-4
存储库中,以便红帽可以在 OpenShift Dedicated 生命周期外生成和更新镜像。在以前的版本中,这些镜像位于 OpenShift Dedicated 安装有效负载和 registry.redhat.io
的 openshift4
存储库中。
OpenShift Jenkins Maven 和 NodeJS Agent 镜像已从 OpenShift Dedicated 4.11 有效负载中删除。红帽不再生成这些镜像,它们不能从 registry.redhat.io
的 ocp-tools-4
存储库中提供。根据 OpenShift Dedicated 生命周期政策,红帽会为任何重要的程序错误修复或安全 CVE 维护这些镜像的 4.10 及更早的版本。
如需更多信息,请参阅以下"添加资源"部分中的"重要更改 OpenShift Jenkins 镜像"链接。
Maven 和 Node.js 代理镜像在 Kubernetes 插件的 OpenShift Dedicated Jenkins 镜像配置中自动配置为 Kubernetes pod 模板镜像。该配置包含每个镜像的标签,您可以在 Restrict where this project can run
设置下应用到任何 Jenkins 任务。如果应用了标签,作业将在运行相应代理镜像的 OpenShift Dedicated pod 下运行。
在 OpenShift Dedicated 4.10 及更新的版本中,使用 Kubernetes 插件运行 Jenkins 代理的建议模式是使用带有 jnlp
和 sidecar
容器的 pod 模板。jnlp
容器使用 OpenShift Dedicated Jenkins Base 代理镜像来简化为构建启动一个单独的 pod。sidecar
容器镜像具有在启动的独立 pod 中的特定语言构建所需的工具。Red Hat Container Catalog 的许多容器镜像在 openshift
命名空间中的示例镜像流中引用。OpenShift Dedicated Jenkins 镜像有一个名为 java-build
的 pod 模板,它带有演示此方法的 sidecar 容器。此 pod 模板使用由 openshift
命名空间中的 java
镜像流提供的最新 Java 版本。
Jenkins 镜像还为 Kubernetes 插件提供附加代理镜像的自动发现和自动配置。
使用 OpenShift Dedicated 同步插件,在 Jenkins 启动时,Jenkins 镜像会在其运行的项目中搜索,或插件配置中列出的项目,用于以下项目:
-
将
role
标签设置为jenkins-agent
的镜像流。 -
将
role
注解设置为jenkins-agent
的镜像流标签。 -
将
role
标签设置为jenkins-agent
的配置映射。
当 Jenkins 镜像找到具有适当标签的镜像流或带有适当注解的镜像流标签时,它会生成对应的 Kubernetes 插件配置。这样,您可以将 Jenkins 任务分配到运行镜像流提供的容器镜像的 pod 中运行。
镜像流或镜像流标签的名称和镜像引用映射到 Kubernetes 插件 pod 模板中的名称和镜像字段。您可以通过使用 agent-label
键在镜像流或镜像流标签对象上设置注解来控制 Kubernetes 插件 pod 模板的标签字段。否则,名称将用作标签。
不要登录到 Jenkins 控制台并更改 pod 模板配置。如果您在创建 pod 模板后这样做,且 OpenShift Dedicated Sync 插件检测到与镜像流或镜像流标签关联的镜像已更改,它会替换 pod 模板并覆盖这些配置更改。您无法将新配置与现有配置合并。
如果您的配置需要更复杂的配置需求,请考虑配置映射方法。
当找到具有适当标签的配置映射时,Jenkins 镜像会假定配置映射的键值数据有效负载中的任何值都与 Jenkins 和 Kubernetes 插件 pod 模板的配置格式一致。配置映射与镜像流和镜像流标签的一个关键优点是,您可以控制所有 Kubernetes 插件 pod 模板参数。
jenkins-agent
的配置映射示例
kind: ConfigMap apiVersion: v1 metadata: name: jenkins-agent labels: role: jenkins-agent 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
命名空间中镜像流的两个容器。一个容器处理作为 Jenkins 代理启动 Pod 的 JNLP 合同。其他容器使用带有工具的镜像,以特定的编码语言构建代码:
kind: ConfigMap apiVersion: v1 metadata: name: jenkins-agent labels: role: jenkins-agent data: template2: |- <org.csanchez.jenkins.plugins.kubernetes.PodTemplate> <inheritFrom></inheritFrom> <name>template2</name> <instanceCap>2147483647</instanceCap> <idleMinutes>0</idleMinutes> <label>template2</label> <serviceAccount>jenkins</serviceAccount> <nodeSelector></nodeSelector> <volumes/> <containers> <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> <name>jnlp</name> <image>image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest</image> <privileged>false</privileged> <alwaysPullImage>true</alwaysPullImage> <workingDir>/home/jenkins/agent</workingDir> <command></command> <args>\$(JENKINS_SECRET) \$(JENKINS_NAME)</args> <ttyEnabled>false</ttyEnabled> <resourceRequestCpu></resourceRequestCpu> <resourceRequestMemory></resourceRequestMemory> <resourceLimitCpu></resourceLimitCpu> <resourceLimitMemory></resourceLimitMemory> <envVars/> </org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> <name>java</name> <image>image-registry.openshift-image-registry.svc:5000/openshift/java:latest</image> <privileged>false</privileged> <alwaysPullImage>true</alwaysPullImage> <workingDir>/home/jenkins/agent</workingDir> <command>cat</command> <args></args> <ttyEnabled>true</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>
不要登录到 Jenkins 控制台并更改 pod 模板配置。如果您在创建 pod 模板后这样做,且 OpenShift Dedicated Sync 插件检测到与镜像流或镜像流标签关联的镜像已更改,它会替换 pod 模板并覆盖这些配置更改。您无法将新配置与现有配置合并。
如果您的配置需要更复杂的配置需求,请考虑配置映射方法。
安装后,OpenShift Dedicated Sync 插件会监控 OpenShift Dedicated 的 API 服务器,以获取对镜像流、镜像流标签和配置映射的更新,并调整 Kubernetes 插件的配置。
适用以下规则:
-
从配置映射、镜像流或镜像流标签中删除标签或注解,从 Kubernetes 插件配置中删除任何现有
PodTemplate
。 - 如果删除了这些对象,相应配置也会从 Kubernetes 插件中删除。
-
如果您创建适当标记或注解的
ConfigMap
、ImageStream
或ImageStreamTag
对象,或者在初始创建后添加标签,这会导致在 Kubernetes-plugin 配置中创建PodTemplate
。 -
对于按照配置映射表单的
PodTemplate
,对PodTemplate
的配置映射数据的更改将应用到 Kubernetes 插件配置中的PodTemplate
设置。更改还会覆盖通过 Jenkins UI 在配置映射更改之间对PodTemplate
所做的任何更改。
要将容器镜像用作 Jenkins 代理,镜像必须运行该代理作为入口点。如需了解更多详细信息,请参阅官方 Jenkins 文档。