PostgreSQL & Kubernetes avec CloudNativePG

Formation CNPG1

Dalibo SCOP

26.09

10 septembre 2026

Sur ce document

Formation Formation CNPG1
Titre PostgreSQL & Kubernetes avec CloudNativePG
Révision 26.09
ISBN N/A
PDF https://dali.bo/cnpg1_pdf
EPUB https://dali.bo/cnpg1_epub
HTML https://dali.bo/cnpg1_html
Slides https://dali.bo/cnpg1_slides

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.

Introduction à PostgreSQL et CloudNativePG

Au menu

  • Le projet PostgreSQL
    • Introduction et version
  • PostgreSQL dans Kubernetes
    • Introduction aux opérateurs et à CloudNativePG

Un peu d’histoire…

  • La licence
  • L’origine du nom
  • Les origines du projet
  • Les principes

Licence

  • Licence PostgreSQL
  • Droit, sans coûts de licence, de :
    • utiliser, copier, modifier, distribuer (et même revendre)
  • Reconnue par l’Open Source Initiative
  • Utilisée par un grand nombre de projets de l’écosystème

PostgreSQL ?!?!

  • 1985 : Michael Stonebraker recode Ingres
  • post « ingres » postingres postgres
  • postgres PostgreSQL

Principes fondateurs

  • Sécurité des données (ACID)
  • Respect des normes (ISO SQL)
  • Portabilité
  • Fonctionnalités intéressant le plus grand nombre
  • Performances
    • si pas de péril pour les données
  • Simplicité du code
  • Documentation
  • Tests fonctionnels

Origines

  • Années 1970 : Michael Stonebraker développe Ingres à Berkeley
  • 1985 : Postgres succède à Ingres
  • 1995 : Ajout du langage SQL
  • 1996 : Libération du code : Postgres devient PostgreSQL
  • 1996 : Création du PostgreSQL Global Development Group

Apparition de la communauté internationale

  • ~ 2000: Communauté japonaise (JPUG)
  • 2004 : PostgreSQLFr
  • 2006 : SPI
  • 2007 : Communauté italienne
  • 2008 : PostgreSQL Europe et US
  • 2009 : Boom des PGDay
  • 2011 : Postgres Community Association of Canada
  • 2017 : Community Guidelines
  • …et ça continue

Progression du code

  • 1,9 millions de lignes
    • ¼ de commentaires
    • le reste surtout en C
  • Nombres de commit par mois :
Évolution du nombre de commit dans le dépôt PostgreSQL

Les versions de PostgreSQL

Quelle version utiliser ?

  • Historique
  • Numérotation
  • Mises à jour mineures et majeures
  • Les versions courantes
  • Quelle version en production ?
  • Forks & dérivés

Historique

Versions & fonctionnalités

  • 1996 : v6.0 -> première version publiée
  • 2003 : v7.4 -> première version réellement stable
  • 2005 : v8.0 -> arrivée sur Windows
  • 2008 : v8.3 -> performances et fonctionnalités, organisation (commitfests)
  • 2010 : v9.0 -> réplication physique
  • 2016 : v9.6 -> parallélisation
  • 2017 : v10 -> réplication logique, partitionnement déclaratif
  • 2025 : v18 -> performances, fonctionnalités, administration…

Numérotation

  • Version récentes (10+)
    • X : version majeure (10, 11, … 18)
    • X.Y : version mineure (14.19, 17.6)
  • Avant la version 10 (toutes périmées !)
    • X.Y : version majeure (9.4, 9.6)
    • X.Y.Z : version mineure (9.6.24)

Mises à jour mineure

De M.m à M.m+n :

  • En général chaque trimestre
  • Et sans souci
    • Release notes
    • tests
    • mise à jour des binaires
    • redémarrage

Versions courantes

  • 1 version majeure par an
    • maintenue 5 ans
  • Dernières mises à jour mineures
  • Prochaine sortie de versions mineures prévue : 12 novembre 2026

Versions 9.4 à 11

  • jsonb
  • Row Level Security
  • Index BRIN, bloom
  • Fonctions OLAP
  • Parallélisation
  • SQL/MED : accès distants
  • Réplication logique
  • Partitionnement déclaratif
  • Réduction des inconvénients de MVCC
  • JIT
  • Index couvrants

Version 12

  • Octobre 2019 - Novembre 2024 (n’est plus supportée !)
  • Amélioration du partitionnement déclaratif
  • Amélioration des performances
    • sur la gestion des index
    • sur les CTE (option MATERIALIZED)
  • Colonnes générées
  • Nouvelles vues de visualisation de la progression des commandes
  • Refonte de la configuration de la réplication

Version 13

  • Septembre 2020 - Novembre 2025
  • Améliorations :
    • partitionnement déclaratif
    • réplication logique
  • Amélioration des performances :
    • index B-tree, objet statistique, tri et agrégat
  • Amélioration de l’autovacuum et du VACUUM :
    • gestion complète des tables en insertion seule
    • traitement parallélisé des index lors d’un VACUUM
  • Amélioration des sauvegardes :
    • génération d’un fichier manifeste, outil pg_verifybackup
  • Nouvelles vues de progression de commandes :
    • pg_stat_progress_basebackup, pg_stat_progress_analyze

Version 14

  • Septembre 2021 - Novembre 2026
  • Nouvelles vues système & améliorations
    • pg_stat_progress_copy, pg_stat_wal, pg_lock.waitstart, query_id
  • Lecture asynchrone des tables distantes
  • Paramétrage par défaut adapté aux machines plus récentes
  • Améliorations diverses :
    • réplications physique et logique
    • quelques facilités de syntaxe (triggers, tableaux en PL/pgSQL)
  • Performances :
    • connexions en lecture seule plus nombreuses
    • index…

Version 15

  • Octobre 2022 - Novembre 2027
  • Nombreuses améliorations incrémentales
    • dont en réplication logique
  • Commande MERGE
  • Performances :
    • DISTINCT parallélisable
    • pg_dump & sauvegardes, recovery, partitionnement
  • Changements notables :
    • public n’est plus accessible en écriture à tous
    • sauvegarde PITR exclusive disparaît

Version 16

  • Septembre 2023 - Novembre 2028
  • Plus de tris incrémentaux (DISTINCT…)
  • Réplication logique depuis un secondaire
  • Expressions régulières dans pg_hba.conf
  • Vues systèmes améliorées : pg_stat_io
  • Compression lz4 ou zstd pour pg_dump
  • Optimisation et améliorations diverses (parallélisation…)

Version 17

  • Septembre 2024 - Novembre 2029
  • Améliorations du VACUUM
  • Planificateur : IN et CTE
  • BRIN : création parallélisée
  • JSON_TABLE
  • Sauvegarde incrémentale (pg_basebackup + pg_combinebackup)
  • Améliorations en réplication logique (pg_createsubscriber)
  • pg_dump --filter
  • Imports (COPY peut rejeter des lignes, MERGE)
  • Améliorations diverses

Version 18

  • Septembre 2025 - Novembre 2030
  • checksums par défaut
  • I/O asynchrones
  • Maintien des statistiques lors d’une migration
  • Colonnes virtuelles calculées
  • Améliorations diverses

Petit résumé

  • Versions 7.x :
    • fondations
    • durabilité
  • Versions 8.x :
    • fonctionnalités
    • performances
  • Versions 9.x :
    • réplication physique
    • extensibilité
  • Versions 10 à 18 :
    • réplication logique
    • parallélisation
    • partitionnement
    • maintenabilité
    • performances

Quelle version utiliser en production ?

Au premier semestre 2025 :

  • 13 et inférieures
    • Danger !
    • planifier une migration urgemment !
  • 14, 15, 16
    • OK pour la production
    • ne pas oublier les mises à jour mineures
  • Nouvelles installations
    • 17 ou 18
  • Nouveaux développements
    • 18
  • https://www.postgresql.org/about/featurematrix

Version officielle de PostgreSQL

Une seule version officielle de PostgreSQL existe, celle publiée par le PGDG. Elle est communautaire.

Il existe de nombreuses versions dérivées.

Versions dérivées

Entre de nombreux autres :

  • Compatibilité Oracle :
    • EnterpriseDB
  • Data warehouse :
    • Greenplum, Netezza
  • Dans le cloud :
    • Amazon RedShift, Aurora, Neon…
    • attention : support, extensions…
  • Extensions :
    • Citus
    • timescaledb
  • Packages avec des outils & support
  • Bases compatibles

Introduction à CloudNativePG

  • Des données dans Kubernetes ?!
  • Nouvelles opportunités pour PostgreSQL
  • Juste un effet de mode ?

Des données dans Kubernetes ?!

  • Pas une évidence
  • Habituellement du stateless
  • Apparition des StatefulSet
  • Couche supplémentaire, complexité

