1.2. Pod とコンテナーのリソース管理

Pod を指定すると、コンテナーが必要とする各リソースの量を指定できます。指定する最も一般的なリソースは、CPU とメモリー (RAM) です。

Pod 内のコンテナーのリソース要求を指定すると、kubenetes-scheduler はこの情報を使用して、Pod を配置するノードを割り当てます。

コンテナーのリソース制限を指定すると、kubelet またはノードエージェントがその制限を適用し、実行中のコンテナーが設定した制限を超えてそのリソースを使用することを許可しないようにします。また、kubelet は、少なくとも要求された量のシステムリソースを、そのコンテナーが使用するために予約します。

1.2.1. 要求と制限

Pod が実行されているノードに使用可能なリソースが十分にある場合、コンテナーは、そのリソースに対する要求が指定するよりも多くのリソースを使用する可能性があります。ただし、コンテナーはそのリソース制限を超えて使用することはできません。

たとえば、コンテナーに 256 MiB のメモリー要求を設定し、そのコンテナーが 8 GiB のメモリーを持つノードにスケジュールされた Pod 内にあり、他の Pod がない場合、コンテナーはより多くの RAM を使用しようとする可能性があります。

そのコンテナーに 4 GiB のメモリー制限を設定すると、kubelet とコンテナーのランタイムによって制限が適用されます。ランタイムは、コンテナーが設定されたリソース制限を超えて使用することを防ぎます。

コンテナー内のプロセスが許可された量を超えるメモリーを消費しようとすると、システムカーネルは Out Of Memory (OOM) エラーで、割り当てを試みたプロセスを終了します。

制限は 2 つの方法で実装できます。

  • 事後対応: 違反が検出されると、システムが介入します。
  • 強制: システムは、コンテナーが制限を超えないようにします。

ランタイムが異なれば、同じ制限を実装する方法も異なる場合があります。

注記

リソースの制限を指定しても、要求を指定せず、admission-time メカニズムがそのリソースのデフォルト要求を適用していない場合、Kubernetes は指定された制限をコピーし、それをリソースの要求値として使用します。

1.2.2. リソースタイプ

CPU とメモリーはどちらもリソースのタイプです。リソースタイプには基本の単位があります。CPU は計算処理を表し、Kubernetes CPU の単位で指定されます。メモリーはバイト単位で指定されます。

CPU とメモリーは、まとめてコンピュートリソースまたはリソースと呼ばれます。コンピュートリソースは、要求、割り当て、消費でき、さらに数量を測定できるリソースです。これらは API リソースとは異なります。Pod やサービスなどの API リソースは、Kubernetes API サーバーを介して読み取りおよび変更できるオブジェクトです。

1.2.3. Pod とコンテナーのリソース要求および制限の指定

コンテナーごとに、次のようなリソースの制限と要求を指定できます。

spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory

個々のコンテナーに対してのみ要求と制限を指定できますが、Pod 全体のリソース要求と制限を考慮することも役立ちます。特定のリソースの場合、Pod リソースの要求/制限は、Pod 内にあるコンテナーごとに割り当てられた、対象タイプのリソース要求または制限を合計したものです。

1.2.4. Kubernetes のリソース単位

CPU のリソース単位

CPU リソースの制限と要求は、CPU 単位で測定されます。Kubernetes における 1 CPU は、ノードが物理ホストか物理マシン内で実行されている仮想マシンかに応じて、1 つの物理プロセッサーコアまたは 1 つの仮想コアに相当します。

部分的な要求は許可されます。spec.containers[].resources.requests.cpu0.5 に設定してコンテナーを定義すると、1.0 CPU を要求した場合と比較して半分の CPU 時間を要求します。CPU のリソース単位で 0.1 は 100m と同じで、100 millicpu または 100 millicore です。millicpu と millicores は同じ意味です。CPU リソースは常にリソースの絶対量として指定され、相対量として指定されることはありません。たとえば 500m CPU は、そのコンテナーがシングルコア、デュアルコア、または 48 コアのマシンで実行されているかどうかにかかわらず、同じ量のコンピューティングパワーを表します。

注記

1.0 または 1000m 未満の CPU 単位を指定するには、milliCPU 形式を使用する必要があります。たとえば、0.005 CPU ではなく 5m を使用します。

メモリーのリソース単位

メモリーの制限と要求はバイト単位で測定されます。数量を示す E、P、T、G、M、k のいずれかの接尾辞を使用して、メモリーを単純な整数または固定小数点数として表すことができます。Ei、Pi、Ti、Gi、Mi、Ki の 2 のべき乗も使用できます。たとえば、次はほぼ同じ値を表します。

128974848, 129e6, 129M,  128974848000m, 123Mi

接尾辞の大文字と小文字に注意してください。400m のメモリーを要求する場合、これは 0.4 バイトの要求であり、400 メビバイト (400Mi) でも 400 メガバイト (400M) でもありません。

CPU とメモリーの仕様例

次のクラスターには、専用の 100m CPU と 250Mi でタスク Pod をスケジュールするのに十分な空きリソースがあります。クラスターは、最大 2000m CPU と 2Gi メモリーを専用に使用するバーストにも耐えることができます。

spec:
  task_resource_requirements:
    requests:
      cpu: 100m
      memory: 250Mi
    limits:
      cpu: 2000m
      memory: 2Gi

Automation Controller は、設定された制限を超えてリソースを使用するジョブをスケジュールしません。タスク Pod が設定された制限を超えてリソースを使用する場合、コンテナーは kubernetes によって OOMKilled され、再起動されます。

1.2.5. リソース要求の推奨サイズ

コンテナーグループを使用するすべてのジョブは、同じ Pod 仕様を使用します。Pod 仕様には、ジョブを実行する Pod のリソース要求が含まれています。

すべてのジョブは同じリソース要求を使用します。Pod 仕様で特定のジョブに指定されたリソース要求は、Kubernetes がワーカーノードで使用可能なリソースに基づいてジョブ Pod をスケジュールする方法に影響します。これらはデフォルト値です。

  • 通常、1 つのフォークには 100 Mb のメモリーが必要です。これは system_task_forks_mem を使用して設定されます。ジョブに 5 つのフォークがある場合、ジョブ Pod の仕様は 500 Mb のメモリーを要求する必要があります。
  • フォークの値が特に高いジョブテンプレートや、より大きなリソース要求が必要なジョブテンプレートでは、より大きなリソース要求を示す別の Pod 仕様で別のコンテナーグループを作成する必要があります。その後、それをジョブテンプレートに割り当てることができます。たとえば、フォーク値が 50 のジョブテンプレートは、5 GB のメモリーを要求するコンテナーグループとペアにする必要があります。
  • ジョブのフォーク値が高く、単一 Pod にそのジョブを含めることができない場合は、ジョブスライス機能を使用します。これにより、コンテナーグループによってプロビジョニングされた自動化 Pod に個々のジョブスライスが収まるように、インベントリーが分割されます。