Skip to content

Commit 52e0126

Browse files
committed
chart: update cnpg-cluster version and enhance resource configurations
1 parent c47241d commit 52e0126

7 files changed

Lines changed: 159 additions & 120 deletions

File tree

charts/cnpg-cluster/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type: application
1515
# This is the chart version. This version number should be incremented each time you make changes
1616
# to the chart and its templates, including the app version.
1717
# Versions are expected to follow Semantic Versioning (https://semver.org/)
18-
version: 0.1.10
18+
version: 0.2.0
1919

2020
# This is the version number of the application being deployed. This version number should be
2121
# incremented each time you make changes to the application. Versions are not expected to

charts/cnpg-cluster/templates/_helpers.tpl

Lines changed: 91 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ Expand the name of the chart.
77

88
{{/*
99
Create a default fully qualified app name.
10-
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
11-
If release name contains chart name it will be used as a full name.
1210
*/}}
1311
{{- define "cnpg-cluster.fullname" -}}
1412
{{- if .Values.fullnameOverride }}
@@ -51,126 +49,155 @@ app.kubernetes.io/instance: {{ .Release.Name }}
5149
{{- end }}
5250

5351
{{/*
54-
Create the name of the service account to use
52+
Total memory in MB allocated to a PostgreSQL pod
5553
*/}}
56-
{{- define "cnpg-cluster.serviceAccountName" -}}
57-
{{- if .Values.serviceAccount.create }}
58-
{{- default (include "cnpg-cluster.fullname" .) .Values.serviceAccount.name }}
59-
{{- else }}
60-
{{- default "default" .Values.serviceAccount.name }}
61-
{{- end }}
54+
{{- define "cnpg-cluster.totalMemoryMB" -}}
55+
{{- $mem := .Values.resources.requests.memory -}}
56+
{{- if hasSuffix "Gi" $mem -}}
57+
{{- trimSuffix "Gi" $mem | float64 | mulf 1024 | int -}}
58+
{{- else if hasSuffix "Mi" $mem -}}
59+
{{- trimSuffix "Mi" $mem | int -}}
60+
{{- else if hasSuffix "G" $mem -}}
61+
{{- trimSuffix "G" $mem | float64 | mulf 1000 | int -}}
62+
{{- else if hasSuffix "M" $mem -}}
63+
{{- trimSuffix "M" $mem | int -}}
64+
{{- else -}}
65+
{{- div (int $mem) 1048576 -}}
66+
{{- end -}}
6267
{{- end }}
6368

6469
{{/*
65-
Sanitized compute size factor (minimum 1)
70+
shared_buffers = 25% total memory
71+
Recommended for mixed workloads (OLTP + analytical queries)
6672
*/}}
67-
{{- define "cnpg-cluster.computeFactor" -}}
68-
{{- $raw := .Values.computeSizeFactor | default 1 -}}
69-
{{- $f := (printf "%v" $raw | atoi) -}}
70-
{{- if lt $f 1 }}{{- $f = 1 }}{{- end -}}
71-
{{- $f -}}
73+
{{- define "cnpg-cluster.sharedBuffersMB" -}}
74+
{{- $total := include "cnpg-cluster.totalMemoryMB" . | int -}}
75+
{{- div (mul $total 25) 100 -}}
7276
{{- end }}
7377

7478
{{/*
75-
Memory per factor in MB (override with .Values.memoryPerFactorMB, default 512MB)
79+
max_connections = Based on memory and expected workload
80+
Formula: (~totalMemoryMB / 10) capped between 25-200
7681
*/}}
77-
{{- define "cnpg-cluster.memoryPerFactorMB" -}}
78-
{{- (.Values.memoryPerFactorMB | default 128) | int -}}
82+
{{- define "cnpg-cluster.maxConnections" -}}
83+
{{- $total := include "cnpg-cluster.totalMemoryMB" . | int -}}
84+
{{- $calculated := div $total 10 -}}
85+
{{- $min := 25 -}}
86+
{{- $max := 200 -}}
87+
{{- if lt $calculated $min -}}
88+
{{- $min -}}
89+
{{- else if gt $calculated $max -}}
90+
{{- $max -}}
91+
{{- else -}}
92+
{{- $calculated -}}
93+
{{- end -}}
7994
{{- end }}
8095

8196
{{/*
82-
Total memory (MB) allocated to a PostgreSQL pod
97+
System connections: CNPG, monitoring, migrations, psql, maintenance
8398
*/}}
84-
{{- define "cnpg-cluster.totalMemoryMB" -}}
85-
{{- $f := include "cnpg-cluster.computeFactor" . | int -}}
86-
{{- $unit := include "cnpg-cluster.memoryPerFactorMB" . | int -}}
87-
{{- mul $f $unit -}}
99+
{{- define "cnpg-cluster.systemConnections" -}}
100+
{{- .Values.connections.system | default 10 | int -}}
88101
{{- end }}
89102

90103
{{/*
91-
CPU per factor in millicores (override with .Values.cpuPerFactorMillicores, default 75m)
104+
Pooler connections: For application traffic via PgBouncer
92105
*/}}
93-
{{- define "cnpg-cluster.cpuPerFactorMillicores" -}}
94-
{{- (.Values.cpuPerFactorMillicores | default 75) | int -}}
106+
{{- define "cnpg-cluster.poolerConnections" -}}
107+
{{- .Values.connections.pooler | default 0 | int -}}
95108
{{- end }}
96109

97110
{{/*
98-
Total CPU (millicores) allocated to a PostgreSQL pod
111+
Direct connections: Calculated as remaining after system and pooler
99112
*/}}
100-
{{- define "cnpg-cluster.totalCPUMillicores" -}}
101-
{{- $f := include "cnpg-cluster.computeFactor" . | int -}}
102-
{{- $unit := include "cnpg-cluster.cpuPerFactorMillicores" . | int -}}
103-
{{- mul $f $unit -}}
113+
{{- define "cnpg-cluster.directConnections" -}}
114+
{{- $max := include "cnpg-cluster.maxConnections" . | int -}}
115+
{{- $system := include "cnpg-cluster.systemConnections" . | int -}}
116+
{{- $pooler := include "cnpg-cluster.poolerConnections" . | int -}}
117+
{{- $remaining := sub (sub $max $system) $pooler -}}
118+
{{- if lt $remaining 5 }}5{{ else }}{{ $remaining }}{{ end }}
104119
{{- end }}
105120

106121
{{/*
107-
shared_buffers = 25% total memory
122+
Pooler max_db_connections
108123
*/}}
109-
{{- define "cnpg-cluster.sharedBuffersMB" -}}
110-
{{- $total := include "cnpg-cluster.totalMemoryMB" . | int -}}
111-
{{- div (mul $total 25) 100 -}}
112-
{{- end }}
113-
114-
{{/*
115-
max_connections = (compute size factor * 5) + 5
116-
*/}}
117-
{{- define "cnpg-cluster.maxConnections" -}}
118-
{{- .Values.computeSizeFactor | mul 5 | add 5 }}
124+
{{- define "cnpg-cluster.pooler.maxDbConnections" -}}
125+
{{- include "cnpg-cluster.poolerConnections" . -}}
119126
{{- end }}
120127

121128
{{/*
122-
work_mem = (25% total) / max_connections
129+
work_mem = (Total RAM * 0.25) / max_connections
130+
Minimum 4MB for reasonable query performance
123131
*/}}
124132
{{- define "cnpg-cluster.workMemMB" -}}
125133
{{- $total := include "cnpg-cluster.totalMemoryMB" . | int -}}
126134
{{- $maxConn := include "cnpg-cluster.maxConnections" . | int -}}
127-
{{- if lt $maxConn 1 }}{{- $maxConn = 1 }}{{- end -}}
128135
{{- $quarter := div (mul $total 25) 100 -}}
129-
{{- $per := div (max 1 $quarter) $maxConn -}}
130-
{{- if lt $per 1 }}1{{ else }}{{ $per }}{{ end }}
136+
{{- $per := div $quarter $maxConn -}}
137+
{{- if lt $per 4 }}4{{ else }}{{ $per }}{{ end }}
131138
{{- end }}
132139

