Labels and Annotations
Resources in Kubernetes are organized in a flat structure, with no hierarchical information or relationship between them. However, such resources and objects can be linked together and put in relationship through labels and annotations.
Note
For more information, see the Kubernetes documentation on annotations and labels .
In brief:
An annotation is used to assign additional non-identifying information to resources with the goal of facilitating integration with external tools.
A label is used to group objects and query them through the Kubernetes native selector capability.
You can select one or more labels or annotations to use in your CloudNativePG deployments. Then you need to configure the operator so that when you define these labels or annotations in a cluster’s metadata, they’re inherited by all resources created by it (including pods).
Note
Label and annotation inheritance is the technique adopted by CloudNativePG instead of alternative approaches such as pod templates.
Predefined labels
CloudNativePG manages the following predefined labels:
cnpg.io/backupDate The date of the backup in ISO 8601 format
(YYYYMMDD ). This label is available only on VolumeSnapshot
resources.
cnpg.io/backupName Backup identifier. This label is available only
on VolumeSnapshot resources.
cnpg.io/backupMonth The year/month when a backup was taken. This
label is available only on VolumeSnapshot resources.
cnpg.io/backupTimeline The timeline of the instance when a backup
was taken. This label is available only on VolumeSnapshot resources.
cnpg.io/backupYear The year a backup was taken. This label is
available only on VolumeSnapshot resources.
cnpg.io/cluster Name of the cluster.
cnpg.io/immediateBackup Applied to a Backup resource if the
backup is the first one created from a ScheduledBackup object having
immediate set to true .
cnpg.io/instanceName Name of the PostgreSQL instance (replaces the
old and deprecated postgresql label).
cnpg.io/jobRole Role of the job (that is, import , initdb ,
join , …)
cnpg.io/majorVersion Integer PostgreSQL major version of the
backup’s data directory (for example, 17 ). This label is available
only on VolumeSnapshot resources.
cnpg.io/onlineBackup Whether the backup is online (hot) or taken
when Postgres is down (cold). This label is available only on
VolumeSnapshot resources.
cnpg.io/podRole Distinguishes pods dedicated to pooler deployment
from those used for database instances.
cnpg.io/poolerName Name of the PgBouncer pooler.
cnpg.io/pvcRole Purpose of the PVC, such as PG_DATA or
PG_WAL .
cnpg.io/reload Available on ConfigMap and Secret resources.
When set to true , a change in the resource is automatically
reloaded by the operator.
cnpg.io/userType Specifies the type of PostgreSQL user associated
with the Secret , either superuser (Postgres superuser access)
or app (application-level user in CloudNativePG terminology), and is
limited to the default users created by CloudNativePG (typically
postgres and app ).
role - deprecated Whether the instance running in a pod is a
primary or a replica . This label is deprecated, you should use
cnpg.io/instanceRole instead.
cnpg.io/scheduled-backup When available, name of the
ScheduledBackup resource that created a given Backup object.
cnpg.io/instanceRole Whether the instance running in a pod is a
primary or a replica .
app.kubernetes.io/managed-by Name of the manager. It will always be
cloudnative-pg . Available across all CloudNativePG managed
resources.
app.kubernetes.io/name Name of the application. It will always be
postgresql . Available on pods, jobs, deployments, services,
persistentVolumeClaims, volumeSnapshots, podDisruptionBudgets,
podMonitors.
app.kubernetes.io/component Name of the component (database ,
pooler , …). Available on pods, jobs, deployments, services,
persistentVolumeClaims, volumeSnapshots, podDisruptionBudgets,
podMonitors.
app.kubernetes.io/instance Name of the owning Cluster resource.
Available on pods, jobs, deployments, services, volumeSnapshots,
podDisruptionBudgets, podMonitors.
app.kubernetes.io/version Major version of PostgreSQL. Available on
pods, jobs, services, volumeSnapshots, podDisruptionBudgets,
podMonitors.
Predefined annotations
CloudNativePG manages the following predefined annotations:
container.apparmor.security.beta.kubernetes.io/* Name of the
AppArmor profile to apply to the named container. See Restricting Pod access using AppArmor
for details.
cnpg.io/backupEndTime The time a backup ended. This annotation is
available only on VolumeSnapshot resources.
cnpg.io/backupEndWAL The WAL at the conclusion of a backup. This
annotation is available only on VolumeSnapshot resources.
cnpg.io/backupStartTime The time a backup started.
cnpg.io/backupStartWAL The WAL at the start of a backup. This
annotation is available only on VolumeSnapshot resources.
cnpg.io/coredumpFilter Filter to control the coredump of Postgres
processes, expressed with a bitmask. By default it’s set to 0x31 to
exclude shared memory segments from the dump. See PostgreSQL core dumps
for more information.
cnpg.io/clusterManifest Manifest of the Cluster owning this
resource (such as a PVC). This label replaces the old, deprecated
cnpg.io/hibernateClusterManifest label.
cnpg.io/fencedInstances List of the instances that need to be
fenced, expressed in JSON format. The whole cluster is fenced if the
list contains the * element.
cnpg.io/forceLegacyBackup Applied to a Cluster resource for
testing purposes only, to simulate the behavior of
barman-cloud-backup prior to version 3.4 (Jan 2023) when the
--name option wasn’t available.
cnpg.io/hash The hash value of the resource.
cnpg.io/hibernation Applied to a Cluster resource to control the
declarative hibernation feature . Allowed values are on and off .
cnpg.io/managedSecrets Pull secrets managed by the operator and
automatically set in the ServiceAccount resources for each Postgres
cluster.
cnpg.io/nodeSerial On a pod resource, identifies the serial number
of the instance within the Postgres cluster.
cnpg.io/operatorVersion Version of the operator.
cnpg.io/pgControldata Output of the pg_controldata command. This
annotation replaces the old, deprecated
cnpg.io/hibernatePgControlData annotation.
cnpg.io/podEnvHash Deprecated, as the cnpg.io/podSpec annotation
now also contains the pod environment.
cnpg.io/podPatch Annotation can be applied on a Cluster
resource.
When set to JSON-patch formatted patch, the patch will be applied on the instance Pods.
️ WARNING: This feature may introduce discrepancies between the operator’s expectations and Kubernetes behavior. Use with caution and only as a last resort.
IMPORTANT: adding or changing this annotation won’t trigger a
rolling deployment of the generated Pods. The latter can be triggered
manually by the user with kubectl cnpg restart .
cnpg.io/podSpec Snapshot of the spec of the pod generated by the
operator. This annotation replaces the old, deprecated
cnpg.io/podEnvHash annotation.
cnpg.io/poolerSpecHash Hash of the pooler resource.
cnpg.io/pvcStatus Current status of the PVC: initializing ,
ready , or detached .
cnpg.io/reconcilePodSpec Annotation can be applied to a Cluster
or Pooler to prevent restarts.
When set to disabled on a Cluster , the operator prevents
instances from restarting due to changes in the PodSpec. This includes
changes to:
- Topology or affinity - Scheduler - Volumes or containers
When set to disabled on a Pooler , the operator restricts any
modifications to the deployment specification, except for changes to
spec.instances .
cnpg.io/reconciliationLoop When set to disabled on a Cluster
, the operator prevents the reconciliation loop from running.
cnpg.io/reloadedAt Contains the latest cluster reload time.
reload is triggered by the user through a plugin.
cnpg.io/skipEmptyWalArchiveCheck When set to enabled on a
Cluster resource, the operator disables the check that ensures that
the WAL archive is empty before writing data. Use at your own risk.
cnpg.io/skipWalArchiving When set to enabled on a Cluster
resource, the operator disables WAL archiving. This will set
archive_mode to off and require a restart of all PostgreSQL
instances. Use at your own risk.
cnpg.io/snapshotStartTime The time a snapshot started.
cnpg.io/snapshotEndTime The time a snapshot was marked as ready to
use.
cnpg.io/validation When set to disabled on a
CloudNativePG-managed custom resource, the validation webhook allows all
changes without restriction.
️ WARNING: Disabling validation may permit unsafe or destructive operations. Use this setting with caution and at your own risk.
cnpg.io/volumeSnapshotDeadline Applied to Backup and
ScheduledBackup resources, allows you to control how long the
operator should retry recoverable errors before considering the volume
snapshot backup failed. In minutes, defaulting to 10.
kubectl.kubernetes.io/restartedAt When available, the time of last
requested restart of a Postgres cluster.
alpha.cnpg.io/unrecoverable Experimental annotation applied to a
Pod running a PostgreSQL instance. It instructs the operator to
delete the Pod and all its associated PVCs. The instance will then
be recreated according to the configured join strategy. This annotation
can only be used on instances that are neither the current primary nor
the designated target primary.
Prerequisites
By default, no label or annotation defined in the cluster’s metadata is inherited by the associated resources. To enable label/annotation inheritance, follow the instructions provided in Operator configuration .
The following continues from that example and limits it to the following:
Annotations:
categoriesLabels:
app,environment, andworkload
Note
Feel free to select the names that most suit your context for both annotations and labels. You can also use wildcards in naming and adopt strategies like using mycompany/* for all labels or setting annotations starting with mycompany/ to be inherited.
Defining cluster’s metadata
When defining the cluster, before any resource is deployed, you can set the metadata as follows:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-example
annotations:
categories: database
labels:
environment: production
workload: database
app: sso
spec:
# ... <snip>
Once the cluster is deployed, you can verify, for example, that the labels were correctly set in the pods:
kubectl get pods --show-labels
Current limitations
Currently, CloudNativePG doesn’t automatically propagate labels or annotations deletions. Therefore, when an annotation or label is removed from a cluster that was previously propagated to the underlying pods, the operator doesn’t remove it on the associated resources.