Nouvelles opportunités pour PostgreSQL

  • Serveurs physiques, machines virtuelles, offres managées, …
  • Et maintenant conteneurisées
  • PostgreSQL s’adapte à tous les environnements

Juste un effet de mode ?

Allons plus loin

  • Déployer PostgreSQL dans Kubernetes
  • Principe d’un opérateur
  • L’opérateur CloudNativePG

Déployer PostgreSQL dans Kubernetes

  • Images contenant les binaires PostgreSQL

Déployer PostgreSQL dans Kubernetes

  • Création des ressources Kubernetes
    • Pod, Service, Persistent Volume, …

Quid du passage à l’échelle ?

  • Réutiliser les définitions de ressources
  • Automatisation des déploiements
  • Templating, permet de multiplier les déploiements
    • Par exemple Helm Chart

A chart is a collection of files that describe a related set of Kubernetes resources.

Spécificités propres à PostgreSQL

  • Configuration
  • Instances secondaires et réplication
  • Sauvegardes
  • Montées de versions
  • Extensions
  • Haute disponibilité et bascule automatique

La solution …

  • … doit :
    • Créer les ressources pour nous
    • Connaître et gérer les spécificités de PostgreSQL
    • Gérer tout le cycle de vie d’une instance
    • Fournir des images

Les opérateurs Kubernetes

  • Pour tous les domaines
    • Bases de données (PostgreSQL, Elasticsearch, …)
    • Réseau (Kong, MetalLB, …)
    • Monitoring (Prometheus, Datadog, …)
    • Stockage (Ceph, Minio, …)
  • https://operatorhub.io/

Principe d’un opérateur

  • Deux composants principaux :
    1. Des nouvelles ressources : extension de l’API Kubernetes (CRD)
    2. Un controller : le cerveau de l’histoire
  • Il va nous aider :
    • À déployer les ressources
    • À assurer le bon fonctionnement de PostgreSQL

Gestion déclarative

  • Fichiers YAML
  • Descriptif, l’opérateur le faire pour nous
    • Même idée qu’Ansible, OpenTofu, …
  • État désiré <-> État actuel
  • Boucle de réconciliation

Opérateurs PostgreSQL

  • Maturité variable en fonction des projets
  • Des spécificités à étudier
    • Extensions PostgreSQL
    • Licence
    • Patroni / Kubernetes
    • Outils de sauvegarde

L’opérateur CloudNativePG

  • https://cloudnative-pg.io
  • Débuté par 2ndQuadrant puis EDB Libéré en 2022
  • Open Source
  • Gouvernance similaire au projet PostgreSQL
  • Intégré à la Cloud Native Computing Foundation (CNCF) depuis 2025

Adoption

  • L’engouement est particulièrement fort pour CloudNativePG

Ce que permet CloudNativePG

  • Mise à disposition des images
  • Déploiements facilités
  • Gestion déclarative
    • d’instances, de bases de données, …
  • Mise en place de réplication automatique
    • par streaming replication
  • Archivage des journaux de transactions
    • via un outil tiers
  • Sauvegardes PITR, sauvegardes planifiées
  • Bascule automatique ou manuelle
  • Haute disponibilité, hibernation, fencing, plugin kubectl, …

Tout ceci sera détaillé au fur et à mesure des modules, n’ayez crainte !

Versions supportées

  • PostgreSQL
    • 14, 15, 16, 17 et 18 (juin 2026)
    • Versions majeures supportées par le PGDG
  • CloudNativePG
    • 1.29 et 1.30 (juin 2026)
    • 2 versions supportées en même temps
    • Uniquement des versions de PostgreSQL supportées
  • Sans oubliez les versions Kubernetes

Exemple de chronologie

Les images fournies

  • Pod CloudNativePG
    • ghcr.io/cloudnative-pg/cloudnative-pg:1.30.0
  • Pod PostgreSQL
    • ghcr.io/cloudnative-pg/postgresql
    • Tag minimal ou standard avec OS
      • 18.1-minimal-trixie
  • Images personnalisées

Conclusion

  • PostgreSQL
    • 30 ans d’existence
    • Robuste et performant
    • Déployable à peut-prêt n’importe où
  • CloudNativePG
    • Nouveau dans le paysage de PostgreSQL
    • Vrai opérateur Open Source
    • Fort engouement

Questions

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

Quiz

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 !

Travaux pratiques

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

Travaux pratiques (solutions)

Quiz

Configuration et gestion des ressources

