During an upgrade of Tanzu Postgres Operator from version 3.0.0 to 4.2.4, newly created WAL PersistentVolumeClaims (PVCs) may be provisioned using the Kubernetes cluster’s default StorageClass, even if the original Postgres instances were created using a different (non-default) StorageClass.
This behavior occurs during the automatic instance migration that is triggered after the operator upgrade which may result in:
Pending statePod describe output would show something like below:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 70s (x3 over 77s) default-scheduler 0/9 nodes are available: 3 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 6 node(s) had volume node affinity conflict. preemption: 0/9 nodes are available: 9 Preemption is not helpful for scheduling.
In Postgres Operator 4.x, the field walStorageClassName was introduced to allow explicit configuration of the WAL PVC StorageClass.
However, during migration from 3.0.0 to 4.2.4:
The walStorageClassName field does not exist in 3.0.0 custom resources.
The migration process cannot automatically determine which StorageClass was previously used for WAL volumes.
As a result, the operator defaults to using the cluster’s default StorageClass when creating WAL PVCs.
This behavior is currently expected due to a migration limitations.
Permanent Fix:
Postgres Operator which will be released by end of March 2026 (tentative ETA) is expected to provide the ability to explicitly define the WAL StorageClass during migration, eliminating the reliance on the cluster’s default StorageClass.
Workaround: