Découverte de CloudNativePG

Module K1

Dalibo SCOP

26.09

10 septembre 2026

Sur ce document

Formation Module K1
Titre Découverte de CloudNativePG
Révision 26.09
PDF https://dali.bo/k1_pdf
EPUB https://dali.bo/k1_epub
HTML https://dali.bo/k1_html
Slides https://dali.bo/k1_slides
TP https://dali.bo/k1_tp
TP (solutions) https://dali.bo/k1_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale (y compris IA)
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 14 à 18.

Découverte de CloudNativePG

Objectifs

  • Prise en main de l’opérateur CloudNativePG
  • Déploiement d’instances PostgreSQL via l’opérateur
  • Tests et découvertes de fonctionnalités

Avant propos Kubernetes

Quelques explications concernant Kubernetes

  • Kubernetes, K8s
  • Orchestrateur de conteneurs
  • Initialement prévu pour des applications dites Stateless
  • De plus en plus d’applications de type base de données
Image du tutoriel Kubernetes (kubernetes.io)
  • Quelques objets basiques de Kubernetes
    • Pod : un ou plusieurs conteneurs applicatifs
    • Service : permet d’accéder durablement à un ou plusieurs Pods
    • Deployment, Secret, Configmap, …
  • Domaines spécifiques
  • Certains génériques

Installation de l’opérateur

  • Deux éléments :
    • L’opérateur (dans un ou plusieurs Pods)
    • Les Custom Resource Definitions (extension de l’API Kubernetes)
  • Installation :
    • Manifest YAML
    • Helm Chart (version packagée)
    • OLM (Operator Lifecycle Manager)
  • Un opérateur par cluster Kubernetes

Principe de fonctionnement

Travaux pratiques

Se trouvent dans le handout HTML

  • Prise en main du cluster Kubernetes
  • Installation de l’opérateur CloudNativePG

Nouvelles ressources

  • Un opérateur installé
kubectl get pod -n cnpg-system
NAME                                       READY   STATUS
cnpg-controller-manager-65bfdb64c9-nztfj   1/1     Running 
  • Quelles Custom Resources peuvent être créées ?

Cluster

  • Définition minimale d’un Cluster PostgreSQL
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgresql
spec:
  instances: 1
  storage:
    size: 2Gi
  walStorage: # Bonne pratique
    size: 2Gi
  • Il ne manquerait pas quelque chose ?

Éléments initiaux

  • Lors de la création du Cluster
  • D’autres ressources sont créées
    • Kubernetes
    • PostgreSQL
    • Certaines sont liées (Secret et ROLE)
  • PostgreSQL
    • Base de données : app
    • Rôles : app, streaming_replica
    • Règles : pg_hba, pg_ident
  • Kubernetes
    • Secrets : postgresql-app (contient le mot de passe du rôle app)
      • kubectl describe secrets postgresql-app
    • Services : postgresql-r, postgresql-ro, postgresql-rw
    • Pod(s) : où est déployé PostgreSQL

Modification des éléments initiaux

  • Modification possible de certains éléments
    • Uniquement lors du premier démarrage
  • Partie spec.bootstrap.initdb du fichier YAML du Cluster
  • La commande initdb est utilisée
spec: # Cluster
[]
  bootstrap:
    initdb:
      database: mabase
      owner: monrole
  instances: 1
  storage:
    size: 2Gi
  walStorage: # Bonne pratique
    size: 2Gi

Database

  • Définition minimale d’une Database
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
  name: mabase
spec:
  name: mabase
  owner: monrole
  ensure: present
  isTemplate: false
  cluster:
    name: postgresql

Schema

  • Pas de Custom Resource Definition
  • Déclaré dans la ressource Database
  • spec.schemas
apiVersion: postgresql.cnpg.io/v1
kind: Database
[]
spec:
  schemas:
  - name: monschema
    owner: moi
    ensure: present

DatabaseRole

  • Nouvelle Custom Resource Definition (v1.30)
  • Attention au nom
    • Bien associé à un Cluster PostgreSQL
  • Nécessite un Secret pour le mot de passe
  • Ne pas oublier de définir la databaseRoleReclaimPolicy
apiVersion: postgresql.cnpg.io/v1
kind: DatabaseRole
metadata:
  name: dalibo
spec:
  cluster:
    name: postgresql
  name: dalibo
  comment: "Utilisateur Support"
  login: true
  superuser: true
  createdb: true
  databaseRoleReclaimPolicy: delete
  passwordSecret:
    name: postgresql-dalibo # doit exister

Extensions au sein d’une Database

  • Indiquées dans le YAML
  • Présentes dans l’image utilisée
  • spec.extensions de l’objet Database
