Découverte de CloudNativePG

Module K1

Dalibo SCOP

25.09

5 septembre 2025

Sur ce document

Formation Module K1
Titre Découverte de CloudNativePG
Révision 25.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
  • 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 13 à 17.

CloudNativePG

Objectifs

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

Avant propos Kubernetes

Avant propos Kubernetes

Quelques explications concernant Kubernetes

  • Kubernetes, K8s
  • Orchestrateur de conteneurs
  • Initialement prévue pour des applications dites Stateless
  • De plus en plus d’applications de type base de données

Avant propos Kubernetes

Avant propos Kubernetes

  • 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

Principe d’un opérateur

  • Nouvelles ressources disponibles
  • Custom Resource Definitions, Custom Resources
  • Cluster, Database, Backup, …
  • L’opérateur crée les ressources pour nous
    • Pod, Service, Secret, …
  • Des fonctionnalités plus poussées

Opérateurs PostgreSQL

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

Attraction Github

L’opérateur CloudNativePG

L’opérateur CloudNativePG

Ce que permet CloudNativePG

  • 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

Ce que permet CloudNativePG

  • Sauvegardes PITR, sauvegardes planifiées
  • Bascule automatique ou manuelle
  • Haute disponibilité, hibernation, fencing, plugin kubectl, …

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

Versions supportées

  • PostgreSQL
    • 13, 14, 15, 16 et 17
  • CloudNativePG
    • 1.26 et 1.27
    • 2 versions majeures supportées en même temps
    • Uniquement des versions de PostgreSQL supportées
  • Gérer également les versions Kubernetes

Installation de l’opérateur

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

Principe de fonctionnement

Les images utilisées

  • Pod CloudNativePG
    • ghcr.io/cloudnative-pg/cloudnative-pg:1.27.0
  • Pod PostgreSQL
    • ghcr.io/cloudnative-pg/postgresql:17.5
  • Images personnalisables

Travaux pratiques

  • Installation de l’opérateur CloudNativePG

Gestion déclarative

Principe

  • Fichiers YAML
  • On décrit juste, on laisse l’outil faire pour nous
    • Même idée qu’Ansible
  • État désiré <-> État actuel
  • Boucle de réconciliation

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:
    size: 2Gi

Éléments initiaux

  • PostgreSQL
    • Base de données app
    • Rôles app, streaming_replica
    • Règles pg_hba
  • 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

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:
    size: 2Gi

Database

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

Schema

  • Pas de Custom Resource Definition
  • Déclaré dans la ressource Database
  • spec.schemas
spec:
  schemas:
  - name: monschema
    owner: moi
    ensure: present

Extensions au sein d’une Database

  • Indiquées dans le YAML (v1.26)
  • Présentes dans l’image utilisée
  • spec.extensions de l’objet Database
spec:
  extensions:
  - name: vector

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ée après le déploiement
spec:
  postgresql:
    extensions:
      - name: ext
        image:
          reference: maregistry/monimage:tag # image contenant l'extension

Role

  • Pas de Custom Resource Definition
  • Déclaré dans la ressource Cluster
  • spec.managed.roles
  • Nécessite la création d’un Secret
spec: # Cluster
[]
  managed:
    roles:
    - name: dalibo
      ensure: present
      comment: Support Account
      login: true
      superuser: true
      passwordSecret:
        name: dalibo-password

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 à ces 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
  • 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
[]
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

Administration de l’instance

  • Plugin kubectl
  • Connexion
  • Traces
  • Réplication
  • Archivage
  • Sauvegarde
  • Restauration
  • Montée de version mineure de PostgreSQL
  • Montée de version de CloudNativePG
  • Haute disponibilité et bascule
  • 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 le PGaaS
  • Question d’accessibilité interne ou externe à Kubernetes
    • Interne (DNS)
    • Externe (kubectl ou psql)

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

Réplication

  • Mise en place très simple
    • instances: N
    • 1 primaire et N-1 secondaires
  • Streaming Replication
  • Répartition sur les nœuds
    • Configuration de l’affinité/anti-affinité
  • Slot de réplication créé par défaut
  • Asynchrone (ou synchrone)

Travaux pratiques

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

Archivage et Sauvegarde - Prérequis

  • Changement de méthode (v1.26)
  • Nécessite un plugin
  • Barman Cloud Plugin
    • Nouvelle ressource ObjectStore

ObjectStore

  • Emplacement de stockage
  • Stockage objet
    • Amazon S3 (ou compatible S3)
    • Google Cloud Storage
    • Microsoft Azure Blob Storage
  • Informations de connexion
  • Réutilisable

ObjectStore

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

Archivage

  • Activé par défaut (archive_mode à on)
  • archive_command :
    • /controller/manager wal-archive …
  • Non modifiable
  • Nécessite un stockage de type S3
  • Utilisé pour les sauvegardes PITR
  • Barman Cloud, pour le moment

Sauvegarde

  • Sauvegarde physique uniquement
  • 2 méthodes
    • Volume Snapshot
    • Object Storage
  • Nouvelles ressources Kubernetes
  • Configuration spec.backup d’un objet Cluster

Méthode par stockage objets

  • Méthode par défaut
  • Nécessite un stockage de type S3
  • spec.backup.barmanObjectStore
  • Barman Cloud, pour le moment
  • Sauvegarde à chaud, PITR
spec:
  backup:
    barmanObjectStore:
      destinationPath: "s3://bucket/"
      endpointURL: "https://s3.fr-par.scw.cloud"
      s3Credentials:
      [...]

Méthode par Volume Snapshot

  • Fonctionnalité Kubernetes (API)
  • spec.backup.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:
  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
  cluster:
    name: postgresql

Travaux pratiques

  • Mise en place d’une sauvegarde PITR

Restauration

  • Création d’une nouvelle instance
  • À partir d’une sauvegarde physique
    • spec.bootstrap.recovery
      • barmanObjectStore
      • volumeSnapshots
  • Plusieurs sources de restauration
  • PITR supporté

Travaux pratiques

  • Procéder à une restauration PITR

Montée de version d’une instance PostgreSQL

  • Version PostgreSQL indiquée dans l’image
    • Modifier l’image pour monter de version
  • Version mineure
  • Version majeure (v1.26)

Montée de version mineure

  • Version mineure
    • Mode Rolling Update
  • primaryUpdateStrategy et primaryUpdateMethod
    • Définis dans le YAML du Cluster

Montée de version majeure

  • Version majeure
  • Plusieurs méthodes
    • pg_dump/pg_restore
    • Réplication logique
    • In-Place Major Upgrade (v1.26)

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

Travaux pratiques

  • Montée de version mineure de PostgreSQL
  • Montée de version de l’opérateur

Haute disponibilité et bascule

  • Répartition sur les nœuds
  • Bascule
    • Automatique
    • Manuelle

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

Travaux pratiques

  • Exercices optionnels

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 ?

Travaux pratiques

  • Exercices optionnels

Quiz

Travaux pratiques

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

Travaux pratiques (solutions)