Introduction

  • CloudNativePG automatise le déploiement pour nous
  • Quid de la configuration des ressources ?
  • Adapter la configuration PostgreSQL est indispensable

Au menu

  • Notions de base des ressources d’un Pod
  • Configuration dans la ressource Cluster et de l’opérateur
  • Quality of Service Class d’un Pod
  • Configuration des instances PostgreSQL

D’abord sur Kubernetes

Configuration des ressources

  • RAM, CPU
  • et les Huge Pages si activées
  • Configuration optionnelle

Configuration des ressources avec CloudNativePG

  • Section spec.resources d’un objet Cluster
    • requests et limits
  • Allouées à chaque Pod
    • Pour PostgreSQL…
    • …mais pas que
      • instance-manager
      • autres outils ?
  • Identiques pour les primaires et secondaires

Exemple de Cluster configuré

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
[]
spec:
[]
  resources:
    requests:
      memory: "2Gi"
      cpu: "0.2"
    limits:
      memory: "2Gi"
      cpu: "0.2"

Configuration des ressources de l’opérateur

  • Pod dans le Namespace cnpg-system
  • On peut donc lui attribuer des ressources
  • Une configuration par défaut existe
    Limits:
      cpu:     100m
      memory:  200Mi
    Requests:
      cpu:      100m
      memory:   100Mi

QoS Class

  • Quality of Service Class
    • Guaranteed
    • Burstable
    • Best Effort
  • Associée à chaque Pod
  • Selon les requests/limits attribuées

Puis sur PostgreSQL

Configuration des instances PostgreSQL

  • Avoir PostgreSQL adapté aux ressources attribuées
  • Configuration par défaut
    • Fixed Parameters
  • Reconfiguration minimale de certains paramètres
  • Rappel :
    • Tout faire dans la ressource Cluster

Configuration par défaut

  • Chaque paramètre PostgreSQL a une valeur par défaut
  • Peuvent être modifiés à différents endroits :
    • options passées à initdb (section boostrap)
    • surcharge par l’opérateur CloudNativePG
    • scripts maisons

Fixed Parameters

  • Impossible à modifier

    Can't set fixed configuration parameter
  • Assurer la gestion de l’instance par l’opérateur

  • Des paramètres peu modifiés en général

Reconfiguration minimale de certains paramètres

  • Adapter vos instances
    • aux ressources
    • à votre infrastructure
    • à vos besoins

Paramètres mémoire

  • Mémoire partagée
    • shared_buffers
  • Mémoire de travail
    • work_mem
    • maintenance_work_mem

Paramètres des journaux de transaction et disque

  • wal_level
  • effective_io_concurrency

Paramètres du planificateur

  • effective_cache_size
  • random_page_cost

Paramètres de parallélisation

  • max_parallel_workers
  • max_worker_processes

Conclusion

  • Configuration
  • Adaptation
  • Attention, des choses restent à faire !

Questions

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

Travaux pratiques

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

Travaux pratiques (solutions)

Quiz

Sauvegarder nos Clusters

Introduction

  • Sauvegardes de nos Clusters
  • Politique de sauvegarde

Au menu

  • Rappel
    • Journalisation
  • Sauvegardes PostgreSQL
    • Logique
    • Physique
      • PITR
  • Méthode de sauvegardes de CloudNativePG
    • Plugin
    • VolumeSnapshot
  • Politique de sauvegarde
    • RTO, RPO

Principe de la journalisation

Intégrité & durabilité

  • Intégrité : la base reste cohérente malgré :
    • arrêt brutal des processus
    • crash machine
  • Durabilité garantie si COMMIT
  • Écriture des modifications dans un journal avant les fichiers de données
  • WAL : Write Ahead Logging

Journaux de transaction (rappels)

Essentiellement :

  • pg_wal/ : journaux de transactions
    • sous-répertoire archive_status
    • nom : timeline, journal, segment
    • ex : 00000002 00000142 000000FF
  • pg_xact/ : état des transactions
  • Ces fichiers sont vitaux !
  • Utiles pour le PITR

Sauvegardes PostgreSQL

  • Deux types, complémentaires
    • Logiques
    • Physiques
      • PITR
  • Outils différents
  • Cas d’usage différents
  • Complexités différentes

Choisir celle qui convient à votre besoin.

Sauvegardes logiques

  • Sauvegarde d’une base, d’un schéma, d’une table…
  • À chaud et cohérente
  • Pas d’impact sur les lecteurs / écrivains
  • 2 outils (contrib)
    • pg_dump
    • pg_dumpall
  • Jamais inclus :
    • tables systèmes
    • fichiers de configuration

