1.6. 配置 Jenkins Kubernetes 插件


OpenShift Jenkins 镜像包含 Jenkins 的预安装 Kubernetes 插件,以便使用 Kubernetes 和 Red Hat OpenShift Service on AWS 在多个容器主机上动态置备 Jenkins 代理。

为了使用 Kubernetes 插件,Red Hat OpenShift Service on AWS 提供了一个适合用作 Jenkins 代理的 OpenShift Agent Base 镜像。

重要

Red Hat OpenShift Service on AWS 4.11 将 OpenShift Jenkins 和 OpenShift Agent Base 镜像移到 registry.redhat.ioocp-tools-4 存储库中,以便红帽可以在 Red Hat OpenShift Service on AWS 生命周期外生成和更新镜像。在以前的版本中,这些镜像位于 Red Hat OpenShift Service on AWS 安装有效负载和 registry.redhat.ioopenshift4 存储库中。

OpenShift Jenkins Maven 和 NodeJS Agent 镜像已从 Red Hat OpenShift Service on AWS 4.11 有效负载中删除。红帽不再生成这些镜像,它们不能从 registry.redhat.ioocp-tools-4 存储库中提供。红帽按照 Red Hat OpenShift Service on AWS 生命周期政策,为任何重要的程序错误修复或安全 CVE 维护这些镜像的 4.10 及更早的版本。

如需更多信息,请参阅以下"添加资源"部分中的"重要更改 OpenShift Jenkins 镜像"链接。

Maven 和 Node.js 代理镜像会在 Red Hat OpenShift Service on AWS Jenkins 镜像的 Kubernetes 插件配置中自动配置为 Kubernetes Pod 模板镜像。该配置包含每个镜像的标签,您可以在 Restrict where this project can run 设置下应用到任何 Jenkins 任务。如果应用了该标签,则作业在运行相应代理镜像的 Red Hat OpenShift Service on AWS pod 下运行。

重要

在 Red Hat OpenShift Service on AWS 4.10 及更新的版本中,使用 Kubernetes 插件运行 Jenkins 代理的建议模式是使用带有 jnlpsidecar 容器的 pod 模板。jnlp 容器使用 Red Hat OpenShift Service on AWS Jenkins Base 代理镜像来简化为构建启动一个单独的 pod。sidecar 容器镜像具有在启动的独立 pod 中的特定语言构建所需的工具。Red Hat Container Catalog 的许多容器镜像在 openshift 命名空间中的示例镜像流中引用。Red Hat OpenShift Service on AWS Jenkins 镜像有一个名为 java-build 的 pod 模板,它带有演示此方法的 sidecar 容器。此 pod 模板使用由 openshift 命名空间中的 java 镜像流提供的最新 Java 版本。

Jenkins 镜像还为 Kubernetes 插件提供附加代理镜像的自动发现和自动配置。

使用 Red Hat OpenShift Service on AWS 同步插件,在 Jenkins 启动时,Jenkins 镜像会在其运行的项目中搜索,或插件配置中列出的项目,用于以下项目:

  • role 标签设置为 jenkins-agent 的镜像流。
  • role 注解设置为 jenkins-agent 的镜像流标签。
  • role 标签设置为 jenkins-agent 的配置映射。

当 Jenkins 镜像找到具有适当标签的镜像流或带有适当注解的镜像流标签时,它会生成对应的 Kubernetes 插件配置。这样,您可以将 Jenkins 任务分配到运行镜像流提供的容器镜像的 pod 中运行。

镜像流或镜像流标签的名称和镜像引用映射到 Kubernetes 插件 pod 模板中的名称和镜像字段。您可以通过使用 agent-label 键在镜像流或镜像流标签对象上设置注解来控制 Kubernetes 插件 pod 模板的标签字段。否则,名称将用作标签。

注意

不要登录到 Jenkins 控制台并更改 pod 模板配置。如果您在创建 pod 模板后这样做,且 Red Hat OpenShift Service on AWS 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 模板后这样做,且 Red Hat OpenShift Service on AWS Sync 插件检测到与镜像流或镜像流标签关联的镜像已更改,它会替换 pod 模板并覆盖这些配置更改。您无法将新配置与现有配置合并。

如果您的配置需要更复杂的配置需求,请考虑配置映射方法。

安装后,Red Hat OpenShift Service on AWS Sync 插件会监控 Red Hat OpenShift Service on AWS 的 API 服务器,以获取对镜像流、镜像流标签和配置映射的更新,并调整 Kubernetes 插件的配置。

适用以下规则:

  • 从配置映射、镜像流或镜像流标签中删除标签或注解,从 Kubernetes 插件配置中删除任何现有 PodTemplate
  • 如果删除了这些对象,相应配置也会从 Kubernetes 插件中删除。
  • 如果您创建适当标记或注解的 ConfigMapImageStreamImageStreamTag 对象,或者在初始创建后添加标签,这会导致在 Kubernetes-plugin 配置中创建 PodTemplate
  • 对于按照配置映射表单的 PodTemplate,对 PodTemplate 的配置映射数据的更改将应用到 Kubernetes 插件配置中的 PodTemplate 设置。更改还会覆盖通过 Jenkins UI 在配置映射更改之间对 PodTemplate 所做的任何更改。

要将容器镜像用作 Jenkins 代理,镜像必须运行该代理作为入口点。如需了解更多详细信息,请参阅官方 Jenkins 文档

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.