1.6. Jenkins Kubernetes プラグインの設定
OpenShift Jenkins イメージにはプリインストールされた Jenkins 用の Kubernetes プラグイン が含まれているため、Kubernetes と OpenShift Container Platform を使用して複数のコンテナーホストで Jenkins エージェントを動的にプロビジョニングできます。
Kubernetes プラグインを使用するために、OpenShift Container Platform は、Jenkins エージェントとしての使用に適した OpenShift Agent Base イメージを提供します。
OpenShift Container Platform 4.11 は、Red Hat が OpenShift Container Platform ライフサイクル外でイメージを生成および更新できるように、OpenShift Jenkins および OpenShift Agent Base イメージを registry.redhat.io
の ocp-tools-4
リポジトリーに移動します。以前のバージョンでは、これらのイメージは OpenShift Container Platform インストールペイロードに使用され、openshift4
リポジトリーは registry.redhat.io
にありました。
OpenShift Jenkins Maven および NodeJS Agent イメージは、OpenShift Container Platform 4.11 ペイロードから削除されました。Red Hat はこれらのイメージを生成しなくなり、registry.redhat.io
の ocp-tools-4
リポジトリーから入手できなくなりました。Red Hat は、OpenShift Container Platform ライフサイクルポリシー に従って、重要なバグ修正またはセキュリティー CVE のためにこれらのイメージの 4.10 以前のバージョンを維持します。
詳細は、次の「関連情報」セクションの 「OpenShift Jenkins イメージに対する重要な変更」リンクを参照してください。
Maven および Node.js のエージェントイメージは、Kubernetes プラグイン用の OpenShift Container Platform Jenkins イメージの設定内で、Kubernetes Pod テンプレートイメージとして自動的に設定されます。この設定には、Restrict where this project can be run
設定で任意の Jenkins ジョブに適用できる各イメージのラベルが含まれています。ラベルが適用されている場合、ジョブはそれぞれのエージェントイメージを実行する OpenShift Container Platform Pod の下で実行されます。
OpenShift Container Platform 4.10 以降では、Kubernetes プラグインを使用して Jenkins エージェントを実行するために推奨されるパターンは、jnlp
および sidecar
コンテナーの両方で Pod テンプレートを使用することです。jnlp
コンテナーは、OpenShift Container Platform Jenkins Base エージェントイメージを使用して、ビルド用の別の Pod の起動を容易にします。sidecar
コンテナーイメージには、起動した別の Pod 内の特定の言語でビルドするために必要なツールがあります。Red Hat Container Catalog の多くのコンテナーイメージは、openshift
namespace にあるサンプルイメージストリームで参照されます。OpenShift Container Platform Jenkins イメージには、このアプローチを示すサイドカーコンテナーを含む java-build
という名前の Pod テンプレートがあります。この Pod テンプレートは、openshift
namespace の Java
イメージストリームによって提供される最新の Java バージョンを使用します。
Jenkins イメージは、Kubernetes プラグイン向けの追加エージェントイメージの自動検出および自動設定も提供します。
OpenShift Container Platform 同期プラグインを使用すると、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 Container Platform 同期プラグインがイメージストリームまたはイメージストリームタグに関連付けられたイメージが変更されたことを検知した場合は、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 Container Platform 同期プラグインがイメージストリームまたはイメージストリームタグに関連付けられたイメージが変更されたことを検知した場合は、Pod テンプレートを置き換え、これらの設定変更を上書きします。新しい設定を既存の設定とマージすることはできません。
より複雑な設定が必要な場合は、config map を使用する方法を検討してください。
インストールされた後、OpenShift Container Platform 同期プラグインは、イメージストリーム、イメージストリームタグ、および config map に更新がないか、OpenShift Container Platform の API サーバーをモニタリングして、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 ドキュメント を参照してください。