Sauvegardes physiques

  • Sauvegarde de l’instance complète
  • À chaud ou à froid
  • Attention à la cohérence des données
  • Ne pas oublier
    • Les fichiers de configuration
    • Les Tablespaces
    • Les journaux de transactions

La cohérence est garantie grâce aux WAL

Sauvegarder avec CloudNativePG

  • Déclarativement
    • Sauvegarde physique uniquement
  • Nouvelles CRD Backup et ScheduledBackup
  • 2 méthodes
    • Object Storage (avec un Plugin)
    • Volume Snapshot
  • Configuration spec.backup d’un objet Cluster

Première méthode - Sauvegarde sur stockage objets

  • Méthode dépendante d’un plugin de sauvegarde
  • Nécessite un stockage objets (S3, Azure Blob…)
  • Sauvegarde à chaud, PITR
spec: # Cluster
  plugins:
  - name: barman-cloud.cloudnative-pg.io # Le plugin à utiliser
    isWALArchiver: true
    parameters:
      barmanObjectName: scaleway-store

Plugin Barman Cloud - ObjectStore

  • Installation propre
  • Nouvelle CRD ObjectStore
    • Emplacement de stockage
    • Informations de connexion
  • Stockage objet
    • Amazon S3 (ou compatible S3), Google Cloud Storage, Azure Blob Storage
  • Réutilisable
apiVersion: barmancloud.cnpg.io/v1
kind: ObjectStore
metadata:
  name: scaleway-store
spec:
  configuration:
      destinationPath: "s3://<bucket>/<folder>/"
      endpointURL: "https://s3.<region>.scw.cloud" 
      s3Credentials:
        accessKeyId:
          name: scaleway-api-secret
          key: ACCESS_KEY_ID
        secretAccessKey:
          name: scaleway-api-secret
          key: ACCESS_SECRET_KEY
        region:
          name: scaleway-api-secret
          key: ACCESS_REGION

Deuxième méthode - Volume Snapshot Kubernetes

  • Fonctionnalité Kubernetes (API)
  • spec.backup.method: volumeSnapshot
  • Dépend de
    • StorageClass
    • Container Storage Interface
  • Sauvegarde à chaud ou à froid

Ressource Backup

  • Custom Resource Definition
  • Définit l’exécution d’une sauvegarde
apiVersion: postgresql.cnpg.io/v1
kind: Backup
metadata:
  name: masauvegarde
spec:
  method: plugin # ou volumeSnapshot
  cluster:
    name: postgresql

Ressource ScheduledBackup

  • Custom Resource Definition
  • Définit la planification de sauvegardes
  • Une ressource Backup créée à chaque exécution
apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
  name: masauvegardequotidienne
spec:
  schedule: "0 0 20 * * *"
  backupOwnerReference: self
  method: plugin # ou volumeSnapshot
  cluster:
    name: postgresql

Archivage

  • Activé par défaut (archive_mode à on)
  • archive_command :
    • /controller/manager wal-archive …
  • Non modifiable
  • Nécessite un stockage de type S3, object storage
  • Utilisé pour les sauvegardes PITR
  • Se repose sur le plugin (isWALArchiver)

Travaux pratiques

  • Mise en place d’une sauvegarde PITR

Restauration

  • Création d’une nouvelle instance
    • Pas de restauration In-Place
  • À partir d’une sauvegarde physique
    • spec.bootstrap.recovery
      • barmanObjectStore
      • volumeSnapshots
  • PITR supporté
  • Indiquer le plugin à utiliser

Travaux pratiques

  • Procéder à une restauration PITR

Questions

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

Travaux pratiques

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

Travaux pratiques (solutions)

Quiz

PostgreSQL : Politique de sauvegarde

Introduction

  • Le pire peut arriver
  • Politique de sauvegarde

Au menu

  • Objectifs
  • Approche
  • Points d’attention

Définir une politique de sauvegarde

  • Pourquoi établir une politique ?
  • Que sauvegarder ?
  • À quelle fréquence sauvegarder les données ?
  • Quels supports ?
  • Quels outils ?
  • Vérifier la restauration des sauvegardes

Objectifs

  • Sécuriser les données
  • Mettre à jour le moteur de données
  • Dupliquer une base de données de production
  • Archiver les données

