API Reference

Packages:

questdb.io/v1alpha1

Resource Types:

QuestDBCluster

QuestDBCluster is the Schema for the questdbclusters API.

NameTypeDescriptionRequired
apiVersionstringquestdb.io/v1alpha1true
kindstringQuestDBClustertrue
metadataobjectRefer to the Kubernetes API documentation for the fields of the metadata field.true
specobject

spec defines the desired state of QuestDBCluster


Validations:

  • self.instances <= 1 || (has(self.backup) && has(self.backup.enabled) && self.backup.enabled): instances > 1 requires an enabled spec.backup (replicas seed from a backup)
  • !((has(self.backup) && has(self.backup.enabled) && self.backup.enabled) || self.instances > 1) || has(self.objectStoreRef): spec.objectStoreRef is required when backup is enabled or instances > 1
  • (has(oldSelf.replication) && has(oldSelf.replication.root) && size(oldSelf.replication.root) > 0) == (has(self.replication) && has(self.replication.root) && size(self.replication.root) > 0): spec.replication.root is immutable in presence as well as value: it cannot be added to, or removed from, an existing cluster. Omitted, the replication WAL root is the per-cluster default db/{namespace}/{name}/, so setting or clearing it re-points live WAL shipping at a different stream. To run against a different root, create a new cluster with it set (born-from-backup)
  • has(oldSelf.bootstrap) == has(self.bootstrap): spec.bootstrap is immutable in presence as well as value: it cannot be added to, or removed from, an existing cluster. It only initializes the genesis primary, so adding it later restores nothing and would only make status.recovery lie. To restore from a backup, create a NEW cluster with spec.bootstrap.recovery
  • !has(oldSelf.objectStoreRef) || has(self.objectStoreRef): spec.objectStoreRef cannot be removed once set: it backs this cluster's replication WAL and backup history, so dropping it converges a replicated cluster down to a single unreplicated primary and strands its backups. Adding a store to a cluster that never had one is allowed
  • !has(self.bootstrap) || !has(self.bootstrap.follow) || (has(self.objectStoreRef) && has(self.backup) && has(self.backup.enabled) && self.backup.enabled): spec.bootstrap.follow requires spec.objectStoreRef and an enabled spec.backup, whatever spec.instances is: a follower has no primary of its own, so it restores its baseline from the external source's backup and then follows that source's WAL — both through the shared store. Without them a single-instance follower would be admitted and silently come up as an ordinary standalone primary
  • !has(self.bootstrap) || !has(self.bootstrap.follow) || (has(self.replication) && has(self.replication.root) && size(self.replication.root) > 0): spec.bootstrap.follow requires an explicit spec.replication.root naming the external source's WAL prefix. Omitted, the root defaults to this cluster's own identity-scoped db/{namespace}/{name}/, which is a stream nothing is writing to — the follower would restore and then never advance
  • !has(self.bootstrap) || !has(self.bootstrap.follow) || (has(self.backup) && has(self.backup.root) && size(self.backup.root) > 0): spec.bootstrap.follow requires an explicit spec.backup.root naming the external source's backup prefix. Omitted, it defaults to a bare 'backup/' that is not scoped to any cluster, so the follower would look for its baseline wherever that happens to point
  • !has(self.bootstrap) || !has(self.bootstrap.follow) || !has(self.replication) || !has(self.replication.seedFrom): spec.replication.seedFrom is meaningless under spec.bootstrap.follow: a follower's replicas seed from the external source's backup named by follow.sourceInstanceName, not from an instance of this cluster. Remove seedFrom

true
statusobject

status defines the observed state of QuestDBCluster

false

QuestDBCluster.spec

↩ Parent

spec defines the desired state of QuestDBCluster

NameTypeDescriptionRequired
imagestring

image is the QuestDB container image.

true
storageobject

storage describes the per-instance persistent volume.

true
authobject

auth configures authentication. If omitted, the operator generates a bootstrap admin password into a Secret named <cluster>-admin.

false
backupobject

backup configures in-database object-store backups. Absent ⇒ no backups. When set and enabled, schedule must be non-empty.


Validations:

  • !has(self.enabled) || !self.enabled || (has(self.schedule) && self.schedule != ''): backup.schedule is required when backup.enabled is true

false
bootstrapobject

bootstrap selects how the genesis primary is initialized. Absent ⇒ fresh primary. Immutable in presence as well as value: it cannot be added to, or removed from, an existing cluster (see the spec-level rules).


Validations:

  • self == oldSelf: spec.bootstrap is immutable
  • !has(self.follow) || !has(self.recovery): spec.bootstrap.recovery and spec.bootstrap.follow are mutually exclusive: both initialize the genesis instances from the same store and they do it in incompatible ways. recovery restores a backup into a writable primary (the source must already be stopped); follow restores the same backup into replicas that keep consuming the source's WAL while it still serves

false
configmap[string]string

config is server.conf passthrough (key=value). Operator-owned keys (acl.admin.*, http.health.check.authentication.required, replication.role, cairo.snapshot.instance.id, .tls.) are rejected.

The object-store keys are NOT rejected, and setting backup.object.store or replication.object.store here has no effect: the operator supplies both through the engine's _FILE mechanism, which takes precedence over server.conf. The additional backup destinations (backup.object.store.1 … .9) and cold.storage.object.store are yours to set.

false
imagePullSecrets[]object

imagePullSecrets references Secrets in the cluster's namespace used to pull spec.image. The QuestDB Enterprise image is private, and pull access to it is the entitlement to run it, so this is how a licensed instance is authorized on a cluster whose nodes have no ambient registry credentials (any AKS cluster, and any EKS cluster whose node role lacks a cross-account ECR grant).

Mutable: changing it rolls the pods, because a rotated pull secret must reach a pod that is restarted for an unrelated reason without a stale reference.


Validations:

  • self.all(s, s.name != ''): imagePullSecrets entries must have a non-empty name

false
instancesinteger

instances is the total number of nodes (1 primary + the rest replicas). Requires an enabled spec.backup (which itself requires spec.objectStoreRef) when > 1, because replicas seed from a backup. Replication itself is gated on spec.objectStoreRef, not on this count.


Format: int32
Default: 1
Minimum: 1

false
objectStoreRefobject

objectStoreRef references the QuestDBObjectStore (same namespace) that backs BOTH backup and replication for this cluster. Backup and replication WAL share this one store/bucket/provider under per-use roots (spec.backup.root, spec.replication.root). Immutable: re-pointing a live cluster's store would diverge replicas from the primary's WAL shipping (split-brain) and strand backup history; a deliberate migration must be an explicit gated flow (e.g. born-from-backup into a new cluster), not an in-place edit. Required when spec.backup is enabled or spec.instances > 1.

