But : Modifier des paramètres basiques de
PostgreSQL
Notre Cluster est démarré et tout semble fonctionner
pour le mieux. Nous avons configuré la RAM et le CPU utilisables par nos
Pods. Attardons-nous maintenant à la configuration de
PostgreSQL.
En tant que DBA PostgreSQL, je veux par exemple modifier le paramètre
shared_buffers et le passer à 4 Go. La commande pour faire
cela est la suivante :
ALTER SYSTEM SET shared_buffers = '4GB' ;
Se connecter à l’instance et modifier le paramètre
shared_buffers.
kubectl cnpg psql cluster-postgresql
psql (17.6 (Debian 17.6-2.pgdg13+1))
Type "help" for help.
postgres=# ALTER SYSTEM SET shared_buffers = '4GB';
ERROR: ALTER SYSTEM is not allowed in this environment
Ce qui est normal à vrai dire. Le paramètre
show_alter_system (disponible depuis la version 17 de
PostgreSQL) empêche cela si il est passé à off.
Vérifier la valeur du paramètre allow_alter_system.
postgres= # show allow_alter_system ;
allow_alter_system
--------------------
off
(1 row )
Il est bien à off.
Par défaut, l’opérateur CloudNativePG modifie certains paramètres de
PostgreSQL et en fixe d’autres. Voir la documentation à ce sujet https://cloudnative-pg.io/docs/1.28/postgresql_conf#fixed-parameters .
Si ALTER SYSTEM n’est plus possible comment faire ?
Tout doit désormais se faire dans le fichier YAML et plus précisément
dans la section postgresql.parameters de notre objet
Cluster. Fini le temps où tout se faisait directement sur
l’instance ou dans le fichiers de configuration.
D’ailleurs, il sera fort probable que vous utilisiez des outils comme
ArgoCD, Jenkins ou autre pour déployer des ressources dans
Kubernetes.
---
apiVersion : postgresql.cnpg.io/v1
kind : Cluster
metadata :
name : cluster-postgresql
spec :
imageName : ghcr.io/cloudnative-pg/postgresql:17.6-standard-trixie
instances : 2
storage :
size : 10Gi
walStorage :
size : 5Gi
resources :
requests :
memory : 2Gi
cpu : 1
limits :
memory : 2Gi
cpu : 1
postgresql :
parameters :
shared_buffers : 4GB
Appliquer cette nouvelle définition et observer… un beau message
d’erreur.
kubectl apply -f cluster.yaml
Kubectl command failed: The Cluster "cluster-postgresql" is invalid: spec.resources.requests: Invalid value: "2Gi": Memory request is lower than PostgreSQL `shared_buffers` value
Certaines vérifications ont été mises en place dans le code de
l’opérateur pour éviter de vous retrouver avec des configurations
incohérentes.
Reprenons la définition de notre Cluster et renseigner
une valeur cohérente pour le paramètre shared_buffers.
postgresql :
parameters :
shared_buffers : 512MB
Appliquer cette nouvelle définition et observer que la prise en
compte du paramètre déclenche un redémarrage des instances du
Cluster
kubectl apply -f cluster.yaml
Par défaut l’opérateur CloudNativePG va redémarrer (ou recharger la
configuration selon le paramètre) automatiquement les instances pour la
prise en compte des nouvelles valeurs. Cette mise à jour peut se faire
automatiquement ou de manière supervisée selon la valeur du paramètre
primaryUpdateStrategy qui peut prendre deux valeurs :
unsupervised : tout est fait automatiquement. C’est la
valeur par défaut ;
supervised : une une opération manuelle est
demandée.
En mode unsupervised, le paramètre
primaryUpdateMethod est pris en compte pour savoir comment
procéder.
restart : l’instance primaire est redémarrée. C’est la
valeur par défaut ;
switchover : une bascule sur un secondaire est
effectuée et le primaire devient secondaire.
Modifier le paramètre work_mem en le passant à 8 Mo.
Observer que les instance sont rechargées mais pas redémarrées.
parameters :
shared_buffers : 512MB
work_mem : 8MB
kubectl apply -f cluster.yaml
Vous pouvez vérifier que les instances ont été rechargées en
regardant les traces d’une instance.
kubectl logs -f cluster-postgresql-1
Vous devriez trouver une ligne avec le message
"msg": "Requesting configuration reload".