Différentes approches

  • Sauvegarde à chaud en SQL (ou logique)
  • Sauvegarde physique des fichiers à froid
  • Sauvegarde à chaud des fichiers + journaux
    • niveau baie
    • pg_basebackup
  • Sauvegarde physique & PITR

RTO/RPO

La politique de sauvegarde découle du :

  • RPO (Recovery Point Objective) : Perte de Données Maximale Admissible
    • faible ou importante ?
  • RTO (Recovery Time Objective) : Durée Maximale d’Interruption Admissible
    • courte ou longue ?

Industrialisation

  • Évaluer les coûts humains et matériels
  • Intégrer les méthodes de sauvegardes avec le reste du SI
    • sauvegarde sur bande centrale
    • supervision
    • plan de continuité et de reprise d’activité

Documentation

  • Documenter les éléments clés de la politique :
    • perte de données
    • rétention
    • durée de restauration
  • Documenter les processus de sauvegarde et restauration
  • Imposer des révisions régulières des procédures

Règles 3-2-1 et 3-2-1-1-0

  • 3 exemplaires des données
  • 2 sur différents médias
  • 1 hors site
  • 1 stockage immuable (hors ligne ?)
  • 0 sauvegarde non testée
  • RAID & réplication ne sont pas des sauvegardes !
  • Le cloud n’est pas une solution magique !
    • perte de datacenters
    • ransomwares

Fichiers de configuration

  • Sauvegarder les fichiers de configuration
  • Et vos scripts
    • paramétrage
    • sauvegarde
    • maintenance

Tester la restauration

  • De nombreuses catastrophes auraient pu être évitées avec un test
  • Validation de la procédure
  • Estimation de la durée

Conclusion

  • Les techniques de sauvegarde de PostgreSQL sont :
    • complémentaires
    • automatisables
  • La maîtrise de ces techniques est indispensable pour assurer un service fiable.
  • Testez vos sauvegardes !

Quiz

Supervision et Troubleshooting

Introduction

  • Deux types de supervision
    • occasionnelle
    • automatique
  • Superviser PostgreSQL et le système
  • Superviser l’opérateur

Au menu

  • Supervision PostgreSQL
    • Informations internes
    • Traces
  • Sondes externes
    • check_pgactivity
  • Outils CloudNativePG
    • Exporter Prometheus
    • Dashboard Grafana
  • Troubleshooting
    • Commandes à connaître

Informations internes

  • PostgreSQL propose :
    • de nombreuses statistiques d’activité
    • de nombreuses informations dans les traces
    • de nombreuses vues
  • … mais rien pour les historiser
  • CloudNativePG … non plus !

pg_stat_activity

  • Tracer l’activité :
    • track_activities = on (défaut)
  • pg_stat_activity affiche
    • les requêtes
    • les processus
    • les Wait Event
    • les Backend Type
  • Nombreuses informations

pg_stat_archiver

  • Compteur d’activité de l’archiver
  • S’assurer du bon fonctionnement
  • Diagnostiquer

pg_stat_user_tables

  • Compteur d’utilisation d’une table
    • seq_scan, idx_scan
  • Statistique sur le contenu
    • n_live_tup, n_dead_tup, n_tup_ins, n_tup_upd, n_tup_del
    • Utile pour l’autovacuum
  • Horodatage
    • last_vacuum, last_autovacuum, last_analyze, last_autoanalyze

pg_stats

  • Statistiques sur les données des
    • Tables
    • Vues matérialisées
  • Statistiques utilisées par le planificateur
  • Utile pour diagnostiquer des problèmes de planification

La liste des vues est longue

  • pg_statio_user_tables
  • pg_stat_database
  • pg_stat_user_indexes
  • pg_stat_wal_receiver
  • pg_stat_checkpointer
  • pg_stat_database_conflicts

Traces PostgreSQL

  • Contient des informations précieuses
    • si correctement configurées
  • Traces des requêtes
    • durée, fichiers temporaires
  • Traces d’évènements
    • erreurs, redémarrages, verrous
  • Une vrai mine d’or à exploiter

Rappels

  • CloudNativePG fixe certains paramètres
    • log_destination, log_directory, log_file_mode, log_filename, …
  • Format JSON sur la sortie standard
  • Aucun paramètre sur le contenu des traces n’est modifié par défaut

Niveau des traces

  • log_min_messages
    • défaut : panic / fatal / log / error / warning
  • log_min_error_statement
    • défaut : error (ou warning)