It also cannot be REMOVED once set — that would converge a replicated cluster down to a single unreplicated primary and strand its backups. ADDING one to a cluster that never had it IS allowed: turning on backup/replication later is a legitimate day-2 operation that strands nothing (see the spec-level rules).


Validations:

  • self == oldSelf: spec.objectStoreRef is immutable

false
pvcRetentionPolicyenum

pvcRetentionPolicy controls whether a stale replica's PVC is deleted when the instance is removed on scale-down. Retain (default) keeps the durable data; Delete reclaims it (a re-scale then born-from-backup re-seeds cleanly). The primary's PVC is never deleted regardless of this policy.


Enum: Retain, Delete
Default: Retain

false
replicationobject

replication optionally tunes primary+replica HA, which is active whenever objectStoreRef is set. instances > 1 requires objectStoreRef and an enabled scheduled backup, not this block.

false
resourcesobject

resources is the compute resource requirements for the QuestDB container. When a memory request and limit are both set they must be EQUAL: QuestDB mmaps/off-heaps heavily, so the memory limit must be firm and sized for the page cache. CPU is intentionally left flexible — a CPU limit is optional (CFS throttling can hurt tail latency; prefer pinning/dedicated nodes), so the pod may be Burstable rather than strictly Guaranteed.


Validations:

  • !has(self.requests) || !has(self.limits) || !('memory' in self.requests) || !('memory' in self.limits) || quantity(self.requests['memory']).compareTo(quantity(self.limits['memory'])) == 0: memory request and limit must be equal (firm memory limit for QuestDB)

false
schedulingobject

scheduling configures placement (nodeSelector/affinity/tolerations/ topologySpread/priorityClass) and the disruption budget for instance Pods.

false

QuestDBCluster.spec.storage

↩ Parent

storage describes the per-instance persistent volume.

NameTypeDescriptionRequired
sizeint or string

size is the requested volume size (e.g. 100Gi). Expand-only: it may grow (if the StorageClass allows expansion) but never shrink.


Validations:

  • quantity(self).compareTo(quantity(oldSelf)) >= 0: storage size cannot be reduced (expand-only)

true
storageClassNamestring

storageClassName selects the StorageClass for the instance PVC. It is immutable: changing it would orphan the bound volume.


Validations:

  • self == oldSelf: storageClassName is immutable

true

QuestDBCluster.spec.auth

↩ Parent

auth configures authentication. If omitted, the operator generates a bootstrap admin password into a Secret named <cluster>-admin.

NameTypeDescriptionRequired
adminSecretobject

adminSecret optionally supplies the bootstrap admin password. If unset, the operator generates one into <cluster>-admin (key "password"). The selected key's value is injected via QDB_ACL_ADMIN_PASSWORD_FILE (the native _FILE convention), not written to server.conf.

false

QuestDBCluster.spec.auth.adminSecret

↩ Parent

adminSecret optionally supplies the bootstrap admin password. If unset, the operator generates one into <cluster>-admin (key "password"). The selected key's value is injected via QDB_ACL_ADMIN_PASSWORD_FILE (the native _FILE convention), not written to server.conf.

NameTypeDescriptionRequired
keystring

The key of the secret to select from. Must be a valid secret key.

true
namestring

Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names


Default:

false
optionalboolean

Specify whether the Secret or its key must be defined

false

QuestDBCluster.spec.backup

↩ Parent

backup configures in-database object-store backups. Absent ⇒ no backups. When set and enabled, schedule must be non-empty.

NameTypeDescriptionRequired
enabledboolean

enabled turns on QuestDB's backup subsystem (backup.enabled).

false
retentioninteger

retention is how many recent backups QuestDB keeps (backup.cleanup.keep.latest.n). Defaults to QuestDB's default (5) when unset.


Format: int32
Minimum: 1

false
rootstring

root is the prefix within spec.objectStoreRef's bucket/container for backups (e.g. "backup/"). It may share spec.replication.root or differ — QuestDB keeps backup sets and replication WAL separate within a shared prefix. Defaults to "backup/" when omitted. Mutable (changing only the backup sub-prefix is the same low-risk operation the old mutable backup ref allowed).

false
schedulestring

schedule is a 5- or 6-field cron expression (backup.schedule.cron). Required when enabled.

false
timezonestring

timezone is the IANA zone for the schedule (backup.schedule.tz). Defaults to QuestDB's default (UTC) when unset.

false

QuestDBCluster.spec.bootstrap

↩ Parent

bootstrap selects how the genesis primary is initialized. Absent ⇒ fresh primary. Immutable in presence as well as value: it cannot be added to, or removed from, an existing cluster (see the spec-level rules).

NameTypeDescriptionRequired
followobject

follow makes the cluster a replica-only FOLLOWER of an external QuestDB the operator does not manage: every instance is a replica, there is no primary, and the fleet seeds from that source's backup and then follows its WAL stream through the shared object store. Promote one instance later to take over.

This is the low-downtime migration path onto the operator. spec.bootstrap.recovery requires stopping the source BEFORE the restore begins, so it loses every write since the last backup; a follower keeps consuming the source's stream while the source still serves, and downtime shrinks to "stop the source, drain it, promote".

Mutually exclusive with recovery: both initialize the genesis instances, from the same store, in incompatible ways.

false
recoveryobject

recovery makes the genesis primary born from a backup (DR / PITR) instead of fresh.

false

QuestDBCluster.spec.bootstrap.follow

↩ Parent

follow makes the cluster a replica-only FOLLOWER of an external QuestDB the operator does not manage: every instance is a replica, there is no primary, and the fleet seeds from that source's backup and then follows its WAL stream through the shared object store. Promote one instance later to take over.

This is the low-downtime migration path onto the operator. spec.bootstrap.recovery requires stopping the source BEFORE the restore begins, so it loses every write since the last backup; a follower keeps consuming the source's stream while the source still serves, and downtime shrinks to "stop the source, drain it, promote".

Mutually exclusive with recovery: both initialize the genesis instances, from the same store, in incompatible ways.

NameTypeDescriptionRequired
sourceInstanceNamestring

sourceInstanceName is the external source's backup_instance_name. It pins which backup in the shared store each replica restores as its baseline, and the operator cannot discover it — discovering it would mean querying the unmanaged source, which is exactly what this design does not do.

It must name the same database the WAL under spec.replication.root belongs to. A mismatch is not rejected here (nothing in the cluster can check it) and presents at runtime as a follower that restores cleanly and then never advances.

true

QuestDBCluster.spec.bootstrap.recovery

↩ Parent

recovery makes the genesis primary born from a backup (DR / PITR) instead of fresh.

NameTypeDescriptionRequired
sourceobject

source references the QuestDBObjectStore holding the backup to restore from.

