第8章 Quotas
8.1. プロジェクトごとのリソースクォータ リンクのコピーリンクがクリップボードにコピーされました!
ResourceQuota オブジェクトで定義される リソースクォータ は、プロジェクトごとにリソース消費量の総計を制限する制約を指定します。これは、タイプ別にプロジェクトで作成できるオブジェクトの数量を制限すると共に、そのプロジェクトのリソースが消費する可能性のあるコンピュートリソースおよびストレージの合計量を制限することができます。
このガイドでは、リソースクォータの仕組みや、クラスター管理者がリソースクォータはプロジェクトごとにどのように設定し、管理できるか、および開発者やクラスター管理者がそれらをどのように表示できるかを説明します。
8.1.1. クォータで管理されるリソース リンクのコピーリンクがクリップボードにコピーされました!
以下では、クォータで管理できる一連のコンピュートリソースとオブジェクトタイプを説明します。
status.phase in (Failed、Succeeded) が true の場合、Pod は終了状態にあります。
| リソース名 | 説明 |
|---|---|
|
|
非終了状態のすべての Pod での CPU 要求の合計はこの値を超えることができません。 |
|
|
非終了状態のすべての Pod でのメモリー要求の合計はこの値を超えることができません。 |
|
|
非終了状態のすべての Pod での CPU 要求の合計はこの値を超えることができません。 |
|
|
非終了状態のすべての Pod でのメモリー要求の合計はこの値を超えることができません。 |
|
| 非終了状態のすべての Pod での CPU 制限の合計はこの値を超えることができません。 |
|
| 非終了状態のすべての Pod でのメモリー制限の合計はこの値を超えることができません。 |
| リソース名 | 説明 |
|---|---|
|
| 任意の状態のすべての永続ボリューム要求でのストレージ要求の合計は、この値を超えることができません。 |
|
| プロジェクトに存在できる永続ボリューム要求の合計数です。 |
|
| 一致するストレージクラスを持つ、任意の状態のすべての永続ボリューム要求でのストレージ要求の合計はこの値を超えることができません。 |
|
| プロジェクトに存在できる、一致するストレージクラスを持つ永続ボリューム要求の合計数です。 |
|
|
非終了状態のすべての Pod におけるローカルの一時ストレージ要求の合計は、この値を超えることができません。 |
|
|
非終了状態のすべての Pod における一時ストレージ要求の合計は、この値を超えることができません。 |
|
| 非終了状態のすべての Pod における一時ストレージ制限の合計は、この値を超えることができません。 |
| リソース名 | 説明 |
|---|---|
|
| プロジェクトに存在できる非終了状態の Pod の合計数です。 |
|
| プロジェクトに存在できる ReplicationController の合計数です。 |
|
| プロジェクトに存在できるリソースクォータの合計数です。 |
|
| プロジェクトに存在できるサービスの合計数です。 |
|
|
プロジェクトに存在できるタイプ |
|
|
プロジェクトに存在できるタイプ |
|
| プロジェクトに存在できるシークレットの合計数です。 |
|
|
プロジェクトに存在できる |
|
| プロジェクトに存在できる永続ボリューム要求の合計数です。 |
|
| プロジェクトに存在できるイメージストリームの合計数です。 |
8.1.2. クォータのスコープ リンクのコピーリンクがクリップボードにコピーされました!
各クォータには スコープ のセットが関連付けられます。クォータは、列挙されたスコープの交差部分に一致する場合にのみリソースの使用状況を測定します。
スコープをクォータに追加すると、クォータが適用されるリソースのセットを制限できます。許可されるセット以外のリソースを設定すると、検証エラーが発生します。
| スコープ | 説明 |
|
|
|
|
|
|
BestEffort スコープは、以下のリソースに制限するようにクォータを制限します。
-
pods
NotBestEffort スコープは、以下のリソースを追跡するようにクォータを制限します。
-
pods -
memory -
requests.memory -
limits.memory -
cpu -
requests.cpu -
limits.cpu
8.1.3. クォータの実施 リンクのコピーリンクがクリップボードにコピーされました!
プロジェクトのリソースクォータが最初に作成されると、プロジェクトは、更新された使用状況の統計が計算されるまでクォータ制約の違反を引き起こす可能性のある新規リソースの作成機能を制限します。
クォータが作成され、使用状況の統計が更新されると、プロジェクトは新規コンテンツの作成を許可します。リソースを作成または変更する場合、クォータの使用量はリソースの作成または変更要求があるとすぐに増分します。
リソースを削除する場合、クォータの使用量は、プロジェクトのクォータ統計の次回の完全な再計算時に減分されます。設定可能な時間を指定して、クォータ使用量の統計値を現在確認されるシステム値まで下げるのに必要な時間を決定します。
プロジェクト変更がクォータ使用制限を超える場合、サーバーはそのアクションを拒否し、クォータ制約を違反していること、およびシステムで現在確認される使用量の統計値を示す適切なエラーメッセージがユーザーに返されます。
8.1.4. 要求と制限 リンクのコピーリンクがクリップボードにコピーされました!
コンピュートリソースの割り当て時に、各コンテナーは CPU、メモリー、一時ストレージのそれぞれに要求値と制限値を指定できます。クォータはこれらの値のいずれも制限できます。
クォータに requests.cpu または requests.memory の値が指定されている場合、すべての着信コンテナーがそれらのリソースを明示的に要求することが求められます。クォータに limits.cpu または limits.memory の値が指定されている場合、すべての着信コンテナーがそれらのリソースの明示的な制限を指定することが求められます。
8.1.5. リソースクォータ定義の例 リンクのコピーリンクがクリップボードにコピーされました!
core-object-counts.yaml
openshift-object-counts.yaml
- 1
- プロジェクトに存在できるイメージストリームの合計数です。
compute-resources.yaml
besteffort.yaml
compute-resources-long-running.yaml
compute-resources-time-bound.yaml
storage-consumption.yaml
- 1
- プロジェクト内の永続ボリューム要求の合計数です。
- 2
- プロジェクトのすべての永続ボリューム要求において、要求されるストレージの合計はこの値を超えることができません。
- 3
- プロジェクトのすべての永続ボリューム要求において、gold ストレージクラスで要求されるストレージの合計はこの値を超えることができません。
- 4
- プロジェクトのすべての永続ボリューム要求において、silver ストレージクラスで要求されるストレージの合計はこの値を超えることができません。
- 5
- プロジェクトのすべての永続ボリューム要求において、silver ストレージクラスの要求の合計数はこの値を超えることができません。
- 6
- プロジェクトのすべての永続ボリューム要求において、bronze ストレージクラスで要求されるストレージの合計はこの値を超えることができません。これが
0に設定される場合、bronze ストレージクラスはストレージを要求できないことを意味します。 - 7
- プロジェクトのすべての永続ボリューム要求において、bronze ストレージクラスで要求されるストレージの合計はこの値を超えることができません。これが
0に設定される場合は、bronze ストレージクラスでは要求を作成できないことを意味します。 - 8
- 非終了状態のすべての Pod において、一時ストレージ要求の合計は 2 Gi を超えることができません。
- 9
- 非終了状態のすべての Pod において、一時ストレージ制限の合計は 4 Gi を超えることができません。
8.1.6. クォータの作成 リンクのコピーリンクがクリップボードにコピーされました!
特定のプロジェクトでリソースの使用を制限するためにクォータを作成することができます。
手順
- ファイルにクォータを定義します。
クォータを作成し、これをプロジェクトに適用するためにファイルを使用します。
oc create -f <file> [-n <project_name>]
$ oc create -f <file> [-n <project_name>]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下に例を示します。
oc create -f core-object-counts.yaml -n demoproject
$ oc create -f core-object-counts.yaml -n demoprojectCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.1.6.1. オブジェクトカウントクォータの作成 リンクのコピーリンクがクリップボードにコピーされました!
BuildConfig および DeploymentConfig オブジェクトなどの、OpenShift Container Platform の標準的な namespace を使用しているリソースタイプのすべてにオブジェクトカウントクォータを作成できます。オブジェクトクォータカウントは、定義されたクォータをすべての標準的な namespace を使用しているリソースタイプに設定します。
リソースクォータを使用する際に、オブジェクトは作成時クォータに基づいてチャージされます。以下のクォータのタイプはリソースが使い切られることから保護するのに役立ちます。クォータは、プロジェクト内に余分なリソースが十分にある場合にのみ作成できます。
手順
リソースのオブジェクトカウントクォータを設定するには、以下を実行します。
以下のコマンドを実行します。
oc create quota <name> \ --hard=count/<resource>.<group>=<quota>,count/<resource>.<group>=<quota>$ oc create quota <name> \ --hard=count/<resource>.<group>=<quota>,count/<resource>.<group>=<quota>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<resource>変数はリソースの名前であり、<group>は API グループです (該当する場合)。リソースおよびそれらの関連付けられた API グループのリストにoc api-resourcesコマンドを使用します。
以下に例を示します。
oc create quota test \ --hard=count/deployments.extensions=2,count/replicasets.extensions=4,count/pods=3,count/secrets=4$ oc create quota test \ --hard=count/deployments.extensions=2,count/replicasets.extensions=4,count/pods=3,count/secrets=4Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
resourcequota "test" created
resourcequota "test" createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、リスト表示されたリソースをクラスター内の各プロジェクトのハード制限に制限します。
クォータが作成されていることを確認します。
oc describe quota test
$ oc describe quota testCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.1.6.2. 拡張リソースのリソースクォータの設定 リンクのコピーリンクがクリップボードにコピーされました!
リソースのオーバーコミットは拡張リソースには許可されません。そのため、クォータで同じ拡張リソースについて requests および limits を指定する必要があります。現時点で、接頭辞 requests. のあるクォータ項目のみが拡張リソースに許可されます。以下は、GPU リソース nvidia.com/gpu のリソースクォータを設定する方法に関するシナリオ例です。
手順
クラスター内のノードで利用可能な GPU の数を判別します。以下に例を示します。
oc describe node ip-172-31-27-209.us-west-2.compute.internal | egrep 'Capacity|Allocatable|gpu'
# oc describe node ip-172-31-27-209.us-west-2.compute.internal | egrep 'Capacity|Allocatable|gpu'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、2 つの GPU が利用可能です。
ResourceQuotaオブジェクトを作成して、namespacenvidiaにクォータを設定します。この例では、クォータは1です。出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow クォータを作成します。
oc create -f gpu-quota.yaml
# oc create -f gpu-quota.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
resourcequota/gpu-quota created
resourcequota/gpu-quota createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow namespace に正しいクォータが設定されていることを確認します。
oc describe quota gpu-quota -n nvidia
# oc describe quota gpu-quota -n nvidiaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 0 1
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 0 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 単一 GPU を要求する Pod を定義します。以下の定義ファイルのサンプルの名前は
gpu-pod.yamlです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod を作成します。
oc create -f gpu-pod.yaml
# oc create -f gpu-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Pod が実行されていることを確認します。
oc get pods
# oc get podsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY STATUS RESTARTS AGE gpu-pod-s46h7 1/1 Running 0 1m
NAME READY STATUS RESTARTS AGE gpu-pod-s46h7 1/1 Running 0 1mCopy to Clipboard Copied! Toggle word wrap Toggle overflow クォータ
Usedのカウンターが正しいことを確認します。oc describe quota gpu-quota -n nvidia
# oc describe quota gpu-quota -n nvidiaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 1 1
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 1 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow nvidianamespace で 2 番目の GPU Pod の作成を試行します。2 つの GPU があるので、これをノード上で実行することは可能です。oc create -f gpu-pod.yaml
# oc create -f gpu-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Error from server (Forbidden): error when creating "gpu-pod.yaml": pods "gpu-pod-f7z2w" is forbidden: exceeded quota: gpu-quota, requested: requests.nvidia.com/gpu=1, used: requests.nvidia.com/gpu=1, limited: requests.nvidia.com/gpu=1
Error from server (Forbidden): error when creating "gpu-pod.yaml": pods "gpu-pod-f7z2w" is forbidden: exceeded quota: gpu-quota, requested: requests.nvidia.com/gpu=1, used: requests.nvidia.com/gpu=1, limited: requests.nvidia.com/gpu=1Copy to Clipboard Copied! Toggle word wrap Toggle overflow クォータが 1 GPU であり、この Pod がそのクォータを超える 2 つ目の GPU の割り当てを試行したため、Forbidden エラーメッセージが表示されることが予想されます。
8.1.7. クォータの表示 リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールでプロジェクトの Quota ページに移動し、プロジェクトのクォータで定義されるハード制限に関連する使用状況の統計を表示できます。
CLI を使用してクォータの詳細を表示することもできます。
手順
プロジェクトで定義されるクォータのリストを取得します。たとえば、
demoprojectというプロジェクトの場合、以下を実行します。oc get quota -n demoproject
$ oc get quota -n demoprojectCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME AGE REQUEST LIMIT besteffort 4s pods: 1/2 compute-resources-time-bound 10m pods: 0/2 limits.cpu: 0/1, limits.memory: 0/1Gi core-object-counts 109s configmaps: 2/10, persistentvolumeclaims: 1/4, replicationcontrollers: 1/20, secrets: 9/10, services: 2/10
NAME AGE REQUEST LIMIT besteffort 4s pods: 1/2 compute-resources-time-bound 10m pods: 0/2 limits.cpu: 0/1, limits.memory: 0/1Gi core-object-counts 109s configmaps: 2/10, persistentvolumeclaims: 1/4, replicationcontrollers: 1/20, secrets: 9/10, services: 2/10Copy to Clipboard Copied! Toggle word wrap Toggle overflow 関連するクォータを記述します。たとえば、
core-object-countsクォータの場合、以下を実行します。oc describe quota core-object-counts -n demoproject
$ oc describe quota core-object-counts -n demoprojectCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.1.8. 明示的なリソースクォータの設定 リンクのコピーリンクがクリップボードにコピーされました!
プロジェクト要求テンプレートで明示的なリソースクォータを設定し、新規プロジェクトに特定のリソースクォータを適用します。
前提条件
- cluster-admin ロールを持つユーザーとしてのクラスターへのアクセスがあること。
-
OpenShift CLI (
oc) がインストールされている。
手順
プロジェクト要求テンプレートにリソースクォータ定義を追加します。
プロジェクト要求テンプレートがクラスターに存在しない場合:
ブートストラッププロジェクトテンプレートを作成し、これを
template.yamlというファイルに出力します。oc adm create-bootstrap-project-template -o yaml > template.yaml
$ oc adm create-bootstrap-project-template -o yaml > template.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow リソースクォータの定義を
template.yamlに追加します。以下の例では、'storage-consumption' という名前のリソースクォータを定義します。テンプレートのparameters:セクションの前に定義を追加する必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- プロジェクト内の永続ボリューム要求の合計数です。
- 2
- プロジェクトのすべての永続ボリューム要求において、要求されるストレージの合計はこの値を超えることができません。
- 3
- プロジェクトのすべての永続ボリューム要求において、gold ストレージクラスで要求されるストレージの合計はこの値を超えることができません。
- 4
- プロジェクトのすべての永続ボリューム要求において、silver ストレージクラスで要求されるストレージの合計はこの値を超えることができません。
- 5
- プロジェクトのすべての永続ボリューム要求において、silver ストレージクラスの要求の合計数はこの値を超えることができません。
- 6
- プロジェクトのすべての永続ボリューム要求において、bronze ストレージクラスで要求されるストレージの合計はこの値を超えることができません。この値が
0に設定される場合、bronze ストレージクラスはストレージを要求できません。 - 7
- プロジェクトのすべての永続ボリューム要求において、bronze ストレージクラスで要求されるストレージの合計はこの値を超えることができません。この値が
0に設定される場合、bronze ストレージクラスは要求を作成できません。
openshift-confignamespace の変更されたtemplate.yamlファイルでプロジェクト要求テンプレートを作成します。oc create -f template.yaml -n openshift-config
$ oc create -f template.yaml -n openshift-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記設定を
kubectl.kubernetes.io/last-applied-configurationアノテーションとして追加するには、--save-configオプションをoc createコマンドに追加します。デフォルトでは、テンプレートは
project-requestという名前になります。
プロジェクト要求テンプレートがクラスター内にすでに存在する場合は、以下を実行します。
注記設定ファイルを使用してクラスター内のオブジェクトを宣言的または命令的に管理する場合は、これらのファイルを使用して既存のプロジェクト要求テンプレートを編集します。
openshift-confignamespace のテンプレートをリスト表示します。oc get templates -n openshift-config
$ oc get templates -n openshift-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 既存のプロジェクト要求テンプレートを編集します。
oc edit template <project_request_template> -n openshift-config
$ oc edit template <project_request_template> -n openshift-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
前述の
storage-consumptionの例などのリソースクォータ定義を既存のテンプレートに追加します。テンプレートのparameters:セクションの前に定義を追加する必要があります。
プロジェクト要求テンプレートを作成した場合は、クラスターのプロジェクト設定リソースでこれを参照します。
編集するプロジェクト設定リソースにアクセスします。
Web コンソールの使用
-
Administration
Cluster Settings ページに移動します。 - Configuration をクリックし、すべての設定リソースを表示します。
- Project のエントリーを見つけ、Edit YAML をクリックします。
-
Administration
CLI の使用
project.config.openshift.io/clusterリソースを編集します。oc edit project.config.openshift.io/cluster
$ oc edit project.config.openshift.io/clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow
プロジェクト設定リソースの
specセクションを更新し、projectRequestTemplateおよびnameパラメーターを追加します。以下の例は、project-requestというデフォルトのプロジェクト要求テンプレートを参照します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
プロジェクトの作成時にリソースクォータが適用されていることを確認します。
プロジェクトを作成します。
oc new-project <project_name>
$ oc new-project <project_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロジェクトのリソースクォータをリスト表示します。
oc get resourcequotas
$ oc get resourcequotasCopy to Clipboard Copied! Toggle word wrap Toggle overflow リソースクォータを詳細に記述します。
oc describe resourcequotas <resource_quota_name>
$ oc describe resourcequotas <resource_quota_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow