Module K2
Dalibo SCOP
26.09
10 septembre 2026
| Formation | Module K2 |
| Titre | Configuration et gestion des ressources |
| Révision | 26.09 |
| https://dali.bo/k2_pdf | |
| EPUB | https://dali.bo/k2_epub |
| HTML | https://dali.bo/k2_html |
| Slides | https://dali.bo/k2_slides |
| TP | https://dali.bo/k2_tp |
| TP (solutions) | https://dali.bo/k2_solutions |
Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :
PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.
Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 14 à 18.
PodCluster et de
l’opérateurPodD’abord sur Kubernetes
spec.resources d’un objet Cluster
requests et limitsPod
instance-managerPod dans le Namespace
cnpg-system Limits:
cpu: 100m
memory: 200Mi
Requests:
cpu: 100m
memory: 100Mi
PodPuis sur PostgreSQL
Clusterinitdb (section
boostrap)Impossible à modifier
Can't set fixed configuration parameterAssurer la gestion de l’instance par l’opérateur
Des paramètres peu modifiés en général
shared_bufferswork_memmaintenance_work_memwal_leveleffective_io_concurrencyeffective_cache_sizerandom_page_costmax_parallel_workersmax_worker_processesN’hésitez pas, c’est le moment !
La version en ligne des solutions de ces TP est disponible sur https://dali.bo/k2_solutions.
But : Configurer l’instance PostgreSQL.
Installer une instance PostgreSQL ne suffit pas. Il faut en plus la
configurer. Habituellement, la configuration se fait dans le fichier
postgresql.conf et nécessite soit un rechargement, soit un
redémarrage de l’instance selon le paramètre modifié. Nous allons voir
comment le faire sur notre instance postgresql-demo-1.
Créer le fichier
~/postgresql-config.yamlavec le contenu suivant :
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: postgresql-config
spec:
instances: 2
storage:
size: 5Gi
walStorage:
size: 5Gi
affinity:
enablePodAntiAffinity: true
topologyKey: kubernetes.io/hostname
podAntiAffinityType: preferred
resources:
requests:
memory: "1024Mi"
cpu: "1"
limits:
memory: "1024Mi"
cpu: "1"Créer ce
Clusteravec la commandekubectl apply -f.
kubectl apply -f ~/postgresql-config.yaml
cluster.postgresql.cnpg.io/postgresql-config created
Utiliser la documentation https://cloudnative-pg.io/docs/current/ pour trouver comment modifier des paramètres PostgreSQL.
La section The
postgresql section est celle qui nous intéresse. On va prendre
exemple sur l’extrait donné pour configurer notre Cluster.
Une section postgresql existe, dans laquelle une liste de
paramètres parameters peut être renseignée.
À noter, tous les paramètres doivent être passés sous forme de string, même si dans la configuration PostgreSQL, ils correspondrent à des entiers, ou flottants.
Ajuster la configuration du
Clusteren ajoutant le paramètreshared_buffers. Positionnez-le à 25% de la mémoirerequest.
La description YAML devient donc :
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: postgresql-config
spec:
instances: 2
storage:
size: 5Gi
walStorage:
size: 5Gi
affinity:
enablePodAntiAffinity: true
topologyKey: kubernetes.io/hostname
podAntiAffinityType: preferred
resources:
requests:
memory: "1024Mi"
cpu: "1"
limits:
memory: "1024Mi"
cpu: "1"
postgresql:
parameters:
shared_buffers: "256MB"Dans une autre console, suivre les traces du
Clusteret de l’instance avec
kubectl cnpg logs cluster postgresql-config -f | kubectl cnpg logs pretty.
Utiliser
kubectl apply -f ~/postgresql-config.yamlpour appliquer les modifications. Observer ce qui se passe sur leClusteravec les traces.
Lorsque la modification est appliquée, l’opérateur va procéder à
certaines opérations. Tout d’abord, il comprend que le paramètre modifié
nécessite un redémarrage des instances pour la prise en compte de la
nouvelle valeur. Effectivement, shared_buffers est un
paramètre qui touche à la mémoire partagée de PostgreSQL. Elle ne peut
être changée à chaud.
L’opérateur initie donc un redémarrage du Cluster (i.e
de toutes les instances). Dans les traces, on peut voir que c’est
d’abord l’instance postgresql-config-2 qui redémarre en
premier. C’est une instance secondaire.
2026-04-16T07:41:10.347 INFO postgresql-config-2 instance-manager Cluster has become unhealthy
2026-04-16T07:41:10.707 INFO postgresql-config-2 instance-manager Received termination signal
2026-04-16T07:41:10.707 INFO postgresql-config-2 instance-manager Requesting smart shutdown of the PostgreSQL instance
2026-04-16T07:41:10.712 INFO postgresql-config-2 pg_ctl pg_ctl: server is running (PID: 28)…
[…]
2026-04-16T07:41:10.791 INFO postgresql-config-2 postgres database system is shut down
Quelques secondes après, elle redémarre et accepte de nouveau des connexions en lecture seule.
[…]
2026-04-16T07:41:15.554 ERROR postgresql-config-2 postgres the database system is starting up
2026-04-16T07:41:15.665 INFO postgresql-config-2 postgres entering standby mode
2026-04-16T07:41:15.675 INFO postgresql-config-2 postgres redo starts at 0/4059E18
2026-04-16T07:41:16.018 INFO postgresql-config-2 postgres consistent recovery state reached at 0/6000000
2026-04-16T07:41:16.018 INFO postgresql-config-2 postgres database system is ready to accept read-only connections
2026-04-16T07:41:16.223 INFO postgresql-config-2 postgres started streaming WAL from primary at 0/6000000 on timeline 1
Si une autre instance secondaire existait, elle aurait été redémarrée. Ici, comme il n’y en a qu’une, il passe à l’instance primaire qui se voit être également arrêtée :
2026-04-16T07:41:23.704 INFO postgresql-config-1 instance-manager Received request for postgres
2026-04-16T07:41:23.705 INFO postgresql-config-1 instance-manager Requesting smart shutdown of the PostgreSQL instance
2026-04-16T07:41:23.744 INFO postgresql-config-1 pg_ctl pg_ctl: server is running (PID: 28)…
[…]
2026-04-16T07:41:23.869 INFO postgresql-config-1 instance-manager Shutting down instance
Puis redémarrée :
2026-04-16T07:41:24.316 INFO postgresql-config-1 instance-manager postmaster started
[…]
2026-04-16T07:41:24.403 INFO postgresql-config-1 postgres starting PostgreSQL 18.3 (Debian 18.3-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14…
2026-04-16T07:41:24.403 INFO postgresql-config-1 postgres listening on IPv4 address "0.0.0.0", port 5432
2026-04-16T07:41:24.403 INFO postgresql-config-1 postgres listening on IPv6 address "::", port 5432
2026-04-16T07:41:24.408 INFO postgresql-config-1 postgres listening on Unix socket "/controller/run/.s.PGSQL.5432"
2026-04-16T07:41:24.422 INFO postgresql-config-1 postgres database system was shut down at 2026-04-16 07:41:24 UTC
2026-04-16T07:41:24.436 INFO postgresql-config-1 postgres database system is ready to accept connections
Il faut donc comprendre que, par défaut, une modification d’un paramètre nécessitant un redémarrage déclenchera aussitôt le redémarrage. Attention donc au moment où vous apportez des modifications. Nous verrons par la suite comment avoir la main sur le moment du redémarrage avec la notion de stratégie de mise à jour.
Modifier le paramètre
work_memen le passant à 8 Mo et réappliquer la définition YAML aveckubectl apply -f ~/postgresql-config.yaml. Observer ce qui se passe sur leCluster.
tail postgresql-config.yaml
requests:
memory: "512Mi"
cpu: "1"
limits:
memory: "512Mi"
cpu: "1"
postgresql:
parameters:
shared_buffers: "256MB"
work_mem: "8MB"
kubectl apply -f ~/postgresql-config.yaml
cluster.postgresql.cnpg.io/postgresql-config configured
Là encore, les traces nous aident à comprendre ce qui se passe. Les deux instances sont rechargées à chaud.
2026-04-16T07:53:36.281 INFO postgresql-config-2 instance-manager Installed configuration file
2026-04-16T07:53:36.282 INFO postgresql-config-1 instance-manager Installed configuration file
2026-04-16T07:53:36.383 INFO postgresql-config-1 instance-manager reloading the instance
2026-04-16T07:53:36.384 INFO postgresql-config-1 instance-manager Requesting configuration reload
2026-04-16T07:53:36.386 INFO postgresql-config-1 pg_ctl server signaled
2026-04-16T07:53:36.386 INFO postgresql-config-1 postgres received SIGHUP, reloading configuration files
2026-04-16T07:53:36.388 INFO postgresql-config-1 postgres parameter "work_mem" changed to "8MB"
2026-04-16T07:53:36.388 INFO postgresql-config-1 postgres parameter "cnpg.config_sha256" changed to "44cf902cab017fd0aa7e0ed149e1d779778870c5283b1dcc4af61b992…
2026-04-16T07:53:36.389 INFO postgresql-config-2 instance-manager reloading the instance
2026-04-16T07:53:36.389 INFO postgresql-config-2 instance-manager Requesting configuration reload
2026-04-16T07:53:36.401 INFO postgresql-config-2 pg_ctl server signaled
2026-04-16T07:53:36.401 INFO postgresql-config-2 postgres received SIGHUP, reloading configuration files
2026-04-16T07:53:36.404 INFO postgresql-config-2 postgres parameter "work_mem" changed to "8MB"
2026-04-16T07:53:36.404 INFO postgresql-config-2 postgres parameter "cnpg.config_sha256" changed to "44cf902cab017fd0aa7e0ed149e1d779778870c5283b1dcc4af61b992…
Vérifier que la modification a bien été prise en compte en vous connectant à une des deux instances et en utilisant
show work_memdans le promptpsql.
kubectl cnpg psql postgresql-config -- -c 'show work_mem';
work_mem
----------
8MB
(1 row)
Certains paramètres PostgreSQL ne sont pas modifiables. C’est le parti pris des développeurs de CloudNativePG. La liste se trouve dans la documentation du projet.
Dans PostgreSQL, il est possible de modifier des paramètres avec
l’ordre SQL ALTER.
Se connecter à l’instance primaire.
Par exemple :
kubectl cnpg psql postgresql-config
psql (18.3 (Debian 18.3-1.pgdg13+1))
Type "help" for help.
postgres=#
Modifier le paramètre
transaction_timeoutde la basepostgresen le positionnant à 10 secondes.
ALTER DATABASE permet de modifier des paramètres spécifiquement pour la base ciblée. Tous les paramètres ne peuvent pas être modifiés de cette manière.
Vérifier la modification avec la meta-commande
\drdsqui retourne les configurations spécifiques de chaque base de données
postgres=# \drds
List of settings
Role | Database | Settings
------+----------+-------------------------
| postgres | transaction_timeout=10s
(1 row)
La configuration est bien modifiée. Désormais toutes les transactions qui s’effectueront sur cette basse profiteront de ce paramétrage.
Modifier un second paramètre avec l’ordre SQL
ALTER SYSTEM SET. Par exemple, positionner le paramètreidle_in_transaction_session_timeoutà 10 minutes.
postgres=# ALTER SYSTEM SET idle_in_transaction_session_timeout = '10m';
ERROR: ALTER SYSTEM is not allowed in this environmentLe message d’erreur est très explicite mais pour le moins étonnant.
Il faut savoir que depuis la version 17 de PostgreSQL, le paramètre
allow_alter_system existe et permet, à la discrétion des
administrateurs, d’autoriser ou non les ordres
ALTER SYSTEM.
Retrouver la valeur du paramètre
allow_alter_system.
postgres=# show allow_alter_system ;
allow_alter_system
--------------------
off
(1 row)
Par défaut, ce paramètre est à on. Vous l’aurez compris,
CloudNativePG passe ce paramètre à off pour interdire
les ordres ALTER SYSTEM et forcer la modification des
paramètres PostgreSQL à se faire de manière déclarative.
Il reste néanmoins possible de modifier ce paramètre dans la YAML du
Cluster avec le champ
.spec.postgresql.enableAlterSystem. Même si cela est
possible, il est préférable de se forcer à utiliser la définition YAML
du Cluster pour modifier la configuration globale des
instances, notamment :
Cluster ;