133140
{{/*
134-
maintenance_work_mem = 5% total
141+
maintenance_work_mem = min(10% total, 2GB)
142+
Higher values speed up VACUUM, CREATE INDEX
135143
*/}}
136144
{{- define "cnpg-cluster.maintenanceWorkMemMB" -}}
137145
{{- $total := include "cnpg-cluster.totalMemoryMB" . | int -}}
138-
{{ div (mul $total 5) 100 }}
146+
{{- $calculated := div (mul $total 10) 100 -}}
147+
{{- $max := 2048 -}}
148+
{{- if gt $calculated $max }}{{ $max }}{{ else }}{{ $calculated }}{{ end }}
139149
{{- end }}
140150

141151
{{/*
142-
effective_cache_size = 50% total memory
152+
effective_cache_size = 75% total memory
153+
Assumption: Kubernetes node has some free memory for OS cache
154+
PostgREST benefits from accurate planner estimates
143155
*/}}
144156
{{- define "cnpg-cluster.effectiveCacheSizeMB" -}}
145157
{{- $total := include "cnpg-cluster.totalMemoryMB" . | int -}}
146-
{{- div (mul $total 50) 100 -}}
158+
{{- div (mul $total 75) 100 -}}
147159
{{- end }}
148160

149161
{{/*
150-
Pooler sizing helpers
162+
random_page_cost: Lower for SSD storage (default 4.0 is for HDD)
151163
*/}}
152-
{{- define "cnpg-cluster.pooler.maxDbConnections" -}}
153-
{{- $clusterMax := include "cnpg-cluster.maxConnections" . | int -}}
154-
{{- $reserve := 5 -}}
155-
{{- $v := sub $clusterMax $reserve -}}
156-
{{- if lt $v 5 }}5{{ else }}{{ $v }}{{ end }}
164+
{{- define "cnpg-cluster.randomPageCost" -}}
165+
1.1
157166
{{- end }}
158167

168+
{{/*
169+
effective_io_concurrency: Higher for SSD/NVMe
170+
*/}}
171+
{{- define "cnpg-cluster.effectiveIOConcurrency" -}}
172+
200
173+
{{- end }}
174+
175+
{{/*
176+
Pooler sizing helpers
177+
For transaction pooling mode
178+
*/}}
159179
{{- define "cnpg-cluster.pooler.maxClientConn" -}}
160-
{{- /* Allow more frontend connections: 10x db connections */ -}}
180+
{{- /* For transaction mode: Allow 10-20x backend connections */ -}}
161181
{{- $db := include "cnpg-cluster.pooler.maxDbConnections" . | int -}}
162-
{{ mul $db 10 }}
182+
{{- if gt $db 0 -}}
183+
{{- mul $db 15 -}}
184+
{{- else -}}
185+
10
186+
{{- end -}}
163187
{{- end }}
164188

165189
{{- define "cnpg-cluster.pooler.defaultPoolSize" -}}
166-
{{- /* 50% of max_db_connections, min 5 */ -}}
190+
{{- /* 70% of max_db_connections for transaction mode */ -}}
167191
{{- $db := include "cnpg-cluster.pooler.maxDbConnections" . | int -}}
168-
{{- $v := div (mul $db 50) 100 -}}
169-
{{- if lt $v 5 }}5{{ else }}{{ $v }}{{ end }}
192+
{{- if gt $db 0 -}}
193+
{{- $v := div (mul $db 70) 100 -}}
194+
{{- if lt $v 5 }}5{{ else }}{{ $v }}{{ end }}
195+
{{- else -}}
196+
5
197+
{{- end -}}
170198
{{- end }}
171199

172200
{{- define "cnpg-cluster.now" -}}
173-
{{- /* Renders current time in configured timezone (Values.timezone), falls back to local system tz */ -}}
174201
{{- $tz := .Values.timezone | default "Local" -}}
175202
{{- dateInZone "2006-01-02T15:04:05-07:00" (now) $tz -}}
176203
{{- end }}
@@ -179,11 +206,9 @@ Pooler sizing helpers
179206
Schedule for automatic backups
180207
*/}}
181208
{{- define "cnpg-cluster.randomBackupSchedule" -}}
182-
{{- /* Deterministic pseudo-random schedule between 03:00–04:59 (UTC+8) */ -}}
183-
{{- /* Uses adler32 hash so it is stable across renders (good for GitOps) */ -}}
184209
{{- $seed := adler32sum (printf "%s-%s" .Release.Name .Release.Namespace) -}}
185-
{{- $offset := mod $seed 120 -}} {{/* 0..119 minutes in 2h window */}}
186-
{{- $hour := add 19 (div $offset 60) -}} {{/* 3 or 4 */}}
210+
{{- $offset := mod $seed 120 -}}
211+
{{- $hour := add 19 (div $offset 60) -}}
187212
{{- $minute := mod $offset 60 -}}
188213
{{- printf "0 %02d %d * * *" $minute $hour -}}
189214
{{- end }}