true
recoveryTargetobject

recoveryTarget bounds the restore to a point in time. Omitted ⇒ restore the latest available backup. Restore snaps to the latest backup at-or-before the timestamp (granularity = the source's backup cadence; not continuous PITR).

false
sourceInstanceNamestring

sourceInstanceName selects which backup instance to restore when the store holds more than one. Optional when the store has exactly one instance.

false

QuestDBCluster.spec.bootstrap.recovery.source

↩ Parent

source references the QuestDBObjectStore holding the backup to restore from.

NameTypeDescriptionRequired
objectStoreRefobject

objectStoreRef names a QuestDBObjectStore in the cluster's namespace.

true

QuestDBCluster.spec.bootstrap.recovery.source.objectStoreRef

↩ Parent

objectStoreRef names a QuestDBObjectStore in the cluster's namespace.

NameTypeDescriptionRequired
namestring

name references a QuestDBObjectStore in the cluster's namespace.

true
rootstring

root is the prefix within the store's bucket/container for THIS use (e.g. "backup/", "db/"). It is the only isolation when multiple uses or clusters share a bucket.

false

QuestDBCluster.spec.bootstrap.recovery.recoveryTarget

↩ Parent

recoveryTarget bounds the restore to a point in time. Omitted ⇒ restore the latest available backup. Restore snaps to the latest backup at-or-before the timestamp (granularity = the source's backup cadence; not continuous PITR).

NameTypeDescriptionRequired
timestampstring

timestamp is an RFC3339 instant. Restore selects the latest backup at-or-before it.


Format: date-time

true

QuestDBCluster.spec.imagePullSecrets[index]

↩ Parent

LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.

NameTypeDescriptionRequired
namestring

Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names


Default:

false

QuestDBCluster.spec.objectStoreRef

↩ Parent

objectStoreRef references the QuestDBObjectStore (same namespace) that backs BOTH backup and replication for this cluster. Backup and replication WAL share this one store/bucket/provider under per-use roots (spec.backup.root, spec.replication.root). Immutable: re-pointing a live cluster's store would diverge replicas from the primary's WAL shipping (split-brain) and strand backup history; a deliberate migration must be an explicit gated flow (e.g. born-from-backup into a new cluster), not an in-place edit. Required when spec.backup is enabled or spec.instances > 1.

It also cannot be REMOVED once set — that would converge a replicated cluster down to a single unreplicated primary and strand its backups. ADDING one to a cluster that never had it IS allowed: turning on backup/replication later is a legitimate day-2 operation that strands nothing (see the spec-level rules).

NameTypeDescriptionRequired
namestring

name references an object in the same namespace as the object holding this reference. Which kind is determined by the field: see its documentation.

true

QuestDBCluster.spec.replication

↩ Parent

replication optionally tunes primary+replica HA, which is active whenever objectStoreRef is set. instances > 1 requires objectStoreRef and an enabled scheduled backup, not this block.

NameTypeDescriptionRequired
configmap[string]string

config is replication tuning passthrough (replication.primary.* / replication.requests.*). Operator-owned keys (replication.role, replication.object.store, the structured walCleaner keys) are rejected. replication.object.store stays rejected HERE (unlike in spec.config) because this block is specifically about replication: silently ignoring a store re-point written into the replication config would be the most misleading possible place to ignore it.

false
maxLagTxnsinteger

maxLagTxns optionally imposes a STRICT freshness gate on -ro membership: a replica more than this many transactions behind drops out. Unset => readiness gates on initial-catch-up + not-suspended only.


Format: int64
Minimum: 1

false
rootstring

root is the prefix within spec.objectStoreRef's bucket/container for this cluster's replication WAL. It may share spec.backup.root or differ — QuestDB keeps replication WAL and backup sets separate within a shared prefix.

DEFAULT WHEN OMITTED: the identity-scoped prefix "db/{namespace}/{name}/" — NOT the bare "db/". Do NOT "make the default explicit" by writing root: "db/": that names a DIFFERENT, shared stream and moves a live cluster's WAL onto it. QuestDB has no instance-name key in the object store, so the prefix is the only isolation between clusters that share a bucket. Deriving it from the cluster's own namespace/name (both immutable on a QuestDBCluster, so the default is stable for the object's lifetime) makes store-sharing safe by construction: a restore/DR clone pointed at the source's bucket inherits the source's data_id from the backup and would otherwise collide with the live source's WAL stream and crash-loop with ER002 (#74). Clusters chained A→B→C each own a distinct stream with no lineage tracking.

SET IT ONLY to opt into a SPECIFIC existing stream — that is the declarative way to adopt/continue another cluster's WAL (a stream take-over), fenced by the keepalive lease (ER005/ER006).

Immutable in VALUE and in PRESENCE (the presence half is enforced by a spec-level rule, since a field-level transition rule cannot see the absent case): re-pointing live WAL shipping would diverge replicas from the primary (split-brain risk), and adding or clearing it moves the stream off/onto the identity-scoped default just as destructively. A deliberate migration must be an explicit gated flow (born-from-backup into a new cluster), not an in-place edit.


Validations:

  • self == oldSelf: replication.root is immutable

false
seedFrominteger

seedFrom optionally pins the seed source for NEW replicas to an instance serial. Default (unset): the most-recent completed backup among live instances. The operator resolves the serial to its backup_instance_name and persists it, so the pin survives that instance's deletion.


Format: int32
Minimum: 1

false
walCleanerobject

walCleaner manages the primary's WAL cleaner — the engine job that bounds shared replication-WAL growth in the object store. It is on by default; these are the operator-surfaced knobs. Other replication.primary.cleaner.* tuning stays available via config above.

false

QuestDBCluster.spec.replication.walCleaner

↩ Parent

walCleaner manages the primary's WAL cleaner — the engine job that bounds shared replication-WAL growth in the object store. It is on by default; these are the operator-surfaced knobs. Other replication.primary.cleaner.* tuning stays available via config above.

NameTypeDescriptionRequired
backupWindowCountinteger

backupWindowCount is how many backup windows of WAL history the cleaner retains (replication.primary.cleaner.backup.window.count). Higher keeps more WAL (a wider PITR/seed window) at the cost of more storage. Defaults to QuestDB's default when unset.


Format: int32
Minimum: 1

false
enabledboolean

enabled toggles the WAL cleaner (replication.primary.cleaner.enabled). Defaults to true (the engine default). DISABLING IT LETS THE REPLICATION WAL GROW UNBOUNDED in the object store — set false only if you manage WAL retention externally.

false

QuestDBCluster.spec.resources

↩ Parent

resources is the compute resource requirements for the QuestDB container. When a memory request and limit are both set they must be EQUAL: QuestDB mmaps/off-heaps heavily, so the memory limit must be firm and sized for the page cache. CPU is intentionally left flexible — a CPU limit is optional (CFS throttling can hurt tail latency; prefer pinning/dedicated nodes), so the pod may be Burstable rather than strictly Guaranteed.

NameTypeDescriptionRequired
claims[]object

Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container.

This field depends on the DynamicResourceAllocation feature gate.

This field is immutable. It can only be set for containers.

false
limitsmap[string]int or string

Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

false
requestsmap[string]int or string

Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

false

QuestDBCluster.spec.resources.claims[index]

↩ Parent

ResourceClaim references one entry in PodSpec.ResourceClaims.

NameTypeDescriptionRequired
namestring

Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.

true
requeststring

Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request.

false

QuestDBCluster.spec.scheduling

↩ Parent

scheduling configures placement (nodeSelector/affinity/tolerations/ topologySpread/priorityClass) and the disruption budget for instance Pods.

NameTypeDescriptionRequired
affinityobject

affinity sets pod/node (anti-)affinity for instance Pods. When set, it FULLY REPLACES the operator's default soft anti-affinity (no merge) — the default per-hostname spreading is NOT retained, so re-add an anti-affinity term if you still want it.

false
nodeSelectormap[string]string

nodeSelector constrains instance Pods to nodes with matching labels.

false
podDisruptionBudgetobject

podDisruptionBudget tunes the operator-managed PodDisruptionBudget.

false
priorityClassNamestring

priorityClassName sets the Pod priority class for instance Pods.

false
tolerations[]object

tolerations allow instance Pods onto tainted nodes.

false
topologySpreadConstraints[]object

topologySpreadConstraints spread instance Pods across failure domains.

false

QuestDBCluster.spec.scheduling.affinity

↩ Parent

affinity sets pod/node (anti-)affinity for instance Pods. When set, it FULLY REPLACES the operator's default soft anti-affinity (no merge) — the default per-hostname spreading is NOT retained, so re-add an anti-affinity term if you still want it.

NameTypeDescriptionRequired
nodeAffinityobject

Describes node affinity scheduling rules for the pod.

false
podAffinityobject

Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).

false
podAntiAffinityobject

Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).

false

QuestDBCluster.spec.scheduling.affinity.nodeAffinity

↩ Parent

Describes node affinity scheduling rules for the pod.

NameTypeDescriptionRequired
preferredDuringSchedulingIgnoredDuringExecution[]object

The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.

false
requiredDuringSchedulingIgnoredDuringExecutionobject

If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.

false

QuestDBCluster.spec.scheduling.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[index]

↩ Parent

An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).

NameTypeDescriptionRequired
preferenceobject

A node selector term, associated with the corresponding weight.

true
weightinteger

Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.


Format: int32

true

QuestDBCluster.spec.scheduling.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].preference

