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évu 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 certaines 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
    • 14, 15, 16, 17 et 18
  • CloudNativePG
    • 1.27 et 1.28 (décembre 2025)
    • 2 versions majeures supportées en même temps
    • Uniquement des versions de PostgreSQL supportées
  • Sans oubliez les versions Kubernetes

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

Les images utilisées

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

⤿ Travaux pratiques

  • Prise en main du cluster Kubernetes
  • 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: # Bonne pratique
    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: # 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

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
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

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 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 du PGaaS
  • Question d’accessibilité
    • en interne
    • depuis l’extérieur
  • Offuscation des adresses IP des 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": 1619781249.7188137,
  "logger": "postgres",
  "msg": "record",
  "record": {
    "log_time": "2021-04-30 11:14:09.718 UTC",
    "user_name": "",
  […]
  }
}
  • Parfois emballées dans du JSON

Réplication

  • Mise en place facilité
    • 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 par défaut

⤿ 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 CRD ObjectStore

Plugin de sauvegarde

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

ObjectStore - Barman Cloud

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

ObjectStore - Barman Cloud

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
  • Se repose sur le plugin (isWALArchiver)

Sauvegarde

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

Méthode par stockage objets

  • Méthode par défaut
  • Nécessite un stockage de type S3
  • Sauvegarde à chaud, PITR
spec:
  plugins:
  - name: barman-cloud.cloudnative-pg.io
    isWALArchiver: true
    parameters:
      barmanObjectName: scaleway-store

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
  • PITR supporté
  • Indiquer le plugin à utiliser

⤿ 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
    • Modifier l’image à utiliser dans lImageCatalog ou ClusterImageCatalog
  • 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

  • Plusieurs méthodes
    • pg_dump/pg_restore
      • microservice ou monolith
    • Réplication logique
      • Plus complexe
    • In-Place Major Upgrade (v1.26)
      • Offline avec pg_upgrade

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

Travaux pratiques (solutions)