charts/cnpg-cluster/templates/cnpg-cluster.yaml

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,58 +6,54 @@ metadata:
66
argocd.argoproj.io/sync-wave: "-1"
77
argocd.argoproj.io/sync-options: SkipDryRunOnMissingResource=true
88
spec:
9-
# https://github.com/cloudnative-pg/postgres-containers/pkgs/container/postgresql
109
imageName: {{ .Values.imageName }}
11-
1210
instances: {{ .Values.instances }}
1311

1412
{{- if not (empty .Values.affinity) }}
1513
affinity: {{ .Values.affinity | toYaml | nindent 4 }}
1614
{{- end }}
1715

18-
# https://cloudnative-pg.io/documentation/current/resource_management/
19-
resources:
20-
requests:
21-
memory: {{ include "cnpg-cluster.totalMemoryMB" . }}Mi
22-
cpu: {{ include "cnpg-cluster.totalCPUMillicores" . }}m
23-
limits:
24-
memory: {{ include "cnpg-cluster.totalMemoryMB" . }}Mi
25-
cpu: {{ include "cnpg-cluster.totalCPUMillicores" . }}m
16+
resources: {{ .Values.resources | toYaml | nindent 4 }}
2617

2718
postgresql:
2819
parameters:
29-
# https://postgresqlco.nf/doc/en/param/shared_buffers/
30-
# https://www.enterprisedb.com/postgres-tutorials/how-tune-postgresql-memory#section-1
31-
# Total RAM * 0.25
3220
shared_buffers: {{ include "cnpg-cluster.sharedBuffersMB" . }}MB
33-
34-
# https://postgresqlco.nf/doc/en/param/work_mem/
35-
# https://www.enterprisedb.com/postgres-tutorials/how-tune-postgresql-memory
36-
# Total RAM * 0.25 / max_connections
3721
work_mem: {{ include "cnpg-cluster.workMemMB" . }}MB
38-
39-
# https://postgresqlco.nf/doc/en/param/maintenance_work_mem/
40-
# https://www.enterprisedb.com/postgres-tutorials/how-tune-postgresql-memory#section-3
41-
# Total RAM * 0.05
4222
maintenance_work_mem: {{ include "cnpg-cluster.maintenanceWorkMemMB" . }}MB
43-
44-
# https://postgresqlco.nf/doc/en/param/effective_cache_size/
45-
# https://www.enterprisedb.com/postgres-tutorials/how-tune-postgresql-memory#section-4
46-
# Total RAM * 0.5
4723
effective_cache_size: {{ include "cnpg-cluster.effectiveCacheSizeMB" . }}MB
4824

49-
# https://postgresqlco.nf/doc/en/param/max_connections/
50-
# Max connections from pooler + some overhead
25+
# Connection settings
5126
max_connections: {{ include "cnpg-cluster.maxConnections" . | quote }}
5227

53-
# https://cloudnative-pg.io/documentation/current/replication/#required-data-durability
54-
# https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-SynchronousReplicaConfiguration
28+
# Query planner - optimized for SSD storage
29+
random_page_cost: {{ include "cnpg-cluster.randomPageCost" . | quote }}
30+
effective_io_concurrency: {{ include "cnpg-cluster.effectiveIOConcurrency" . | quote }}
31+
32+
# WAL settings for better write performance
33+
wal_buffers: "16MB"
34+
min_wal_size: "1GB"
35+
max_wal_size: "4GB"
36+
37+
# Checkpoint tuning
38+
checkpoint_completion_target: "0.9"
39+
40+
# Logging for PostgREST query analysis
41+
log_min_duration_statement: "1000" # Log slow queries > 1s
42+
log_line_prefix: "%m [%p] %q%u@%d "
43+
44+
# Statistics for query optimization
45+
default_statistics_target: "100"
46+
47+
# Parallel query settings (if sufficient CPU)
48+
max_parallel_workers_per_gather: "2"
49+
max_parallel_workers: "4"
50+
51+
# Synchronous replication for data durability
5552
synchronous:
5653
dataDurability: required
5754
method: any
5855
number: 1
5956