↩ Parent

A node selector term, associated with the corresponding weight.

NameTypeDescriptionRequired
matchExpressions[]object

A list of node selector requirements by node's labels.

false
matchFields[]object

A list of node selector requirements by node's fields.

false

QuestDBCluster.spec.scheduling.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].preference.matchExpressions[index]

↩ Parent

A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

The label key that the selector applies to.

true
operatorstring

Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.

true
values[]string

An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].preference.matchFields[index]

↩ Parent

A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

The label key that the selector applies to.

true
operatorstring

Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.

true
values[]string

An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution

↩ Parent

If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.

NameTypeDescriptionRequired
nodeSelectorTerms[]object

Required. A list of node selector terms. The terms are ORed.

true

QuestDBCluster.spec.scheduling.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[index]

↩ Parent

A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.

NameTypeDescriptionRequired
matchExpressions[]object

A list of node selector requirements by node's labels.

false
matchFields[]object

A list of node selector requirements by node's fields.

false

QuestDBCluster.spec.scheduling.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[index].matchExpressions[index]

↩ Parent

A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

The label key that the selector applies to.

true
operatorstring

Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.

true
values[]string

An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[index].matchFields[index]

↩ Parent

A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

The label key that the selector applies to.

true
operatorstring

Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.

true
values[]string

An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity

↩ Parent

Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).

NameTypeDescriptionRequired
preferredDuringSchedulingIgnoredDuringExecution[]object

The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.

false
requiredDuringSchedulingIgnoredDuringExecution[]object

If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[index]

↩ Parent

The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)

NameTypeDescriptionRequired
podAffinityTermobject

Required. A pod affinity term, associated with the corresponding weight.

true
weightinteger

weight associated with matching the corresponding podAffinityTerm, in the range 1-100.


Format: int32

true

QuestDBCluster.spec.scheduling.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm

↩ Parent

Required. A pod affinity term, associated with the corresponding weight.

NameTypeDescriptionRequired
topologyKeystring

This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.

true
labelSelectorobject

A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.

false
matchLabelKeys[]string

MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.

false
mismatchLabelKeys[]string

MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.

false
namespaceSelectorobject

A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.

false
namespaces[]string

namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm.labelSelector

↩ Parent

A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm.labelSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm.namespaceSelector

↩ Parent

A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm.namespaceSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[index]

↩ Parent

Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key <topologyKey> matches that of any node on which a pod of the set of pods is running

NameTypeDescriptionRequired
topologyKeystring

This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.

true
labelSelectorobject

A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.

false
matchLabelKeys[]string

MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.

false
mismatchLabelKeys[]string

MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.

false
namespaceSelectorobject

A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.

false
namespaces[]string

namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[index].labelSelector

↩ Parent

A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[index].labelSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[index].namespaceSelector

↩ Parent

A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution[index].namespaceSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity

↩ Parent

Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).

NameTypeDescriptionRequired
preferredDuringSchedulingIgnoredDuringExecution[]object

The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and subtracting "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.

false
requiredDuringSchedulingIgnoredDuringExecution[]object

If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[index]

↩ Parent

The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)

NameTypeDescriptionRequired
podAffinityTermobject

Required. A pod affinity term, associated with the corresponding weight.

true
weightinteger

weight associated with matching the corresponding podAffinityTerm, in the range 1-100.


Format: int32

true

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm

↩ Parent

Required. A pod affinity term, associated with the corresponding weight.

NameTypeDescriptionRequired
topologyKeystring

This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.

true
labelSelectorobject

A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.

false
matchLabelKeys[]string

MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.

false
mismatchLabelKeys[]string

MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.

false
namespaceSelectorobject

A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.

false
namespaces[]string

namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm.labelSelector

↩ Parent

A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm.labelSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm.namespaceSelector

↩ Parent

A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[index].podAffinityTerm.namespaceSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[index]

↩ Parent

Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key <topologyKey> matches that of any node on which a pod of the set of pods is running

