資源管理¶
典型的な Kubernetes クラスターでは、ポッドは無制限のリソースで実行されます。デフォルトでは、必要なだけの CPU と RAM の使用が許可される場合があります。
CloudNativePG を使用すると、管理者はマニフェストの resources
セクションを介して、次の 2
つのノブを使用して、クラスターのポッドによるリソースの使用を制御および管理できます。
requests: 初期要件limits: リソースのニーズが動的に増加した場合の最大使用量
たとえば、次のように 32MiB の RAM (128MiB まで拡張可能) と 50m の CPU (100m まで拡張可能) の初期量を要求できます。
resources:
requests:
memory: "32Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
メモリーの要求と制限はコンテナーに関連付けられていますが、ポッドにはメモリーの要求と制限があると考えると便利です。ポッドのメモリ リクエストは、ポッド内のすべてのコンテナのメモリ リクエストの合計です。
Pod のスケジューリングは、制限ではなくリクエストに基づいています。 Pod は、Pod のメモリー要求を満たすのに十分な使用可能なメモリーが Node にある場合にのみ、Node 上で実行するようにスケジュールされます。
リソースごとに、コンテナーを優先度の高い順に 3 つのサービス品質 (QoS) クラスに分けます。
保証済み
バースト可能
最大限の努力
詳細については、 Configure Quality of Service for Pods を参照してください。
Kubernetes ドキュメントのセクション。
PostgreSQL ワークロードの場合、「保証された」QoS を設定することをお勧めします。
Kubernetes でのリソース関連の問題を回避するために、クラスター作成時の「リソース不足」処理のベスト プラクティスを参照できます。
マニフェスト ファイルのリソース セクションで、メモリと CPU に必要な値を指定します。このようにして、
OOM Killed(「OOM」はメモリ不足を表します) や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 サーバーに割り当てられるメモリの量です
(このパラメータが定義されていない場合、このパラメータのデフォルト値は
128MB です)。
shared_buffers の適切な開始値は、システムのメモリの 25% です。例:
shared_buffers が 256 MB の場合、コンテナーのメモリ サイズの推奨値は
1 GB です。これは、ポッド内のすべてのコンテナーに、Kubernetes
が常に保持する合計 1 GB
のメモリがあることを意味します。期待どおりに動作します。詳細については、 Resource Consumption
を参照してください。
PostgreSQL ドキュメントのセクション。
Kubernetes ドキュメントのページ。