Tracer les requêtes et leur durée

  • Toutes les requêtes :
    • log_min_duration_statement (ex : 1s)
    • ou log_statement + log_duration
  • Extrait aléatoire :
    • log_transaction_sample_rate
    • log_statement_sample_rate + log_min_duration_sample

Configuration : tracer certains comportements

  • log_connections + log_disconnections
  • log_autovacuum_min_duration
  • log_checkpoints
    • time ou wal ?
  • log_lock_waits (mini 1s)
    • verrous en attente

Repérer les fichiers temporaires

  • Exemple :
LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp9894.0",
      size 26927104
  • log_temp_files : à activer !
  • Cause : tris, agrégats, jointures…
  • Alerte : problème potentiel de performances

Cas particulier : log_line_prefix

  • log_line_prefix
    • Fréquemment modifié
    • Permet d’ajouter des informations
    • Habituellement conseillé : %t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h
  • Inutile avec CloudNativePG
    • log_destination à csvlog
  • Transformation CSV en JSON

Sondes externes

  • Permet des vérifications
    • plus précises
    • propres au métier
  • check_pg_activity
    • script de monitoring PostgreSQL pour Nagios-like
    • utilisable indépendamment de CloudNativePG
  • Développé initialement par Dalibo
  • https://github.com/OPMDG/check_pgactivity

Outils CloudNativePG

  • Exporte des métriques prédéfinies, format Prometheus
    • Sur l’opérateur
    • Sur PostgreSQL
    • ConfigMap par défaut cnpg-default-monitoring
    • Métriques PostgreSQL, métriques Golang
  • Permet de définir des métriques maisons
  • S’intègre facilement avec Grafana

Métriques prédéfinies

  • Pod PostgreSQL
    • curl http://127.0.0.1:9187/metrics
    • Métriques PostgreSQL
    • Métriques Golang
  • Pod de l’opérateur
    • curl http://127.0.0.1:8080/metrics
  • ConfigMap cnpg-default-monitoring
  • Mise en cache de 30s

Métriques personnalisées

  • Besoins spécifiques
  • ConfigMap
  • spec.monitoring du Cluster
  • Attention à la complexité des requêtes !

Dashboard Grafana

  • Collecter les données
    • À vous de le faire
  • Les afficher
    • À vous de le faire
    • Un dashboard Grafana (#20417) existe !
    • Le compléter avec vos propres graphiques

Troubleshooting

  • PostgreSQL et CloudNativePG
  • Quelques commandes
  • Cas typiques

Quelques commandes - CloudNativePG

  • Plugin cnpg pour kubectl
    • Permet d’intéragir avec un Cluster
    • De nombreuses sous-commandes

Commande status

kubectl cnpg status CLUSTER
  • État connu du Cluster
  • Primaire, secondaire, réplication, lag, …
  • Bon point de départ

Commande report

kubectl cnpg report cluster CLUSTER --logs -f report.zip
kubectl cnpg report operator -n NAMESPACE --logs -f report_cnpg.zip
  • Crée une archive (.zip) d’un Cluster ou de l’opérateur
    • définitions YAML (manifests)
    • traces des Pods (logs)
  • Pratique à envoyer à un support

Commande fencing

kubectl cnpg fencing on CLUSTER ID -- une instance
kubectl cnpg fencing on CLUSTER "*" -- toutes les instances
  • Arrête le service postmaster
  • Pod toujours en cours d’exécution
  • Pas de failover si l’instance primaire est fenced

show

SHOW parametre;
  • Retourne la valeur du paramètre
  • Utile pour s’assurer de la valeur prise en compte

pg_is_in_recovery

select pg_is_in_recovery();
  • Savoir si l’instance est en recovery
  • true ou false
  • Déduire le type d’instance (primaire, secondaire)

pg_cancel_backend

SELECT pg_cancel_backend(pid) ;
  • Annuler une requête
SELECT pg_terminate_backend(pid, timeout) ;
  • Fermer une connexion

pg_ls_dir et pg_ls_waldir

SELECT pg_ls_dir(path);
  • Dossier quelconque
SELECT pg_ls_waldir();
  • Dossier pg_wal

  • Utiles sans accès au système de fichiers

Cas typiques

  • Incidents classiques
  • Des problèmes déjà rencontrés

Saturation de l’espace disque

  • Système de fichiers saturé
  • pg_wal saturé :
    • Blocage de l’instance
  • Le volume doit être agrandi

Décrochage du secondaire

  • Secondaire arrêté longtemps
  • Réplication en pause
  • Pas de slot de réplication ou paramètre max_slot_wal_keep_size dépassé
  • Redémarrage du secondaire
  • Impossible de raccrocher le primaire

Questions

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

Travaux pratiques

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

Travaux pratiques (solutions)

Quiz

Les montées de versions avec CloudNativePG

Introduction

  • Environnement Kubernetes
    • Jongler avec les versions
      • PostgreSQL : 5 supportées
      • CloudNativePG : 2 supportées
      • Kubernetes : 3 supportées
  • Releases très fréquentes
  • Interruptions de services à prévoir

Exemple de chronologie (Rappel)

Au menu

  • Montées de versions PostgreSQL
    • Mineures
    • Majeures
  • Montées de versions de l’opérateur
  • Quelques mots sur les montées de versions Kubernetes

Releases PostgreSQL

Rappel PostgreSQL

  • Versions PostgreSQL
    • X : version majeure (10, 11, … 18)
      • 1 par an, 5 supportées
    • X.Y : version mineure (14.19, 17.6)
      • Chaque trimestre

Rappel CloudNativePG

  • 2 versions supportées en même temps
    • Uniquement des versions de PostgreSQL supportées

Montées de version avec CloudNativePG

  • « Déclarativement »
  • Version PostgreSQL indiquée dans :
    • imageName du Cluster
    • images du ImageCatalog ou ClusterImageCatalog
  • Version mineure
  • Version majeure (In-Place)
  • Rolling Update

Montée de version mineure

  • Version mineure
  spec:
-    imageName: ghcr.io/cloudnative-pg/postgresql:18.0-standard-trixie
+    imageName: ghcr.io/cloudnative-pg/postgresql:18.1-standard-trixie
  • Ou ImageCatalog / ClusterImageCatalog
  • Mode Rolling Update
    • Les instances secondaires d’abord

Montée de version majeure

  • Plusieurs méthodes
    • pg_dump/pg_restore
    • In-Place Major Upgrade (v1.26+)
      • Offline avec pg_upgrade
    • Réplication logique
      • En live
      • Plus complexe
  • Avec ou sans CloudNativePG

Montée de version majeure - In-Place Major Upgrade

  • CloudNativePG v1.26+
  • Instances arrêtées
  • Même OS (dans l’image)
  • Pas de Rolling Update
    • Primaire puis recréation des secondaires
  • Une sauvegarde avant l’opération !

Montée de version majeure - bootstrap.initdb.import

  • pg_dump/pg_restore
  • Le plus simple
    • Plus ou moins long
  • via bootstrap.initdb.import
  • Plusieurs types :
    • microservice ou monolith
  • Nouvelle ressource Cluster
    • externalClusters dans sa définition YAML

Montée de version majeure - bootstrap.initdb.import

  • Deux méthodes :
    • monolith
      • Une ou plusieurs bases
      • Un ou plusieurs rôles
    • microservice
      • Uniquement 1 base
  • pg_dump -Fd
    • Stocké temporairement dans le volume PGDATA

Montée de version majeure - bootstrap.initdb.import

  • spec.externalClusters
    • Indique l’instance PostgreSQL où se trouve la ou les bases
spec:
[]
  externalClusters:
    - name: cluster-ancienne-version
      connectionParameters:
        host: 10.20.30.40
        user: postgres
        dbname: postgres
      password:
        name: cluster-ancienne-version-superuser # un Secret doit exister
        key: password      

Montée de version de l’opérateur

  • L’opérateur et les Custom Resource Definitions
  • L’instance-manager
  • Redémarrage des instances
  • Étalement des redémarrages dans le temps
    • CLUSTERS_ROLLOUT_DELAY
    • INSTANCES_ROLLOUT_DELAY

Stratégie de mise à jour

  • primaryUpdateStrategy et primaryUpdateMethod
    • Montées de version mineure
    • Changement de configuration

Mises à jour Kubernetes

  • Mise à jour des nœuds
    • Évictions des Pods
  • Pod Disruption Budget
    • Créé par défaut
kubectl describe pdb cluster-18-primary

Name:           cluster-18-primary
Namespace:      default
Min available:  1
Selector:       cnpg.io/cluster=cluster-18,cnpg.io/instanceRole=primary
Status:
    Allowed disruptions:  0
    Current:              1
    Desired:              1
    Total:                1
Events:                   <none>

Questions

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

Travaux pratiques

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

Travaux pratiques (solutions)

Quiz


  1. La trace se retrouve encore dans le nom de la librairie C pour les clients, la libpq.↩︎