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
リポジトリーに移動しました。これにより、Red Hat が OpenShift Dedicated のライフサイクルに関係なくイメージを生成および更新できるようになりました。以前は、これらのイメージは OpenShift Dedicated のインストールペイロードと registry.redhat.io
の openshift4
リポジトリーにありました。
OpenShift Jenkins Maven イメージおよび NodeJS Agent イメージは、OpenShift Dedicated 4.11 のペイロードから削除されました。Red Hat はこれらのイメージを生成しなくなり、registry.redhat.io
の ocp-tools-4
リポジトリーから入手できなくなりました。Red Hat は、OpenShift Dedicated のライフサイクルポリシー に従って、重要なバグ修正やセキュリティー CVE に備えて、これらのイメージの 4.10 以前のバージョンを維持しています。
詳細は、次の「関連情報」セクションの 「OpenShift Jenkins イメージに対する重要な変更」リンクを参照してください。
Maven および Node.js のエージェントイメージは、Kubernetes プラグイン用の OpenShift Dedicated Jenkins イメージの設定内で、Kubernetes Pod テンプレートイメージとして自動的に設定されます。この設定には、Restrict where this project can be run
設定で任意の Jenkins ジョブに適用できる各イメージのラベルが含まれています。ラベルが適用されていると、ジョブはそれぞれのエージェントイメージを実行する OpenShift Dedicated の Pod で実行されます。
OpenShift Dedicated 4.10 以降では、Kubernetes プラグインを使用して Jenkins エージェントを実行する際に推奨されるパターンは、jnlp
コンテナーと sidecar
コンテナーの両方を含む Pod テンプレートを使用することです。jnlp
コンテナーは、ビルド用の個別の Pod の起動を容易にするために、OpenShift Dedicated Jenkins Base エージェントイメージを使用します。sidecar
コンテナーイメージには、起動した別の Pod 内の特定の言語でビルドするために必要なツールがあります。Red Hat Container Catalog の多くのコンテナーイメージが、openshift
namespace のサンプルイメージストリームで参照されています。OpenShift Dedicated の Jenkins イメージには、このアプローチを例示する sidecar コンテナーを含む java-build
という名前の Pod テンプレートがあります。この Pod テンプレートは、openshift
namespace の Java
イメージストリームによって提供される最新の Java バージョンを使用します。
Jenkins イメージは、Kubernetes プラグイン向けの追加エージェントイメージの自動検出および自動設定も提供します。
OpenShift Dedicated 同期プラグインを使用すると、Jenkins の起動時に、Jenkins イメージが実行中のプロジェクト内、またはプラグインの設定にリストされているプロジェクト内で以下の項目を検索します。
-
role
ラベルがjenkins-agent
に設定されたイメージストリーム。 -
role
アノテーションがjenkins-agent
に設定されたイメージストリームタグ。 -
role
ラベルがjenkins-agent
に設定された config map。
Jenkins イメージは、適切なラベルを持つイメージストリーム、または適切なアノテーションを持つイメージストリームタグを見つけると、対応する Kubernetes プラグイン設定を生成します。このようにして、イメージストリームによって提供されるコンテナーイメージを実行する Pod で実行するように Jenkins ジョブを割り当てることができます。
イメージストリームまたはイメージストリームタグの名前とイメージ参照は、Kubernetes プラグインの Pod テンプレートにある名前およびイメージフィールドにマッピングされます。Kubernetes プラグインの Pod テンプレートのラベルフィールドは、agent-label
キーを使用してイメージストリームまたはイメージストリームタグオブジェクトにアノテーションを設定することで制御できます。これらを使用しない場合には、名前をラベルとして使用します。
Jenkins コンソールにログインして、Pod テンプレート設定を変更しないでください。Pod テンプレートの作成後にこれを行うと、OpenShift Dedicated 同期プラグインが、イメージストリームまたはイメージストリームタグに関連付けられたイメージの変更を検知したときに、Pod テンプレートを置き換え、これらの設定変更を上書きします。新しい設定を既存の設定とマージすることはできません。
より複雑な設定が必要な場合は、config map を使用する方法を検討してください。
適切なラベルを持つ config map が見つかると、Jenkins イメージは、config map のキーと値のデータペイロードの任意の値に、Jenkins および Kubernetes プラグイン Pod テンプレートの設定形式と一致する Extensible Markup Language (XML) が含まれていると想定します。イメージストリームやイメージストリームタグに対する config map の主な利点の 1 つは、すべての Kubernetes プラグイン Pod テンプレートパラメーターを制御できることです。
jenkins-agent
の config map の例:
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
namespace のイメージストリームを参照する 2 つのコンテナーを示しています。1 つのコンテナーが、Pod を Jenkins エージェントとして起動するための JNLP コントラクトを処理します。もう 1 つのコンテナーは、特定のコーディング言語でコードを構築するためのツールを備えたイメージを使用します。
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 同期プラグインが、イメージストリームまたはイメージストリームタグに関連付けられたイメージの変更を検知したときに、Pod テンプレートを置き換え、これらの設定変更を上書きします。新しい設定を既存の設定とマージすることはできません。
より複雑な設定が必要な場合は、config map を使用する方法を検討してください。
OpenShift Dedicated 同期プラグインは、インストール後、OpenShift Dedicated の API サーバーを監視して、イメージストリーム、イメージストリームタグ、および config map の更新を確認し、Kubernetes プラグインの設定を調整します。
以下のルールが適用されます。
-
config map、イメージストリーム、またはイメージストリームタグからラベルまたはアノテーションを削除すると、既存の
PodTemplate
が Kubernetes プラグインの設定から削除されます。 - これらのオブジェクトが削除されると、対応する設定が Kubernetes プラグインから削除されます。
-
適切なラベルおよびアノテーションが付いた
ConfigMap
、ImageStream
、またはImageStreamTag
オブジェクトを作成するか、最初の作成後にラベルを追加すると、Kubernetes プラグイン設定でPodTemplate
が作成されます。 -
config map 形式による
PodTemplate
の場合、PodTemplate
の config map データへの変更は、Kubernetes プラグイン設定のPodTemplate
設定に適用されます。この変更は、config map への変更と変更の間に Jenkins UI を介してPodTemplate
に加えられた変更もオーバーライドします。
Jenkins エージェントとしてコンテナーイメージを使用するには、イメージが、エントリーポイントとしてエージェントを実行する必要があります。詳細は、公式の Jenkins ドキュメント を参照してください。