apiVersion: postgresql.cnpg.io/v1
kind: Database
[]
spec:
  extensions:
  - name: vector
    ensure: present

Ajout dynamique d’extensions

  • Version 1.27+ de l’opérateur
  • Version 18+ de PostgreSQL
    • Nouveau paramètre GUC extension_control_path
  • Images externes à gérer
  • Peuvent être ajoutées après le déploiement
spec:
  postgresql:
    extensions:
      - name: ext
        image:
          reference: maregistry/monimage:tag # image dédiée

Tablespace

  • Pas de Custom Resource Definition
  • Déclaré dans la ressource Cluster
  • spec.tablespaces
spec: # Cluster
[]
  tablespaces:
    - name: data
      storage:
        size: 1Gi
      owner: dalibo
    - name: fast
      storage:
        size: 2Gi
        storageClass: fast
      owner:
        name: dalibo

Configuration de l’instance

  • Déclaratif, tout se fait en YAML
  • Accès direct aux fichiers interdit !
    • postgresql.conf
    • pg_hba.conf
    • pg_ident.conf

postgresql.conf

  • Tous les paramètres ne sont pas modifiables
  • ALTER SYSTEM désactivé
    • allow_alter_system à false (v17+)
  • Des vérifications sont mises en place
  • Redémarrage ou rechargement automatique
    • Un garde-fou existe (primaryUpdateStrategy)

pg_hba.conf et pg_ident.conf

  • Pré-configurés
    • FIXED RULES, DEFAULT-RULES
  • Dans la définition du Cluster
    • USER-DEFINED RULES
  • Reconfiguration dynamique du pg_hba.conf
[]
postgresql:
  pg_hba:
    - host app 10.244.0.0/16 scram-sha-256
[]

Travaux pratiques

  • Déploiement d’instances PostgreSQL
  • Éléments initiaux

Administration de l’instance

  • Plugin kubectl
  • Connexion
  • Traces
  • Réplication
  • Archivage
  • Sauvegarde
  • Restauration
  • Montée de version de PostgreSQL
  • Montée de version de CloudNativePG
  • Hibernation et fencing

Plugin kubectl

  • kubectl cnpg --help
  • Ligne de commande écrite en Go
  • Interaction avec l’opérateur, un Cluster, une instance spécifique
  • Commandes :
    • status
    • psql
    • promote
    • backup
    • logs
    • reload
    • restart

Connexion

  • Plus d’accès au serveur
    • Comme avec du PGaaS
  • Question d’accessibilité
    • en interne
    • depuis l’extérieur
  • Offuscation des adresses IP dans les traces PostgreSQL
    • %h du paramètre log_line_prefix

Traces

  • Format JSON
  • Un seul flux pour différents logger, pas que PostgreSQL
  • Sortie standard du Pod
  • Certains paramètres log_* non modifiables
  • Outil de centralisation de traces obligatoire (Loki, Fluentd, …)
  • Exploitables par pgBadger

Traces

{
  "level": "info",
  "ts": "2026-03-20T13:10:03.114096395Z",
  "logger": "postgres",
  "msg": "record",
  "logging_pod": "postgresql-prod-1",
  "record": {
    "log_time": "2026-03-20 13:10:03.113 UTC",
    "process_id": "36",
  […]
  }
}
  • Parfois emballées dans du JSON

Réplication

  • Mise en place facilitée

    • instances: N
    • 1 primaire et N-1 secondaires
  • Streaming Replication

  • Slot de réplication créé par défaut

  • Asynchrone par défaut

Travaux pratiques

  • Déploiement d’une instance secondaire
  • Tests de bascules

Archivage et Sauvegarde - Introduction

  • Nécessite un plugin
  • Un seul proposé Barman Cloud Plugin
  • D’autres arriveront (pgBackRest…)

Plugin de sauvegarde

  • Indiqué dans le Cluster
  plugins:
  - name: barman-cloud.cloudnative-pg.io
    isWALArchiver: true
    parameters:
      barmanObjectName: objectstore-demo  

Hibernation et fencing

  • Hibernation
    • Arrêter le Pod en conservant les volumes
    • Déclarative ou via le plugin cnpg
  • Fencing
    • Arrêter uniquement le service postmaster

Conclusion

  • Un opérateur complet, open-source, communautaire
  • Déploiement et configuration facilités
  • Approche déclarative
  • Nouveaux mécanismes et configuration à connaitre
  • Connaissance de PostgreSQL nécessaire

Questions

N’hésitez pas, c’est le moment !

Quiz

Travaux pratiques

La version en ligne des solutions de ces TP est disponible sur https://dali.bo/k1_solutions.

Travaux pratiques (solutions)