リソース使用の管理
OpenShift Pipelines でのリソース消費の管理
概要
第1章 OpenShift パイプラインのリソース消費の削減 リンクのコピーリンクがクリップボードにコピーされました!
マルチテナント環境でクラスターを使用する場合、各プロジェクトおよび Kubernetes オブジェクトの CPU、メモリー、およびストレージリソースの使用を制御する必要があります。これにより、1 つのアプリケーションがリソースを過剰に消費し、他のアプリケーションに影響を与えるのを防ぐことができます。
結果として作成される Pod に設定される最終的なリソース制限を定義するために、Red Hat OpenShift Pipelines は、それらが実行されるプロジェクトのリソースクォータの制限および制限範囲を使用します。
プロジェクトのリソース消費を制限するには、以下を実行できます。
- リソースクォータを設定し、管理 して、リソースの総消費量を制限します。
- 制限範囲を使用し、リソース消費を制限 します。この対象は、Pod、イメージ、イメージストリームおよび永続ボリューム要求 (PVC) などの特定のオブジェクトのリソース消費です。
1.1. パイプラインでのリソース消費について リンクのコピーリンクがクリップボードにコピーされました!
各タスクは、Task リソースの steps フィールドで定義された、特定の順序で実行される多数の必須ステップで設定されます。各タスクは Pod として実行され、各ステップは同じ Pod 内のコンテナーとして実行されます。
ステップは一度に 1 つずつ実行されます。タスクを実行する Pod は、タスク内の 1 つのコンテナーイメージ (ステップ) を一度に実行するのに十分なリソースのみを要求するため、タスク内のすべてのステップのリソースは保存されません。
steps 仕様の Resources フィールドは、リソース消費の制限を指定します。デフォルトで、CPU、メモリー、および一時ストレージのリソース要求は、BestEffort (ゼロ) 値またはそのプロジェクトの制限範囲で設定される最小値に設定されます。
ステップのリソース要求および制限の設定例
LimitRange パラメーターおよびコンテナーリソース要求の最小値がパイプラインおよびタスクが実行されるプロジェクトに指定される場合、Red Hat OpenShift Pipelines はプロジェクトのすべての LimitRange 値を確認し、ゼロではなく最小値を使用します。
プロジェクトレベルでの制限範囲パラメーターの設定例
1.2. パイプラインでの追加のリソース消費を軽減する リンクのコピーリンクがクリップボードにコピーされました!
Pod 内のコンテナーにリソース制限を設定する場合、OpenShift Container Platform はすべてのコンテナーが同時に実行される際に要求されるリソース制限を合計します。
呼び出されるタスクで一度に 1 つのステップを実行するために必要なリソースの最小量を消費するために、Red Hat OpenShift Pipelines は、最も多くのリソースを必要とするステップで指定される CPU、メモリー、および一時ストレージの最大値を要求します。これにより、すべてのステップのリソース要件が満たされます。最大値以外の要求はゼロに設定されます。
ただしこの動作により、リソースの使用率が必要以上に高くなる可能性があります。リソースクォータを使用する場合、これにより Pod がスケジュールできなくなる可能性があります。
たとえば、スクリプトを使用する 2 つのステップを含むタスクと、リソース制限および要求を定義しないタスクについて考えてみましょう。作成される Pod には 2 つの init コンテナー (エントリーポイントコピー用に 1 つとスクリプトの作成用に 1 つ) と 2 つのコンテナー (各ステップに 1 つ) があります。
OpenShift Container Platform はプロジェクトに設定された制限範囲を使用して、必要なリソース要求および制限を計算します。この例では、プロジェクトに以下の制限範囲を設定します。
このシナリオでは、各 init コンテナーは要求メモリー 1 Gi (制限範囲の上限) を使用し、各コンテナーは 500 Mi の要求メモリーを使用します。そのため、Pod のメモリー要求の合計は 2 Gi になります。
同じ制限範囲が 10 のステップのタスクで使用される場合、最終的なメモリー要求は 5 Gi になります。これは、各ステップで実際に必要とされるサイズ (500 Mi) よりも大きくなります (それぞれのステップは他のステップの後に実行されるためです)。
そのため、リソースによるリソース消費を減らすには、以下を行います。
- スクリプト機能および同じイメージを使用して、複数の異なるステップを 1 つの大きなステップにグループ化し、特定のタスクのステップ数を減らします。これにより、要求される最小リソースを減らすことができます。
- 相互に独立しており、独立して実行できるステップを、単一のタスクではなく、複数のタスクに分散します。これにより、各タスクのステップ数が減り、各タスクの要求が小さくなるため、スケジューラーはリソースが利用可能になるとそれらを実行できます。
第2章 OpenShift Pipeline のコンピュートリソースクォータの設定 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenShift Pipelines の ResourceQuota オブジェクトは、namespace ごとのリソース消費の合計を制御します。これを使用して、オブジェクトのタイプに基づき、namespace で作成されたオブジェクトの数量を制限できます。さらに、コンピュートリソースクォータを指定して、namespace で消費されるコンピュートリソースの合計量を制限できます。
ただし、namespace 全体のクォータを設定するのではなく、パイプライン実行で作成される Pod が使用するコンピュートリソースの量を制限できます。現時点で、Red Hat OpenShift Pipelines ではパイプラインのコンピュートリソースクォータを直接指定できません。
2.1. OpenShift Pipeline でコンピュートリソース消費を制限する別の方法 リンクのコピーリンクがクリップボードにコピーされました!
パイプラインによるコンピュートリソースの使用量をある程度制御するためには、代わりに、以下のアプローチを検討してください。
タスクの各ステップでリソース要求および制限を設定します。
例: タスクのステップごとのリソース要求および制限設定
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
LimitRangeオブジェクトの値を指定して、リソース制限を設定します。LimitRangeの詳細は、制限範囲によるリソース消費の制限 を参照してください。 - パイプラインのリソース消費を減らします。
- プロジェクトごとにリソースクォータ を設定して管理します。
- 理想的には、パイプラインのコンピュートリソースクォータは、パイプライン実行で同時に実行される Pod が消費するコンピュートリソースの合計量と同じである必要があります。ただし、タスクを実行する Pod はユースケースに基づきコンピュートリソースを消費します。たとえば、Maven ビルドタスクには、ビルドするアプリケーションごとに異なるコンピュートリソースが必要となる場合があります。その結果、一般的なパイプラインでタスクのコンピュートリソースクォータを事前に定義できません。コンピュートリソースの使用に関する予測可能性や制御性を高めるには、さまざまなアプリケーション用にカスタマイズされたパイプラインを使用します。
これらの方法で対応できないユースケースには、優先順位クラスのリソースクォータを使用して回避策を実装できます。
2.2. 優先順位クラスを使用したパイプラインリソースクォータの指定 リンクのコピーリンクがクリップボードにコピーされました!
PriorityClass オブジェクトは、優先順位クラス名を、相対的な優先順位を示す整数値にマッピングします。値が大きいと、クラスの優先度が高くなります。優先順位クラスの作成後に、仕様に優先順位クラス名を指定する Pod を作成できます。さらに、Pod の優先順位に基づいて、Pod によるシステムリソースの消費を制御できます。
パイプラインにリソースクォータを指定することは、パイプライン実行が作成する Pod のサブセットのリソースクォータを設定することに似ています。以下の手順では、優先順位クラスに基づいてリソースクォータを指定して回避策の例を提供します。
手順
パイプラインの優先順位クラスを作成します。
例: パイプラインの優先順位クラス
Copy to Clipboard Copied! Toggle word wrap Toggle overflow パイプラインのリソースクォータを作成します。
例: パイプラインのリソースクォータ
Copy to Clipboard Copied! Toggle word wrap Toggle overflow パイプラインのリソースクォータの使用量を確認します。
例: パイプラインにおけるリソースクォータ使用状況の確認
oc describe quota
$ oc describe quotaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod が実行されていないため、クォータは使用されません。
パイプラインおよびタスクを作成します。
例: パイプラインの YAML
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例: パイプラインのタスクの YAML
Copy to Clipboard Copied! Toggle word wrap Toggle overflow パイプライン実行を作成して開始します。
例: パイプライン実行の YAML
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記パイプライン実行は、エラー:
failed quota: <quota name> must specify cpu, memoryで失敗する可能性があります。このエラーを回避するには、namespace の制限範囲を設定します。ここで、ビルドプロセス中に作成された Pod に
LimitRangeオブジェクトのデフォルトが適用されます。制限範囲の設定の詳細は、関連情報 セクションの 制限範囲によるリソース消費の制限 を参照してください。
Pod の作成後に、パイプライン実行におけるリソースクォータの使用状況を確認します。
例: パイプラインにおけるリソースクォータ使用状況の確認
oc describe quota
$ oc describe quotaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力は、優先クラスごとにリソースクォータを指定することで、特定の優先クラスに属するすべての同時実行 Pod のリソースクォータをまとめて管理できることを示しています。