4.2.3.6. Jenkins Kubernetes プラグインの設定
OpenShift Container Platform Jenkins イメージには、事前にインストール済みの Kubernetes プラグイン が含まれ、Kubernetes および OpenShift Container Platform を使用して、Jenkins エージェントを複数のコンテナーホストで動的にプロビジョニングできるようにします。
OpenShift Container Platform は、Kubernetes プラグインを使用するために、Jenkins エージェントとして使用するのに適したイメージを 5 つ (Base、Maven、および Node.js イメージ) 提供します。詳細は、Jenkins Agents を参照してください。
jenkins-slave-maven-* および jenkins-slave-nodejs-* イメージは、v3.10 リリースサイクル中に非推奨のマークが付けられます。イメージは、ユーザーがアプリケーションを新規の jenkins-agent-maven-* および jenkins-agent-nodejs-* イメージに移行できるようにしばらく残されます。
Maven および Node.js のエージェントイメージは、Kubernetes プラグイン用の OpenShift Container Platform Jenkins イメージの設定内で、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
に設定されている ConfigMap
適切なラベルが付いたイメージストリームまたは、適切なアノテーションが付いたイメージストリームタグが見つかると、対応する Kubernetes プラグイン設定が生成されるため、イメージストリームから提供されるコンテナーイメージを実行する Pod で、Jenkins ジョブを実行するように割り当てることができます。
イメージストリームまたはイメージストリームタグのイメージ参照および名前が、Kubernetes プラグインの Pod テンプレートにある名前およびイメージフィールドにマッピングされます。Kubernetes プラグインの Pod テンプレートのラベルフィールドは、イメージストリームにアノテーションを設定するか、イメージストリームタグオブジェクトに slave-label
キーを設定して、制御できます。これらを使用しない場合には、名前をラベルとして使用します。
適切なラベルが指定された ConfigMap が検出される場合は、ConfigMap のキーと値のデータペイロードの値に、Jenkins および Kubernetes プラグインの Pod テンプレートの設定形式に準拠する XML が含まれることが想定されます。ConfigMap を使用する時に注意すべき主な差別化要因は、イメージストリームまたはイメージストリームタグの代わりに、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
からラベルまたはアノテーションを削除すると、既存のPodTemplate
が Kubernetes プラグインの設定から削除されます。 - 同様に、これらのオブジェクトが削除されると、対応する設定が Kubernetes プラグインから削除されます。
-
逆に、適切なラベルおよびアノテーションが付いた
ConfigMap
、ImageStream
、またはImageStreamTag
オブジェクトを作成するか、初回作成後にラベルを追加すると、Kubernetes プラグイン設定にPodTemplate
が作成されます。 -
ConfigMap
フォームを介したPodTemplate
の場合には、PodTemplate
のConfigMap
データへの変更は、Kubernetes プラグイン設定のPodTemplate
設定に適用され、ConfigMap
に変更を加えてから次に変更を加えるまでの間に、Jenkins UI で加えたPodTemplate
の変更が上書きされます。
Jenkins エージェントとしてコンテナーイメージを使用するには、イメージは、エントリーポイントとしてスレーブエージェントを実行する必要があります。これに関する詳細情報は、公式の Jenkins ドキュメント を参照してください。
4.2.3.6.1. パーミッションに関する考慮事項
以前の ConfigMap の例では、Pod テンプレート XML の <serviceAccount>
要素は、作成される Pod で使用する OpenShift Container Platform サービスアカウントとなっています。Pod にマウントされたサービスアカウントの認証情報は、サービスアカウントに関連付けられたパーミッションとともに、OpenShift ContainerPlatform マスターに対するどの操作を Pod から許可するかを制御します。
OpenShift Container Platform Jenkins イメージで実行される Kubernetes プラグインで起動される Pod で使用されるサービスアカウントでは、以下を考慮してください。
-
OpenShift Container Platform で提供される Jenkins のテンプレートサンプルを使用する場合には、
jenkins
サービスアカウントが、Jenkins が実行するプロジェクトのedit
ロールで定義され、マスター Jenkins Pod にサービスアカウントがマウントされます。 - Jenkins 設定に挿入される 2 つのデフォルトの Maven および NodeJS Pod テンプレートも、マスターと同じサービスアカウントを使用するように設定されます。
- 必要なラベルまたはアノテーションを持つイメージストリームまたはイメージストリームタグの結果として、OpenShift Sync プラグイン によって自動検出された Pod テンプレートには、サービスアカウントがマスターのサービスアカウントに設定されています。
- Pod テンプレートの定義を Jenkins と Kubernetes プラグインに渡す他の方法として、使用するサービスアカウントを明示的に指定する必要があります。
-
他の方法には、Jenkins コンソール、Kubernetes プラグインで提供される
podTemplate
パイプライン DSL、または Pod テンプレートの XML 設定をデータとする ConfigMap のラベル付けなどが含まれます。 -
サービスアカウントの値を指定しない場合には、
default
のサービスアカウントが使用されます。 - 使用するサービスアカウントが何であっても、必要なパーミッション、ロールなどを OpenShift Container Platform 内で定義して、Pod 内から操作することを選択したプロジェクトを操作できるようにする必要があります。