diff --git a/kubernetes/apps/home-assistant/ha-pg-cluster.yaml b/kubernetes/apps/home-assistant/ha-pg-cluster.yaml index 7b2ee685..c0a05589 100644 --- a/kubernetes/apps/home-assistant/ha-pg-cluster.yaml +++ b/kubernetes/apps/home-assistant/ha-pg-cluster.yaml @@ -31,6 +31,11 @@ metadata: namespace: home-assistant spec: instances: 2 + # switchover, not CNPG's default `restart`: any change that rolls the pods + # (walStorage below did) then promotes the already-rolled replica instead of + # restarting the primary in place, so the recorder loses seconds of writes + # rather than stopDelay plus a pg_wal move plus startup (REN-176). + primaryUpdateMethod: switchover smartShutdownTimeout: 10 stopDelay: 60 imageName: ghcr.io/cloudnative-pg/postgresql:16 @@ -61,7 +66,35 @@ spec: # one stalled night survives and two fill the volume; ~18.6 GiB carries # about four. Approved by the owner on REN-135. # ceph-block has allowVolumeExpansion: true, so this grows in place. + # + # Since REN-176 WAL lives on walStorage below, so the stall headroom above + # now belongs to that volume. 32Gi stays because a PVC cannot shrink. size: 32Gi + # WAL on its own volume (ha-pg-N-wal), approved by the owner on REN-176. + # + # PERMANENT. The CNPG webhook rejects removing walStorage once set ("walStorage + # cannot be disabled once configured"), so reverting this block fails + # admission and leaves the home-assistant Kustomization stuck. Undoing it + # means a new Cluster recovered from ha-pg-store. Adding it on 1.30.1 needs + # no re-clone: the operator creates the PVC, rolls each pod, and the instance + # manager moves pg_wal onto it before Postgres starts. + # + # This does NOT keep the recorder up when WAL fills: a full WAL disk still + # stops Postgres. What it does is keep WAL writable if PGDATA fills (a purge + # that stops running), and make WAL-volume usage a direct archiver-backlog + # signal. + # + # Sized so stall survival is no worse than the shared 32Gi gives today. + # Today: ~18.6 GiB free on PGDATA / 4.66 GiB/day of WAL = ~4.0 days. + # 1.86 GiB normal pg_wal footprint (max_wal_size 2GB) + # + 18.64 GiB four days of full archiver outage at 4.66 GiB/day + # (the nightly 56-119 segment burst, REN-136, is inside that rate) + # = 20.5 GiB -> 21Gi: (21 - 1.86) / 4.66 = ~4.1 days. 18Gi would give ~3.5, + # worse than today. RBD is thin, so the ceiling costs nothing until a stall + # fills it. The webhook requires min_wal_size < max_wal_size < this size. + walStorage: + storageClass: ceph-block + size: 21Gi plugins: - name: barman-cloud.cloudnative-pg.io isWALArchiver: true