NameTypeDescriptionRequired
topologyKeystring

This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.

true
labelSelectorobject

A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.

false
matchLabelKeys[]string

MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key in (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.

false
mismatchLabelKeys[]string

MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with labelSelector as key notin (value) to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.

false
namespaceSelectorobject

A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.

false
namespaces[]string

namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[index].labelSelector

↩ Parent

A label query over a set of resources, in this case pods. If it's null, this PodAffinityTerm matches with no Pods.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[index].labelSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[index].namespaceSelector

↩ Parent

A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[index].namespaceSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.spec.scheduling.podDisruptionBudget

↩ Parent

podDisruptionBudget tunes the operator-managed PodDisruptionBudget.

NameTypeDescriptionRequired
enabledboolean

enabled controls whether the operator maintains a PDB. Defaults to true. Set false to remove the PDB entirely (e.g. to permit unrestricted node drains).

false
minAvailableinteger

minAvailable overrides the computed integer minAvailable. When unset: single instance => 1; replicated => instances-1.

LIMITATION: instance Pods have no controller to reschedule them, so a PDB that leaves no disruption budget HARD-BLOCKS voluntary evictions (kubectl drain hangs) until a human deletes the Pod or the PDB. This happens whenever minAvailable >= the number of currently-Ready instances — including the single-instance default (minAvailable=1 over one Pod). It is intentional protection for a database, NOT auto-clamped: set a lower minAvailable, scale out, or disable the PDB if you need drains to proceed unattended.


Format: int32
Minimum: 0

false

QuestDBCluster.spec.scheduling.tolerations[index]

↩ Parent

The pod this Toleration is attached to tolerates any taint that matches the triple <key,value,effect> using the matching operator <operator>.

NameTypeDescriptionRequired
effectstring

Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.

false
keystring

Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.

false
operatorstring

Operator represents a key's relationship to the value. Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).

false
tolerationSecondsinteger

TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.


Format: int64

false
valuestring

Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.

false

QuestDBCluster.spec.scheduling.topologySpreadConstraints[index]

↩ Parent

TopologySpreadConstraint specifies how to spread matching pods among the given topology.

NameTypeDescriptionRequired
maxSkewinteger

MaxSkew describes the degree to which pods may be unevenly distributed. When whenUnsatisfiable=DoNotSchedule, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When whenUnsatisfiable=ScheduleAnyway, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.


Format: int32

true
topologyKeystring

TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.

true
whenUnsatisfiablestring

WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won't make it more imbalanced. It's a required field.

true
labelSelectorobject

LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.

false
matchLabelKeys[]string

MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot be set when LabelSelector isn't set. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.

This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).

false
minDomainsinteger

MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule.

For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | | P P | P P | P P | The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew.


Format: int32

false
nodeAffinityPolicystring

NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.

If this value is nil, the behavior is equivalent to the Honor policy.

false
nodeTaintsPolicystring

NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included.

If this value is nil, the behavior is equivalent to the Ignore policy.

false

QuestDBCluster.spec.scheduling.topologySpreadConstraints[index].labelSelector

↩ Parent

LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.

NameTypeDescriptionRequired
matchExpressions[]object

matchExpressions is a list of label selector requirements. The requirements are ANDed.

false
matchLabelsmap[string]string

matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.

false

QuestDBCluster.spec.scheduling.topologySpreadConstraints[index].labelSelector.matchExpressions[index]

↩ Parent

A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.

NameTypeDescriptionRequired
keystring

key is the label key that the selector applies to.

true
operatorstring

operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.

true
values[]string

values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.

false

QuestDBCluster.status

↩ Parent

status defines the observed state of QuestDBCluster

NameTypeDescriptionRequired
adminSecretNamestring

adminSecretName is the Secret holding the bootstrap admin password in effect (operator-generated <cluster>-admin, or the user-supplied auth.adminSecret).

false
backupobject

backup reports observed backup configuration + the latest run.

false
conditions[]object

conditions represent the current state of the QuestDBCluster. Types: Available, Progressing, InstanceUnreachable, ConfigRejected, OperatorIdentityReady, BackupHealthy, ReplicationHealthy, PromotionRequired, Recovered, RecoveryFailed, StorageResizeBlocked.

false
currentPrimarystring

currentPrimary is the instance name of the current primary (e.g. prod-1).

false
instancesinteger

instances is the number of instances the operator is currently managing.


Format: int32

false
latestSerialinteger

latestSerial is the highest instance serial ever allocated. Serials are 1-based and monotonic; a zero/absent value means no instance has ever been minted (the reconciler allocates serial 1 from that state). It is never reused and does NOT increment when a pod is recreated for the same identity.


Format: int32

false
observedGenerationinteger

observedGeneration is the most recent generation observed by the controller. When it equals .metadata.generation, the reported status reflects the current spec.


Format: int64

false
operatorSecretNamestring

operatorSecretName is the Secret holding the questdb_operator service-account password (<cluster>-operator).

false
phasestring

phase is a short, human-facing lifecycle summary surfaced as a printer column. Use conditions for machine-readable state; phase is not load-bearing for control flow.

false
readyInstancesinteger

readyInstances is the number of instances whose pod reports Ready.


Format: int32

false
recoveryobject

recovery reports genesis-primary restore state (nil unless spec.bootstrap.recovery set).

false
replicationobject

replication reports observed replication state (nil when spec.objectStoreRef is unset).

false

QuestDBCluster.status.backup

↩ Parent

backup reports observed backup configuration + the latest run.

NameTypeDescriptionRequired
configuredboolean

configured is true once the operator has injected backup config into the pod.

false
lastBackupobject

lastBackup is the most recent run observed via backups() (nil until one runs).

false

QuestDBCluster.status.backup.lastBackup

↩ Parent

lastBackup is the most recent run observed via backups() (nil until one runs).

NameTypeDescriptionRequired
endTimestring

Format: date-time

false
errorstring
false
progressPercentinteger

Format: int32

false
startTimestring

Format: date-time

false
statusstring

status is in_progress|completed|failed|unknown.

false

QuestDBCluster.status.conditions[index]

↩ Parent

Condition contains details for one aspect of the current state of this API Resource.

NameTypeDescriptionRequired
lastTransitionTimestring

lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.


Format: date-time

true
messagestring

message is a human readable message indicating details about the transition. This may be an empty string.

true
reasonstring

reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.

true
statusenum

status of the condition, one of True, False, Unknown.


Enum: True, False, Unknown

true
typestring

type of condition in CamelCase or in foo.example.com/CamelCase.

true
observedGenerationinteger

observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.


Format: int64
Minimum: 0

false

QuestDBCluster.status.recovery

↩ Parent

recovery reports genesis-primary restore state (nil unless spec.bootstrap.recovery set).

