Configuration

Well-known metadata

Every label, annotation, finalizer and node taint Bloodraven reads or writes, with its writer, value grammar and stability level.

This page lists every label, annotation and finalizer key Bloodraven reads or writes, and its node taint, with the objects that carry each one, who writes it, the grammar of its value, and how stable it is:

  • Public: you may set or select on it, and it changes only with a release-noted break.
  • Operator-owned read-only: the operator writes it; you may read it, but do not edit or remove it.
  • Internal (may change): operator bookkeeping. Do not read or edit it; its key and value can change in any release.

Every key is under bloodraven.shipstream.io: the prefix itself (bloodraven.shipstream.io/<name>), or a subdomain of it for a family whose name part is an id (<kind>-hold.bloodraven.shipstream.io/<id>, <namespace>.db-readonly.bloodraven.shipstream.io/<group>), so one prefix match finds every member. The app.kubernetes.io/* labels the operator also sets are the Kubernetes recommended labels and are not listed. A boolean label value is true or false.

A structured internal value is a JSON object with a schemaVersion member. A payload with a version the operator does not know proves nothing: the operator refuses it and reports it with a condition and a Warning Event (MetadataVersionUnsupported), as each key below says.

Action annotations

A user (or kubectl bloodraven) sets these on the MysqlFailoverGroup to request a one-shot action. They share one value grammar, <subject>(:<key>=<value>)*: the subject is a site name or an operation id, a pair splits at its first =, and a value matches ^[A-Za-z0-9._/+-]+$, so it never contains : or =. An instant inside a value uses the ISO 8601 basic UTC form, for example 20261104T100000Z. A destructive action on a site-name subject carries confirm=<metadata.name>:uid=<metadata.uid>; an operation id the operator minted and never reuses needs neither. Two keys are outside the grammar: RevokeDeploymentLeasesAnnotation is presence-only (its value is ignored), and RotateKeyringAnnotation takes a bare site name, since a rotation destroys nothing. A value that does not parse, or fails its interlock, is never acted on: each key's consumer reports why (a Warning Event, or the status of the request) and, for most keys, removes the annotation so the request can be set again; the entries below say which. Never commit an action annotation to a GitOps repository: a sync re-applies it.

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/planned-failover (annotation)MysqlFailoverGroupuser (kubectl bloodraven promote); the operator removes it<site>[:maxLagWait=<duration>], for example pdx or pdx:maxLagWait=30s; maxLagWait is 1s to 1h. This key triggers a graceful, cooldown-respecting switchover to the named PrimaryCandidate site. The operator removes it once the request is decided: accepted, rejected or skipped. A request that is deferred (onCooldown=Defer, a deployment hold), or that waits for admission, keeps it until then; removing it cancels a deferred run.Public
bloodraven.shipstream.io/acknowledge-planned-failover-hold (annotation)MysqlFailoverGroupuser (kubectl bloodraven ack-planned-failover-hold); the operator removes it<runID>, the held run's status.plannedFailoverHold.runID. This key acknowledges an automation hold. An operator-minted run id cannot match another group, so the value needs no confirm= or uid= pair. The operator removes it after it clears the hold.Public
bloodraven.shipstream.io/reclone-site (annotation)MysqlFailoverGroupuser (kubectl bloodraven reclone); operator<site>:confirm=<metadata.name>:uid=<metadata.uid>, plus :gtidPrefix=<uuid prefix> when the site has diverged. This key asks the operator to reclone one site from the current primary with CLONE INSTANCE, which wipes the site's datadir. When the site has a recorded divergent GTID set (status.sites.divergentGtid), gtidPrefix= is required: at least 8 characters of the source UUID of the set's first entry. It proves the requester read the divergence. The operator also writes it to drain status.restoreReclones, and removes it when the clone is done or the request is rejected.Public
bloodraven.shipstream.io/revoke-deployment-leases (annotation)MysqlFailoverGroupuser; the operator removes itany; its presence is the request. This key revokes every deployment lease the group holds. Lease admission stays closed while it is set; the operator removes it once every revocation has persisted, and a value changed meanwhile is a new request it handles first.Public
bloodraven.shipstream.io/rotate-keyring (annotation)MysqlFailoverGroupuser; the operator removes it<site>. This key triggers an InnoDB master-key rotation on the named site. The operator refuses to rotate the active primary: rotate the replicas, run a planned failover, then rotate the former primary.Public
bloodraven.shipstream.io/release-pitr-archive-binding (annotation)MysqlFailoverGroupuser; the operator removes it<binding id>:confirm=<metadata.name>:uid=<metadata.uid>. This key releases one PITR archive binding and deletes its key snapshots. The binding id is derived from the destination, so it recurs in a re-created group of the same name: the uid pair keeps a stale request from releasing the new group's binding.Public

Failover record and planned-failover bookkeeping

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/last-failover, bloodraven.shipstream.io/last-failover-target (annotation)MysqlFailoverGroupoperatoran RFC 3339 UTC instant at second precision; the target site name. These keys copy the anti-flap record (status.lastFailover) to object metadata, so a status-write outage that overlaps an operator restart cannot lose the cooldown. Both are written in one patch on every promotion.Operator-owned read-only
bloodraven.shipstream.io/promotion-gtid-executed (annotation)MysqlFailoverGroupoperatora GTID set. This key is the out-of-band copy of the promotion watermark (status.lastFailover.promotionGtidExecuted), written with bloodraven.shipstream.io/last-failover and bloodraven.shipstream.io/last-failover-target. Omitted above 64 KiB. Ignored unless bloodraven.shipstream.io/promotion-gtid-executed-for names the event the other two keys record.Operator-owned read-only
bloodraven.shipstream.io/promotion-gtid-executed-for (annotation)MysqlFailoverGroupoperator<last-failover> <last-failover-target> (one space), for example 2026-11-04T10:00:00Z iad. This key binds the watermark to its failover event, written and deleted in the same patch as bloodraven.shipstream.io/promotion-gtid-executed. A watermark whose binding does not name the event the other two keys record is no watermark.Operator-owned read-only
bloodraven.shipstream.io/planned-failover-status-fence (annotation)MysqlFailoverGroupoperatoran ISO 8601 basic UTC instant with nanoseconds, 20261104T100000.123456789Z. This key is bumped with a write conditioned on the resourceVersion an ambiguous status write was made against. Its success proves that write can never commit. Each bump moves past the stored value.Internal (may change)
bloodraven.shipstream.io/planned-failover-terminal (annotation)MysqlFailoverGroupoperator{"schemaVersion":1,"runID":"<runID>","outcome":"<outcome>","reason":"<reason>","warnings":["<warning>"]} (reason and warnings may be omitted). This key ends a run outside /status when its status writes stall. Every planned-failover predicate treats the run it names as terminal; a ManualRecoveryRequired marker is also a hold record. A marker with a schemaVersion the operator does not know is reported (Degraded=True/MetadataVersionUnsupported and a Warning Event) and proves no outcome, but one naming a run with outcome ManualRecoveryRequired still holds automation.Internal (may change)
bloodraven.shipstream.io/planned-failover-stall-since (annotation)MysqlFailoverGroupoperator<runID>:since=<YYYYMMDDThhmmssZ>. This key is the durable start of the status-stall deadline.Internal (may change)
bloodraven.shipstream.io/planned-failover-manager-absent-since (annotation)MysqlFailoverGroupoperator<runID>:since=<YYYYMMDDThhmmssZ>. This key is the durable start of the manager-absence deadline.Internal (may change)
bloodraven.shipstream.io/planned-failover-confirmed (annotation)MysqlFailoverGroupoperator<runID>:since=<YYYYMMDDThhmmssZ>, the confirmation time. This key records, before the run releases its claim, that the run's promotion was confirmed, recorded and published, so a restart before the final status write does not take the released claim back. Removed when the run ends.Internal (may change)
bloodraven.shipstream.io/encryption-status-fence (annotation)MysqlFailoverGroupoperatoran RFC 3339 timestamp. This key is bumped to advance the group's resourceVersion, so a status write conditioned on an older version (one whose response was lost) can no longer commit. The write is what matters; nothing reads the value.Internal (may change)
bloodraven.shipstream.io/restore-confirm (annotation)the in-place restore Joboperatorthe confirm token. This key is the spec.restoreInPlace.confirm token the in-place restore Job was created for, so a Job left over from an earlier request with the same name is not mistaken for the current one.Internal (may change)

Finalizers

Each finalizer is named after its kind. The operator adds and removes them; removing one by hand skips the cleanup it guards.

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/failover-group (finalizer)MysqlFailoverGroupoperatornone (a finalizer). This key runs the graceful-shutdown sequence (node taints removed, DNS records deleted) before a MysqlFailoverGroup is deleted.Internal (may change)
bloodraven.shipstream.io/mysqldatabase (finalizer)MysqlDatabaseoperatornone (a finalizer). This key guards the MySQL-side cleanup of a MysqlDatabase.Internal (may change)
bloodraven.shipstream.io/mysqlbackup (finalizer)MysqlBackupoperatornone (a finalizer). This key guards the artifact cleanup of a MysqlBackup.Internal (may change)
bloodraven.shipstream.io/mysqlbackup-verification (finalizer)MysqlBackupVerificationoperatornone (a finalizer). This key guards the cleanup of a MysqlBackupVerification's resources.Internal (may change)

Group routing labels

The operator puts these on the objects it manages for a MysqlFailoverGroup (pods, Services, Deployments, StatefulSets, Secrets). Services, NetworkPolicies and monitors select on them. Operator labels win over spec.podLabels.

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/failover-group (label)managed objects and pods; MysqlBackup, MysqlBackupVerificationoperator; kubectl bloodraven backup and verify; user, on a MysqlBackup or MysqlBackupVerification it createsthe group name. This key names the owning MysqlFailoverGroup. It is also on MysqlBackups and MysqlBackupVerifications (spec.failoverGroupRef), and kubectl bloodraven sets it on the ones it creates. The one place a user writes it is a MysqlBackup or MysqlBackupVerification created by hand: set it to spec.failoverGroupRef, with bloodraven.shipstream.io/backup-profile. On every object the operator manages it is the operator's.Operator-owned read-only
bloodraven.shipstream.io/site (label)managed objects and podsoperatorthe site name. This key names the site. It is part of every Deployment and StatefulSet selector, which is immutable: a workload whose selector differs from the one the operator renders is refused (Degraded=True/WorkloadSelectorMismatch).Operator-owned read-only
bloodraven.shipstream.io/role (label)MySQL podsoperatorprimary or replica. This key is the site's role, set on the live pods each health poll. The primary and replica Services select on it.Operator-owned read-only
bloodraven.shipstream.io/healthy (label)MySQL podsoperatortrue or false. This key is the site's verdict from its last health poll. The replica Service and a ReadOnly site's Service select on "true".Operator-owned read-only
bloodraven.shipstream.io/dragonfly-role (label)Dragonfly podsoperatormaster or replica. This key is a Dragonfly pod's operator-assigned role. The active Service selects on it together with bloodraven.shipstream.io/dragonfly-traffic.Operator-owned read-only
bloodraven.shipstream.io/dragonfly-traffic (label)Dragonfly podsoperatortrue, or absent. This key gates whether a Dragonfly pod is eligible for the active Service, which selects "true". A planned failover removes it from the source pod before the takeover, so the Service sheds the old endpoint first.Operator-owned read-only

Managed-object bookkeeping

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/keyring-version (label)keyring escrow Secretsoperator; the keyring escrow recovery runbook reads itan integer. This key is the escrow version on a site's keyring escrow Secret.Internal (may change)
bloodraven.shipstream.io/keyring-digest (annotation)keyring escrow Secretsoperatorsha256:<hex>. This key records the digest of the escrowed keyring bytes. It is informational: the operator always recomputes it.Internal (may change)
bloodraven.shipstream.io/spec-hash (annotation)site Deployments and other managed objectsoperatora hash. This key is the hash of the rendered spec of a managed object; a difference starts an ordered update.Internal (may change)
bloodraven.shipstream.io/managed-service-annotations (annotation)Servicesoperatora JSON list of annotation keys. This key lists the Service annotations the operator manages, so it can remove one that leaves the spec.Internal (may change)
bloodraven.shipstream.io/credential-hash (annotation)credential Secretsoperatora hash. This key records the hash of the credentials last applied.Internal (may change)
bloodraven.shipstream.io/system-schema-restriction (annotation)credential Secretsoperatora hash. This key records the credential hash for which the application user's system-schema restriction last succeeded.Internal (may change)
bloodraven.shipstream.io/dragonfly-load-hold (annotation)Dragonfly podsoperatoran RFC 3339 time, when the hold started. This key marks a Dragonfly pod whose traffic the operator holds off until it has loaded its snapshot: the active site of a snapshot-restore upgrade that ended while it was still loading. While it is set, the operator removes the pod's bloodraven.shipstream.io/dragonfly-traffic again whoever restored it, and it removes the annotation once the site answers as loaded.Internal (may change)

Backup and verification labels

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/mysqlbackup (label)backup and cleanup Jobs, MysqlBackupVerificationoperatorthe MysqlBackup name. This key names the MysqlBackup a Job or a verification belongs to.Operator-owned read-only
bloodraven.shipstream.io/backup-profile (label)MysqlBackup, MysqlBackupVerification, their Jobs and CronJobsoperator; kubectl bloodraven backup and verify; userthe profile name. This key names the backup profile (spec.profileName). Set it with bloodraven.shipstream.io/failover-group when you create a MysqlBackup by hand.Public
bloodraven.shipstream.io/backup-schedule (label)MysqlBackup, backup CronJobsoperatorthe schedule name. This key names the schedule that created a MysqlBackup. The schedule rollup reads it.Public
bloodraven.shipstream.io/resource (label)operator-created Jobs, CronJobs and Secretsoperatorbackup, backup-cleanup, backup-schedule, restore, backup-verification, backup-verification-schedule or pitr-archive-check. This key classifies an operator-created Job, CronJob or Secret.Operator-owned read-only
bloodraven.shipstream.io/backup-encrypted (label)backup Jobs and their podsoperatortrue, or absent. This key marks a backup Job (and its pods) that writes an encrypted artifact. The MysqlBackup itself does not carry it: read status.encryption.mode there.Operator-owned read-only
bloodraven.shipstream.io/mysqlbackup-verification (label)verification Jobsoperatorthe MysqlBackupVerification name. This key names the MysqlBackupVerification a Job belongs to.Operator-owned read-only
bloodraven.shipstream.io/verification-schedule (label)scheduled MysqlBackupVerifications, verification CronJobsoperator (the CronJob and the trigger command it runs)the backup profile name (a profile has one verification schedule, named after it). This key names the verification schedule that created a MysqlBackupVerification. A verification created by hand or by kubectl bloodraven verify does not carry it.Public
bloodraven.shipstream.io/triggered-by (annotation)MysqlBackup, MysqlBackupVerificationthe schedules, the trigger commands, kubectl bloodraven (--triggered-by, default manual), userfree text. The operator's writers use schedule, schedule/<name> and retry/<name>/attempt-<n>; other writers may record anything. This key records what created a MysqlBackup or a MysqlBackupVerification. Informational free text; nothing reads it.Public

Backup bookkeeping

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/backup-retry-of (label)MysqlBackupoperatorthe replaced MysqlBackup's name. This key names the MysqlBackup a retry replaces.Internal (may change)
bloodraven.shipstream.io/backup-retry-root, bloodraven.shipstream.io/backup-retry-root-uid (annotation)MysqlBackupoperatorthe root MysqlBackup's name; its uid. These keys name the first backup of a retry chain.Internal (may change)
bloodraven.shipstream.io/backup-attempt (annotation)MysqlBackupoperatoran integer. This key is the attempt number within a retry chain.Internal (may change)
bloodraven.shipstream.io/cleanup-failure-recorded (annotation)backup cleanup Jobsoperatortrue. This key marks a failed cleanup Job whose failure Event and metric were emitted, so each Job counts once.Internal (may change)
bloodraven.shipstream.io/failover-group-uid (annotation)backup Jobs and their pod templateoperatorthe group's metadata.uid. This key pins the source group's uid on a backup Job and its pod; status.failoverGroupUID is recovered from it. The same key is bloodraven.shipstream.io/failover-group-uid on key snapshots.Internal (may change)
bloodraven.shipstream.io/pitr-archive-id (annotation)backup Jobs and their pod templateoperatorar1-…, or empty while PITR is off. This key pins the source group's PITR archive ID on a backup Job; status.pitrArchiveID is recovered from it.Internal (may change)
bloodraven.shipstream.io/verification-backup (annotation)verification Job pod templatesoperator{"schemaVersion":1,"name":…,"uid":…,"artifactStorage":{…}}. This key pins the MysqlBackup a verification Job reads. A record with a schemaVersion the operator does not know fails the verification (Verified=False/MetadataVersionUnsupported and a Warning Event).Internal (may change)

Holds

A hold keeps an object that a running operation reads. Holds form one family, <kind>-hold.bloodraven.shipstream.io/<id>, so every hold of a kind is found by one prefix match. Removing a hold by hand while its holder runs can delete data under it.

KeyOnWriterValue and meaningStability
verification-hold.bloodraven.shipstream.io/<verification uid> (annotation)MysqlBackup; PITR archive key snapshot Secretsoperatorthe verification's name. This key marks a MysqlBackup, and a PITR archive key snapshot, that a MysqlBackupVerification is reading. The full key is the prefix followed by the verification's uid. Retention, the artifact-cleanup finalizer and the PITR binlog cutoff leave the object alone while a hold on it is live, also while the verification is Terminating.Operator-owned read-only

PITR archive binding metadata

On archive key snapshots (Secrets) and the Jobs that mount them.

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/pitr-render (annotation)site Deploymentsoperatorsorted JSON with schemaVersion 1; unknown keys are refused. This key is the canonical JSON of the PITR identity and access fields a site Deployment renders.Internal (may change)
bloodraven.shipstream.io/pitr-destination (annotation)archive key snapshot Secretsoperatorthe normalized destination. This key is the normalized archive destination.Internal (may change)
bloodraven.shipstream.io/pitr-accepted (annotation)archive key snapshot SecretsoperatorJSON with schemaVersion 1. This key is the acceptance record of an accepted archive key snapshot. Never edit it.Operator-owned read-only
bloodraven.shipstream.io/pitr-binding-id (label)archive key snapshot Secretsoperatorpab-<16 hex digits>. This key is the binding id. It is the release selector, so a release also covers snapshots whose binding entry was dropped or lost.Internal (may change)
bloodraven.shipstream.io/failover-group-uid (label)archive key and dump key snapshot Secretsoperator; doctor support-bundle.sh selects on itthe group's metadata.uid. This key is the group's metadata.uid. Snapshots have no owner reference, so it scopes every listing to one group incarnation. Same key as bloodraven.shipstream.io/failover-group-uid.Internal (may change)
bloodraven.shipstream.io/mysqlbackup-uid (label)dump key snapshot Secretsoperatorthe MysqlBackup's metadata.uid. This key is the MysqlBackup's uid.Internal (may change)
bloodraven.shipstream.io/pitr-key-secret (label)check, restore, verification and in-place staging Jobsoperatorthe snapshot Secret's name. This key is the archive key snapshot a Job mounts. A release is refused while such a Job has not stopped.Internal (may change)
bloodraven.shipstream.io/pitr-key-secret-uid (annotation)archive check Jobsoperatorthe snapshot Secret's metadata.uid. This key is the uid of the candidate snapshot a check Job mounts, when the Job was created. A verdict is accepted only for that object.Internal (may change)

Deployment API leases

On the coordination.k8s.io Leases the operator creates for deployment leases.

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/deployment-lease (annotation)deployment LeasesoperatorJSON with schemaVersion 1. This key holds the lease record. A record with a schemaVersion the operator does not know is refused: the lease request fails, and the group reports Degraded=True/MetadataVersionUnsupported with a Warning Event.Internal (may change)
bloodraven.shipstream.io/deployment-kind (label)deployment Leasesoperatormigration or failover-hold. This key is the lease kind.Internal (may change)
bloodraven.shipstream.io/deployment-state (label)deployment Leasesoperatoractive, released, expired or revoked. This key is the lease state.Internal (may change)

Client labels

The chart's deployment API NetworkPolicy (auxiliary.deployAPI.networkPolicy.enabled) admits a client only when both labels match the same source.

KeyOnWriterValue and meaningStability
bloodraven.shipstream.io/mysql-client (label)Namespaceuser; the chart NetworkPolicy selects on ittrue. This key marks a namespace whose pods may reach the operator's deployment API.Public
bloodraven.shipstream.io/deploy-client (label)Poduser; the chart NetworkPolicy selects on ittrue. This key marks a pod that may call the deployment API.Public

Node taint

KeyOnWriterValue and meaningStability
<namespace>.db-readonly.bloodraven.shipstream.io/<group> (taint)Nodeoperator; users tolerate ittrue, effect NoExecute. The operator puts this taint, with effect NoExecute, on a site's nodes (spec.sites.taintNodeSelector) while the site is read only, so pods that do not tolerate it are evicted; workloads that must keep running there tolerate it. The namespace is part of the key, so two groups of the same name in different namespaces never share a taint. The prefix is at most 100 characters (a 63-character namespace) and the name part is the group name.Public