リソース管理

一般的な Kubernetes クラスターでは、ポッドは無制限のリソースで実行されます。デフォルトでは、必要なだけの CPU と RAM の使用が許可されます。

CloudNativePGを使用すると、管理者は、マニフェストのresources セクションを使用して、クラスターのポッドによるリソース使用量を2つのノブで制御および管理できます。

  • requests :初期要件

  • limits :リソースニーズが動的に増加する場合の最大使用量

たとえば、次のように32MiB(128MiBにスケーラブル)の初期量のRAMと50mのCPU(100mにスケーラブル)を要求できます。

resources:
  requests:
    memory: "32Mi"
    cpu: "50m"
  limits:
    memory: "128Mi"
    cpu: "100m"

メモリの要求と制限はコンテナに関連付けられますが、ポッドにはメモリの要求と制限があると考えると便利です。ポッドのメモリ要求は、ポッド内のすべてのコンテナに対するメモリ要求の合計です。

ポッドのスケジューリングは、制限ではなく要求に基づいています。ポッドのメモリ要求を満たすのに十分なメモリがノードにある場合にのみ、ポッドはノードで実行されるようにスケジュールされます。

リソースごとに、コンテナを優先度の高い順に3つのサービス品質(QoS)クラスに分割します。

  • 保証

  • 壊れやすい

  • ベストエフォート

詳細については、Kubernetesドキュメントの Configure Quality of Service for Pods セクションを参照してください。

PostgreSQLのワークロードの場合、「保証」のQoSを設定することをお勧めします。

Kubernetesのリソース関連の問題を回避するには、クラスター作成時の「リソース不足」処理のベストプラクティスを参照してください。

  • マニフェストファイルのresourcesセクションで、メモリとCPUに必要な値を指定します。このようにして、 OOM Killed (「OOM」はOut Of Memoryを表します)とCPU throttle 、または実行中のインスタンスでのその他のリソース関連の問題を回避できます。

  • クラスターのポッドを「保証」QoSクラスに割り当てるには、メモリとCPUの両方の制限と要求を同じ値に設定する必要があります。

  • ポッドリソースと一貫して、必要なPostgreSQLメモリパラメーターを指定します(VMまたは物理マシンのシナリオで行うように-以下を参照)。

  • nodeSelectorを使用して専用ノードにデータベースサーバーポッドをセットアップします。 APIリファレンスページの “affinityconfiguration" リソースの「nodeSelector」および「tolerations」フィールドを参照してください。

次のマニフェストの例を参照できます。

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgresql-resources
spec:

  instances: 3

  postgresql:
    parameters:
      shared_buffers: "256MB"

  resources:
    requests:
      memory: "1024Mi"
      cpu: 1
    limits:
      memory: "1024Mi"
      cpu: 1

  storage:
    size: 1Gi

上記の例では、 256MB の値でshared_buffers パラメーターを指定しました-つまり、データをキャッシュするためにPostgreSQLサーバー専用に割り当てられるメモリーの量(このパラメーターのデフォルト値は、定義されていない場合)。

shared_buffers の妥当な開始値は、システムのメモリーの25%です。例: shared_buffers が256 MBの場合、コンテナのメモリサイズの推奨値は1 GBです。これは、ポッド内のすべてのコンテナにKubernetesが常に保持する合計1 GBのメモリがあることを意味します。期待どおりに動作します。詳細については、PostgreSQLドキュメントの Resource Consumption セクションを参照してください。