Jenkins環境でKubernetesプラグインを利用して動的なエージェントをKubernetes/Dockerクラスター上で運用する際、そのパフォーマンス最適化はCI/CDパイプラインの安定性と効率を飛躍的に向上させます。本記事では、ガベージコレクション、接続タイムアウト管理、そしてリソース制限という3つの重要な側面から、効果的なチューニング方法について解説します。
ガベージコレクション:不要なPodの自動クリーンアップ
Kubernetesプラグインのガベージコレクション機能は、使用済みのPodリソースがクラスター内に残存するのを防ぐ上で極めて重要です。適切に設定することで、リソースリークを防ぎ、クラスターの健全性を維持できます。
主要な設定項目
- ガベージコレクションの有効化: 「Enable garbage collection」オプションをチェックして、自動クリーンアップ機能を有効にします。
- タイムアウト期間: リソース解放速度とタスクの安定性のバランスを考慮し、デフォルトの120秒を推奨します。この時間を経過した未使用のPodが削除の対象となります。
- 追加の名前空間: 複数の名前空間にまたがるPodを監視する必要がある場合は、関連する名前空間をここに追加します。
この機能は、プラグインの内部では主にPodRetentionクラスに関連するロジックによって管理されています。
接続タイムアウトの最適化:通信安定性の向上
不適切な接続タイムアウト設定は、エージェントの起動失敗やビルドタスクのハングアップを引き起こす可能性があります。以下の主要パラメーターを調整することで、プラグインの通信の安定性を大幅に改善できます。
核となるタイムアウトパラメーター
- 接続タイムアウト(
connectionTimeout): JenkinsコントローラーがKubernetesエージェントに接続を試みる際の最大待機時間です。デフォルトは1000ミリ秒ですが、ネットワーク状況に応じて調整が必要となる場合があります。 - 切断タイムアウト(
disconnectionTimeout): エージェントが切断された後、リソースを適切に解放するためにKubernetesプラグインが待機する時間です。通常、デフォルトの5秒が推奨されます。 - Liveness Probeタイムアウト(
timeoutSeconds): コンテナのヘルスチェックにおけるタイムアウト時間です。これはKubernetesのPod定義で設定される一般的なパラメーターであり、通常は1〜5秒の範囲で設定されます。
これらのタイムアウト値は、システムのプロパティやプラグインの設定画面を通じて調整することが可能です。例えば、Javaシステムプロパティとして以下のように設定されることがあります。
// 接続タイムアウトの設定例
// System.getProperty("jenkins.kubernetes.connectionTimeout", "1000") に相当する内部処理
int agentConnectionTimeout = Integer.parseInt(System.getProperty("jenkins.kubernetes.agentConnectionTimeout", "1000"));
// 切断タイムアウトの設定例
// System.getProperty("jenkins.kubernetes.disconnectionTimeout", "5") に相当する内部処理
int agentDisconnectionTimeout = Integer.parseInt(System.getProperty("jenkins.kubernetes.agentDisconnectionTimeout", "5"));
リソース制限戦略:リソース競合の回避策
Podに対するCPUとメモリのリソース制限を適切に設定することは、単一のPodによる過剰なリソース消費を防ぎ、クラスター全体の安定稼働を保証するために不可欠です。
推奨されるリソース設定
各Podに対し、以下のガイドラインに基づいてリソース要求(requests)と制限(limits)を設定することを推奨します。
- CPU要求(Request): 100m(0.1コア)をベースラインとし、実際のタスク要件に合わせて調整します。
- メモリ要求(Request): 156Miから開始し、Javaアプリケーションの場合は少なくとも512Miを目安に設定します。
- CPU制限(Limit): 他のPodへの影響を避けるため、通常2コアを超えない範囲で設定します。
- メモリ制限(Limit): アプリケーションの特性に合わせて設定しますが、一般的には4Giを超えないようにします。
これらのリソース設定は、KubernetesのPodテンプレート内で定義されます。以下に一般的なYAML形式での設定例を示します。
apiVersion: v1
kind: Pod
metadata:
name: jenkins-agent-pod
spec:
containers:
- name: jnlp
image: jenkins/jnlp-agent:latest
resources:
requests:
cpu: "100m"
memory: "156Mi"
limits:
cpu: "2"
memory: "4Gi"
この設定は、PodTemplateBuilderのような内部コンポーネントを通じて、JenkinsプラグインによってKubernetes APIに変換され適用されます。
パフォーマンス最適化の主要なポイント
Kubernetesプラグインの性能を最大限に引き出すためには、以下の3つの主要な最適化ポイントに注力することが重要です。
- ガベージコレクションの有効化と設定: クラスターリソースのクリーンさを保ち、リソースリークを防ぎます。
- タイムアウトパラメーターの調整: ネットワーク環境に合わせて接続および切断タイムアウト設定を最適化します。
- リソース制限の適切な設定: 各Podに適切なCPUとメモリのリソースを割り当て、競合を回避します。