NameTypeDescriptionRequired
sourceInstanceNamestring
false

QuestDBCluster.status.replication

↩ Parent

replication reports observed replication state (nil when spec.objectStoreRef is unset).

NameTypeDescriptionRequired
activePromotionstring

activePromotion names the QuestDBPromotion currently being serviced for this cluster, or is absent when no cutover is in flight.

false
followingboolean

following is true while the cluster is a replica-only follower of the external QuestDB named by spec.bootstrap.follow. Such a cluster has no primary and accepts no writes. It becomes false after an instance is promoted.

false
maxLagTxnsinteger

maxLagTxns is the worst observed end-to-end lag across replicas and tables. Zero means all observed replicas are caught up; absent means lag is undetermined.


Format: int64

false
primaryEstablishedboolean

primaryEstablished is true once the primary has been Ready at least once. When true, primary-PVC-loss protection is active and the operator will not initialize an empty replacement primary if that PVC is missing.

false
replicas[]object

replicas reports per-replica observed state.

false
seedobject

seed is the effective seed for the next replica bootstrap: the durable, monotonically advanced last-known-good pointer (source=auto) or the resolved pinned source (source=pinned).

false
streamobject

stream reports the observed follower and source WAL progress over time.

false

QuestDBCluster.status.replication.replicas[index]

↩ Parent

ReplicaStatus reports observed state for a single replica instance.

NameTypeDescriptionRequired
caughtUpboolean

caughtUp is a sticky indication that the replica completed its initial catch-up at least once and became eligible for the read-only Service. It does not report current freshness; use caughtUpNow for that.

true
instancestring

instance is the replica's instance/pod name.

true
caughtUpNowboolean

caughtUpNow reports current observed freshness: true means the replica was reachable, had no suspended tables, and had zero lag; false means it was behind; absent means freshness was undetermined.

false
lagTxnsinteger

lagTxns is the replica's observed end-to-end transaction lag behind the primary. Zero means caught up; absent means lag was undetermined.


Format: int64

false
suspendedTables[]string

suspendedTables lists tables whose replication is suspended (unhealthy).

false

QuestDBCluster.status.replication.seed

↩ Parent

seed is the effective seed for the next replica bootstrap: the durable, monotonically advanced last-known-good pointer (source=auto) or the resolved pinned source (source=pinned).

NameTypeDescriptionRequired
backupInstanceNamestring

backupInstanceName is QuestDB's 3-word backup identity for that set, written into a replica's _backup_restore trigger.

true
serialinteger

serial is the instance serial whose backup set seeds new replicas.


Format: int32

true
sourceenum

source is how the seed was chosen: "auto" (most-recent-live) or "pinned" (spec.replication.seedFrom).


Enum: auto, pinned

true
timestampstring

timestamp is the completion time of the backup this seed points at.


Format: date-time

true

QuestDBCluster.status.replication.stream

↩ Parent

stream reports the observed follower and source WAL progress over time.

NameTypeDescriptionRequired
advancedAtstring

advancedAt is when writtenTxn last increased, or when observation began if no increase has been observed.


Format: date-time

false
receivedAdvancedAtstring

receivedAdvancedAt is when receivedTxn last increased, or when observation began if no increase has been observed. A quiet value does not prove the source process has stopped.


Format: date-time

false
receivedTxninteger

receivedTxn is the highest source transaction observed in sampled replication indexes. It reports source publication progress and never decreases.


Format: int64

false
writtenTxninteger

writtenTxn is the highest transaction observed as applied locally across sampled tables and follower instances. It never decreases.


Format: int64

false

QuestDBObjectStore

QuestDBObjectStore is the Schema for the questdbobjectstores API.

NameTypeDescriptionRequired
apiVersionstringquestdb.io/v1alpha1true
kindstringQuestDBObjectStoretrue
metadataobjectRefer to the Kubernetes API documentation for the fields of the metadata field.true
specobject

spec defines the desired state of QuestDBObjectStore


Validations:

  • self.provider != 'S3' || (has(self.s3) && !has(self.azure) && !has(self.gcs)): provider S3 requires the s3 block and no other provider block
  • self.provider != 'Azure' || (has(self.azure) && !has(self.s3) && !has(self.gcs)): provider Azure requires the azure block and no other provider block
  • self.provider != 'GCS' || (has(self.gcs) && !has(self.s3) && !has(self.azure)): provider GCS requires the gcs block and no other provider block
  • self.provider != 'GCS': provider GCS is not supported in this release; supported providers are S3 and Azure

true
statusobject

status defines the observed state of QuestDBObjectStore

false

QuestDBObjectStore.spec

↩ Parent

spec defines the desired state of QuestDBObjectStore

NameTypeDescriptionRequired
providerenum

provider selects the backend. It is immutable: changing the backend of a live store would orphan every object (data + backups) written under the old backend while consumers silently re-point to an empty new one.


Validations:

  • self == oldSelf: provider is immutable
Enum: S3, Azure, GCS

true
azureobject

azure configures an Azure Blob store. Set iff provider is Azure.


Validations:

  • !has(self.extraOptions) || self.extraOptions.all(k, !k.contains(';') && !k.contains('=') && !self.extraOptions[k].contains(';')): extraOptions keys must not contain ';' or '='; values must not contain ';'
  • !has(self.extraOptions) || self.extraOptions.all(k, !(k.lowerAscii() in ['container','account_name','account_key','root','endpoint'])): extraOptions key is reserved; set it via the dedicated structured field

false
gcsobject

gcs configures a Google Cloud Storage store. Set iff provider is GCS.


Validations:

  • !has(self.extraOptions) || self.extraOptions.all(k, !k.contains(';') && !k.contains('=') && !self.extraOptions[k].contains(';')): extraOptions keys must not contain ';' or '='; values must not contain ';'
  • !has(self.extraOptions) || self.extraOptions.all(k, !(k.lowerAscii() in ['bucket','root','endpoint','credential','credential_path','token'])): extraOptions key is reserved; set it via the dedicated structured field

false
s3object

s3 configures an AWS S3 (or S3-compatible) store. Set iff provider is S3.


Validations:

  • !has(self.extraOptions) || self.extraOptions.all(k, !k.contains(';') && !k.contains('=') && !self.extraOptions[k].contains(';')): extraOptions keys must not contain ';' or '='; values must not contain ';'
  • !has(self.extraOptions) || self.extraOptions.all(k, !(k.lowerAscii() in ['bucket','root','region','endpoint','access_key_id','secret_access_key','session_token'])): extraOptions key is reserved; set it via the dedicated structured field

false

QuestDBObjectStore.spec.azure

↩ Parent

azure configures an Azure Blob store. Set iff provider is Azure.

