Module K6
Dalibo SCOP
26.10
octobre 2026
| Formation | Module K6 |
| Titre | Haute disponibilité |
| Révision | 26.10 |
| https://dali.bo/k6_pdf | |
| EPUB | https://dali.bo/k6_epub |
| HTML | https://dali.bo/k6_html |
| Slides | https://dali.bo/k6_slides |
| TP | https://dali.bo/k6_tp |
| TP (solutions) | https://dali.bo/k6_solutions |
Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :
PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.
Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 15 à 19.
Pod primaire.spec.failoverDelay pour retarder le déclenchementVACUUM ANALYZE conseilléServicesClusters sur des infrastructures distinctesLa version en ligne des solutions de ces TP est disponible sur https://dali.bo/k6_solutions.
But : Tester et comprendre le mécanisme de bascule entre primaire et secondaire.
Trouver quelle est l’instance primaire du cluster
postgresql-demo.
Vous devriez trouver que l’instance postgresql-demo-1
est l’instance primaire. Pour le savoir, plusieurs méthodes :
pg_is_in_recovery() en étant
connecté sur une instance avec psql. Si elle retourne
false, l’instance est primaire, sinon, à true,
elle est secondaire.kubectl exec -it postgresql-demo-1 -c postgres -- psql -c 'SELECT pg_is_in_recovery();'
pg_is_in_recovery
-------------------
f
(1 row)
kubectl exec -it postgresql-demo-2 -c postgres -- psql -c 'SELECT pg_is_in_recovery();'
pg_is_in_recovery
-------------------
t
(1 row)
cnpg de kubectl et à sa
commande status ;kubectl cnpg status postgresql-demo
Cluster Summary
Name default/postgresql-demo
System ID: 7582605931997384732
PostgreSQL Image: ghcr.io/cloudnative-pg/postgresql:17.5-standard-bookworm
Primary instance: postgresql-demo-1
Primary promotion time: 2025-12-11 14:23:56 +0000 UTC (17h6m44s)
Status: Cluster in healthy state
Instances: 2
Ready instances: 2
Size: 247M
Current Write LSN: 0/E000000 (Timeline: 1 - WAL File: 00000001000000000000000E)
[...]
Promouvoir l’instance
postgresql-demo-2comme nouvelle primaire avec le plugincnpgdekubectl.
Attention, il y a bien un espace entre le nom du cluster et l’identifiant de l’instance.
kubectl cnpg promote postgresql-demo 2
{"level":"info","ts":"2024-12-06T10:40:18.767552528Z","msg":"Cluster is not healthy"}
Node postgresql-demo-2 in cluster postgresql-demo will be promoted
Vérifier que le cluster est en bonne santé et que
postgresql-demo-2est désormais l’instance primaire.
kubectl cnpg status postgresql-demo
[...]
Primary instance: postgresql-demo-2
Primary promotion time: 2025-12-12 07:31:26 +0000 UTC (30s)
Status: Cluster in healthy state
[...]
Instances status
Name Current LSN Replication role Status QoS Manager Version Node
---- ----------- ---------------- ------ --- --------------- ----
postgresql-demo-2 0/F001078 Primary OK Burstable 1.28.1 kind-worker
postgresql-demo-1 0/F001078 Standby (async) OK Burstable 1.28.1 kind-worker2
Les applications auront évidemment une coupure réseau, puisqu’il y a une bascule.
Lorsqu’une erreur survient sur le primaire, le mécanisme de
failover va être déclenché. Ce mécanisme sera démarré après une
certaine durée modifiable via le paramètre
.spec.failoverDelay (par défaut à 0) dans la définition du
cluster PostgreSQL.
L’erreur peut être, par exemple, un problème sur le volume associé, le Pod primaire qui serait supprimé, le conteneur PostgreSQL qui serait KO, etc. (voir la documentation sur les probes).
Ajouter le paramètre
.spec.failoverDelayà votre instance et le positionner à 10 secondes.
Le prendre en compte avec
kubectl apply -f ~/postgresql-demo.yaml.
kubectl apply -f ~/postgresql-demo.yaml
cluster.postgresql.cnpg.io/postgresql-demo configured
Dans une autre session, lancer la commande
watch kubectl get pod.
watch kubectl get pod
Détruire le
Podcorrespondant à l’instance primaire.
kubectl delete pod postgresql-demo-2
pod "postgresql-demo-2" deleted
Regarder comment réagit le
Cluster.
Une bascule sur le seul Pod disponible est faite après
10 secondes. L’instance postgresql-demo-1 est
automatiquement promue primaire. Dans la foulée, un Pod est
recréé pour retrouver la situation initiale.
Instances status
Name Current LSN Replication role Status QoS Manager Version Node
---- ----------- ---------------- ------ --- --------------- ----
postgresql-demo-1 0/11002BF8 Primary OK Burstable 1.28.1 kind-worker2
postgresql-demo-2 0/11002BF8 Standby (async) OK Burstable 1.28.1 kind-worker
Voici un exemple avec un délai .spec.failoverDelay à 20
secondes.