60-
# https://cloudnative-pg.io/documentation/current/storage/
6157
storage:
6258
storageClass: {{ .Values.storageClass }}
6359
size: {{ .Values.storageSize }}
Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{- if .Values.pooler.ro.enabled }}
1+
{{- if and .Values.pooler.ro.enabled (gt (.Values.pooler.ro.instances | int) 0) (gt (.Values.connections.pooler | int) 0) }}
22
apiVersion: postgresql.cnpg.io/v1
33
kind: Pooler
44
metadata:
@@ -12,24 +12,16 @@ spec:
1212
instances: {{ .Values.pooler.ro.instances }}
1313
type: ro
1414

15-
# https://cloudnative-pg.io/documentation/current/connection_pooling/#pgbouncer-configuration-options
1615
pgbouncer:
1716
poolMode: {{ .Values.pooler.ro.mode }}
1817
parameters:
1918
max_client_conn: "{{ include "cnpg-cluster.pooler.maxClientConn" . }}"
2019
default_pool_size: "{{ include "cnpg-cluster.pooler.defaultPoolSize" . }}"
2120
max_db_connections: "{{ include "cnpg-cluster.pooler.maxDbConnections" . }}"
2221

23-
# https://cloudnative-pg.io/documentation/current/connection_pooling/#pod-templates
2422
template:
2523
spec:
2624
containers:
2725
- name: pgbouncer
28-
resources:
29-
requests:
30-
memory: {{ mul (include "cnpg-cluster.computeFactor" . | int) 32 }}Mi
31-
cpu: {{ mul (include "cnpg-cluster.computeFactor" . | int) 15 }}m
32-
limits:
33-
memory: {{ mul (include "cnpg-cluster.computeFactor" . | int) 64 }}Mi
34-
cpu: {{ mul (include "cnpg-cluster.computeFactor" . | int) 45 }}m
26+
resources: {{ .Values.poolerResources | toYaml | nindent 12 }}
3527
{{- end }}
Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{- if .Values.pooler.rw.enabled }}
1+
{{- if and .Values.pooler.rw.enabled (gt (.Values.pooler.rw.instances | int) 0) (gt (.Values.connections.pooler | int) 0) }}
22
apiVersion: postgresql.cnpg.io/v1
33
kind: Pooler
44
metadata:
@@ -12,24 +12,16 @@ spec:
1212
instances: {{ .Values.pooler.rw.instances }}
1313
type: rw
1414

15-
# https://cloudnative-pg.io/documentation/current/connection_pooling/#pgbouncer-configuration-options
1615
pgbouncer:
1716
poolMode: {{ .Values.pooler.rw.mode }}
1817
parameters:
1918
max_client_conn: "{{ include "cnpg-cluster.pooler.maxClientConn" . }}"
2019
default_pool_size: "{{ include "cnpg-cluster.pooler.defaultPoolSize" . }}"
2120
max_db_connections: "{{ include "cnpg-cluster.pooler.maxDbConnections" . }}"
2221

23-
# https://cloudnative-pg.io/documentation/current/connection_pooling/#pod-templates
2422
template:
2523
spec:
2624
containers:
2725
- name: pgbouncer
28-
resources:
29-
requests:
30-
memory: {{ mul (include "cnpg-cluster.computeFactor" . | int) 32 }}Mi
31-
cpu: {{ mul (include "cnpg-cluster.computeFactor" . | int) 15 }}m
32-
limits:
33-
memory: {{ mul (include "cnpg-cluster.computeFactor" . | int) 64 }}Mi
34-
cpu: {{ mul (include "cnpg-cluster.computeFactor" . | int) 45 }}m
26+
resources: {{ .Values.poolerResources | toYaml | nindent 12 }}
3527
{{- end }}

0 commit comments

Comments
 (0)