NameTypeDescriptionRequired
accountNamestring

accountName is the storage account name used to construct the default Azure Blob endpoint and provider configuration.

true
containerstring

container is the blob container name.

true
credentialsSecretobject

credentialsSecret holds static credentials. The operator never configures a ServiceAccount, pod identity label, or provider identity; omit this field only when the QuestDB pod already has provider-supported ambient identity. The beta-supported wiring is EKS IRSA through the tenant default ServiceAccount; the AKS guide uses AZURE_STORAGE_KEY. Expected Secret keys: S3 — AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN; Azure — AZURE_STORAGE_KEY; GCS — GOOGLE_APPLICATION_CREDENTIALS_JSON.

false
endpointstring

endpoint overrides the default endpoint (MinIO / Azurite / fake-gcs). For Azure, when omitted the operator derives https://<accountName>.blob.core.windows.net.

false
extraOptionsmap[string]string

extraOptions are appended verbatim as OpenDAL key=value pairs (e.g. ca_builtin_roots). Keys must not contain ';' or '='; values must not contain ';'.


Validations:

  • self.all(k, k.size() <= 256): extraOptions keys must be at most 256 characters
  • self.all(k, self[k].size() <= 256): extraOptions values must be at most 256 characters

false
rootstring

root is a path prefix within the bucket/container. NOTE: on a QuestDBObjectStore this field does NOT isolate data — the effective prefix is the consuming cluster's per-use root (spec.backup.root / spec.replication.root), which overrides it. Those per-use roots are what isolate clusters that share a bucket (QuestDB has no instance-name key).

false

QuestDBObjectStore.spec.azure.credentialsSecret

↩ Parent

credentialsSecret holds static credentials. The operator never configures a ServiceAccount, pod identity label, or provider identity; omit this field only when the QuestDB pod already has provider-supported ambient identity. The beta-supported wiring is EKS IRSA through the tenant default ServiceAccount; the AKS guide uses AZURE_STORAGE_KEY. Expected Secret keys: S3 — AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN; Azure — AZURE_STORAGE_KEY; GCS — GOOGLE_APPLICATION_CREDENTIALS_JSON.

NameTypeDescriptionRequired
namestring

Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names


Default:

false

QuestDBObjectStore.spec.gcs

↩ Parent

gcs configures a Google Cloud Storage store. Set iff provider is GCS.

NameTypeDescriptionRequired
bucketstring

bucket is the GCS bucket name.

true
credentialsSecretobject

credentialsSecret holds static credentials. The operator never configures a ServiceAccount, pod identity label, or provider identity; omit this field only when the QuestDB pod already has provider-supported ambient identity. The beta-supported wiring is EKS IRSA through the tenant default ServiceAccount; the AKS guide uses AZURE_STORAGE_KEY. Expected Secret keys: S3 — AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN; Azure — AZURE_STORAGE_KEY; GCS — GOOGLE_APPLICATION_CREDENTIALS_JSON.

false
endpointstring

endpoint overrides the default endpoint (MinIO / Azurite / fake-gcs). For Azure, when omitted the operator derives https://<accountName>.blob.core.windows.net.

false
extraOptionsmap[string]string

extraOptions are appended verbatim as OpenDAL key=value pairs (e.g. ca_builtin_roots). Keys must not contain ';' or '='; values must not contain ';'.


Validations:

  • self.all(k, k.size() <= 256): extraOptions keys must be at most 256 characters
  • self.all(k, self[k].size() <= 256): extraOptions values must be at most 256 characters

false
rootstring

root is a path prefix within the bucket/container. NOTE: on a QuestDBObjectStore this field does NOT isolate data — the effective prefix is the consuming cluster's per-use root (spec.backup.root / spec.replication.root), which overrides it. Those per-use roots are what isolate clusters that share a bucket (QuestDB has no instance-name key).

false

QuestDBObjectStore.spec.gcs.credentialsSecret

↩ Parent

credentialsSecret holds static credentials. The operator never configures a ServiceAccount, pod identity label, or provider identity; omit this field only when the QuestDB pod already has provider-supported ambient identity. The beta-supported wiring is EKS IRSA through the tenant default ServiceAccount; the AKS guide uses AZURE_STORAGE_KEY. Expected Secret keys: S3 — AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN; Azure — AZURE_STORAGE_KEY; GCS — GOOGLE_APPLICATION_CREDENTIALS_JSON.

NameTypeDescriptionRequired
namestring

Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names


Default:

false

QuestDBObjectStore.spec.s3

↩ Parent

s3 configures an AWS S3 (or S3-compatible) store. Set iff provider is S3.

NameTypeDescriptionRequired
bucketstring

bucket is the S3 bucket name.

true
credentialsSecretobject

credentialsSecret holds static credentials. The operator never configures a ServiceAccount, pod identity label, or provider identity; omit this field only when the QuestDB pod already has provider-supported ambient identity. The beta-supported wiring is EKS IRSA through the tenant default ServiceAccount; the AKS guide uses AZURE_STORAGE_KEY. Expected Secret keys: S3 — AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN; Azure — AZURE_STORAGE_KEY; GCS — GOOGLE_APPLICATION_CREDENTIALS_JSON.

false
endpointstring

endpoint overrides the default endpoint (MinIO / Azurite / fake-gcs). For Azure, when omitted the operator derives https://<accountName>.blob.core.windows.net.

false
extraOptionsmap[string]string

extraOptions are appended verbatim as OpenDAL key=value pairs (e.g. ca_builtin_roots). Keys must not contain ';' or '='; values must not contain ';'.


Validations:

  • self.all(k, k.size() <= 256): extraOptions keys must be at most 256 characters
  • self.all(k, self[k].size() <= 256): extraOptions values must be at most 256 characters

false
regionstring

region is the bucket region.

false
rootstring

root is a path prefix within the bucket/container. NOTE: on a QuestDBObjectStore this field does NOT isolate data — the effective prefix is the consuming cluster's per-use root (spec.backup.root / spec.replication.root), which overrides it. Those per-use roots are what isolate clusters that share a bucket (QuestDB has no instance-name key).

false

QuestDBObjectStore.spec.s3.credentialsSecret

↩ Parent

credentialsSecret holds static credentials. The operator never configures a ServiceAccount, pod identity label, or provider identity; omit this field only when the QuestDB pod already has provider-supported ambient identity. The beta-supported wiring is EKS IRSA through the tenant default ServiceAccount; the AKS guide uses AZURE_STORAGE_KEY. Expected Secret keys: S3 — AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN; Azure — AZURE_STORAGE_KEY; GCS — GOOGLE_APPLICATION_CREDENTIALS_JSON.

NameTypeDescriptionRequired
namestring

Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names


Default:

false

QuestDBObjectStore.status

↩ Parent

status defines the observed state of QuestDBObjectStore

NameTypeDescriptionRequired
observedGenerationinteger

observedGeneration is the most recent .metadata.generation observed.


Format: int64

false

QuestDBPromotion

QuestDBPromotion is the Schema for the questdbpromotions API. One object is one cutover: it is created to request a promotion, runs once, and reaches a terminal phase. Retrying means creating a new object.

NameTypeDescriptionRequired
apiVersionstringquestdb.io/v1alpha1true
kindstringQuestDBPromotiontrue
metadataobjectRefer to the Kubernetes API documentation for the fields of the metadata field.true
specobject

spec defines the desired state of QuestDBPromotion

true
statusobject

status defines the observed state of QuestDBPromotion

false

QuestDBPromotion.spec

↩ Parent

spec defines the desired state of QuestDBPromotion

NameTypeDescriptionRequired
clusterRefobject

clusterRef names the QuestDBCluster to cut over, in this object's namespace. It is immutable: re-pointing a live cutover at a different cluster is never a coherent request.


Validations:

  • self == oldSelf: clusterRef is immutable; create a new QuestDBPromotion instead

true
targetinteger

target is the instance serial that should become the primary. Immutable, so an escalation to mode: Emergency is structurally against the same cutover and cannot silently substitute a different node.


Validations:

  • self == oldSelf: target is immutable; create a new QuestDBPromotion instead
Format: int32
Minimum: 1

true
catchUpTimeoutSecondsinteger

catchUpTimeoutSeconds is how long a Planned cutover waits for the target replica to catch up before failing. Nothing is shaped while it waits — the old primary is still primary and still serving writes — so a timeout here leaves the cluster exactly as it was and costs only the cutover. Raise it for a replica with a large lag to work through. It is measured from the start of the cutover, so time spent waiting on a non-drainable primary counts against it. 0 means wait indefinitely. Ignored when mode is Emergency, which never waits. The post-drain wait for the target to confirm it applied the drained tail is downtime, so it is bounded by primaryGracePeriodSeconds instead — see there.


Format: int32
Default: 900
Minimum: 0

false
modeenum

mode selects the cutover strategy. The operator never chooses between a lossless cutover and a lossy one on your behalf — that choice is always yours.

Planned (the default) drains the old primary before promoting the target, so every committed write reaches the new primary. If the old primary cannot be drained — its data PVC is lost, or it is stranded on an unreachable node — the promotion FAILS and nothing is promoted. It never falls back to Emergency.

Emergency skips the drain: it fences the old primary and promotes the target immediately. Writes the old primary had not yet replicated are LOST. Use it when the primary is dead, or alive but wedged and you accept the loss.

It is the one field editable on a running cutover, and only in one direction: Planned may be escalated to Emergency, never the reverse, because a fence cannot be undone.


Validations:

  • oldSelf != 'Emergency' || self == 'Emergency': mode cannot be de-escalated from Emergency back to Planned: the old primary has already been fenced
Enum: Planned, Emergency
Default: Planned

false
primaryGracePeriodSecondsinteger

primaryGracePeriodSeconds is how long a Planned cutover tolerates an old primary it cannot drain before failing. It covers both the start of the cutover and a primary lost mid-drain, and it exists so a brief node blip does not fail an otherwise healthy cutover.

It also bounds the wait AFTER a successful drain, while the target confirms it has applied what that drain uploaded (measured from status.drainCompletedAt; reason TargetNotReplayed). The rule is the cost, not the phase: while the cluster is not serving writes, this field is the limit; while it is still serving, it is catchUpTimeoutSeconds.

This wait IS downtime: the primary is gone, so the cluster is not serving writes for its duration, and reaching it fails this cutover for good (reason PrimaryNotDrainable, or PrimaryLostDuringDrain if the primary was lost part-way through). A promotion is one-shot: there is nothing to re-request on a terminal object, so accepting the loss means creating a NEW QuestDBPromotion with mode: Emergency. Keep it short. 0 means wait indefinitely, which trades a bounded outage for an unbounded one. Ignored when mode is Emergency, which never waits.


Format: int32
Default: 120
Minimum: 0

false

QuestDBPromotion.spec.clusterRef

↩ Parent

clusterRef names the QuestDBCluster to cut over, in this object's namespace. It is immutable: re-pointing a live cutover at a different cluster is never a coherent request.

NameTypeDescriptionRequired
namestring

name references an object in the same namespace as the object holding this reference. Which kind is determined by the field: see its documentation.

true

QuestDBPromotion.status

↩ Parent

status defines the observed state of QuestDBPromotion

NameTypeDescriptionRequired
completedAtstring

completedAt is when this cutover reached a terminal phase.


Format: date-time

false
conditions[]object

conditions carries Succeeded: Unknown while running, True on Completed, False on Failed.

false
drainCompletedAtstring

drainCompletedAt is when the old primary's drain was first observed to finish — its primary-catchup-uploads container exiting 0, which is the moment the object store became final for this cutover. Nil until then, and while a Planned cutover shows a Draining phase with this set, it is waiting for the TARGET to confirm it has applied what that drain uploaded. primaryGracePeriodSeconds bounds that wait, measured from here.


Format: date-time

false
messagestring

message is a human-readable explanation naming what happened, what state the cluster is in, and what to do next.

false
modestring

mode is the strategy this cutover RAN (Planned|Emergency): decided once at entry from spec.mode and never escalated on the operator's own initiative. It only ever differs from the request if you explicitly escalated to mode: Emergency while the drain was still running.

false
phaseenum

phase is the saga phase. Completed and Failed are terminal.


Enum: Pending, Validating, Draining, Promoting, Completed, Failed

false
reasonstring

reason is a machine-readable outcome code (CamelCase), set on a terminal phase.

false
startedAtstring

startedAt is when this cutover left Pending. It is the clock catchUpTimeoutSeconds is measured against.


Format: date-time

false
undrainableSincestring

undrainableSince is when the old primary most recently became non-drainable, or nil while it is drainable. It is cleared the moment the primary becomes drainable again, so a blip that recovers resets the grace clock rather than consuming it.


Format: date-time

false

QuestDBPromotion.status.conditions[index]

↩ Parent

Condition contains details for one aspect of the current state of this API Resource.

NameTypeDescriptionRequired
lastTransitionTimestring

lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.


Format: date-time

true
messagestring

message is a human readable message indicating details about the transition. This may be an empty string.

true
reasonstring

reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.

true
statusenum

status of the condition, one of True, False, Unknown.


Enum: True, False, Unknown

true
typestring

type of condition in CamelCase or in foo.example.com/CamelCase.

true
observedGenerationinteger

observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.


Format: int64
Minimum: 0

false