Skip to content

API Reference

Packages

core.camunda.io/v1

Package v1 contains API Schema definitions for the core v1 API group.

Resource Types

AdminMappingRule

AdminMappingRule gives the admin role to every token in which the claim ClaimName holds the value ClaimValue.

Appears in: - ClusterAdminSpec

Field Description Default Validation
id string ID names the rule inside the cluster. The Admin web application lists it
under Mapping Rules.
MaxLength: 256
MinLength: 1
claimName string ClaimName is the name of a claim, or a JSONPath expression that points
at a claim.
MinLength: 1
claimValue string ClaimValue is the value that the claim must hold for the rule to match. MinLength: 1

AdminPasswordStatus

AdminPasswordStatus is the state of the admin credential of a basic-auth cluster.

Appears in: - CamundaClusterStatus

Field Description Default Validation
rotation string Rotation is the last admin password rotation that the operator
applied. It is the value of spec.auth.basic.passwordRotation, after the
preset merge, that produced the password in the admin Secret. A
rotation is in progress while that value is not empty and differs from
this one. A cleared value does not stop a rotation that has started.
That rotation completes, and this field then records the value that
started it. A cluster that gets the value from its preset shows none in
its own spec.
Optional: {}

ArchiveBoundary

ArchiveBoundary is the moment when a server moved its archive to another location while no interval was open. Only a base backup that began after this moment belongs to the current archive. A base backup that began before it wrote to the old location.

Appears in: - DatabaseServerArchiveStatus

Field Description Default Validation
at Time At is when the server moved.
location string Location is the new location, in the form of ArchiveRecord.Location.
The boundary ends when the archive of that location opens a record. It
moves when the location moves again.
objectStorageRef string ObjectStorageRef is the ObjectStorageConfig of that location. It is
information for the reader only.
Optional: {}

ArchiveRecord

ArchiveRecord is one continuous archive that a server wrote. A recovery replays it from a base backup up to the requested point. A restore can reach only a point inside the interval of a record.

Appears in: - DatabaseServerArchiveStatus

Field Description Default Validation
serverName string ServerName is the archive directory in the bucket, equal to the name of
the CloudNativePG cluster that wrote it.
objectStorageRef string ObjectStorageRef is the ObjectStorageConfig, in the namespace of this
server, that holds this archive. When the server moves to another
bucket, it closes this record and opens a new one. Thus every interval
names the bucket that a restore of that interval reads.
Optional: {}
location string Location is where in object storage the server wrote this archive: the
provider, the bucket, and the path, as one URL. Two intervals hold the
same archive only when their locations are equal. The name of an
ObjectStorageConfig is not sufficient, because you can edit the object
or create it again with the same name. A record without a location gets
the current location of the server.
Optional: {}
from Time From is the earliest point that a recovery from this archive can reach:
the time when its first base backup completed.
to Time To is the latest point that a recovery from this archive can reach. It
is unset while the server still writes to this archive.
Optional: {}
unverifiedFrom Time UnverifiedFrom is the point after which this archive can miss parts of
the write-ahead log. It is set while CloudNativePG reports that the
uploads of the server fail. A restore cannot reach a point after it.
When the uploads work again, the plugin uploads the segments that it
held back. The field is then cleared, and a restore can reach the whole
interval again. Only the record that the server writes to now has it.
Optional: {}

AttachedClusterStatus

AttachedClusterStatus is one CamundaCluster that clusterSelector matched.

Appears in: - CamundaManagementClusterStatus

Field Description Default Validation
name string Name is the name of the CamundaCluster.
namespace string Namespace is the namespace of the CamundaCluster.
attached boolean Attached shows whether the management plane serves this cluster.
Console lists the cluster, and Web Modeler deploys to it, only while
this is true.
reason string Reason names what the management plane found on this cluster. It has
one of five values. Four values tell why the cluster is not attached.
ClaimedElsewhere means that another management plane holds the
cluster. NotReady means that the cluster publishes no gateway endpoints,
or that it changed while the operator claimed it. InvalidReference
means that the operator cannot read the platform config of the cluster.
It also means that the OIDC issuer of the cluster differs from the
issuer of the management plane. WriteFailed means that the API server refused the
write of the Console ping settings. The fifth value,
BasicAuthUserFailed, is on an attached row.
The management plane serves the cluster, but the Web Modeler user on
it is missing.
Optional: {}
message string Message explains the reason in one sentence. Optional: {}

AttachedOptimizeStatus

AttachedOptimizeStatus is one CamundaOptimize whose login callback this management plane registers.

Appears in: - CamundaManagementClusterStatus

Field Description Default Validation
name string Name is the name of the CamundaOptimize.
namespace string Namespace is the namespace of the CamundaOptimize.
externalUrl string ExternalURL is spec.externalUrl of that CamundaOptimize. The registered
callback is this URL with the login path of Optimize.

AuthenticationMethod

Underlying type: string

AuthenticationMethod selects how users and clients authenticate against an orchestration cluster.

Validation: - Enum: [basic oidc]

Appears in: - PlatformAuthSpec

Field Description
basic AuthenticationMethodBasic selects username and password authentication
against users that the orchestration cluster stores itself.
oidc AuthenticationMethodOIDC selects an external OIDC identity provider.

AzureBlobCredentials

AzureBlobCredentials holds the static key of an Azure storage account.

Appears in: - AzureBlobStorageAuth

Field Description Default Validation
secretRef LocalSecretKeyRef SecretRef names the Secret key that holds the storage account key.

AzureBlobStorage

AzureBlobStorage describes an Azure Blob Storage container.

Appears in: - ObjectStorageConfigSpec

Field Description Default Validation
accountName string AccountName is the storage account that holds the container. MinLength: 1
container string Container is the blob container that consumers write to. MinLength: 1
basePath string BasePath is the blob prefix under which consumers write objects,
without leading or trailing slashes. Empty means the container root.
Pattern: ^[^/]+(/[^/]+)*$
Optional: {}
endpoint string Endpoint is the URL of the blob service. Empty means the public Azure
endpoint of the account. Set it for Azurite and sovereign clouds.
Optional: {}
auth AzureBlobStorageAuth Auth selects how consumers authenticate. An absent block means
workload identity through the ServiceAccount.
{ type:workloadIdentity } Optional: {}

AzureBlobStorageAuth

AzureBlobStorageAuth selects how consumers authenticate against an Azure Blob container.

Appears in: - AzureBlobStorage

Field Description Default Validation
type ObjectStorageAuthType Type is the authentication choice. Defaults to workloadIdentity. workloadIdentity Enum: [workloadIdentity credentials]
Optional: {}
workloadIdentity AzureBlobWorkloadIdentity WorkloadIdentity names the trusted principal. It is valid only with
type workloadIdentity. With an empty or absent block, the operator adds
no annotation to the ServiceAccount. The operator still adds the
azure.workload.identity/use label to the pods.
Optional: {}
credentials AzureBlobCredentials Credentials is a static storage account key. Required with type
credentials. Forbidden with other types.
Optional: {}

AzureBlobWorkloadIdentity

AzureBlobWorkloadIdentity names the Azure principal that the container trusts. With an empty block, the operator adds no annotation to the ServiceAccount of the consumer. The operator still adds the azure.workload.identity/use label to the pods of the consumer.

Appears in: - AzureBlobStorageAuth

Field Description Default Validation
clientId string ClientID is the managed identity that consumers use. When set, the
operator puts it in the azure.workload.identity/client-id annotation
of a ServiceAccount that it creates for the consumer. On an existing
ServiceAccount, add the annotation yourself.
Optional: {}

BackupCredentialsSpec

BackupCredentialsSpec configures the backup credentials Secret. The operator creates it unless it is disabled.

Appears in: - DatabaseSpec

Field Description Default Validation
disabled boolean Disabled stops the operator from creating the backup user and Secret.
Defaults to false.
Optional: {}
secretName string SecretName is the name of the credentials Secret. The default comes
from the CR name, as the field that uses this type states.
Optional: {}

BackupDumpSpec

BackupDumpSpec is the dump configuration of the cluster. It holds the pod settings that a backup can also set for one run, and the image that runs the dump. Only the cluster sets the image. The Job runs under the ServiceAccount of the cluster, with the cloud identity and the database credentials of the cluster. Thus the cluster owner chooses the program that the Job runs, never the person who creates a backup. A LogicalBackupRDBMS replaces all the pod settings and always uses the image of the cluster.

Appears in: - ClusterBackupSpec

Field Description Default Validation
resources ResourceRequirements Resources are the CPU and memory of the dump pod. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the dump pod.
In the spec.dump of a LogicalBackupRDBMS, every name that starts with
PG or UPLOAD_ is reserved, and the API server refuses it. A PG* name is
connection policy, because libpq reads PGHOSTADDR, PGSERVICE,
PGOPTIONS, and more. UPLOAD_* is the upload contract. The variables of
a backup reach only the dump container, never the upload container.
Cloud SDKs read endpoint, proxy, and configuration variables from the
environment, and the author of a backup must not change where the dump
goes.
In the spec.backup.dump of the cluster, no name is reserved, and the
variables reach every container. The cluster owner sets the connection
policy, PGSSLMODE included.
Unlike the extraEnv of a workload, this list is atomic. One field
manager owns the whole list, because no extension adds entries to a
dump pod.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources of the dump pod. In the
spec.dump of a LogicalBackupRDBMS, every source needs a prefix that
cannot make a PG* or UPLOAD_* name. The writer of the referenced object
chooses its keys. As with ExtraEnv, the sources of a
backup reach only the dump container. The block of the cluster needs no
prefix, and its sources reach every container.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the dump pod. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the dump pod. A service mesh
sidecar keeps running after the dump finishes, and the Job does not
complete. Set the injection annotation of the mesh to false here.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the dump pod. When set,
it replaces the block of a preset, with no merge.
Optional: {}
scratchVolume ScratchVolumeSpec ScratchVolume is where the pod writes the dump before the upload. When
set, it replaces the block of a preset, with no merge. The dump pod
runs with fsGroup 999, the postgres group. Thus pg_dump can write to a
volume that a storage class gives with the root owner.
Optional: {}
activeDeadlineSeconds integer ActiveDeadlineSeconds is the number of seconds that the dump Job can
run before it fails, counted from its start. When the dump block that
applies does not set it, the Job gets 86400 (24 hours). In the block of
the cluster, an unset value takes the value of the preset. The
spec.dump of a LogicalBackupRDBMS replaces the block of the cluster, so
an unset value there gives 86400, not the value of the cluster.
The default is large, so that a very large dump can complete. The Job
always has a deadline. A pod that cannot start uses no retry, so
without a deadline a broken Job stays active for the life of the
backup. A lower value fails a stuck dump sooner. A higher value gives a
long dump the time that it needs.
Minimum: 1
Optional: {}
postgresImage string PostgresImage is the full image reference of the dump container. It
replaces the default postgres:<major> of the upstream registry. Set it
in an air-gapped installation, where the default image is not
available.
Optional: {}

BackupPart

BackupPart is the observed state of one part of the backup set: the web-application indices, the exported record indices, or the Zeebe partitions.

Appears in: - LogicalBackupElasticsearchStatus

Field Description Default Validation
state BackupPartState State is the state of this part. Enum: [Pending InProgress Completed Failed]
Optional: {}
failureReason string FailureReason is set when State is Failed. Optional: {}

BackupPartState

Underlying type: string

BackupPartState is the state of one part of the backup set.

Validation: - Enum: [Pending InProgress Completed Failed]

Appears in: - BackupPart

Field Description
Pending
InProgress
Completed
Failed

BackupSchedule

BackupSchedule creates logical backups of one CamundaCluster on a cron schedule, and deletes old backups that have its label. At each trigger, the operator creates the backup kind for the storage type of the cluster. The backup has the name <schedule>-<unix-timestamp> and the labels camunda.io/cluster and camunda.io/backup-schedule. If a name is too long for a resource name or a label value, the operator shortens it. Then it adds a hash of the full name, so two long names stay different.

The backups have no owner reference to the schedule, so a deletion of the schedule never deletes its backups. The schedule skips a trigger while a reference does not resolve, and the Ready condition shows the reason. It also skips a trigger while the cluster is suspended or cannot start a backup yet. It skips a trigger too while a backup of this schedule is not in a final phase. It records an event for these three skips, and no event for a reference that does not resolve.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string BackupSchedule
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec BackupScheduleSpec spec defines the desired state of BackupSchedule Required: {}
status BackupScheduleStatus status defines the observed state of BackupSchedule Optional: {}

BackupScheduleSpec

BackupScheduleSpec is the backup policy of one cluster: when the schedule creates a backup, and how many backups it keeps.

Appears in: - BackupSchedule

Field Description Default Validation
clusterRef ClusterRef ClusterRef references the CamundaCluster to back up. At each trigger,
the operator creates the backup kind for the storage type of the
cluster: LogicalBackupElasticsearch or LogicalBackupRDBMS.
Required: {}
schedule string Schedule is when the backups run: a five-field cron expression
(minute, hour, day of month, month, day of week), evaluated in UTC.
Pattern: ^\s*([0-9A-Za-z*?,/-]+\s+)\{4\}[0-9A-Za-z*?,/-]+\s*$
Required: {}
retained RetainedBackups Retained limits how many backups of this schedule stay. The schedule
counts and deletes the backups in its namespace whose
camunda.io/backup-schedule label names this schedule. A backup that you
create with that label counts too, and the schedule can delete it. The
schedule never deletes a backup that is not in a final phase.
{ } Optional: {}

BackupScheduleStatus

BackupScheduleStatus is the observed state of the schedule.

Appears in: - BackupSchedule

Field Description Default Validation
lastScheduleTime Time LastScheduleTime is the last trigger that the schedule used, also when
it skipped the trigger. The schedule never tries a skipped trigger
again.
Optional: {}
lastBackupName string LastBackupName is the backup that the schedule created most recently. Optional: {}
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current state. The Ready condition has the
reason Healthy when the references and the cron expression are valid,
and InvalidReference when one of them is not.
Optional: {}

BasicAuthSpec

BasicAuthSpec configures the admin credential of a basic-auth cluster.

Appears in: - ClusterAuthSpec

Field Description Default Validation
adminEmail string AdminEmail is the email address of the admin user that the operator
seeds. The orchestration cluster stores it on that user, and the Admin
web application shows it. Set the address of the person or the team
that owns the cluster.
When empty, the operator uses admin@example.com. RFC 2606 reserves this
domain for documentation, so the default is not the address of a real
person.
The operator applies a changed value to the running cluster. The
cluster validates the address and refuses a domain without a dot. When
the cluster refuses an address, AdminSecretReady shows its answer.
MaxLength: 253
Pattern: ^$\|^[^@[:space:]]+@[^@[:space:]]+\.[^@[:space:]]+$
Optional: {}
passwordRotation string PasswordRotation requests one rotation of the admin password. Set it
to a value that differs from the applied one, for example a date. The
operator generates a new password and sets it on the admin user of the
running cluster. Then it publishes the password in the admin Secret.
The connectors Deployment restarts with the new password. An empty
value never rotates. A suspended cluster rotates after it resumes.
status.adminPassword.rotation shows the applied value. A preset can set
this field. Then every cluster that references the preset rotates, and
each of these clusters reports its own status.
MaxLength: 253
Optional: {}

CamundaCluster

CamundaCluster describes one Camunda orchestration cluster: the Zeebe brokers, the gateway, the web applications, and, when enabled, the connectors runtime. The operator creates the StatefulSets, Deployments, and Services of the cluster and keeps them in the declared state.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string CamundaCluster
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec CamundaClusterSpec spec defines the desired state of CamundaCluster Required: {}
status CamundaClusterStatus status defines the observed state of CamundaCluster Optional: {}

CamundaClusterPreset

CamundaClusterPreset is a cluster-scoped baseline configuration for CamundaCluster resources. It has no controller, creates nothing, and reports no status. A CamundaCluster reads it through its presetRef and merges its own fields over it, with the rules of the preset doc.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string CamundaClusterPreset
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec CamundaClusterPresetSpec spec defines the desired state of CamundaClusterPreset Required: {}

CamundaClusterPresetSpec

CamundaClusterPresetSpec defines the desired state of CamundaClusterPreset.

Appears in: - CamundaClusterPreset

Field Description Default Validation
cluster CamundaClusterSpec Cluster is the configuration baseline that the clusters that reference
the preset get. It uses the CamundaCluster spec type. A preset must not
set the references of one cluster: platformConfigRef, presetRef,
releaseRef, storageRef, backupStorageRef, and documentStorageRef. It
must also not set externalUrl, serviceAccount,
connectors.serviceAccount.name, monitoring, suspend, or pause.
It must also not set the fields that belong to a CamundaRelease:
version and connectors.version. An explicit zero value, such as an
empty presetRef or suspend: false, counts as unset. Templated YAML
often renders unset fields in this way. The CamundaCluster doc gives
the details of each field. The CamundaClusterPreset doc gives the merge
rules.
Required: {}

CamundaClusterSpec

CamundaClusterSpec defines the desired state of CamundaCluster.

A CamundaClusterPreset uses the same type as its baseline. For this reason, the schema marks storageRef and platformConfigRef as optional, and the CamundaCluster requires them. A preset refuses the fields that belong to one cluster only.

Appears in: - CamundaCluster - CamundaClusterClaimSpec - CamundaClusterPresetSpec

Field Description Default Validation
platformConfigRef string PlatformConfigRef names the cluster-scoped CamundaPlatformConfig that
provides auth, license, and image repositories. Required on a
CamundaCluster, forbidden in a preset.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
presetRef string PresetRef names a cluster-scoped CamundaClusterPreset used as the
configuration baseline. The preset doc lists the merge rules.
Optional: {}
releaseRef string ReleaseRef names a cluster-scoped CamundaRelease that provides the
versions, the pinned images, and the environment of a version. It
merges over the preset and under this spec. Forbidden in a preset.
Optional: {}
version string Version is the Camunda version to deploy, as a full semantic version.
Required unless the resolved release provides it. Forbidden in a
preset. The operator refuses a version below 8.9.0, also when it comes
from the release. The operator also refuses a version below the
version that the brokers run, with Ready reason VersionDowngradeRefused.
The annotation camunda.io/allow-version-downgrade on the CamundaCluster,
set to that version, permits it.
The operator also refuses a version more than one minor above the
version that the brokers run, in the same major, with Ready reason
VersionSkipRefused. No annotation permits that move.
Pattern: ^\d+\.\d+\.\d+$
Optional: {}
externalUrl string ExternalURL is the external base URL of the cluster. The operator uses
it for OIDC redirect URLs and web application links. It creates no
Ingress.
Optional: {}
serviceAccount ServiceAccountSpec ServiceAccount configures the ServiceAccount of every workload except
the connectors, which connectors.serviceAccount configures. The
workloads get access to the buckets of backupStorageRef and
documentStorageRef through this identity. When the operator creates
the account, it adds the identity annotation of each bucket that names
one. When the annotations carry azure.workload.identity/client-id, the
pods of these workloads, the backup Jobs included, get the label
azure.workload.identity/use: "true". When name is unset, the account
is <name>-camunda. The pods need no account while neither the cluster
nor its preset sets this block and no referenced bucket uses workload
identity. The operator then deletes the account only when the cluster
owns it, because the operator created it or took it over. An account
of that name that you created stays.
Optional: {}
auth ClusterAuthSpec Auth holds the credentials of this cluster and the identities that get
its admin role. Under OIDC, it holds the client credentials and the
administrators. Under basic authentication, it holds the admin
credential that the operator owns.
Optional: {}
zeebe ZeebeSpec Zeebe configures the brokers. Optional: {}
gateway GatewaySpec Gateway configures the gateway. Optional: {}
operate WebAppSpec Operate configures the Operate web application. Optional: {}
tasklist WebAppSpec Tasklist configures the Tasklist web application. Optional: {}
admin WebAppSpec Admin configures the Admin web application (Orchestration Cluster
Identity before Camunda 8.9). Its Spring profile is admin.
Optional: {}
connectors ConnectorsSpec Connectors configures the connectors runtime. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of every workload. A
per-component entry wins over an entry here with the same name.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
A CamundaManagementCluster that serves this cluster owns the four
CAMUNDA_CONSOLE_PING_ entries (CAMUNDA_HUB_PING_ on Camunda 8.10 and
later). It replaces what you set under these names. If your entry under
one of these names has valueFrom, the management cluster removes it. One
entry cannot hold a value and a reference together.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of
every workload.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of every workload pod. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of every workload pod. The keys
camunda.io/config-hash and camunda.io/service-account-hash belong to the
operator. A value for them here, or in the podAnnotations of a process,
does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of every workload that does
not set its own. When set, it replaces the scheduling block of a preset,
with no merge.
Optional: {}
storageRef string StorageRef names the SecondaryStorageConfig, in the namespace of this
cluster, that describes the secondary storage backend. Required on a
CamundaCluster, forbidden in a preset. One backend serves one
CamundaCluster. Two contracts that name one address are one backend. If
another cluster already holds the backend, the operator suspends this
cluster with Ready reason StorageAlreadyAttached. The suspension stays
until the other cluster moves to another backend or is deleted.
Optional: {}
indexReplicas integer IndexReplicas is the replica count of each index that the cluster
creates in an Elasticsearch secondary storage. When it is not set, the
nodeCount of the storage contract gives the count: 0 on one node, 1 on
two or more nodes. Without a nodeCount, Camunda keeps its own default.
When indexReplicas is not set and the extraEnv of a process sets a
legacy replica key, that process keeps the value of the key.
The cluster applies the count to its existing indices when it starts.
If the nodes cannot place the count, the operator keeps it and records
an IndexReplicasExceedNodes Warning event on the CamundaCluster. A
relational secondary
storage ignores this field.
Minimum: 0
Optional: {}
backupStorageRef string BackupStorageRef names an ObjectStorageConfig, in the namespace of
this cluster, for backups.
Optional: {}
documentStorageRef string DocumentStorageRef names an ObjectStorageConfig, in the namespace of
this cluster, for document storage.
Optional: {}
backup ClusterBackupSpec Backup configures the backups of this cluster. It sets the schedule and
the retention of the primary-storage backups that Zeebe takes, and the
pod of the database dump Job. A preset can set this block, but not
backupStorageRef. The block applies only to a cluster with relational
secondary storage. Only such a cluster has continuous and scheduled
primary-storage backups and the dump Job.
Optional: {}
monitoring ClusterMonitoringSpec Monitoring configures the monitoring integrations. Optional: {}
suspend boolean Suspend scales every workload to zero and keeps the data. Defaults to
false. An annotation with the prefix suspension-hold.camunda.io/ on the
CamundaCluster also suspends it, whatever this field says.
Optional: {}
pause boolean Pause stops the reconciliation of this cluster: the operator changes no
workload and writes no status. It records a Paused event instead. Other
resources that use the cluster, such as a BackupSchedule or a restore,
still act on it. When you delete a paused cluster, the operator still
releases its storage backends. Defaults to false.
Optional: {}

CamundaClusterStatus

CamundaClusterStatus is the observed state of a CamundaCluster.

Appears in: - CamundaCluster

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
volumes VolumeStatus array Volumes lists the bound broker PersistentVolumeClaims and the capacity
that each one reports, sorted by name.
Optional: {}
management ManagementBinding Management is the published address of the management API of this
cluster. Extensions read it and do not derive the Service name, the
port, and the authentication themselves. It is unset while the cluster
is suspended, so a consumer does not use an old endpoint.
Optional: {}
gateway GatewayBinding Gateway is the published address of the client APIs of this cluster.
Extensions read it and do not derive the Service name and the ports
themselves. It is unset while the cluster is suspended, so a consumer
does not use an old endpoint.
Optional: {}
endpoints Endpoint array Endpoints lists the routes of this cluster, sorted by name: each path
on the external URL, with the Service and the port that serve it. An
access extension reads it and does not derive a Service from the mode
fields. The longest matching path prefix wins, and default takes every
path that no other entry names. The entries stay while the cluster is
suspended, because the Services stay.
Optional: {}
adminPassword AdminPasswordStatus AdminPassword is the state of the admin credential of a basic-auth
cluster. It is unset under OIDC.
Optional: {}
serviceAccountName string ServiceAccountName is the ServiceAccount that the pods of this cluster
run under, except the connectors. It is empty when they run under the
default account of the namespace. An extension that runs a pod for
this cluster reads it and does not derive the name itself.
Optional: {}
connectorsServiceAccountName string ConnectorsServiceAccountName is the ServiceAccount that the connectors
pods run under. It is empty when neither the cluster nor its preset
sets connectors.serviceAccount, and when connectors are not enabled.
Optional: {}
conditions Condition array Conditions represent the current state. Ready holds the reason of a
failed pre-check, or it follows the conditions of the components that
the cluster needs. The per-process conditions (ZeebeReady, GatewayReady,
OperateReady, TasklistReady, AdminReady, ConnectorsReady) also appear
here.
Optional: {}

CamundaManagementCluster

CamundaManagementCluster describes one Camunda management plane: Management Identity, an identity provider, and, when set, Console and Web Modeler. The operator creates its Deployments and Services. It writes the ManagementAuthConfig that Optimize reads. It attaches the management plane to the orchestration clusters that clusterSelector matches.

The creation of a CamundaManagementCluster is a task for a platform administrator. The selector reaches CamundaClusters in every namespace, and the operator adds annotations to the clusters that it matches.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string CamundaManagementCluster
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec CamundaManagementClusterSpec spec defines the desired state of CamundaManagementCluster Required: {}
status CamundaManagementClusterStatus status defines the observed state of CamundaManagementCluster Optional: {}

CamundaManagementClusterSpec

CamundaManagementClusterSpec describes one management plane: Management Identity, its identity provider, and, when set, Console and Web Modeler.

Appears in: - CamundaManagementCluster

Field Description Default Validation
platformConfigRef string PlatformConfigRef names the cluster-scoped CamundaPlatformConfig that
holds the license and the image settings. In the oidc mode, it also
holds the identity provider and every client of the management plane.
MinLength: 1
suspend boolean Suspend scales every workload of this management cluster to zero. The
ManagementAuthConfig, the claims on the orchestration clusters, and the
Console ping settings stay. Thus nothing else must change while the
management plane is down.
Optional: {}
clusterSelector LabelSelector ClusterSelector selects the CamundaClusters that Console and Web
Modeler serve, in every namespace that namespaceSelector permits. An
unset selector selects no cluster. An empty selector ({}) selects every
cluster.
Optional: {}
namespaceSelector LabelSelector NamespaceSelector limits clusterSelector to the namespaces whose labels
match. It selects on the labels of the Namespace objects, as the
namespaceSelector of an admission webhook does. An unset or empty ({})
selector permits every namespace.
Optional: {}
managementAuthConfigName string ManagementAuthConfigName is the name of the cluster-scoped
ManagementAuthConfig that this management cluster writes. A
CamundaOptimize reads it through its managementAuthRef. Empty means the
name of this resource.
Optional: {}
serviceAccount ServiceAccountSpec ServiceAccount configures the ServiceAccount of every workload of this
management plane, except a component that sets a serviceAccount block of
its own. A PluginRequest of the plane targets this account, so the
access that a plugin grants goes to these workloads. When name is unset,
the account is <name>-management. No two accounts of one management
plane can have the same name, or Ready reports InvalidReference. The
name default needs create false.
Optional: {}
identityProvider IdentityProviderSpec IdentityProvider selects where users authenticate. Exactly one of
keycloak, externalKeycloak, or oidc is set.
identity IdentitySpec Identity configures Management Identity. Console, Web Modeler, and
Optimize authenticate through it, so the operator always deploys it.
console ConsoleSpec Console configures Console. While it is unset, the operator does not
deploy Console.
Optional: {}
webModeler WebModelerSpec WebModeler configures Web Modeler. While it is unset, the operator does
not deploy Web Modeler.
Optional: {}

CamundaManagementClusterStatus

CamundaManagementClusterStatus is the observed state of a CamundaManagementCluster.

Appears in: - CamundaManagementCluster

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
managementAuthConfig string ManagementAuthConfig is the name of the ManagementAuthConfig that this
management cluster writes. A CamundaOptimize reads it through its
managementAuthRef.
Optional: {}
serviceAccountName string ServiceAccountName is the ServiceAccount that the workloads of this
management plane run under, except a component that sets a
serviceAccount block of its own. A PluginRequest of the plane targets
it. An extension that runs a pod for this plane reads it and does not
derive the name itself.
Optional: {}
endpoints Endpoint array Endpoints lists the routes of this management plane, sorted by name.
Each entry is a path on an external URL, with the Service and the port
that serve it. An access extension reads it and does not derive a
Service from the mode fields. The path of an entry is the path of the
external URL of its app, or / for a URL without a path. The entry
belongs to the host of that URL. keycloak is present in the keycloak
mode, console while spec.console is set, and web-modeler and
web-modeler-websockets while spec.webModeler is set. The longest
matching path prefix wins. The entries stay while the management plane
is suspended, because the Services stay.
Optional: {}
clusters AttachedClusterStatus array Clusters lists every CamundaCluster that clusterSelector matched, and
shows whether the management plane serves it.
Optional: {}
optimize AttachedOptimizeStatus array Optimize lists every CamundaOptimize that names the ManagementAuthConfig
of this management cluster and sets spec.externalUrl, sorted by
namespace and name. The management plane registers the login callback
of each one on the Optimize client of the realm.
The list is empty in the oidc mode. In that mode, the identity provider
of the platform config holds the callback URLs.
Optional: {}
callbackRealm KeycloakRealmTarget CallbackRealm is the Keycloak realm that this management plane last
gave to Management Identity, in the externalKeycloak mode. Identity
registers the login callbacks of Optimize in this realm when it starts.
Thus the field appears with the realm, not with the first registration.
A value does not mean that the callbacks are still in the realm. When
the spec names another realm or the oidc mode, the operator first
removes the callbacks from this realm. The field stays until no
configuration of the old realm can write them back. That is the case
when no Management Identity pod of the old realm can run, and no
Deployment or ReplicaSet of it can start one. The field then disappears
or moves to the new realm. This change shows that the move is complete.
The field is absent after a move into the keycloak or the oidc mode.
It is also absent while no login callback of this operator is
registered anywhere and nothing can write one back. The operator runs the
Keycloak of the keycloak mode, and deletes it with the management plane
or when the plane leaves that mode. Thus the field never names the
realm of that Keycloak. During a move into either mode, the field still
names the realm that the plane leaves.
A Keycloak that is permanently gone never answers. To release its realm
with the callbacks in it, set the annotation
camunda.io/forget-callback-realm. Use the value that the
OptimizeCallbacksReady message names.
Optional: {}
conditions Condition array Conditions represent the current state. Ready holds the reason of a
failed pre-check, or StepFailed for a failed step. When the write of
the ManagementAuthConfig is the first failed step, Ready holds
WriteFailed instead. In the oidc mode it holds ImmutableAfterStart when
spec.identity.admin changed after Management Identity first started.
Otherwise it follows the conditions of the deployed components. When
all of them are True, a failed OptimizeCallbacksReady makes Ready False
with its reason. The per-component conditions (KeycloakReady,
IdentityReady, ConsoleReady, WebModelerReady, ManagementAuthReady,
SecretsReady, MirroredSecretsReady, ServiceAccountsReady) and
OptimizeCallbacksReady also appear here.
Optional: {}

CamundaOptimize

CamundaOptimize describes one Camunda Optimize instance attached to one CamundaCluster. The operator creates a webapp Deployment, an importer Deployment, and their Services. It also enables the Elasticsearch exporter of the referenced cluster, so Optimize has data to import.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string CamundaOptimize
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec CamundaOptimizeSpec spec defines the desired state of CamundaOptimize Required: {}
status CamundaOptimizeStatus status defines the observed state of CamundaOptimize Optional: {}

CamundaOptimizeSpec

CamundaOptimizeSpec is the desired state of one Optimize instance. It attaches to one CamundaCluster and reads the data of that cluster from Elasticsearch.

The spec has no platformConfigRef. The image repository and the license come from the CamundaPlatformConfig of the referenced cluster, so Optimize and the cluster cannot have different values.

Appears in: - CamundaOptimize

Field Description Default Validation
version string Version is the Optimize version to deploy, as a full semantic version.
Camunda releases Optimize with the minor and the patch of the
orchestration cluster, so set it to the effective version of the
referenced cluster. If the major or the minor differs, Ready reports
VersionMismatch.
Pattern: ^\d+\.\d+\.\d+$
managementAuthRef string ManagementAuthRef names the cluster-scoped ManagementAuthConfig that
provides the Management Identity OIDC configuration. Optimize
authenticates against Management Identity, not against the built-in
auth of the orchestration cluster.
MinLength: 1
externalUrl string ExternalURL is the URL where browsers reach this Optimize. With a path,
such as https://camunda.example.com/optimize, Optimize serves under that
path, and status.endpoints routes that path. Without a path, Optimize
serves at the root of the host.
In the two Keycloak modes, the management plane of managementAuthRef
registers <externalUrl>/api/authentication/callback on the optimize
client of the realm. Thus a person who signs in here comes back here.
Without a URL, the plane registers no callback, and Keycloak refuses
the return. The exception is a callback that somebody added to the
realm manually.
In the oidc mode, the operator registers no callback. The identity
provider of the platform config holds the callback URLs, so add
<externalUrl>/api/authentication/callback there.
Optional: {}
clusterRef ClusterRef ClusterRef names the CamundaCluster that this Optimize instance reads.
The secondary storage of that cluster must be Elasticsearch. No other
CamundaOptimize can be attached to it.
The reference is immutable. A change to another cluster changes the pod
selectors of the Deployments, and Kubernetes does not permit that.
Also, the old cluster keeps the exporter settings of this Optimize.
webapp WorkloadSpec Webapp configures the Deployment that serves the Optimize user
interface. It runs with data import off.
Optional: {}
importer WorkloadSpec Importer configures the Deployment that imports the exported cluster
data into the Optimize indices. Optimize supports one active importer,
so replicas must be 0 or 1. With 0, the import stops, for example
during a restore or an index rewrite. The webapp continues to serve the
data that it already imported.
Optional: {}
indexReplicas integer IndexReplicas is the replica count of each Optimize index, and of each
zeebe-record index that the exporter of the cluster writes for this
Optimize. When it is not set, the nodeCount of the storage contract of
the cluster gives the count. The count is 0 on one node, and 1 on two or
more nodes.
Without a nodeCount, Optimize and the exporter keep their own defaults.
Optimize applies the count to its existing indices when it starts. The
exporter applies it to the next zeebe-record indices that it creates.
If the nodes cannot place the count, the operator keeps it and records
an IndexReplicasExceedNodes Warning event on the CamundaOptimize.
Minimum: 0
Optional: {}
monitoring OptimizeMonitoringSpec Monitoring configures the monitoring integrations. Optional: {}

CamundaOptimizeStatus

CamundaOptimizeStatus is the observed state of a CamundaOptimize.

Appears in: - CamundaOptimize

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current state. Ready holds the reason of a
failed pre-check. Otherwise it follows the conditions of the two
workloads, and MirroredSecretsReady when the Optimize references a
Secret in another namespace. The per-workload conditions (WebappReady,
ImporterReady) and MirroredSecretsReady also appear here.
Optional: {}
suspendedBy OptimizeSuspension SuspendedBy tells why the Optimize workloads are at zero with the
referenced cluster. It is empty while they follow their spec. It stays
set while a failed check keeps them at zero after the cluster resumed.
Enum: [Cluster StorageClaim]
Optional: {}
endpoints Endpoint array Endpoints lists the routes of this Optimize: one entry, optimize, with
the webapp Service and its HTTP port. Its path prefix is the path of
spec.externalUrl without a trailing slash, or / when that path is empty.
An access extension reads it and does not derive the Service name. The entry
stays while the workloads are at zero with the cluster, because the
Service stays. It is empty before the first render. It is also empty
while another CamundaOptimize holds the cluster or the cluster is gone,
because the operator then deletes the webapp Service.
Optional: {}

CamundaPlatformConfig

CamundaPlatformConfig is the cluster-scoped CRD that holds the platform settings of an environment: the identity provider, the license, and the image repositories. Every orchestration cluster that references it uses these settings.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string CamundaPlatformConfig
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec CamundaPlatformConfigSpec spec defines the desired state of CamundaPlatformConfig Required: {}
status CamundaPlatformConfigStatus status defines the observed state of CamundaPlatformConfig Optional: {}

CamundaPlatformConfigSpec

CamundaPlatformConfigSpec holds the settings that are the same for all orchestration clusters of an environment.

Appears in: - CamundaPlatformConfig

Field Description Default Validation
auth PlatformAuthSpec Auth holds the authentication settings of the orchestration clusters.
Unset means basic authentication.
Optional: {}
licenseSecretRef SecretKeyRef LicenseSecretRef names the Secret key that holds the Camunda license
key. Without it, clusters run in unlicensed non-production mode.
Optional: {}
images ImagesSpec Images changes the repositories of the images that the operator pulls,
one entry for each image, for example to a mirror. Each value is a full
repository with its registry and no tag. The tag always comes from the
version field of the resource that runs the image. A registry with a
port needs a path after the port, as in registry:5000/camunda/optimize.
The operator appends the tag to the value, as in
registry:5000/camunda/optimize:<version>.
Optional: {}

CamundaPlatformConfigStatus

CamundaPlatformConfigStatus is the observed validation state of the platform config.

Appears in: - CamundaPlatformConfig

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current validation state. The Ready condition
has the reasons Healthy or MissingSecret.
Optional: {}

CamundaRelease

CamundaRelease is a cluster-scoped description of what a platform runs: the versions, the pinned images, and the environment that a version needs. It has no controller, creates nothing, and reports no status. A CamundaCluster, an ElasticsearchCluster, and a DatabaseServer each read it through their releaseRef. They merge it over their preset and under their own spec.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string CamundaRelease
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec CamundaReleaseSpec spec defines the desired state of CamundaRelease Required: {}

CamundaReleaseSpec

CamundaReleaseSpec holds what a platform runs: the version of the orchestration cluster, and the versions of its storage. It also holds the image references that replace the images of these versions, and the environment that a version needs.

Appears in: - CamundaRelease

Field Description Default Validation
version string Version is the Camunda version of the orchestration cluster processes,
as a full semantic version. A cluster that references the release
refuses an effective version below 8.9.0. Its own spec.version wins over
this value.
Pattern: ^\d+\.\d+\.\d+$
Required: {}
connectors ReleaseConnectorsSpec Connectors holds the version and the environment of the connectors
runtime.
Optional: {}
elasticsearch ReleaseElasticsearchSpec Elasticsearch holds the version of the Elasticsearch clusters of this
release. An ElasticsearchCluster takes it through its releaseRef.
Optional: {}
databaseServer ReleaseDatabaseServerSpec DatabaseServer holds the version of the PostgreSQL servers of this
release. A DatabaseServer takes it through its releaseRef.
Optional: {}
images ReleaseImagesSpec Images replaces the image reference of a process. The operator uses an
entry as it is, with its tag or digest. It changes only the image that
the operator pulls. The operator still uses the version above for the
version rules, the downgrade rule, and the environment that it
computes.
Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of every workload. The entries
merge by name over the preset entries and under the cluster entries.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of
every workload. They follow the preset sources and precede the cluster
sources.
Optional: {}
zeebe ReleaseEnvSpec Zeebe holds the environment of the brokers. Optional: {}
gateway ReleaseEnvSpec Gateway holds the environment of the gateway. Optional: {}
operate ReleaseEnvSpec Operate holds the environment of Operate. Optional: {}
tasklist ReleaseEnvSpec Tasklist holds the environment of Tasklist. Optional: {}
admin ReleaseEnvSpec Admin holds the environment of the Admin web application. Optional: {}

ClusterAdminSpec

ClusterAdminSpec holds the identities that get the admin role of one cluster under OIDC. The identity provider authenticates a caller, and nothing else authorizes one, so an OIDC cluster without this block has no administrator. Basic authentication seeds its own administrator and ignores the block.

Appears in: - ClusterAuthSpec

Field Description Default Validation
users string array Users are the values of the username claim that get the admin role. items:MinLength: 1
Optional: {}
clients string array Clients are the values of the client id claim that get the admin role.
A client entry matches only when the platform config sets
auth.oidc.clientIdClaim.
items:MinLength: 1
Optional: {}
mappingRules AdminMappingRule array MappingRules give the admin role to every token that holds a claim with
a given value.
Optional: {}

ClusterAuthSpec

ClusterAuthSpec holds the credentials of one cluster and the identities that get its admin role. Under OIDC it carries the client credentials, which override the defaults of the platform config and of the preset, and the identities of the administrators. A block that sets clientId replaces the whole client: the audience and the client secret then come from this block only. A block without clientId overrides the audience and the client secret one by one. Under basic authentication it carries the basic block, which configures the admin credential that the operator owns.

Appears in: - CamundaClusterSpec

Field Description Default Validation
clientId string ClientID is the OIDC client ID of this cluster. A client ID replaces
the whole client: the audience and the client secret then come from
this block only. Requires clientSecretRef.
Optional: {}
audience string Audience is the audience that access tokens must carry. Defaults to
the client ID that the cluster uses.
Optional: {}
clientSecretRef LocalSecretKeyRef ClientSecretRef names the Secret that holds the OIDC client secret of
this cluster. Required when clientId is set.
Optional: {}
admin ClusterAdminSpec Admin holds the identities that get the admin role of this cluster. It
applies under OIDC only. Basic authentication seeds its own
administrator and ignores this block.
Optional: {}
basic BasicAuthSpec Basic configures the admin credential that the operator owns. It
applies under basic authentication only. OIDC ignores this block, like
basic authentication ignores admin.
Optional: {}

ClusterBackupSpec

ClusterBackupSpec configures the backups of one orchestration cluster. spec.backupStorageRef sets where the backups go. This block is the policy, so a preset can hold it for many clusters.

Appears in: - CamundaClusterSpec

Field Description Default Validation
primaryStorage PrimaryStorageBackupSpec PrimaryStorage configures the backups that Zeebe takes of its own
primary storage. A point-in-time restore uses them.
Optional: {}
dump BackupDumpSpec Dump configures the Job that writes the logical database to the backup
bucket. A LogicalBackupRDBMS can replace this block as a whole.
Optional: {}

ClusterMonitoringSpec

ClusterMonitoringSpec groups the monitoring integrations of a CamundaCluster.

Appears in: - CamundaClusterSpec

Field Description Default Validation
serviceMonitor ServiceMonitorSpec ServiceMonitor configures the Prometheus ServiceMonitors. When enabled,
the operator creates one ServiceMonitor for each process, with the name
of the workload. It scrapes /actuator/prometheus on the management port
9600 of a unified process, and on the HTTP port 8080 of connectors.
Optional: {}

ClusterRef

ClusterRef references a CamundaCluster by name, in the namespace of the referencing object. The reference cannot cross namespaces. For a backup, the operator reads the Secrets of the cluster, runs a Job in its namespace, and calls its management API. Thus the reference stays inside the RBAC limits of the namespace of the CR. A user who can create the CR in a namespace can back up the clusters of that namespace, and no others.

Appears in: - BackupScheduleSpec - CamundaClusterClaimStatus - CamundaOptimizeSpec - GrantSpec - LogicalBackupElasticsearchSpec - LogicalBackupRDBMSSpec - LogicalRestoreElasticsearchSpec - LogicalRestoreRDBMSSpec - PointInTimeRestoreSpec

Field Description Default Validation
name string Name is the name of the CamundaCluster, in the namespace of this
object.
MinLength: 1

ComponentMode

Underlying type: string

ComponentMode says where a process of the unified binary runs.

Validation: - Enum: [Standalone Embedded]

Appears in: - GatewaySpec - WebAppSpec

Field Description
Standalone ComponentModeStandalone runs the process as its own Deployment of the
unified binary.
Embedded ComponentModeEmbedded runs the process inside the nearest standalone
host up the chain: the gateway when it is standalone, otherwise zeebe.

ConfidentialClientSpec

ConfidentialClientSpec is an identity provider client that authenticates with a secret.

Appears in: - ManagementClients - WebModelerAPIClientSpec

Field Description Default Validation
clientId string ClientID is the client id at the identity provider. MinLength: 1
audience string Audience is the audience that the component validates in access tokens.
Empty means the client id.
Optional: {}
clientSecretRef SecretKeyRef ClientSecretRef names the Secret key that holds the client secret.

ConnectorsSpec

ConnectorsSpec configures the connectors runtime. It is a separate application, never part of the unified binary, and always its own Deployment.

Appears in: - CamundaClusterSpec

Field Description Default Validation
enabled boolean Enabled runs the connectors runtime when true. Defaults to false. Optional: {}
version string Version is the version of the connectors bundle image, as a full
semantic version. Use the same minor as the cluster, such as 8.9.x for
a cluster on 8.9. The patch does not follow the cluster patch. Required
when connectors are enabled, unless the resolved release provides it.
Forbidden in a preset.
Pattern: ^\d+\.\d+\.\d+$
Optional: {}
serviceAccount ServiceAccountSpec ServiceAccount configures the ServiceAccount of the connectors pods.
When unset, they run under the default ServiceAccount of the namespace.
When set, they run under <name>-connectors, or under name. Only
the annotations of this block go on the account, never the identities
of the buckets. When they carry azure.workload.identity/client-id, the
connectors pods get the label azure.workload.identity/use: "true". The
connectors never run under the cluster ServiceAccount: name must differ
from it, and a spec.serviceAccount.name of default needs this block, or
Ready reports InvalidReference. The name default needs create false. A
preset can set this block, except name.
Optional: {}
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}

ConsoleSpec

ConsoleSpec configures Console.

Appears in: - CamundaManagementClusterSpec

Field Description Default Validation
version string Version is the Console version, as a full semantic version. The
operator supports 8.9.0 and later.
Pattern: ^\d+\.\d+\.\d+$
externalUrl string ExternalURL is the URL where browsers reach Console. Console serves
under the path of this URL. Every selected CamundaCluster reports to
Console through its Kubernetes Service. Thus the clusters do not need
an Ingress in front of Console.
serviceAccount ServiceAccountSpec ServiceAccount gives the Console pods a ServiceAccount of their own.
When unset, they run under spec.serviceAccount. When set, they run
under <name>-console, or under name, and they do not get the access
that a plugin grants to the account of spec.serviceAccount. The name
default needs create false.
Optional: {}
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}

CredentialsSpec

CredentialsSpec names the Secret to which the operator writes generated credentials, with the keys username and password. The Secret is in the namespace of the CR.

Appears in: - BackupCredentialsSpec - DatabaseSpec

Field Description Default Validation
secretName string SecretName is the name of the credentials Secret. The default comes
from the CR name, as the field that uses this type states.
Optional: {}

Database

Database creates a logical database and its users on an existing PostgreSQL server with SQL. It publishes the result as a DatabaseConfig in its own namespace, and, when set, as a SecondaryStorageConfig. When you delete a Database, Kubernetes deletes the published contracts and Secrets. The logical database and the SQL users stay on the server.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string Database
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec DatabaseSpec spec defines the desired state of Database Required: {}
status DatabaseStatus status defines the observed state of Database Optional: {}

DatabaseConfig

DatabaseConfig is the namespaced contract CRD that describes one logical database: its server, its name, and its application credentials. The components that connect to the database read it. Consumers find it by name in their own namespace.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string DatabaseConfig
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec DatabaseConfigSpec spec defines the desired state of DatabaseConfig Required: {}
status DatabaseConfigStatus status defines the observed state of DatabaseConfig Optional: {}

DatabaseConfigSpec

DatabaseConfigSpec describes one logical database: its server, its name, and its application credentials.

Appears in: - DatabaseConfig

Field Description Default Validation
serverRef string ServerRef names the DatabaseServerConfig of the server that holds this
database.
MinLength: 1
databaseName string DatabaseName is the name of the logical database on the server. MinLength: 1
credentialsSecretRef LocalCredentialsSecretRef CredentialsSecretRef names an application user with read and write
access to the database.
backupCredentialsSecretRef LocalCredentialsSecretRef BackupCredentialsSecretRef names a separate user with the privileges
to dump the database. Backups use this user. A restore uses the
application user of CredentialsSecretRef.
Optional: {}

DatabaseConfigStatus

DatabaseConfigStatus is the observed validation state of the contract.

Appears in: - DatabaseConfig

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current validation state. The Ready condition
has the reasons Healthy, InvalidReference, or MissingSecret.
Optional: {}

DatabaseEngine

Underlying type: string

DatabaseEngine identifies the database engine of a server.

Validation: - Enum: [postgres]

Appears in: - DatabaseServerConfigSpec

Field Description
postgres

DatabaseServer

DatabaseServer runs one PostgreSQL instance through the external CloudNativePG operator. It archives the instance continuously to an object storage bucket. It publishes the connection details as a DatabaseServerConfig, which a Database and a PointInTimeRestore use. One or more orchestration clusters use the instance, each through its own Database.

A PointInTimeRestore rolls the whole instance back. It needs a server that holds the database of its cluster and nothing else.

The name of the CR is also the name of the CloudNativePG cluster. On create, the name must be a DNS-1035 label of at most 46 characters. CloudNativePG accepts 50 characters, and a rollback appends up to four ("-r99"). While the recovery index is below 100, the cluster of a rollback gets the full name. Above that, the operator shortens the name to a head and a hash. Each archive record adds one to the index: a rollback, an archive that is enabled again, and a change of bucket.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string DatabaseServer
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec DatabaseServerSpec spec defines the desired state of DatabaseServer Required: {}
status DatabaseServerStatus status defines the observed state of DatabaseServer Optional: {}

DatabaseServerArchiveSpec

DatabaseServerArchiveSpec points a server at the bucket of its continuous archive. The archive holds the write-ahead log of every instance, and the base backups that a recovery starts from. A server with an archive publishes pitr.enabled true on its contract. A server without one publishes false, and no point-in-time restore can reach it.

The archive is not the backup model of the operator. BackupSchedule and LogicalBackupRDBMS take logical dumps and never use these base backups.

Appears in: - DatabaseServerSpec

Field Description Default Validation
objectStorageRef string ObjectStorageRef names an ObjectStorageConfig in the namespace of this
server. The operator writes the archive under a prefix of that bucket
that only this server uses.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
retentionPeriodDays integer RetentionPeriodDays is how far into the past a restore can reach. The
operator enforces this value on the bucket, and the contract of this
server publishes the same value.
The maximum is 36500 days, which is a hundred years. The operator counts
the reachable window in nanoseconds, and that count overflows at about
292 years. The maximum stays well below that limit.
Maximum: 36500
Minimum: 1
baseBackupSchedule string BaseBackupSchedule is when the server takes a base backup. It is the
six-field cron of CloudNativePG (seconds first, in UTC), or one of the
descriptors @yearly, @annually, @monthly, @weekly, @daily, @midnight,
@hourly and @every. The first base backup runs as soon as the server is
up, whatever the schedule says. A recovery from the archive is possible
only after that backup completes.
The API server refuses the five-field cron of a Kubernetes CronJob.
CloudNativePG reads the first field as seconds, so a five-field value
runs at a different time than intended.
Each field has the bounds that CloudNativePG accepts. Seconds and
minutes take 0-59, and hours take 0-23. The day of the month takes
1-31, and the month takes 1-12 or JAN-DEC. The day of the week takes
0-6 or SUN-SAT. The schema cannot find a range whose first value is
above its second, such as FRI-MON. The operator refuses such a range
with Ready reason InvalidReference, before it applies anything.
A step has at most three digits. An @every number has at most six
digits on each side of the point. These limits are stricter than the
parser of CloudNativePG. That parser accepts a longer number, then
overflows and stops taking base backups.
0 0 2 * * * Pattern: ^(\s*([*?]\|[0-5]?\d(-[0-5]?\d)?)(/[1-9]\d\{0,2\})?(,([*?]\|[0-5]?\d(-[0-5]?\d)?)(/[1-9]\d\{0,2\})?)*\s+([*?]\|[0-5]?\d(-[0-5]?\d)?)(/[1-9]\d\{0,2\})?(,([*?]\|[0-5]?\d(-[0-5]?\d)?)(/[1-9]\d\{0,2\})?)*\s+([*?]\|([01]?\d\|2[0-3])(-([01]?\d\|2[0-3]))?)(/[1-9]\d\{0,2\})?(,([*?]\|([01]?\d\|2[0-3])(-([01]?\d\|2[0-3]))?)(/[1-9]\d\{0,2\})?)*\s+([*?]\|([1-9]\|[12]\d\|3[01])(-([1-9]\|[12]\d\|3[01]))?)(/[1-9]\d\{0,2\})?(,([*?]\|([1-9]\|[12]\d\|3[01])(-([1-9]\|[12]\d\|3[01]))?)(/[1-9]\d\{0,2\})?)*\s+([*?]\|([1-9]\|1[0-2]\|[Jj]([Aa][Nn]\|[Uu][LlNn])\|[Ff][Ee][Bb]\|[Mm][Aa][RrYy]\|[Aa]([Pp][Rr]\|[Uu][Gg])\|[Ss][Ee][Pp]\|[Oo][Cc][Tt]\|[Nn][Oo][Vv]\|[Dd][Ee][Cc])(-([1-9]\|1[0-2]\|[Jj]([Aa][Nn]\|[Uu][LlNn])\|[Ff][Ee][Bb]\|[Mm][Aa][RrYy]\|[Aa]([Pp][Rr]\|[Uu][Gg])\|[Ss][Ee][Pp]\|[Oo][Cc][Tt]\|[Nn][Oo][Vv]\|[Dd][Ee][Cc]))?)(/[1-9]\d\{0,2\})?(,([*?]\|([1-9]\|1[0-2]\|[Jj]([Aa][Nn]\|[Uu][LlNn])\|[Ff][Ee][Bb]\|[Mm][Aa][RrYy]\|[Aa]([Pp][Rr]\|[Uu][Gg])\|[Ss][Ee][Pp]\|[Oo][Cc][Tt]\|[Nn][Oo][Vv]\|[Dd][Ee][Cc])(-([1-9]\|1[0-2]\|[Jj]([Aa][Nn]\|[Uu][LlNn])\|[Ff][Ee][Bb]\|[Mm][Aa][RrYy]\|[Aa]([Pp][Rr]\|[Uu][Gg])\|[Ss][Ee][Pp]\|[Oo][Cc][Tt]\|[Nn][Oo][Vv]\|[Dd][Ee][Cc]))?)(/[1-9]\d\{0,2\})?)*\s+([*?]\|([0-6]\|[Ss]([Uu][Nn]\|[Aa][Tt])\|[Mm][Oo][Nn]\|[Tt]([Uu][Ee]\|[Hh][Uu])\|[Ww][Ee][Dd]\|[Ff][Rr][Ii])(-([0-6]\|[Ss]([Uu][Nn]\|[Aa][Tt])\|[Mm][Oo][Nn]\|[Tt]([Uu][Ee]\|[Hh][Uu])\|[Ww][Ee][Dd]\|[Ff][Rr][Ii]))?)(/[1-9]\d\{0,2\})?(,([*?]\|([0-6]\|[Ss]([Uu][Nn]\|[Aa][Tt])\|[Mm][Oo][Nn]\|[Tt]([Uu][Ee]\|[Hh][Uu])\|[Ww][Ee][Dd]\|[Ff][Rr][Ii])(-([0-6]\|[Ss]([Uu][Nn]\|[Aa][Tt])\|[Mm][Oo][Nn]\|[Tt]([Uu][Ee]\|[Hh][Uu])\|[Ww][Ee][Dd]\|[Ff][Rr][Ii]))?)(/[1-9]\d\{0,2\})?)*\s*\|@((year\|annual\|month\|week\|dai\|hour)ly\|midnight\|every (\d\{1,6\}(\.\d\{1,6\})?[hms])+))$
Optional: {}

DatabaseServerArchiveStatus

DatabaseServerArchiveStatus is the observed state of the archive of a server.

Appears in: - DatabaseServerStatus

Field Description Default Validation
history ArchiveRecord array History lists every archive that the server wrote, oldest first. A
recovery uses the record whose interval holds the requested point. The
operator never removes a record. Thus a restore can reach back across
an earlier recovery for as long as the bucket keeps the objects. When
you remove spec.archive, the open record closes and the list stays.
When you add an archive again, a new record opens. A move of
spec.archive to another bucket does the same. No restore can reach a
point in a time without an archive.
Optional: {}
boundary ArchiveBoundary Boundary is the last move of the archive that no record holds yet. The
move happens when spec.archive is enabled again on another location,
or when the location moves again before a base backup opens a record.
It prevents a base backup of the old location from opening the
interval of the new location. It is cleared when that interval opens.
Optional: {}
reachableFrom Time ReachableFrom is the oldest point that the objects in the bucket still
cover, rounded down to the minute. The bucket can miss up to one minute
after it. The retention period removes old objects from the bucket. A
longer retention period does not bring back what a shorter one already
removed. The window grows to the new retention period only as the
archive writes past this point. The server refuses a rollback to a
point before it. When it is unset, only the retention period limits
the window.
Optional: {}

DatabaseServerConfig

DatabaseServerConfig is the contract CRD that describes a database server: the engine, the endpoint, the admin credentials, and the point-in-time recovery capability. The operator creates databases on the server and validates the declared capabilities. A consumer reads it in its own namespace. Thus all the RDBMS resources of a cluster are in the namespace of that cluster.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string DatabaseServerConfig
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec DatabaseServerConfigSpec spec defines the desired state of DatabaseServerConfig Required: {}
status DatabaseServerConfigStatus status defines the observed state of DatabaseServerConfig Optional: {}

DatabaseServerConfigSpec

DatabaseServerConfigSpec describes a database server: the engine, the endpoint, the admin credentials, and the point-in-time recovery capability.

Appears in: - DatabaseServerConfig

Field Description Default Validation
engine DatabaseEngine Engine is the database engine of the server. See DatabaseEngine for
the accepted values.
Enum: [postgres]
host string Host is the host name or the address of the server. MinLength: 1
port integer Port is the port of the server. Maximum: 65535
Minimum: 1
adminCredentialsSecretRef LocalCredentialsSecretRef AdminCredentialsSecretRef names an admin user that can create databases
and roles. The operator uses it to probe the server and to create the
database and the roles of a Database. The Secret is in the namespace of
this contract.
pitr PITRCapability PITR declares the point-in-time recovery capability of the server. Optional: {}
recovery RecoveryRequest Recovery asks for a rollback of the server to a point in time. A
consumer writes it. The answer is in pitr.lastRecovery, only when
pitr.recovery is operator. The request stays on the contract after the
answer, as the record of the last request.
Optional: {}

DatabaseServerConfigStatus

DatabaseServerConfigStatus is the observed validation state of the contract. It holds what the operator read from the server the last time that it reached the server.

Appears in: - DatabaseServerConfig

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
serverVersion string ServerVersion is the major version that the server reported the last
time that the operator reached it, for example "17". A dump of a
database on this server uses client tools of this major version. Thus
a backup waits until the operator publishes it.
Optional: {}
systemIdentifier string SystemIdentifier is the identity of the PostgreSQL instance behind this
endpoint, as the server reported it on the last probe. It identifies
the server itself. Thus two contracts that describe one server with
different hosts publish the same value. The operator uses it to keep
each logical database unique. A change to the endpoint or to
adminCredentialsSecretRef clears it.
Optional: {}
probedAt Time ProbedAt is when the operator last reached the server and read
ServerVersion and SystemIdentifier. The operator probes the server
again when this is older than the probe interval, or when the admin
credentials Secret changed. Between probes, it does not change.
A change to the endpoint or to adminCredentialsSecretRef clears this
field, and also ServerVersion, SystemIdentifier, ProbedEndpoint,
ProbedSecretName, ProbedSecretKeys, and ProbedSecretVersion. These
fields describe the server of the old spec. A change to another field,
for example a recovery request, does not clear them, because it cannot
move the server.
Optional: {}
probedEndpoint string ProbedEndpoint is the host and the port that the last probe reached, as
"<host>:<port>". With it, the operator knows whether a spec change
moves the server.
Optional: {}
probedSecretName string ProbedSecretName is the admin credentials Secret that the last probe
read. When the spec names another Secret, the operator clears the
record of the probe.
Optional: {}
probedSecretKeys string ProbedSecretKeys are the keys of that Secret that the last probe read,
as "<usernameKey>/<passwordKey>". One Secret can hold the credentials
of more than one user, so the keys identify the user.
Optional: {}
probedSecretVersion string ProbedSecretVersion is the resourceVersion of the admin credentials
Secret that the last probe used. When the Secret changes, the operator
probes again before the interval ends, so it validates new credentials
quickly.
Optional: {}
conditions Condition array Conditions represent the current validation state. The Ready condition
has the reasons Healthy, MissingSecret, or ConnectionFailed.
Optional: {}

DatabaseServerMonitoringSpec

DatabaseServerMonitoringSpec groups the Prometheus scraping integration of a database server.

Appears in: - DatabaseServerSpec

Field Description Default Validation
podMonitor PodMonitorSpec PodMonitor configures the Prometheus PodMonitor over the instance pods. Optional: {}

DatabaseServerPreset

DatabaseServerPreset is a cluster-scoped baseline configuration for DatabaseServer resources. It has no controller, creates nothing, and reports no status. A server reads it through its presetRef. A field set on the server replaces the value of the preset for that field completely.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string DatabaseServerPreset
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec DatabaseServerPresetSpec spec defines the desired state of DatabaseServerPreset Required: {}

DatabaseServerPresetSpec

DatabaseServerPresetSpec defines the desired state of DatabaseServerPreset.

Appears in: - DatabaseServerPreset

Field Description Default Validation
server DatabaseServerSpec Server is the complete configuration baseline that the servers that
reference the preset get. It uses the DatabaseServer spec type. A
preset must not set the fields that belong to one server only:
presetRef, releaseRef, databaseServerConfig, and suspend. It must also
not set the version, which belongs to a CamundaRelease. An explicit
zero value, such as an empty presetRef or suspend: false, counts as
unset. Templated YAML often renders unset fields in this way. A preset
can set archive like any other field. One bucket can serve many
servers, because every server writes under its own prefix.
Required: {}

DatabaseServerRecoveryStatus

DatabaseServerRecoveryStatus is the recovery request that the server works on now, or the last one that it answered. With it, a recovery can continue after an interruption.

It holds the whole answer, not a reference to it. The server publishes the answer on a contract. If somebody deletes the contract and creates it again, the server publishes the answer again from this status.

Appears in: - DatabaseServerStatus

Field Description Default Validation
requestID string RequestID is the requestID of the request, as the contract carries it.
contract string Contract is the DatabaseServerConfig that carried the request. The
server answers on that contract. Until it answers, it does not change
the contract that it publishes.
requestedBy string RequestedBy is the requestedBy of the request, as the contract carries
it.
targetTime string TargetTime is the targetTime of the request, as the contract carries it.
cluster string Cluster is the CloudNativePG cluster that the recovery builds. It is
empty for a request that the server refused, also when the server had
built a cluster before.
Optional: {}
previousCluster string PreviousCluster is the cluster that the contract pointed at before the
recovery moved it. If a recovery fails after the move, the contract
points at this cluster again, because it still holds the data.
Optional: {}
archive RecoveryArchiveRef Archive is the archive that the recovery reads. The server records it
before the recovery builds anything. A spec change to another bucket
does not move a recovery that is already running.
Optional: {}
result RecoveryResult Result is the result that the server published for the request. It is
unset while the recovery runs.
Enum: [Completed Failed Unavailable]
Optional: {}
message string Message is the message that the server published with Result. Optional: {}
completedAt Time CompletedAt is when the server answered the request. It is unset while
the recovery runs.
Optional: {}

DatabaseServerServiceAccountSpec

DatabaseServerServiceAccountSpec configures the ServiceAccount of the instance pods. The operator creates it with the name <server name>-postgres. Every CloudNativePG cluster of the server runs under it, also the cluster that a rollback builds. The operator adds the workload-identity annotations of the archive bucket. An annotation set here wins over the operator annotation with the same key.

Appears in: - DatabaseServerSpec

Field Description Default Validation
annotations object (keys:string, values:string) Annotations to set on the ServiceAccount. Usually these are
workload-identity annotations (IRSA, GCP Workload Identity, and more)
that give the instance pods access to cloud resources.
Optional: {}

DatabaseServerSpec

DatabaseServerSpec defines the desired state of DatabaseServer.

A DatabaseServerPreset uses the same type as its baseline. For this reason, the schema marks databaseServerConfig as optional, and the DatabaseServer requires it. A preset refuses the fields that belong to one server only. A preset also refuses the version, which belongs to a CamundaRelease.

Appears in: - DatabaseServer - DatabaseServerPresetSpec

Field Description Default Validation
presetRef string PresetRef names a cluster-scoped DatabaseServerPreset to use as the
configuration baseline. A field set on the server replaces the value of
the preset for that field completely.
Optional: {}
releaseRef string ReleaseRef names a cluster-scoped CamundaRelease that provides the
PostgreSQL major version. It merges over the preset and under this spec.
Forbidden in a preset.
Optional: {}
platformConfigRef string PlatformConfigRef names a cluster-scoped CamundaPlatformConfig. The
server reads only its image settings. spec.images.postgres sets where
the server pulls the PostgreSQL image from, for example in an air-gapped
cluster. When empty, the server uses the default image repository.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
version string Version is the PostgreSQL major version to run, as a number such as
"17". It selects the image tag. Camunda 8.9 supports PostgreSQL 14 and
later. The operator refuses a version below 14, also when it comes
from the release. Required unless the resolved release provides it.
Forbidden in a preset.
The major version of a running server cannot change. The operator
refuses another major version, higher or lower, with Ready reason
VersionChangeRefused. The server then keeps the major version it has.
The same applies to a new major version from a release. To run another
major version, create a new server and move the data to it.
Pattern: ^\d+$
Optional: {}
instances integer Instances is the number of PostgreSQL instances. Defaults to 1. One
instance has no failover. If its node goes away, the server is down
until the volume is attached again.
Minimum: 1
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of each instance. Optional: {}
storageSize Quantity StorageSize is the size of the data volume of each instance. Required
unless the resolved preset provides it. It cannot shrink, because a
PostgreSQL data volume cannot become smaller in place. The API server
refuses a change of this field in a DatabaseServer to a smaller value.
A smaller value is accepted when the field was not set before, or when
a preset lowers the size. A server whose volumes are already larger
then keeps that size and records a StorageShrinkIgnored event.
Optional: {}
storageClassName string StorageClassName is the StorageClass of the data volumes. Defaults to
the default StorageClass of the Kubernetes cluster.
Optional: {}
walStorageSize Quantity WALStorageSize puts the write-ahead log on a separate volume of this
size. When unset, the log stays on the data volume. It cannot shrink,
as storageSize cannot. The server ignores a smaller value from a preset
in the same way.
You can add it to a running server, but you cannot remove it again.
CloudNativePG refuses a cluster that removes the volume. If the field
is cleared, on the server or in a preset, the volume keeps its size and
the server records a WALStorageKept event.
Optional: {}
serviceAccount DatabaseServerServiceAccountSpec ServiceAccount configures the ServiceAccount of the instance pods. Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the instance pods. When
set, it replaces the scheduling block of the preset, with no merge.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels applied to the instance pods. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations applied to the instance pods. Optional: {}
monitoring DatabaseServerMonitoringSpec Monitoring configures the Prometheus scraping integration. Optional: {}
databaseServerConfig string DatabaseServerConfig names the DatabaseServerConfig that the operator
publishes in the namespace of this server. It holds the endpoint, the
admin credentials, and the point-in-time recovery capability of the
server. Required on a DatabaseServer, forbidden in a preset.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
archive DatabaseServerArchiveSpec Archive points the server at the bucket that holds its continuous
archive. Without it the server takes no part in point-in-time restore.
Optional: {}
suspend boolean Suspend stops the PostgreSQL instances and keeps their data volumes.
Defaults to false. The operator hibernates the CloudNativePG cluster:
it removes the instance pods and keeps the volumes. When you set the
field back to false, the instances start again on the same volumes.
Optional: {}

DatabaseServerStatus

DatabaseServerStatus is the observed state of a DatabaseServer.

Appears in: - DatabaseServer

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
version string Version is the PostgreSQL major version that the server runs, as a
number such as "17". It comes from the merged spec, so it is correct
when the release or the server gives the version. While
the operator refuses a version change, it shows the major version of the
data directory. It is empty until the operator resolves the references
of the server for the first time.
Optional: {}
cluster string Cluster is the CloudNativePG cluster that the published contract points
at. It is the name of the server until a recovery replaces it.
Optional: {}
systemIdentifier string SystemIdentifier is the identity of the PostgreSQL instance behind the
contract, as CloudNativePG reports it. A recovery restores the
pg_control of its base backup, so the recovered instance keeps the
identity and this value does not change. A recovery replaces the
endpoint of the contract.
Optional: {}
archive DatabaseServerArchiveStatus Archive is the observed state of the continuous archive of the server.
It is unset until the server writes an archive. A removal of
spec.archive does not clear it. The bucket still holds what the server
wrote, and a server that archives again can recover from it.
Optional: {}
recovery DatabaseServerRecoveryStatus Recovery is the recovery request that the server works on now, or the
last one it answered. The answer itself is published on the contract,
in spec.pitr.lastRecovery.
Optional: {}
volumes VolumeStatus array Volumes lists the bound PersistentVolumeClaims of the current cluster
and the capacity that each one reports, sorted by name. A server with a
write-ahead log volume also shows that claim. A server that does not own
the cluster of its derived name shows no claims, because they belong
to the other cluster.
Optional: {}
conditions Condition array Conditions represent the current state. Ready holds the reason of a
failed pre-check (InvalidReference, MissingSecret, CNPGNotInstalled,
BarmanPluginNotInstalled). Otherwise it follows the cluster, the
contract, and, when the server has an archive, the archive. The
per-component conditions (ClusterReady, ArchiveReady, ContractReady,
MonitoringReady) also appear here. MonitoringReady never affects Ready,
so a broken PodMonitor does not make the server not ready. ArchiveReady
without spec.archive does not affect Ready either.
Optional: {}

DatabaseSpec

DatabaseSpec defines the desired state of Database.

Appears in: - Database

Field Description Default Validation
serverRef string ServerRef names the DatabaseServerConfig, in this namespace, of the
server on which the operator creates the database.
MinLength: 1
databaseName string DatabaseName is the name of the logical database to create, as a valid
PostgreSQL identifier. It must be unique on each PostgreSQL instance
that a contract reaches, not only on each contract. The operator
refuses a Database with the same databaseName as a Database of any
namespace on the same instance.
Pattern: ^[a-z_][a-z0-9_]\{0,62\}$
applicationCredentials CredentialsSpec ApplicationCredentials configures the application credentials Secret.
The operator always creates it. The Secret name defaults to
<CR name>-credentials.
Optional: {}
backupCredentials BackupCredentialsSpec BackupCredentials configures the backup credentials Secret. The
operator creates it unless it is disabled. The Secret name defaults to
<CR name>-backup-credentials.
Optional: {}
databaseConfig string DatabaseConfig names the DatabaseConfig that the operator creates in
the namespace of this Database. Defaults to the CR name.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
secondaryStorageConfig string SecondaryStorageConfig, when set, makes the operator also create a
SecondaryStorageConfig of type rdbms with this name in the namespace of
this Database. It references the DatabaseConfig. Omit it for a database
that is not Camunda secondary storage (Keycloak, Identity, Web
Modeler).
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}

DatabaseStatus

DatabaseStatus is the observed state of a Database.

Appears in: - Database

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
collisionKey string CollisionKey is the logical database that this Database last resolved:
the system identifier of the server and the database name. Every
Database records it, also a Database that loses the name to another.
Thus the field shows what a Database asked for, not what it owns. The
operator sets it only after it reaches the server. If the spec names a
missing server, the old key stays until that server answers. The same
applies to a server that is not probed for the current spec.
A Database whose Ready condition reports InvalidReference and names
another Database does not own the name that it shows here. The
operator never clears the field. Thus an owner whose server or
contract is gone keeps the logical database. Delete that Database to
release the name.
Optional: {}
conditions Condition array Conditions represent the current state. Ready holds the reason of a
failed pre-check (InvalidReference, MissingSecret,
ServerIdentityUnknown, ConnectionFailed). Otherwise it takes the status
and the reason of the BindingsReady condition, which also appears here.
Optional: {}

DumpPodSpec

DumpPodSpec configures the pod of the Job that dumps the logical database of a relational cluster and uploads it to the backup bucket. It holds all the settings that a backup can set for one run. The pod runs the dump and then the upload, so one resource block sizes both. It never names the image. BackupDumpSpec gives the reason.

Appears in: - BackupDumpSpec - LogicalBackupRDBMSSpec

Field Description Default Validation
resources ResourceRequirements Resources are the CPU and memory of the dump pod. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the dump pod.
In the spec.dump of a LogicalBackupRDBMS, every name that starts with
PG or UPLOAD_ is reserved, and the API server refuses it. A PG* name is
connection policy, because libpq reads PGHOSTADDR, PGSERVICE,
PGOPTIONS, and more. UPLOAD_* is the upload contract. The variables of
a backup reach only the dump container, never the upload container.
Cloud SDKs read endpoint, proxy, and configuration variables from the
environment, and the author of a backup must not change where the dump
goes.
In the spec.backup.dump of the cluster, no name is reserved, and the
variables reach every container. The cluster owner sets the connection
policy, PGSSLMODE included.
Unlike the extraEnv of a workload, this list is atomic. One field
manager owns the whole list, because no extension adds entries to a
dump pod.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources of the dump pod. In the
spec.dump of a LogicalBackupRDBMS, every source needs a prefix that
cannot make a PG* or UPLOAD_* name. The writer of the referenced object
chooses its keys. As with ExtraEnv, the sources of a
backup reach only the dump container. The block of the cluster needs no
prefix, and its sources reach every container.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the dump pod. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the dump pod. A service mesh
sidecar keeps running after the dump finishes, and the Job does not
complete. Set the injection annotation of the mesh to false here.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the dump pod. When set,
it replaces the block of a preset, with no merge.
Optional: {}
scratchVolume ScratchVolumeSpec ScratchVolume is where the pod writes the dump before the upload. When
set, it replaces the block of a preset, with no merge. The dump pod
runs with fsGroup 999, the postgres group. Thus pg_dump can write to a
volume that a storage class gives with the root owner.
Optional: {}
activeDeadlineSeconds integer ActiveDeadlineSeconds is the number of seconds that the dump Job can
run before it fails, counted from its start. When the dump block that
applies does not set it, the Job gets 86400 (24 hours). In the block of
the cluster, an unset value takes the value of the preset. The
spec.dump of a LogicalBackupRDBMS replaces the block of the cluster, so
an unset value there gives 86400, not the value of the cluster.
The default is large, so that a very large dump can complete. The Job
always has a deadline. A pod that cannot start uses no retry, so
without a deadline a broken Job stays active for the life of the
backup. A lower value fails a stuck dump sooner. A higher value gives a
long dump the time that it needs.
Minimum: 1
Optional: {}

ElasticsearchCluster

ElasticsearchCluster runs an Elasticsearch cluster for secondary storage, through the external ECK operator. It publishes the connection details and generated credentials as a SecondaryStorageConfig.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string ElasticsearchCluster
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec ElasticsearchClusterSpec spec defines the desired state of ElasticsearchCluster Required: {}
status ElasticsearchClusterStatus status defines the observed state of ElasticsearchCluster Optional: {}

ElasticsearchClusterPreset

ElasticsearchClusterPreset is a cluster-scoped baseline configuration for ElasticsearchCluster resources. It has no controller, creates nothing, and reports no status. A cluster reads it through its presetRef. A field set on the cluster replaces the value of the preset for that field completely.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string ElasticsearchClusterPreset
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec ElasticsearchClusterPresetSpec spec defines the desired state of ElasticsearchClusterPreset Required: {}

ElasticsearchClusterPresetSpec

ElasticsearchClusterPresetSpec defines the desired state of ElasticsearchClusterPreset.

Appears in: - ElasticsearchClusterPreset

Field Description Default Validation
cluster ElasticsearchClusterSpec Cluster is the complete configuration baseline that the clusters that
reference the preset get. It uses the ElasticsearchCluster spec type. A
preset must not set the fields that belong to one cluster only:
presetRef, releaseRef, secondaryStorageConfig, and suspend. It must
also not set the version, which belongs to a CamundaRelease. An explicit
zero value, such as an empty presetRef or suspend: false, counts as
unset. Templated YAML often renders unset fields in this way. A preset
can set monitoring like any other field. Thus it can enable scraping
and set the exporter image and resources for every cluster that
references it.
Required: {}

ElasticsearchClusterSpec

ElasticsearchClusterSpec defines the desired state of ElasticsearchCluster.

An ElasticsearchClusterPreset uses the same type as its baseline. For this reason, the schema marks secondaryStorageConfig as optional, and the ElasticsearchCluster requires it. A preset refuses the fields that belong to one cluster only. A preset also refuses the version, which belongs to a CamundaRelease.

Appears in: - ElasticsearchCluster - ElasticsearchClusterPresetSpec

Field Description Default Validation
presetRef string PresetRef names a cluster-scoped ElasticsearchClusterPreset to use as
the configuration baseline. A field set on the cluster replaces the
value of the preset for that field completely.
Optional: {}
releaseRef string ReleaseRef names a cluster-scoped CamundaRelease that provides the
Elasticsearch version. It merges over the preset and under this spec.
Forbidden in a preset.
Optional: {}
version string Version is the Elasticsearch version to deploy, as a full semantic
version. Camunda 8.9 supports Elasticsearch 8.x from 8.19, and 9.x from
9.2. The operator refuses a version below 8.19, and 9.0 and 9.1, also
when it comes from the release, with Ready reason InvalidReference. Required unless the
resolved release provides it. Forbidden in a preset.
Pattern: ^\d+\.\d+\.\d+$
Optional: {}
replicas integer Replicas is the number of Elasticsearch nodes. Required unless the
resolved preset provides it.
Minimum: 1
Optional: {}
resources ResourceRequirements Resources are the CPU and memory for each Elasticsearch node. Optional: {}
storageSize Quantity StorageSize is the size of the data volume of each node. Required
unless the resolved preset provides it. It cannot shrink, because an
Elasticsearch data volume cannot become smaller in place. The API
server refuses a change of this field in an ElasticsearchCluster to a
smaller value. A smaller value is accepted when the field was not set
before, or when a preset lowers the size. A cluster whose volumes are
already larger then keeps that size and records a StorageShrinkIgnored
event.
Optional: {}
storageClassName string StorageClassName is the StorageClass of the data volumes. Defaults to
the default StorageClass of the Kubernetes cluster. The class cannot
change after the ECK Elasticsearch resource exists. A cluster whose ECK
resource exists keeps its class and records a
StorageClassChangeIgnored event. A cluster without an ECK resource
takes the new class, also a suspended cluster when it resumes. Volumes
that a suspension or whenDeleted Retain kept keep their class.
Optional: {}
serviceAccount ServiceAccountSpec ServiceAccount configures the ServiceAccount of the Elasticsearch pods.
When name is unset, the account is <name>-es. The pods need no account
while neither the cluster nor its preset sets this block and the
snapshot bucket uses no workload identity. The operator then deletes the
account only when the cluster owns it, because the operator created it
or took it over. An account of that name that you created stays.
Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables for every Elasticsearch node. Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) for
every Elasticsearch node.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels applied to the Elasticsearch pods. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations applied to the Elasticsearch pods.
The key camunda.io/service-account-hash belongs to the operator, and a
value for it does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the Elasticsearch pods.
When set, it replaces the scheduling block of the preset, with no merge.
Optional: {}
snapshotStorageRef string SnapshotStorageRef names an ObjectStorageConfig, in the namespace of
this cluster, for the bucket of the snapshot repository of this
cluster. When it is set, the operator does all the Elasticsearch work
for that bucket. It gives the nodes their credentials, registers the
repository, and publishes the repository name in the
SecondaryStorageConfig. A CamundaCluster on this storage needs it for
backups. The CamundaCluster must reference the same bucket.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
secureSettings SecureSettingsSource array SecureSettings are Secrets that ECK loads into the keystore of every
node. The operator adds the credentials of snapshotStorageRef to the
keystore itself. Use this field for all other keystore entries.
Optional: {}
secondaryStorageConfig string SecondaryStorageConfig names the SecondaryStorageConfig that the
operator creates in the namespace of this cluster. It holds the
connection details and the generated credentials. Required on an
ElasticsearchCluster, forbidden in a preset.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
monitoring MonitoringSpec Monitoring configures the Prometheus scraping integration. Optional: {}
persistentVolumeClaimRetentionPolicy PersistentVolumeClaimRetentionPolicy PersistentVolumeClaimRetentionPolicy says what happens to the data
volumes when the ElasticsearchCluster is deleted. Suspension always
keeps them.
Optional: {}
suspend boolean Suspend stops the Elasticsearch cluster and keeps its data volumes.
Defaults to false. The operator deletes the ECK Elasticsearch resource
and keeps the volumes. When you set the field back to false, the
operator creates the resource again, and ECK attaches the volumes
again.
Optional: {}

ElasticsearchClusterStatus

ElasticsearchClusterStatus is the observed state of an ElasticsearchCluster.

Appears in: - ElasticsearchCluster

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
version string Version is the effective Elasticsearch version of the cluster, as a
full semantic version. It comes from the merged spec, so it is correct
when the release or the cluster gives the version. During
an upgrade, or when the operator cannot apply the change, the old
version can still run. It is empty
until the operator resolves the references of the cluster for the first
time.
Optional: {}
volumes VolumeStatus array Volumes lists the bound data PersistentVolumeClaims of the cluster and
the capacity that each one reports, sorted by name.
Optional: {}
snapshotRepository string SnapshotRepository is the snapshot repository that the operator
registered in Elasticsearch for this cluster. The published
SecondaryStorageConfig holds the same name. It is empty until the first
registration succeeds. It shows the last registration that succeeded,
not a new check that the repository still exists.
Optional: {}
conditions Condition array Conditions represent the current state. Ready holds the reason of a
failed pre-check (InvalidReference, MissingSecret, ECKNotInstalled).
Otherwise it follows the component conditions and, when the cluster or
its preset sets snapshotStorageRef and the cluster is not suspended,
SnapshotRepositoryReady. The per-component conditions (CredentialsReady,
KeystoreReady, ElasticsearchReady, StorageContractReady) also appear
here.
MetricsReady reports the exporter and never affects Ready.
Optional: {}

ElasticsearchStorage

ElasticsearchStorage holds Elasticsearch connection details.

Appears in: - SecondaryStorageConfigSpec

Field Description Default Validation
endpoint string Endpoint is the HTTP(S) endpoint of the Elasticsearch cluster.
credentialsSecretRef LocalCredentialsSecretRef CredentialsSecretRef names a basic-auth user with read and write
access to the Camunda indices.
caSecretRef LocalSecretKeyRef CASecretRef names the CA bundle that consumers use to verify the TLS
certificate of the endpoint. Set it when a well-known CA did not sign
the certificate of the endpoint. An example is the self-signed
certificate of a cluster that ECK runs. Omit it for an endpoint with a
publicly trusted certificate. It is valid only with an https endpoint.
Optional: {}
snapshotRepository string SnapshotRepository names the snapshot repository in this Elasticsearch
cluster that backups write to. An ElasticsearchCluster with a
snapshotStorageRef registers the repository and sets this field in the
contract that it publishes. For an Elasticsearch cluster that this
operator does not manage, register the repository yourself and then
set this field. A cluster that takes backups needs it. Without it, the
backup components have no place to write. The name is part of a URL
path of the Elasticsearch API, so it permits only a small set of
characters.
MaxLength: 253
Pattern: ^[a-zA-Z0-9][a-zA-Z0-9._-]*$
Optional: {}
nodeCount integer NodeCount is the number of data nodes of the Elasticsearch cluster. An
ElasticsearchCluster sets it in the contract that it publishes. For an
Elasticsearch cluster that this operator does not manage, set it
yourself.
A consumer that sets no index replica count of its own gets 0 replicas
on one node and 1 replica on two or more nodes. Without a node count,
the consumer keeps the default of the Camunda application.
Minimum: 1
Optional: {}

Endpoint

Endpoint is one route that a resource needs: a path on the external URL and the Service and port that serve it.

Appears in: - CamundaClusterStatus - CamundaManagementClusterStatus - CamundaOptimizeStatus

Field Description Default Validation
name string Name identifies the route, for example operate or grpc.
service string Service is the name of a Service in the namespace of the resource.
port integer Port is the port of the Service.
pathPrefix string PathPrefix is the path that the route matches. It is empty for gRPC. Optional: {}
protocol EndpointProtocol Protocol is HTTP or GRPC. Enum: [HTTP GRPC]

EndpointProtocol

Underlying type: string

EndpointProtocol is the protocol of a route.

Validation: - Enum: [HTTP GRPC]

Appears in: - Endpoint

Field Description
HTTP EndpointProtocolHTTP is a route for HTTP traffic, matched by path prefix.
GRPC EndpointProtocolGRPC is a route for gRPC traffic. It has no path prefix.

ExporterSpec

ExporterSpec tunes the elasticsearch_exporter Deployment that ServiceMonitorSpec.Enabled deploys.

Appears in: - MonitoringSpec

Field Description Default Validation
image string Image overrides the exporter image. Defaults to the pinned
quay.io/prometheuscommunity/elasticsearch-exporter release of the
operator.
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the exporter container. Optional: {}

ExternalKeycloakSpec

ExternalKeycloakSpec connects Management Identity to a Keycloak that you run.

Appears in: - IdentityProviderSpec - ManagementIdentityProvider

Field Description Default Validation
url string URL is the URL of Keycloak, with the /auth path when Keycloak has one.
Management Identity uses this URL, so it must resolve from inside the
Kubernetes cluster.
The operator appends /realms/<realm> to this URL, so the URL has no
query and no fragment. The URL is also in the annotations of the Lease
that claims the realm, so its length has a limit.
The URL has no user and no password. The operator does not support a
Keycloak behind a proxy that needs basic authentication.
MaxLength: 2048
realm string Realm is the realm that Management Identity creates and uses. Empty
means camunda-platform. The realm is part of the issuer, the token, and
the JWKS URLs that Management Identity builds. Thus it holds only
letters, digits, dots, hyphens, and underscores, and its length has a
limit, as the URL has.
MaxLength: 255
Optional: {}
adminCredentialsSecretRef LocalCredentialsSecretRef AdminCredentialsSecretRef names the Secret with the Keycloak
administrator credentials. Management Identity uses them to create the
realm, the clients, and the initial administrator.
caBundleSecretRef LocalSecretKeyRef CABundleSecretRef names the Secret key that holds the certificate
authority of Keycloak, in PEM form. The operator signs in to Keycloak to
register the login callbacks of Optimize. It then trusts this authority
and the trust store of its own image. Set it when a public authority did
not sign the certificate of Keycloak. It is valid only with an https
url.
Optional: {}

GCSCredentials

GCSCredentials holds the static key of a GCS bucket.

Appears in: - GCSStorageAuth

Field Description Default Validation
secretRef LocalSecretKeyRef SecretRef names the Secret key that holds the service-account JSON
key.

GCSStorage

GCSStorage describes a Google Cloud Storage bucket.

Appears in: - ObjectStorageConfigSpec

Field Description Default Validation
bucketName string BucketName is the name of the bucket, as storage client SDKs use it. MinLength: 1
basePath string BasePath is the key prefix under which consumers write objects,
without leading or trailing slashes. Empty means the bucket root.
Pattern: ^[^/]+(/[^/]+)*$
Optional: {}
auth GCSStorageAuth Auth selects how consumers authenticate. An absent block means
workload identity through the ServiceAccount.
{ type:workloadIdentity } Optional: {}

GCSStorageAuth

GCSStorageAuth selects how consumers authenticate against a GCS bucket.

Appears in: - GCSStorage

Field Description Default Validation
type ObjectStorageAuthType Type is the authentication choice. Defaults to workloadIdentity. workloadIdentity Enum: [workloadIdentity credentials]
Optional: {}
workloadIdentity GCSWorkloadIdentity WorkloadIdentity names the trusted principal. It is valid only with
type workloadIdentity. With an empty or absent block, the operator adds
no annotation. The identity must then be bound on the cloud side, for
example with Workload Identity Federation for GKE.
Optional: {}
credentials GCSCredentials Credentials is a static service-account key. Required with type
credentials. Forbidden with other types.
Optional: {}

GCSWorkloadIdentity

GCSWorkloadIdentity names the Google principal that the bucket trusts. With an empty block, the operator adds no annotation to the ServiceAccount of the consumer. The identity must then be bound on the cloud side, for example with Workload Identity Federation for GKE.

Appears in: - GCSStorageAuth

Field Description Default Validation
serviceAccountEmail string ServiceAccountEmail is the Google service account that consumers
impersonate. When set, the operator puts it in the
iam.gke.io/gcp-service-account annotation of a ServiceAccount that it
creates for the consumer. On an existing ServiceAccount, add the
annotation yourself.
Optional: {}

GatewayBinding

GatewayBinding is the published in-cluster address of the client APIs of a cluster. A client library takes the gRPC address as a host and a port, and the REST address as a base URL. Each field holds the form that a client takes.

Appears in: - CamundaClusterStatus

Field Description Default Validation
grpcEndpoint string GRPCEndpoint is the host and the port of the gRPC API, for example
my-cluster-gateway.my-cluster-ns.svc:26500.
restEndpoint string RESTEndpoint is the base URL of the orchestration cluster REST API, for
example http://my-cluster-gateway.my-cluster-ns.svc:8080.

GatewaySpec

GatewaySpec configures the gateway.

Appears in: - CamundaClusterSpec

Field Description Default Validation
mode ComponentMode Mode selects a Deployment of the unified binary (Standalone) or the
embedded gateway of the brokers (Embedded). Defaults to Standalone.
The workload fields have an effect only in Standalone mode. The
exception is extraEnv and extraEnvFrom: in Embedded mode, they apply to
the brokers.
Enum: [Standalone Embedded]
Optional: {}
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}

IdentityAdminSpec

IdentityAdminSpec names the first administrator of the management plane. Management Identity reads it only on the first start and stores the result in its database.

In the oidc mode, the administrator is a claim of the tokens that the provider issues. Set claimName and claimValue. A later change of the claim shows ImmutableAfterStart. In the two Keycloak modes, the administrator is the first Keycloak user. Set username. A later change creates a second user, and the first user keeps its access.

Appears in: - IdentityOverrides - IdentitySpec

Field Description Default Validation
claimName string ClaimName is the token claim that identifies the administrator, for
example oid or sub. Set it in the oidc mode. The operator records the
claim as <claimName>=<claimValue> and splits it at the first equals
sign. Thus the name cannot hold an equals sign.
MinLength: 1
Optional: {}
claimValue string ClaimValue is the value of the claim for the administrator.
Set it in the oidc mode.
MinLength: 1
Optional: {}
username string Username is the name of the first Keycloak user. Set it in the keycloak
and the externalKeycloak modes. Management Identity creates the user on
its first start. A later change of this field creates a second user and
does not rename the first user.
MinLength: 1
Optional: {}
passwordSecretRef LocalSecretKeyRef PasswordSecretRef names the Secret key that holds the password of the
first Keycloak user. The operator generates a password when this is
unset.
Optional: {}
email string Email is the email address of the first Keycloak user. Web Modeler
needs an address for every person who signs in. Thus it is required
when webModeler is set in a Keycloak mode.
MinLength: 3
Optional: {}

IdentityProviderSpec

IdentityProviderSpec holds one of the three identity provider modes.

Appears in: - CamundaManagementClusterSpec

Field Description Default Validation
keycloak ManagedKeycloakSpec Keycloak runs Keycloak through the Keycloak Operator. The Keycloak
Operator must be installed on the Kubernetes cluster.
Optional: {}
externalKeycloak ExternalKeycloakSpec ExternalKeycloak connects Management Identity to a Keycloak that you
run. Management Identity still creates the realm, the clients, and the
initial administrator in it.
Optional: {}
oidc ManagementOIDCSpec OIDC connects Management Identity to the identity provider of the
referenced CamundaPlatformConfig.
Optional: {}

IdentitySpec

IdentitySpec configures Management Identity.

The operator owns the Keycloak URL and the realm of the container. Both come from spec.identityProvider, so the API server refuses an extraEnv entry for KEYCLOAK_URL or KEYCLOAK_REALM. In a Keycloak mode, this management plane claims the realm that they name. With an override, Management Identity writes the login callbacks of Optimize to another realm. status.callbackRealm does not name that realm, the operator does not remove the callbacks from it, and another management plane can hold it.

Appears in: - CamundaManagementClusterSpec

Field Description Default Validation
version string Version is the Management Identity version, as a full semantic version.
The operator supports 8.9.0 and later.
Pattern: ^\d+\.\d+\.\d+$
externalUrl string ExternalURL is the URL where browsers reach Management Identity.
Identity registers it as the redirect URI of its own client. Identity
serves under the path of this URL, so it can share one host with
Keycloak, Console, and Web Modeler. A URL with a path other than "/"
must use https, because Camunda requires https for Identity under a
path.
databaseConfigRef string DatabaseConfigRef names the DatabaseConfig of the Management Identity
database, in the namespace of this resource. Identity needs its own
PostgreSQL database.
MinLength: 1
serviceAccount ServiceAccountSpec ServiceAccount gives the Management Identity pods a ServiceAccount of their own.
When unset, they run under spec.serviceAccount. When set, they run
under <name>-identity, or under name, and they do not get the access that a
plugin grants to the account of spec.serviceAccount. The name default
needs create false.
Optional: {}
admin IdentityAdminSpec Admin names the first administrator of the management plane.
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}

ImagesSpec

ImagesSpec changes the repositories of the container images that the operator pulls. Each field holds a repository without a tag or a digest, for example mirror.example.com/camunda/optimize. The version of the component gives the tag. A repository name is lowercase, as the container registries require. An unset field means the default repository of that image.

Appears in: - CamundaPlatformConfigSpec

Field Description Default Validation
camunda string Camunda is the image of the orchestration cluster processes. Defaults
to camunda/camunda.
Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}
connectors string Connectors is the image of the connectors runtime. Defaults to
camunda/connectors-bundle.
Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}
optimize string Optimize is the image of Optimize. Defaults to camunda/optimize. Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}
identity string Identity is the image of Management Identity. Defaults to
camunda/identity.
Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}
console string Console is the image of Console. Defaults to camunda/console. Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}
webModelerRestapi string WebModelerRestapi is the image of the Web Modeler restapi process.
Defaults to camunda/web-modeler-restapi below 8.10, and to camunda/hub
from 8.10 on.
Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}
webModelerWebsockets string WebModelerWebsockets is the image of the Web Modeler websockets
process. Defaults to camunda/web-modeler-websockets below 8.10, and to
camunda/hub-websockets from 8.10 on.
Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}
keycloak string Keycloak is the image of the Keycloak that the operator runs. Defaults
to camunda/keycloak.
Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}
postgres string Postgres is the image of the PostgreSQL that a DatabaseServer runs.
Defaults to ghcr.io/cloudnative-pg/postgresql. The tag is the major
version of the server, so a replacement must publish the same tags.
Pattern: ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?(:[0-9]+(/[a-z0-9]+([._-][a-z0-9]+)*)+\|(/[a-z0-9]+([._-][a-z0-9]+)*)*)/?$
Optional: {}

KeycloakRealmTarget

KeycloakRealmTarget is one Keycloak realm and how the operator signs in to it. Two targets name the same realm when their url and their realm are equal. Their administrators and certificate authorities can differ.

Appears in: - CamundaManagementClusterStatus

Field Description Default Validation
url string URL is the URL of Keycloak that the operator uses, with the /auth path
when Keycloak has one.
realm string Realm is the Keycloak realm.
adminCredentialsSecretRef LocalCredentialsSecretRef AdminCredentialsSecretRef names the Secret with the Keycloak
administrator that the operator signs in with, in the namespace of this
resource.
caBundleSecretRef LocalSecretKeyRef CABundleSecretRef names the Secret key with the certificate authority of
Keycloak, in the namespace of this resource. It is absent when a public
authority signed the certificate of Keycloak.
Optional: {}

LocalCredentialsSecretRef

LocalCredentialsSecretRef references a username and password pair in a Secret in the namespace of the object that holds the reference. Every namespaced kind uses it, so a reference never reaches the credentials of another namespace.

Appears in: - DatabaseConfigSpec - DatabaseServerConfigSpec - ElasticsearchStorage - ExternalKeycloakSpec - KeycloakRealmTarget - ManagementAuth - WebModelerMailSpec

Field Description Default Validation
name string Name is the name of the Secret that holds the credentials. MinLength: 1
usernameKey string UsernameKey is the key in the Secret that holds the plaintext username. username MinLength: 1
Optional: {}
passwordKey string PasswordKey is the key in the Secret that holds the plaintext password. password MinLength: 1
Optional: {}

LocalSecretKeyRef

LocalSecretKeyRef references one value in a Secret in the namespace of the object that holds the reference. Every namespaced kind uses it, so a reference never reaches the Secrets of another namespace.

Appears in: - AzureBlobCredentials - ClusterAuthSpec - ElasticsearchStorage - ExternalKeycloakSpec - GCSCredentials - IdentityAdminSpec - KeycloakRealmTarget

Field Description Default Validation
name string Name is the name of the Secret that holds the value. MinLength: 1
key string Key is the key in the Secret that holds the value. MinLength: 1

LogicalBackupElasticsearch

LogicalBackupElasticsearch is one backup of a CamundaCluster with Elasticsearch secondary storage. The backup is one set under one backup ID: the web-application indices, the exported Zeebe record indices, and the Zeebe partitions. The cluster continues to run during the backup, with exporting soft-paused. A restore reads a completed backup by its backup ID and its recorded snapshot names.

When you delete the resource, the operator tries to delete the stored backup data. The deletion waits while the cluster publishes no management binding, for example while it is suspended. It also waits while the pinned bucket points elsewhere. The operator removes the resource and can leave the data when the cluster is gone or was created again. The same applies when the pinned bucket is gone. It also applies when the management client cannot be built and the backup holds no pause of exporting.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string LogicalBackupElasticsearch
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec LogicalBackupElasticsearchSpec spec identifies the cluster to back up. It is immutable. A backup runs
one time. To try again, create a new resource.
Required: {}
status LogicalBackupElasticsearchStatus status defines the observed state of the backup Optional: {}

LogicalBackupElasticsearchSpec

LogicalBackupElasticsearchSpec identifies the cluster to back up. The whole spec is immutable. A backup runs one time. To try again, create a new resource.

Appears in: - LogicalBackupElasticsearch

Field Description Default Validation
clusterRef ClusterRef ClusterRef references the CamundaCluster to back up, in the namespace
of this backup. Its secondary storage must be Elasticsearch.
Required: {}

LogicalBackupElasticsearchStatus

LogicalBackupElasticsearchStatus is the progress of the backup to a final phase.

Appears in: - LogicalBackupElasticsearch

Field Description Default Validation
phase LogicalBackupPhase Phase is the phase of the backup. Completed and Failed are final. Enum: [Pending Running Completed Failed]
Optional: {}
step LogicalBackupElasticsearchStep Step is the current step of the backup. After an interruption, the
backup continues at this step.
Enum: [PauseExporting BackupHistory SnapshotRecords BackupRuntime ResumeExporting]
Optional: {}
backupId integer BackupID identifies every part of the backup set: the web-application
snapshots, the record snapshot, and the partition backup. A restore
finds the set by this ID.
Optional: {}
partitionsCount integer PartitionsCount is the partition count of the cluster when the backup
started. A restore must match it.
Optional: {}
storageSizes LogicalBackupStorageSizes StorageSizes are the effective restore sizes. The operator computes
them when the backup starts. If a value is not available then, the
operator adds it later while exporting runs: before the pause, or after
the resume. It does not add a value while exporting is paused. Thus an
absent value can still appear later in the backup.
Optional: {}
history BackupPart History is the backup of the web-application indices. Optional: {}
records BackupPart Records is the snapshot of the exported Zeebe record indices. Optional: {}
runtime BackupPart Runtime is the backup of the Zeebe partitions. Optional: {}
historySnapshots string array HistorySnapshots names the Elasticsearch snapshots of the
web-application indices. The operator records the names as soon as the
management API gives them. Thus the deletion of the backup and a
restore can find the snapshots after the cluster is gone.
Optional: {}
repository string Repository records the snapshot repository of every part of the set.
The operator records it when the backup starts, and every later step
and the deletion use this name. Thus the whole set goes to one
repository, also when the storage contract changes its repository
during the backup. The deletion also goes to the correct repository.
Optional: {}
storage PinnedStorage Storage records the Elasticsearch destination of the set: the storage
contract and its endpoint when the backup started. The repository name
alone does not identify a cluster. If the storage contract or the
endpoint changes during the backup, the step fails. The deletion never
runs against another cluster.
Optional: {}
workloadConfigHash string WorkloadConfigHash records the configuration of Zeebe when the backup
started. It is the config hash of the Zeebe pod template. The backup
starts only after the cluster runs its current spec. Zeebe must also
run the Elasticsearch endpoint, the snapshot repository, and the bucket
that the contracts of the cluster declare. Until the runtime backup is final, each step compares
the current hash with this value, after it reads the state of its part.
If the hash differs, the step fails at once. The generation of the cluster is not sufficient, because
a change of a referenced object changes the hash but not the generation.
Optional: {}
clusterUID string ClusterUID records the identity of the CamundaCluster of the backup. A
cluster that is deleted and created again with the same name is
another cluster. This backup never paused the exporting of the new
cluster. Every management call after the start compares the cluster
with this UID. If they differ, the backup ends and does not change the
new cluster.
Optional: {}
version string Version is the Camunda version of the cluster when the backup started,
as the management binding reported it. A restore compares it with the
version of its target. An Elasticsearch backup restores only to the
same version. A restore can read the version only here, because a
suspended cluster has no management binding. The backup starts only
when Zeebe runs this version. If a step finds Zeebe on another version
before the runtime backup is final, the step fails at once with both
versions in the message.
Optional: {}
historyRequestedTime Time HistoryRequestedTime is when the operator decided to request the
backup of the web-application indices. The operator writes it before
it sends the request, so the decision stays after a lost response or a
restart. It shows that this backup intended to send the request. It
does not prove that a history backup with this ID belongs to this
backup.
Optional: {}
historyAcceptedTime Time HistoryAcceptedTime is when the cluster accepted the history backup
request of this backup. Only this field shows that the history backup
with this ID belongs to this backup. If such a history backup exists
without this field, the step fails, and the operator does not delete
its snapshots. A crash between the request and the write of this field
fails the backup. The cluster can then keep a history backup with this
ID, which you remove manually.
Optional: {}
runtimeRequestedTime Time RuntimeRequestedTime is when the operator decided to request the
runtime backup. The operator writes it before it sends the request, so
the decision stays after a lost response or a restart. It shows that
this backup intended to send the request. It does not prove that a
runtime backup with this ID belongs to this backup.
Optional: {}
runtimeAcceptedTime Time RuntimeAcceptedTime is when the cluster accepted the runtime backup
request of this backup. Only this field shows that the runtime backup
with this ID belongs to this backup. A runtime backup can exist without
this field, after a lost response or when another client used the ID
first. Then the step fails, and the operator does not delete that
runtime backup. A crash between the request and the write of this
field fails the backup. The cluster can then keep such a runtime
backup, which you remove manually.
The cluster registers the backup some time after it accepts it. For a
short grace period after this time, the operator waits for an absent
backup. After the grace period, an absent backup fails the step.
Optional: {}
unreachableSince Time UnreachableSince is when a step first failed to reach its endpoint:
the management API or Elasticsearch. Exporting can be paused during
every step, so the retries have a time limit. After the limit, the step
fails, and the backup resumes exporting. The field clears when all
calls succeed again.
Optional: {}
failureMessage string FailureMessage names the failed step and its error. The operator
records it when a step fails and exporting must still resume. Thus the
final condition shows the reason after the resume.
Optional: {}
resumeStartedTime Time ResumeStartedTime is the start of the resume deadline. Only the time
of active resume attempts counts against the deadline. A time in which
the backup waits, for example for a suspended cluster or an
unpublished binding, moves the start forward and does not count. The
value stays after a restart of the operator.
Optional: {}
lastResumeAttemptTime Time LastResumeAttemptTime is when the last resume attempt ended. The time
from it to the start of the next attempt decides whether the start of
the deadline moves. The time inside an attempt always counts.
Optional: {}
terminalReason string TerminalReason is the Ready reason that the operator recorded when the
backup reached its final phase: Completed, Failed, or ResumeFailed.
Optional: {}
resumeFailureMessage string ResumeFailureMessage is the last error of the resume of exporting,
when the backup stopped the attempts. A backup that failed a step and
then failed to resume reports this field and FailureMessage.
Optional: {}
completionTime Time CompletionTime is when the backup reached a final phase. Optional: {}
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current state. The Ready condition shows the
backup with the reasons Progressing, Completed, Failed, ResumeFailed,
ClusterSuspended, BackupInProgress, StorageTypeMismatch,
InvalidReference, MissingSecret, and ConnectionFailed.
Optional: {}

LogicalBackupElasticsearchStep

Underlying type: string

LogicalBackupElasticsearchStep is the current step of the backup. After a crash or a restart of the operator, the backup continues at this step. The request to pause exporting can be sent again after a restart.

Validation: - Enum: [PauseExporting BackupHistory SnapshotRecords BackupRuntime ResumeExporting]

Appears in: - LogicalBackupElasticsearchStatus

Field Description
PauseExporting
BackupHistory
SnapshotRecords
BackupRuntime
ResumeExporting

LogicalBackupPhase

Underlying type: string

LogicalBackupPhase is the phase of a backup that runs one time. Completed and Failed are final. To try again, create a new CR.

Validation: - Enum: [Pending Running Completed Failed]

Appears in: - LogicalBackupElasticsearchStatus - LogicalBackupRDBMSStatus

Field Description
Pending LogicalBackupPending means that the backup did not start its work. A
pre-check did not pass yet, or another backup of the same cluster runs.
Running LogicalBackupRunning means that the backup runs.
Completed LogicalBackupCompleted means that the backup finished and a restore can
use it.
Failed LogicalBackupFailed means that the backup failed. The message of the
Ready condition names the failed step.

LogicalBackupRDBMS

LogicalBackupRDBMS is one backup of an orchestration cluster with relational secondary storage. It is a dump of the whole logical database in the backup bucket, with one Zeebe backup. Camunda calls the Zeebe log and snapshots its "primary storage", and the exported relational data its "secondary storage". A Zeebe backup is the backup of the primary storage that Camunda writes to the backup bucket, on a request through the management API. A restore reads the exporter position from the restored dump and selects the Zeebe backups that match it. Thus the pair is a complete restore point.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string LogicalBackupRDBMS
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec LogicalBackupRDBMSSpec spec defines the desired state of LogicalBackupRDBMS Required: {}
status LogicalBackupRDBMSStatus status defines the observed state of LogicalBackupRDBMS Optional: {}

LogicalBackupRDBMSSpec

LogicalBackupRDBMSSpec identifies the cluster to back up. It is immutable. A backup runs one time. To try again, create a new CR.

Appears in: - LogicalBackupRDBMS

Field Description Default Validation
clusterRef ClusterRef ClusterRef references the CamundaCluster to back up. The cluster must
store its data in a relational database and have a backupStorageRef.
Required: {}
dump DumpPodSpec Dump replaces all the pod settings of the spec.backup.dump block of
the cluster for this backup. When unset, the settings of the cluster
apply. The two never merge. The image of the dump is not one of these
settings. The Job runs under the ServiceAccount of the cluster, so the
image always comes from the block of the cluster.
The environment has limits too. The extraEnv of a backup cannot set a
name that starts with PG or UPLOAD_, and the API server refuses such a
name. Every extraEnvFrom source needs a prefix that cannot make such a
name. libpq prefers PGHOSTADDR over the PGHOST of the Job. Without the
limit, a source can send the dump, with the credentials of the Job, to
another host. The API server accepts a source without a safe prefix.
The backup then stays Pending with reason InvalidReference, and its Job
never starts.
The environment of this block reaches only the dump container, never
the upload container. Cloud SDKs read endpoint, proxy, and
configuration variables from the environment, and a backup must not
change where its dump goes. The block of the cluster has no prefix
limit, and its environment reaches every container.
Optional: {}

LogicalBackupRDBMSStatus

LogicalBackupRDBMSStatus is the observed state of one backup operation.

Appears in: - LogicalBackupRDBMS

Field Description Default Validation
phase LogicalBackupPhase Phase is the phase of the backup. Completed and Failed are final. Enum: [Pending Running Completed Failed]
Optional: {}
step LogicalBackupRDBMSStep Step is the current step of the backup. After an interruption, the
backup continues at this step.
Enum: [Dumping ZeebeBackup]
Optional: {}
backupId integer BackupID identifies the dump object in the bucket. The operator sets
it one time, when the backup leaves Pending.
Optional: {}
jobName string JobName is the Job that dumps and uploads the database, while the Job
exists. It clears when the operator recorded the dump and removed the
Job. A failed Job stays until the backup is deleted, and its name stays
too.
Optional: {}
objectKey string ObjectKey is the full key of the dump in the backup bucket:
<basePath>/<namespace>/<cluster>/<backupId>/<uid>/camunda.dump. The
uid is the UID of this resource. Thus a backup id that is used again
never names the dump of another backup.
Optional: {}
zeebeBackupId integer ZeebeBackupID is the id of the Zeebe backup that the cluster generated
after the dump. It is unset until the operator requests that backup.
Optional: {}
zeebeBackupRequestedAt Time ZeebeBackupRequestedAt is when the operator requested the Zeebe
backup. It limits how long the operator waits for the cluster to report
the backup.
Optional: {}
workloadConfigHash string WorkloadConfigHash records the configuration of Zeebe when the backup
started. It is the config hash of the Zeebe pod template. The backup
starts only after every Zeebe pod runs this template, and the template
uses the bucket of the backup storage contract. The operator compares
it with the current hash before it renders the dump Job and before it
requests the Zeebe backup. It compares again until the Zeebe
backup is final. Before the request, a different hash fails the backup
after the grace period. After the request, a different hash fails the
backup at once, also when the Zeebe backup completed. The generation
of the cluster is not sufficient, because a change of a referenced
object changes the hash but not the generation.
Optional: {}
clusterUID UID ClusterUID records the CamundaCluster of the backup. A cluster that is
deleted and created again with the same name is another cluster, with
other primary storage. If the UID of the cluster changes, the backup
fails. Thus a dump never pairs with the Zeebe backup of another
cluster.
Optional: {}
version string Version is the Camunda version of the cluster when the backup started,
as the management binding reported it. A restore compares it with the
version of its target. A relational backup restores to the same Camunda
minor or to one minor newer. A restore can read the version only here,
because a suspended cluster has no management binding. The backup
starts only when Zeebe runs this version. After the Zeebe backup
request, a poll that finds Zeebe on another version fails the backup
at once with both versions in the message.
Optional: {}
firstFailedAt Time FirstFailedAt is when a dependency of the running backup first stopped
resolving, or the management API first stopped answering. The grace
period starts at this time. It clears when the backup recovers.
Optional: {}
bucketRef string BucketRef records the ObjectStorageConfig through which the Job wrote
the dump. On deletion, the operator uses this contract, not the
current backupStorageRef of the cluster. It removes the object only
while the cluster and this contract exist, and the contract points to
the same place. For a bucket with static credentials, the credentials
Secret must also exist.
Optional: {}
bucketLocation string BucketLocation records where the Job wrote the object: the storage
type, the bucket, the base path, and the endpoint of the
ObjectStorageConfig at the start. On deletion, the operator removes the
object only while the contract still points there. If the contract
points somewhere else, the object stays. Thus the operator never
deletes an unrelated object with the same key.
Optional: {}
bucketGeneration integer BucketGeneration is the generation of the recorded ObjectStorageConfig
when the backup started. It is information only. BucketLocation
decides whether a deletion can run.
Optional: {}
storageSizes LogicalBackupStorageSizes StorageSizes are the effective restore sizes that the operator
recorded when the backup started. The RDBMS kind records only the Zeebe
size.
Optional: {}
failureMessage string FailureMessage tells why the backup failed. It is set with the Failed
phase. The Ready condition has the same message.
Optional: {}
completionTime Time CompletionTime is when the backup reached a final phase. Optional: {}
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current state. The Ready condition has the
phase as its reason, and its message names a failed step. For a
Pending backup, Ready has the reason of the check that holds it, and
the message explains that check.
Optional: {}

LogicalBackupRDBMSStep

Underlying type: string

LogicalBackupRDBMSStep is the current step of the backup. After an interruption, the backup continues at this step.

Validation: - Enum: [Dumping ZeebeBackup]

Appears in: - LogicalBackupRDBMSStatus

Field Description
Dumping StepDumping runs the Job that writes the logical database to the
backup bucket.
ZeebeBackup StepZeebeBackup requests one Zeebe backup directly after the dump, so
that the two make one restore point. A Zeebe backup is the backup that
Camunda takes of its primary storage: the Zeebe log and snapshots.

LogicalBackupRef

LogicalBackupRef references a completed logical backup in the namespace of the restore. The reference never crosses a namespace. The kind of the restore sets the kind of the backup, so the reference holds only a name.

Appears in: - LogicalRestoreElasticsearchSpec - LogicalRestoreRDBMSSpec

Field Description Default Validation
name string Name is the name of the backup, in the namespace of this restore. MinLength: 1
Required: {}

LogicalBackupStorageSizes

LogicalBackupStorageSizes are the effective restore sizes of the components that hold storage. The operator records them when a backup starts, so that a restore can create volumes of the correct size. A value that the operator cannot compute stays unset. An Elasticsearch backup can add a missing value later, while exporting runs. The RDBMS kind never sets Elasticsearch, because it does not back up Elasticsearch data.

Appears in: - LogicalBackupElasticsearchStatus - LogicalBackupRDBMSStatus

Field Description Default Validation
elasticsearch Quantity Elasticsearch is the effective restore size of one Elasticsearch data
volume.
Optional: {}
zeebe Quantity Zeebe is the effective restore size of one broker data volume. Optional: {}

LogicalRestoreElasticsearch

LogicalRestoreElasticsearch restores one completed LogicalBackupElasticsearch into one suspended CamundaCluster. It deletes the Camunda indices of the target and restores every snapshot of the backup into its Elasticsearch. Then it gives the brokers empty data volumes and runs the Camunda restore application one time for each broker.

The restore prepares the target itself. It suspends the target, waits for its brokers to stop, and sets spec.version to the Camunda version of the backup. When it completes, it removes the suspension, but only a suspension that it applied itself. A failed restore leaves the target suspended. A restore that somebody deletes while it runs also leaves the target suspended. Empty or half-written broker volumes cause more damage under running brokers.

The restore keeps spec.version, with the field manager camunda-operator/restore-version. The target runs the version of the backup until another manager takes over or removes that field. A manifest without spec.version does not change it, because server-side apply removes a field only for the manager that set it. This applies also to a target that gets its version from a release. The value of the restore wins over the release until somebody removes the field.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string LogicalRestoreElasticsearch
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec LogicalRestoreElasticsearchSpec spec names the backup to restore and the cluster to restore into. It
is immutable. A restore runs one time. To try again, create a new
resource.
Required: {}
status LogicalRestoreElasticsearchStatus status defines the observed state of the restore Optional: {}

LogicalRestoreElasticsearchSpec

LogicalRestoreElasticsearchSpec names the backup to restore and the cluster to restore into. The whole spec is immutable. A restore runs one time. To try again, create a new resource.

Appears in: - LogicalRestoreElasticsearch

Field Description Default Validation
backupRef LogicalBackupRef BackupRef references the completed LogicalBackupElasticsearch to
restore from, in the namespace of this restore.
Required: {}
targetClusterRef ClusterRef TargetClusterRef references the CamundaCluster to restore into. It
must name the cluster of the backup, because the restore application
reads the primary-storage backup under the prefix of that cluster. The
cluster must stay suspended for the whole restore.
Required: {}

LogicalRestoreElasticsearchStatus

LogicalRestoreElasticsearchStatus is the progress of the restore to a final phase.

Appears in: - LogicalRestoreElasticsearch

Field Description Default Validation
phase LogicalRestorePhase Phase is the phase of the restore. After an interruption, the restore
continues at this phase.
Enum: [Pending ValidatingCompatibility RestoringSecondaryStorage RestoringPrimaryStorage Completed Failed]
Optional: {}
backupId integer BackupID is the backup that the restore reads. The operator records it
when the restore starts. Later phases of the restore still read the
backup resource, so keep it until the restore completes.
Optional: {}
backend string Backend is the Elasticsearch that the restore writes, as the scheme,
the host, and the port. The operator records it when the restore
starts. From then until the final phase, and after it while
recoveryHeld is true, no other CamundaCluster starts on this backend.
The restore waits while its target does not hold the backend.
Optional: {}
contract string Contract is the SecondaryStorageConfig that held the endpoint of
Backend when the restore started. When the endpoint of that contract
moves, the restore still holds this contract.
Optional: {}
recoveryHeld boolean RecoveryHeld is true while a failed or deleted restore keeps the
backend, because Elasticsearch can still recover snapshots that the
restore asked for. While it is true, no other CamundaCluster starts on
the backend, and the target stays suspended. No other backup or restore
of the target starts. A deleted restore stays while it is true. It is
unset on a restore that was never held, and false when the hold ends.
Optional: {}
recoveryUnknownSince Time RecoveryUnknownSince is the start of the current period in which a held
restore cannot read the recovery from Elasticsearch. If the recovery stays unknown for ten
minutes, the restore releases the backend.
Optional: {}
repository string Repository is the Elasticsearch snapshot repository that the restore
reads from, on the Elasticsearch of the target.
Optional: {}
restoredSnapshots string array RestoredSnapshots names every snapshot that the restore asked
Elasticsearch to restore. After the operator records the names, the
restore does not delete the indices again when it continues after an
interruption.
Optional: {}
targetClusterUID UID TargetClusterUID records the identity of the target cluster. A cluster
that is deleted and created again with the same name is another
cluster, and this restore does not apply to it.
Optional: {}
brokers integer Brokers is the broker count of the broker StatefulSet. The operator
records it before the restore deletes a volume. It sets how many
volumes the restore creates again and how many Jobs run.
Optional: {}
primaryJobNames string array PrimaryJobNames are the restore application Jobs, one for each broker,
in broker order. The operator records them before it creates the Jobs.
A completed restore removes these Jobs. The logs of these Jobs explain
a failed restore.
Optional: {}
recreatedClaims string array RecreatedClaims names the broker data claims that the restore deleted
and created again. Thus the restore does not delete a claim two times.
Optional: {}
firstFailedAt Time FirstFailedAt is when a dependency of the running restore first stopped
resolving. The grace period starts at this time. The field can clear if
the dependency recovers before the restore deletes target indices or
records a recreated broker volume or a broker Job. After that point, the
field stays set, so a dependency that fails and recovers again and
again does not reset the grace period.
Optional: {}
clusterSuspended boolean ClusterSuspended records that this restore suspended its target
cluster. The restore removes that suspension when it reaches
Completed. A cluster that its owner suspended has no such record, so
it stays suspended. The cluster of a failed restore also stays
suspended.
Optional: {}
terminalReason string TerminalReason is the Ready reason that the operator recorded when the
restore reached its final phase.
Optional: {}
failureMessage string FailureMessage names the failed phase and its error. The Ready
condition has the same message.
Optional: {}
completionTime Time CompletionTime is when the restore reached a final phase. Optional: {}
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current state of the restore. Optional: {}

LogicalRestorePhase

Underlying type: string

LogicalRestorePhase is the phase of a logical restore that runs one time. Completed and Failed are final. To try again, create a new resource. Both logical restore kinds use it, because their phases are the same.

Validation: - Enum: [Pending ValidatingCompatibility RestoringSecondaryStorage RestoringPrimaryStorage Completed Failed]

Appears in: - LogicalRestoreElasticsearchStatus - LogicalRestoreRDBMSStatus

Field Description
Pending LogicalRestorePending means that the restore did not start its work. A
pre-check stops it: the target cluster runs, another operation holds
the cluster, or the backup is not completed.
ValidatingCompatibility LogicalRestoreValidatingCompatibility means that the operator compares
the backup with the target. It compares the storage type, the backup
bucket, the Camunda version, and, on the Elasticsearch kind, the
partition count.
RestoringSecondaryStorage LogicalRestoreRestoringSecondaryStorage means that the operator writes
the backup into the secondary storage of the target.
RestoringPrimaryStorage LogicalRestoreRestoringPrimaryStorage means that the operator created
the broker data volumes again and runs the restore application on them.
Completed LogicalRestoreCompleted means that the restore finished. The operator
removes the Jobs of the brokers, so their pods release the broker data
volumes. It removes the suspension that it applied, so the target runs
again, unless its owner suspended it.
Failed LogicalRestoreFailed means that the restore failed. The Ready condition
names the failed phase. The operator keeps the Jobs of the brokers,
because their logs show the cause. Thus a restore that reached
RestoringPrimaryStorage holds the broker data volumes until you delete
it. A restore that failed in an earlier phase records no Job in
PrimaryJobNames and holds no broker volume.

LogicalRestoreRDBMS

LogicalRestoreRDBMS restores one completed LogicalBackupRDBMS into one suspended CamundaCluster. The operator writes the dump into the logical database of the target with pg_restore. Then it gives the brokers empty data volumes and runs the Camunda restore application on them, one time for each broker.

The restore prepares the target itself. It suspends the target, waits for its brokers to stop, and sets spec.version to the Camunda version of the backup. When it completes, it removes the suspension, but only a suspension that it applied itself. A failed restore leaves the target suspended. A restore that somebody deletes while it runs also leaves the target suspended. Empty or half-written broker volumes cause more damage under running brokers.

The restore keeps spec.version, with the field manager camunda-operator/restore-version. The target runs the version of the backup until another manager takes over or removes that field. A manifest without spec.version does not change it, because server-side apply removes a field only for the manager that set it. Thus a target of a newer minor stays on the minor of the backup, and the owner must upgrade it again.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string LogicalRestoreRDBMS
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec LogicalRestoreRDBMSSpec spec names the backup to read and the cluster to restore into. It is
immutable. A restore runs one time. To try again, create a new
resource.
Required: {}
status LogicalRestoreRDBMSStatus status defines the observed state of the restore Optional: {}

LogicalRestoreRDBMSSpec

LogicalRestoreRDBMSSpec names the backup to restore and the cluster to restore into. The whole spec is immutable. A restore runs one time. To try again, create a new resource.

Appears in: - LogicalRestoreRDBMS

Field Description Default Validation
backupRef LogicalBackupRef BackupRef references the completed LogicalBackupRDBMS to restore from,
in the namespace of this restore.
Required: {}
targetClusterRef ClusterRef TargetClusterRef references the CamundaCluster to restore into. It
must name the cluster of the backup, because the restore application
reads the primary-storage backup under the prefix of that cluster. The
cluster must be suspended for the whole restore.
Required: {}

LogicalRestoreRDBMSStatus

LogicalRestoreRDBMSStatus is the progress of the restore to a final phase.

Appears in: - LogicalRestoreRDBMS

Field Description Default Validation
phase LogicalRestorePhase Phase is the phase of the restore. After an interruption, the restore
continues at this phase.
Enum: [Pending ValidatingCompatibility RestoringSecondaryStorage RestoringPrimaryStorage Completed Failed]
Optional: {}
backupId integer BackupID is the id of the dump that the restore reads, as the backup
records it. The operator records it when the restore starts. Later
phases of the restore still read the backup resource, so keep it until
the restore completes.
Optional: {}
backend string Backend is the logical database that the restore writes, as the host,
the port, and the database name. The operator records it when the
restore starts. From then until the final phase, no other
CamundaCluster starts on this backend. The restore waits while its
target does not hold the backend.
Optional: {}
contract string Contract is the DatabaseServerConfig and the database name of Backend
when the restore started. When the DatabaseServerConfig moves to
another address, the restore still holds this contract.
Optional: {}
secondaryJobName string SecondaryJobName is the Job that runs pg_restore, while the Job exists. Optional: {}
targetClusterUID UID TargetClusterUID records the identity of the target cluster. A cluster
that is deleted and created again with the same name is another
cluster, and this restore does not apply to it.
Optional: {}
brokers integer Brokers is the broker count of the broker StatefulSet. The operator
records it before the restore deletes a volume. It sets how many
volumes the restore creates again and how many Jobs run.
Optional: {}
primaryJobNames string array PrimaryJobNames are the restore application Jobs, one for each broker,
in broker order. The operator records them before it creates the Jobs.
A completed restore removes these Jobs. The logs of these Jobs explain
a failed restore.
Optional: {}
recreatedClaims string array RecreatedClaims names the broker data claims that the restore deleted
and created again. Thus the restore does not delete a claim two times.
Optional: {}
firstFailedAt Time FirstFailedAt is when a dependency of the running restore first stopped
resolving. The grace period starts at this time. The field can clear if
the dependency recovers before the restore deletes target indices or
records a recreated broker volume or a broker Job. After that point, the
field stays set, so a dependency that fails and recovers again and
again does not reset the grace period.
Optional: {}
clusterSuspended boolean ClusterSuspended records that this restore suspended its target
cluster. The restore removes that suspension when it reaches
Completed. A cluster that its owner suspended has no such record, so
it stays suspended. The cluster of a failed restore also stays
suspended.
Optional: {}
terminalReason string TerminalReason is the Ready reason that the operator recorded when the
restore reached its final phase.
Optional: {}
failureMessage string FailureMessage names the failed phase and its error. The Ready
condition has the same message.
Optional: {}
completionTime Time CompletionTime is when the restore reached a final phase. Optional: {}
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current state of the restore. Optional: {}

ManagedKeycloakSpec

ManagedKeycloakSpec configures the Keycloak that the operator runs through the Keycloak Operator.

Appears in: - IdentityProviderSpec

Field Description Default Validation
version string Version is the Keycloak version, as a full semantic version. Camunda
8.9 supports only Keycloak 26. The image is
camunda/keycloak:quay-optimized-<version>, unless the platform config
sets another repository.
Pattern: ^\d+\.\d+\.\d+$
externalUrl string ExternalURL is the URL where browsers reach Keycloak, with the /auth
path. It is the front-channel issuer of every token. Management
Identity uses the front-channel URL since 8.5.3, so the Identity pods
must also reach it. Management Identity administers Keycloak through
the Service that the Keycloak Operator creates, not through this URL.
The operator appends /realms/<realm> to this URL, so the URL has no
query and no fragment.
databaseConfigRef string DatabaseConfigRef names the DatabaseConfig of the Keycloak database, in
the namespace of this resource. Keycloak needs its own PostgreSQL
database.
MinLength: 1
replicas integer Replicas is the number of Keycloak instances. Defaults to 1. Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the Keycloak container. Optional: {}
serviceAccount ServiceAccountSpec ServiceAccount gives the Keycloak pods a ServiceAccount of their own.
When unset, they run under spec.serviceAccount. When set, they run
under <name>-keycloak, or under name, and they do not get the access that a
plugin grants to the account of spec.serviceAccount. The name default
needs create false.
Optional: {}
scheduling SchedulingSpec Scheduling constraints of the Keycloak pods. Optional: {}

ManagementAuth

ManagementAuth is how a consumer of the management binding authenticates.

Appears in: - ManagementBinding

Field Description Default Validation
method ManagementAuthMethod Method is the authentication method of the management port. Camunda
8.9 serves the actuator endpoints without authentication, so the
operator publishes none. The value basic is for a user who adds a
Spring Security configuration to the port, and for a later Camunda
version that secures it.
Enum: [none basic]
credentialsSecretRef LocalCredentialsSecretRef CredentialsSecretRef names the username and password of the management
port. It is set only when Method is basic.
Optional: {}

ManagementAuthConfig

ManagementAuthConfig is the contract CRD that holds the Management Identity OIDC configuration: the endpoints, the client credentials, and the audience. Components outside the orchestration cluster, such as Optimize, read it.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string ManagementAuthConfig
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec ManagementAuthConfigSpec spec defines the desired state of ManagementAuthConfig Required: {}
status ManagementAuthConfigStatus status defines the observed state of ManagementAuthConfig Optional: {}

ManagementAuthConfigSpec

ManagementAuthConfigSpec holds the Management Identity OIDC configuration: the endpoints, the machine-to-machine client credentials, and the audience.

Appears in: - ManagementAuthConfig

Field Description Default Validation
baseUrl string BaseURL is the base URL of the Management Identity service.
issuerUrl string IssuerURL is the OIDC issuer URL for the validation of tokens.
issuerBackendUrl string IssuerBackendURL is the issuer URL for calls between containers inside
the Kubernetes cluster. When empty, consumers use IssuerURL.
Optional: {}
authUrl string AuthURL is the OIDC authorization endpoint for the login redirects of
the browser.
tokenUrl string TokenURL is the OIDC token endpoint for machine-to-machine tokens.
jwksUrl string JwksURL is the JWKS endpoint that gives the token signing keys.
clientId string ClientID is the ID of the client that Optimize signs in with. MinLength: 1
audience string Audience is the audience that access tokens for this client must have. MinLength: 1
clientSecretRef SecretKeyRef ClientSecretRef names the Secret key that holds the secret of that
client.

ManagementAuthConfigStatus

ManagementAuthConfigStatus is the observed validation state of the contract.

Appears in: - ManagementAuthConfig

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current validation state. The Ready condition
has the reasons Healthy or MissingSecret.
Optional: {}

ManagementAuthMethod

Underlying type: string

ManagementAuthMethod is how a consumer authenticates against the management API of a cluster.

Validation: - Enum: [none basic]

Appears in: - ManagementAuth

Field Description
none
basic

ManagementBinding

ManagementBinding is the published address of the management API of one cluster. Extensions that operate the cluster, such as the backup kinds, read it. They do not derive the Service name, the port, or the authentication themselves. It is empty while the cluster is suspended, because the management API is then not available.

Appears in: - CamundaClusterStatus

Field Description Default Validation
endpoint string Endpoint is the base URL of the management API, for example
http://my-cluster-zeebe.my-namespace.svc:9600.
auth ManagementAuth Auth is how a consumer authenticates against the endpoint.
version string Version is the Camunda version of the cluster, for example 8.9.9. A
consumer selects its endpoint set from the minor version.
partitions integer Partitions is the partition count of the cluster. A restore must match
it, so a backup records it.
backupRepository string BackupRepository is the snapshot repository that the components write
backups to. It is set only on a cluster with Elasticsearch storage and a
backupStorageRef. It comes from the SecondaryStorageConfig.
Optional: {}

ManagementClients

ManagementClients names the identity provider client of each component of the management plane. A CamundaManagementCluster reports InvalidReference when a component that it deploys has no client here.

Appears in: - ManagementOIDCClientsSpec

Field Description Default Validation
identity ConfidentialClientSpec Identity is the client of Management Identity. Optional: {}
optimize ConfidentialClientSpec Optimize is the client of Optimize. The ManagementAuthConfig that the
management cluster writes holds it, and Optimize reads it from there.
Optional: {}
webModeler PublicClientSpec WebModeler is the client of the Web Modeler user interface. The browser
holds no secret, so it is a public client.
Optional: {}
webModelerApi WebModelerAPIClientSpec WebModelerAPI is the client of the Web Modeler API. Optional: {}
console PublicClientSpec Console is the client of Console. The browser holds no secret, so it is
a public client.
Optional: {}

ManagementOIDCClientsSpec

ManagementOIDCClientsSpec holds the identity provider clients of the management plane.

Appears in: - OIDCSpec

Field Description Default Validation
clients ManagementClients Clients holds one entry for each component of the management plane.

ManagementOIDCSpec

ManagementOIDCSpec selects the identity provider of the referenced CamundaPlatformConfig. The clients of the management plane are in that config, under spec.auth.oidc.management.clients, so this block has no fields.

Appears in: - IdentityProviderSpec - ManagementIdentityProvider

MonitoringSpec

MonitoringSpec groups the Prometheus scraping integration of the Elasticsearch cluster.

Appears in: - ElasticsearchClusterSpec

Field Description Default Validation
serviceMonitor ServiceMonitorSpec ServiceMonitor configures the exporter and the Prometheus
ServiceMonitor.
Optional: {}
exporter ExporterSpec Exporter tunes the exporter Deployment. Optional: {}

OIDCProviderType

Underlying type: string

OIDCProviderType names the product behind an OIDC connection. Management Identity reads it and changes how it resolves users and groups.

Appears in: - OIDCSpec

Field Description
generic OIDCProviderGeneric fits any OIDC-compliant provider.
microsoft OIDCProviderMicrosoft selects Microsoft Entra ID.

OIDCSpec

OIDCSpec is the identity provider connection of a platform config. The fields use the terms of OIDC discovery and work with any OIDC-compliant provider.

Appears in: - PlatformAuthSpec

Field Description Default Validation
issuerUrl string IssuerURL is the issuer URL of the identity provider. Consumers get the
endpoints from its OIDC discovery document, unless the endpoint fields
below set them.
providerType OIDCProviderType ProviderType names the kind of identity provider. Management Identity
reads it and changes how it resolves users and groups. Empty means
generic, which fits any OIDC-compliant provider. Set microsoft for
Microsoft Entra ID.
Enum: [generic microsoft]
Optional: {}
jwksUrl string JWKSURL is an explicit JWKS endpoint. It overrides the value from OIDC
discovery.
Optional: {}
tokenUrl string TokenURL is an explicit token endpoint. It overrides the value from OIDC
discovery.
Optional: {}
authUrl string AuthURL is an explicit authorization endpoint. It overrides the value
from OIDC discovery.
Optional: {}
clientId string ClientID is the default OIDC client ID of all clusters. A preset or a
cluster can set another value.
MinLength: 1
audience string Audience is the audience that consumers validate in access tokens.
When empty, consumers use ClientID.
Optional: {}
usernameClaim string UsernameClaim is the token claim that holds the username of a person.
Empty means the default of the orchestration cluster, which is "sub".
Optional: {}
clientIdClaim string ClientIDClaim is the token claim that holds the id of a machine client.
Empty means that no claim identifies a client, and every token is a
person. The tokens of persons must not have this claim, because a
token with it is always a client.
Optional: {}
clientSecretRef SecretKeyRef ClientSecretRef names the Secret key that holds the default OIDC client
secret.
management ManagementOIDCClientsSpec Management holds the clients that the management plane uses at this
identity provider. A CamundaManagementCluster in the oidc mode reads
them. First register one client for each component at the provider.
Optional: {}

ObjectStorageAuthType

Underlying type: string

ObjectStorageAuthType selects how consumers authenticate against a bucket.

Validation: - Enum: [workloadIdentity credentials]

Appears in: - AzureBlobStorageAuth - GCSStorageAuth - S3StorageAuth

Field Description
workloadIdentity
credentials

ObjectStorageConfig

ObjectStorageConfig is the contract CRD that describes a bucket for backups or document storage. It also describes how consumers authenticate against the bucket: with workload identity on the ServiceAccount of the consumer, or with static credentials in a Secret.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string ObjectStorageConfig
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec ObjectStorageConfigSpec spec defines the desired state of ObjectStorageConfig Required: {}
status ObjectStorageConfigStatus status defines the observed state of ObjectStorageConfig Optional: {}

ObjectStorageConfigSpec

ObjectStorageConfigSpec describes a bucket and how consumers authenticate against it. The type field selects exactly one of the s3, gcs, and azureBlob blocks.

Appears in: - ObjectStorageConfig

Field Description Default Validation
type ObjectStorageType Type selects the storage API of the bucket. Enum: [S3 GCS AzureBlob]
s3 S3Storage S3 describes an S3 or S3-compatible bucket. Required when type is S3.
Forbidden with other types.
Optional: {}
gcs GCSStorage GCS describes a Google Cloud Storage bucket. Required when type is
GCS. Forbidden with other types.
Optional: {}
azureBlob AzureBlobStorage AzureBlob describes an Azure Blob Storage container. Required when
type is AzureBlob. Forbidden with other types.
Optional: {}

ObjectStorageConfigStatus

ObjectStorageConfigStatus is the observed validation state of the contract.

Appears in: - ObjectStorageConfig

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current validation state. The Ready
condition has the reasons Healthy and MissingSecret.
Optional: {}

ObjectStorageType

Underlying type: string

ObjectStorageType identifies the storage API of a bucket.

Validation: - Enum: [S3 GCS AzureBlob]

Appears in: - ObjectStorageConfigSpec

Field Description
S3
GCS
AzureBlob

OptimizeMonitoringSpec

OptimizeMonitoringSpec groups the monitoring integrations of a CamundaOptimize.

Appears in: - CamundaOptimizeSpec - OptimizeAttachment

Field Description Default Validation
serviceMonitor ServiceMonitorSpec ServiceMonitor configures the Prometheus ServiceMonitors. When enabled,
the operator creates one ServiceMonitor for each Deployment, with the
name of the workload. It scrapes /actuator/prometheus on the management
port.
Optional: {}

OptimizeSuspension

Underlying type: string

OptimizeSuspension names why the Optimize workloads are at zero with the cluster that they attach to.

Validation: - Enum: [Cluster StorageClaim]

Appears in: - CamundaOptimizeStatus

Field Description
Cluster OptimizeSuspensionCluster means that the referenced cluster is
suspended, by spec.suspend or by a state in which the operator keeps it
at zero.
StorageClaim OptimizeSuspensionStorageClaim means that the referenced cluster does
not hold the storage claim of its backend, or that another writer still
writes to that backend. The writer can be pods of another cluster or of
a previous Optimize instance, or a restore into another cluster.

PITRCapability

PITRCapability declares the point-in-time recovery capability of a server: continuous WAL archiving with the given retention.

Appears in: - DatabaseServerConfigSpec

Field Description Default Validation
enabled boolean Enabled reports whether the server performs continuous WAL archiving. false Optional: {}
retentionPeriodDays integer RetentionPeriodDays is how many days into the past a point-in-time
restore can go. Required when enabled is true.
The maximum is 36500 days, which is a hundred years. A reader counts
the reachable window in nanoseconds, and that count overflows at about
292 years. The maximum stays well below that limit.
Maximum: 36500
Optional: {}
recovery RecoveryMode Recovery says who rolls the server back to a point in time. Defaults to
external. The value operator means that the publisher of this contract
answers spec.recovery. It requires enabled: true. The value external
means that nobody answers, and you roll the server back manually.
external Enum: [operator external]
Optional: {}
lastRecovery RecoveryOutcome LastRecovery is how the last recovery request ended. It is unset until
the first answer. The answer to each later request replaces it.
Optional: {}

PartitionPosition

PartitionPosition is the exporter position of one partition, as the pre-check read it from the restored database.

Appears in: - PointInTimeRestoreStatus

Field Description Default Validation
partitionId integer PartitionID is the Zeebe partition.
lastUpdated Time LastUpdated is the LAST_UPDATED value of the row of the partition in the
EXPORTER_POSITION table.

PersistentVolumeClaimRetentionPolicy

PersistentVolumeClaimRetentionPolicy is like the StatefulSet field of the same name, with only whenDeleted. There is no whenScaled choice. ECK deletes the volume of each Elasticsearch node that it removes in a scale down. The operator always keeps the volume of a broker that it removes in a scale down.

Appears in: - ElasticsearchClusterSpec - ZeebeSpec

Field Description Default Validation
whenDeleted PersistentVolumeClaimRetentionPolicyType WhenDeleted is what happens to the data volumes when the resource is
deleted. Defaults to Delete. Delete removes them with the resource.
Retain keeps them, and a later resource with the same name attaches
them again.
Delete Enum: [Retain Delete]
Optional: {}

PersistentVolumeClaimRetentionPolicyType

Underlying type: string

PersistentVolumeClaimRetentionPolicyType is what happens to the data volumes of a resource (an ElasticsearchCluster, the brokers of a CamundaCluster) when the resource is deleted.

Validation: - Enum: [Retain Delete]

Appears in: - PersistentVolumeClaimRetentionPolicy

Field Description
Retain RetainPersistentVolumeClaimRetentionPolicyType keeps the data volumes.
You remove the data manually. For an ElasticsearchCluster, the ECK
resource has the volume claim delete policy DeleteOnScaledownOnly. For
a CamundaCluster, the broker StatefulSet has whenDeleted Retain.
Delete DeletePersistentVolumeClaimRetentionPolicyType deletes the data volumes
with the resource. For an ElasticsearchCluster, the ECK resource has
the volume claim delete policy DeleteOnScaledownAndClusterDeletion, the
ECK default. For a CamundaCluster, the broker StatefulSet has
whenDeleted Delete.

PinnedStorage

PinnedStorage is the destination of a backup set, recorded when the backup starts. It names the storage contract and the Elasticsearch endpoint that hold the snapshots, and the backup bucket that holds the runtime backup. status.repository records the name of the snapshot repository. Every step checks the destination before it writes, and the operator checks it before it deletes. Thus a destination that moves during the backup does not split the set or send a deletion to the wrong place.

Appears in: - LogicalBackupElasticsearchStatus

Field Description Default Validation
secondaryStorageConfig string SecondaryStorageConfig is the name of the storage contract, in the
namespace of the backup.
endpoint string Endpoint is the Elasticsearch endpoint that the contract named.
bucketRef string BucketRef is the ObjectStorageConfig that the cluster used for backups
when the backup started: its spec.backupStorageRef at that time. The
runtime backup goes to that bucket.
bucketLocation string BucketLocation is where that contract pointed: the storage type, the
bucket, the base path, and the endpoint. The steps write, and the
operator deletes, only while the contract still points there.

PlatformAuthSpec

PlatformAuthSpec selects the authentication method of every orchestration cluster that references the platform config.

Appears in: - CamundaPlatformConfigSpec

Field Description Default Validation
method AuthenticationMethod Method is the authentication method. An unset auth block and an unset
method both mean basic.
basic Enum: [basic oidc]
Optional: {}
oidc OIDCSpec OIDC is the identity provider connection. Required when method is
oidc. Forbidden with other methods.
Optional: {}

PodMonitorSpec

PodMonitorSpec configures the Prometheus PodMonitor of a resource whose pods serve their own metrics endpoint. A DatabaseServer scrapes the metrics port of every CloudNativePG instance. The PodMonitor is created only when the Kubernetes cluster serves the kind.

Appears in: - DatabaseServerMonitoringSpec

Field Description Default Validation
enabled boolean Enabled creates the PodMonitor when true. Defaults to false. Optional: {}
labels object (keys:string, values:string) Labels are extra labels applied to the PodMonitor. Optional: {}
annotations object (keys:string, values:string) Annotations are extra annotations applied to the PodMonitor. Optional: {}
interval string Interval is how often Prometheus scrapes the pods, as a Prometheus
duration such as 30s. Empty leaves the interval to the Prometheus
configuration.
Pattern: ^(0\|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$
Optional: {}

PointInTimeRestore

PointInTimeRestore brings the primary storage of a suspended CamundaCluster with relational secondary storage to the same point in time as its database. It reads the exporter position of every partition from that database. Then it deletes and creates the broker data volumes again. Then it runs the Camunda restore application with the requested point, one time for each broker.

The database reaches that point in one of two ways. A DatabaseServerConfig that declares pitr.recovery: operator is rolled back by its publisher. The restore writes the request on the contract and waits for the answer. A contract that declares external, the default, is rolled back before you create the restore. The restore reads the database as it is.

The restore prepares the cluster itself. It suspends the cluster and waits for its brokers to stop. When it completes, it removes the suspension, but only a suspension that it applied itself. A failed restore leaves the cluster suspended. A restore that somebody deletes while it runs also leaves the cluster suspended. Empty or half-written broker volumes cause more damage under running brokers.

It writes no version. This kind restores the primary storage of the cluster from the continuous backups of the same cluster. Thus no backup names a version other than the version that the cluster runs.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string PointInTimeRestore
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec PointInTimeRestoreSpec spec names the cluster to restore and the point that its database
holds. It is immutable. A restore runs one time. To try again, create
a new resource.
Required: {}
status PointInTimeRestoreStatus status defines the observed state of the restore Optional: {}

PointInTimeRestorePhase

Underlying type: string

PointInTimeRestorePhase is the phase of a restore that runs one time. Completed and Failed are final. To try again, create a new resource.

Validation: - Enum: [Pending RestoringDatabase ValidatingDatabaseState RestoringPrimaryStorage Completed Failed]

Appears in: - PointInTimeRestoreStatus

Field Description
Pending PointInTimeRestorePending means that the restore did not start its
work. A pre-check stops it: the cluster runs, the storage chain does
not resolve, or the database is ahead of spec.timestamp.
RestoringDatabase PointInTimeRestoreRestoringDatabase means that the operator asked the
database server to roll back to spec.timestamp and waits for the
answer. The restore has this phase only when the DatabaseServerConfig
declares pitr.recovery: operator. A server that declares external rolls
back before you create the restore. The restore then goes directly to
ValidatingDatabaseState.
ValidatingDatabaseState PointInTimeRestoreValidatingDatabaseState means that the operator reads
the exporter position of every partition from the restored database.
This happens before the operator changes a volume.
RestoringPrimaryStorage PointInTimeRestoreRestoringPrimaryStorage means that the operator
created the broker data volumes again and runs the restore application
on them.
Completed PointInTimeRestoreCompleted means that the restore finished. The
operator removes the Jobs of the brokers, so their pods release the
broker data volumes. It removes the suspension that it applied, so the
cluster runs again, unless its owner suspended it.
Failed PointInTimeRestoreFailed means that the restore failed. The Ready
condition names the failed phase. The operator keeps the Jobs of the
brokers, because their logs show the cause. Thus a restore that reached
RestoringPrimaryStorage holds the broker data volumes until you delete
it. A restore that failed in an earlier phase records no Job in
PrimaryJobNames and holds nothing.

PointInTimeRestoreSpec

PointInTimeRestoreSpec names the cluster to roll back and the point in time to roll it back to. The whole spec is immutable.

Appears in: - PointInTimeRestore

Field Description Default Validation
clusterRef ClusterRef ClusterRef references the CamundaCluster to restore, in the namespace
of this restore. Its secondary storage must be a relational database.
Required: {}
timestamp Time Timestamp is the point to restore to.
DatabaseServerConfig.spec.pitr.recovery sets who rolls the database
server back to it. With operator, the restore asks the server to roll
back to this point. With external, you roll the server back to it
before you create the restore.
Choose a point at least one backup interval before the cluster stopped
writing. Also choose a point inside the window in which Zeebe keeps its
primary-storage backups. The CamundaCluster sets these with
spec.backup.primaryStorage.schedule and retention.window. The defaults
are one hour and seven days. If no backup covers the point, the restore
fails after it erased the broker volumes.
The point must be inside the retention period of the database server,
and it must not be in the future. The operator does these two checks.
Required: {}

PointInTimeRestoreStatus

PointInTimeRestoreStatus tracks the restore to a terminal phase.

Appears in: - PointInTimeRestore

Field Description Default Validation
phase PointInTimeRestorePhase Phase is the phase of the restore. The restore continues from it after
an interruption.
Enum: [Pending RestoringDatabase ValidatingDatabaseState RestoringPrimaryStorage Completed Failed]
Optional: {}
storage PointInTimeRestoreStorage Storage records the storage chain that the restore validated. The
operator records it before it reads the database, and again after a
rollback that the restore asked for. If a later read does not agree,
the restore fails.
Optional: {}
backend string Backend names the database that the restore holds while its server
rolls back: the host, the port, and the database name. The operator
records it just before it asks for the rollback. It follows each
endpoint that the contract names. From then until the final phase, no
other CamundaCluster starts on this database, also when the contract
names another endpoint. A restore whose server
rolls back outside the operator records no backend.
Optional: {}
observedPositions PartitionPosition array ObservedPositions are the exporter positions that the pre-check read,
in partition order. They show what the operator saw when the restore
passed the database-state check, or what stopped it.
Optional: {}
targetClusterUID UID TargetClusterUID records the identity of the target cluster. A cluster
that is deleted and created again with the same name is another
cluster, and this restore does not apply to it.
Optional: {}
brokers integer Brokers is the broker count of the broker StatefulSet. The operator
records it before the restore deletes a volume. It sets how many
volumes the restore creates again and how many Jobs run.
Optional: {}
primaryJobNames string array PrimaryJobNames are the restore application Jobs, one for each broker,
in broker order. The operator records them before it creates the Jobs.
A completed restore removes these Jobs. The logs of these Jobs explain
a failed restore.
Optional: {}
recreatedClaims string array RecreatedClaims names the broker data claims that the restore deleted
and created again. Thus the restore does not delete a claim two times.
Optional: {}
firstFailedAt Time FirstFailedAt is when a dependency of the running restore first stopped
resolving. The grace period starts at this time. The field can clear if
the dependency recovers before the restore deletes target indices or
records a recreated broker volume or a broker Job. After that point, the
field stays set, so a dependency that fails and recovers again and
again does not reset the grace period.
Optional: {}
clusterSuspended boolean ClusterSuspended records that this restore suspended its target
cluster. The restore removes that suspension when it reaches
Completed. A cluster that its owner suspended has no such record, so
it stays suspended. The cluster of a failed restore also stays
suspended.
Optional: {}
terminalReason string TerminalReason is the Ready reason that the operator recorded when the
restore reached its final phase.
Optional: {}
failureMessage string FailureMessage names the failed phase and its error. The Ready
condition has the same message.
Optional: {}
completionTime Time CompletionTime is when the restore reached a final phase. Optional: {}
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current state of the restore. Optional: {}

PointInTimeRestoreStorage

PointInTimeRestoreStorage is the identity of the storage chain that the restore validated. It holds the contracts that the restore resolved, the logical database that it read, and the server of that database. Each part of the chain can change. The restore checks the server and the database before it deletes anything. If a later read does not agree with this record, it is another database, and the restore fails. A rollback that the restore asked for replaces the record.

Appears in: - PointInTimeRestoreStatus

Field Description Default Validation
secondaryStorageConfig string SecondaryStorageConfig is the storage contract of the cluster.
secondaryStorageConfigUID UID SecondaryStorageConfigUID records the identity of that contract. Thus
the restore finds a contract that was deleted and created again with
the same name.
Optional: {}
databaseConfig string DatabaseConfig is the contract of the logical database.
databaseConfigUID UID DatabaseConfigUID records the identity of that contract. Optional: {}
databaseServerConfig string DatabaseServerConfig is the contract of the server that holds the
database and declares its point-in-time recovery.
databaseServerConfigUID UID DatabaseServerConfigUID records the identity of that contract. Optional: {}
databaseName string DatabaseName is the logical database whose exporter position the
pre-check read.
endpoint string Endpoint is the host and port of the server, as the pre-check used it.
A contract that now names another endpoint names another server.
systemIdentifier string SystemIdentifier is the identity of the PostgreSQL instance behind that
endpoint, as the contract published it. The rule for a dedicated server
counted this identity. An endpoint that later reports another identity
is another instance.

PrimaryStorageBackupSpec

PrimaryStorageBackupSpec configures the backup scheduler of Zeebe. On a relational cluster, Camunda takes these backups itself, without a call from the operator. They pair with the database dump. A restore reads the exporter position from the restored database and selects the primary-storage backups that match it.

Appears in: - ClusterBackupSpec

Field Description Default Validation
continuous boolean Continuous keeps every log segment until it is backed up, so that a
restore finds a range without gaps. Defaults to true on a relational
cluster with a backupStorageRef. A preset can turn it on for many
clusters, and one cluster can still turn it off.
Optional: {}
schedule string Schedule is the interval at which Zeebe takes a primary-storage
backup: an ISO 8601 duration, a CRON expression, or "none". Defaults
to PT1H. Always use a schedule with continuous. Otherwise the log grows
without limit.
MinLength: 1
Optional: {}
checkpointInterval string CheckpointInterval is the interval at which Zeebe writes marker
checkpoints into the log stream, as an ISO 8601 duration of days and
time (P2DT3H, PT15M). Camunda parses no week, month, or year units.
It is the granularity of a point-in-time restore. Defaults to PT15M.
Pattern: ^P([0-9]+D(T(([0-9]+H)([0-9]+M)?([0-9]+([.][0-9]+)?S)?\|([0-9]+M)([0-9]+([.][0-9]+)?S)?\|[0-9]+([.][0-9]+)?S))?\|T(([0-9]+H)([0-9]+M)?([0-9]+([.][0-9]+)?S)?\|([0-9]+M)([0-9]+([.][0-9]+)?S)?\|[0-9]+([.][0-9]+)?S))$
Optional: {}
retention PrimaryStorageRetentionSpec Retention bounds how long Zeebe keeps its primary-storage backups. Optional: {}

PrimaryStorageRetentionSpec

PrimaryStorageRetentionSpec bounds the primary-storage backups that Zeebe keeps. Zeebe always keeps at least one backup, even outside the window.

Appears in: - PrimaryStorageBackupSpec

Field Description Default Validation
window string Window is how far back the backups stay available for a restore, as an
ISO 8601 duration of days and time (P7D, PT12H). Camunda parses no
week, month, or year units. Defaults to P7D. It limits the restore
window, so set it at least as long as the recovery point that the
cluster needs. A BackupSchedule can keep database dumps for longer than
this window. A restore of such an old dump is not possible.
Pattern: ^P([0-9]+D(T(([0-9]+H)([0-9]+M)?([0-9]+([.][0-9]+)?S)?\|([0-9]+M)([0-9]+([.][0-9]+)?S)?\|[0-9]+([.][0-9]+)?S))?\|T(([0-9]+H)([0-9]+M)?([0-9]+([.][0-9]+)?S)?\|([0-9]+M)([0-9]+([.][0-9]+)?S)?\|[0-9]+([.][0-9]+)?S))$
Optional: {}
cleanupSchedule string CleanupSchedule is the interval at which Zeebe looks for backups
outside the window: an ISO 8601 duration, a CRON expression, or
"none". Defaults to PT1H.
MinLength: 1
Optional: {}

PublicClientSpec

PublicClientSpec is an identity provider client that a browser uses, so it has no secret.

Appears in: - ManagementClients

Field Description Default Validation
clientId string ClientID is the client id at the identity provider. MinLength: 1
audience string Audience is the audience that the component validates in access tokens.
Empty means the client id.
Optional: {}

RDBMSStorage

RDBMSStorage holds relational database backend details.

Appears in: - SecondaryStorageConfigSpec

Field Description Default Validation
databaseConfigRef string DatabaseConfigRef names the DatabaseConfig of the logical database to
use, in the namespace of this contract.
MinLength: 1

RecoveryArchiveIdentity

RecoveryArchiveIdentity is the workload identity of a bucket: what the pods of a consumer use to read the objects in it. A bucket with static credentials has none.

Appears in: - RecoveryArchiveRef

Field Description Default Validation
annotations object (keys:string, values:string) Annotations are the annotations of the ServiceAccount of the pods. Optional: {}
podLabels object (keys:string, values:string) PodLabels are the labels that the pods need. Only Azure needs one. Optional: {}

RecoveryArchiveRef

RecoveryArchiveRef names the archive that a recovery reads: the directory in the bucket, the location of that bucket, and the bucket contract that names it. It also holds the archive settings of the server at that moment. Until the rollback has an answer, the operator keeps the archive as it was. It does not apply an edit of spec.archive in that time: a moved bucket, a changed retention or schedule, or a removal.

Appears in: - DatabaseServerRecoveryStatus

Field Description Default Validation
serverName string ServerName is the archive directory, equal to the name of the
CloudNativePG cluster that wrote it.
objectStorageRef string ObjectStorageRef is the ObjectStorageConfig, in the namespace of this
server, that the archive lives in.
location string Location is where in object storage the archive is, in the form of
ArchiveRecord.Location. A running recovery reads the location that it
recorded, so an edit of the ObjectStorageConfig does not move it.
Optional: {}
retentionPeriodDays integer RetentionPeriodDays is spec.archive.retentionPeriodDays as it stood
when the rollback started.
Optional: {}
baseBackupSchedule string BaseBackupSchedule is spec.archive.baseBackupSchedule as it stood when
the rollback started.
Optional: {}
identity RecoveryArchiveIdentity Identity is the workload identity of that bucket when the rollback
started. The pods keep this identity while they read the bucket. It is
unset for a bucket with static credentials, and for a bucket that
names no identity.
Optional: {}

RecoveryMode

Underlying type: string

RecoveryMode says who rolls the server back to a point in time.

Validation: - Enum: [operator external]

Appears in: - PITRCapability

Field Description
operator RecoveryModeOperator means that the publisher of this contract rolls
the server back when spec.recovery asks for it.
external RecoveryModeExternal means that nobody answers spec.recovery. You roll
the server back manually, before the restore starts.

RecoveryOutcome

RecoveryOutcome is how a recovery request ended. It repeats the request that it answers. Thus a consumer knows whether it is the answer to its own request.

Appears in: - PITRCapability

Field Description Default Validation
requestID string RequestID is the requestID of the request that this outcome answers. Pattern: ^[0-9a-f]\{8\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{12\}$
requestedBy string RequestedBy is the requestedBy of the request that this outcome
answers.
MaxLength: 507
Pattern: ^[a-z0-9]([-a-z0-9.]*[a-z0-9])?/[a-z0-9]([-a-z0-9.]*[a-z0-9])?$
targetTime string TargetTime is the targetTime of the request that this outcome answers,
in the same form as in the request. Thus a consumer can compare the
two as text.
Format: date-time
Pattern: ^\d\{4\}-\d\{2\}-\d\{2\}T\d\{2\}:\d\{2\}:\d\{2\}(\.\d+)?(Z\|[+-]\d\{2\}:\d\{2\})$
completedAt Time CompletedAt is when the request ended.
result RecoveryResult Result is how the request ended. See RecoveryResult for the values. Enum: [Completed Failed Unavailable]
message string Message says what happened. It is empty for a result of Completed. Optional: {}

RecoveryRequest

RecoveryRequest asks the publisher of this contract to roll the server back to a point in time. A consumer writes it with its own field manager. The publisher of the contract never writes this field, so the two writers never conflict.

Appears in: - DatabaseServerConfigSpec

Field Description Default Validation
requestID string RequestID identifies this request, and only this one. A controller sets
the uid of the resource that asks. A manual request can use any UUID.
Two requests can name the same resource and the same point. The
RequestID tells them apart. A resource that is deleted and created
again with the same name is another requester. The answer to the first
request says nothing about the state that the second requester asks
for.
Pattern: ^[0-9a-f]\{8\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{12\}$
requestedBy string RequestedBy is the namespace and the name of the resource that asks, as
"<namespace>/<name>". It comes back in pitr.lastRecovery. Thus the
requester can find its own answer.
MaxLength: 507
Pattern: ^[a-z0-9]([-a-z0-9.]*[a-z0-9])?/[a-z0-9]([-a-z0-9.]*[a-z0-9])?$
targetTime string TargetTime is the point to roll back to, as RFC 3339 with a zone, for
example 2026-08-20T14:30:00Z. The API server refuses a timestamp
without a zone. PostgreSQL reads such a timestamp as the local time of
the server, which can be a different point from the one that the
writer intended.
Format: date-time
Pattern: ^\d\{4\}-\d\{2\}-\d\{2\}T\d\{2\}:\d\{2\}:\d\{2\}(\.\d+)?(Z\|[+-]\d\{2\}:\d\{2\})$

RecoveryResult

Underlying type: string

RecoveryResult is how a recovery request ended.

Validation: - Enum: [Completed Failed Unavailable]

Appears in: - DatabaseServerRecoveryStatus - RecoveryOutcome

Field Description
Completed RecoveryResultCompleted means that the server now holds the state of
the requested point.
Failed RecoveryResultFailed means that the recovery started and did not
finish.
Unavailable RecoveryResultUnavailable means that the server holds no copy of the
requested point, so it attempted no recovery.

ReleaseConnectorsSpec

ReleaseConnectorsSpec is the connectors runtime of a release.

Appears in: - CamundaReleaseSpec

Field Description Default Validation
version string Version is the version of the connectors bundle image, as a full
semantic version. Use the same minor as the Camunda version of the
release. The patch does not follow the Camunda patch. A cluster that
runs connectors needs it from the release or from its own spec.
Pattern: ^\d+\.\d+\.\d+$
Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. An entry here wins over a top-level entry of the release with
the same name.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}

ReleaseDatabaseServerSpec

ReleaseDatabaseServerSpec is the PostgreSQL server of a release.

Appears in: - CamundaReleaseSpec

Field Description Default Validation
version string Version is the PostgreSQL major version of the servers of this release,
as a number such as "17". A server that references the release refuses
an effective version below 14. Its own spec.version wins over this
value. A server that already runs another major version refuses the
change and keeps its major version.
Pattern: ^\d+$
Optional: {}

ReleaseElasticsearchSpec

ReleaseElasticsearchSpec is the Elasticsearch of a release.

Appears in: - CamundaReleaseSpec

Field Description Default Validation
version string Version is the Elasticsearch version of the clusters of this release,
as a full semantic version. Elasticsearch has its own patch line, so it
does not follow the Camunda version. A cluster that references the
release refuses an effective version below 8.19 in the 8 line or below
9.2 in the 9 line. Its own spec.version wins over this value.
Pattern: ^\d+\.\d+\.\d+$
Optional: {}

ReleaseEnvSpec

ReleaseEnvSpec is the environment of one component that a release adds.

Appears in: - CamundaReleaseSpec - ReleaseConnectorsSpec

Field Description Default Validation
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. An entry here wins over a top-level entry of the release with
the same name.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}

ReleaseImagesSpec

ReleaseImagesSpec holds the image references that a release pins. Each value is a complete reference, with its tag or digest.

Appears in: - CamundaReleaseSpec

Field Description Default Validation
camunda string Camunda is the image of every orchestration cluster process. Unset
means the camunda image of the platform config at the version of the
release.
MinLength: 1
Optional: {}
connectors string Connectors is the image of the connectors runtime. Unset means the
connectors image of the platform config at connectors.version.
MinLength: 1
Optional: {}

RestoreProgress

RestoreProgress is the part of a restore status that every restore kind has. Each restore status embeds it inline, so its fields appear directly in the status.

Appears in: - LogicalRestoreElasticsearchStatus - LogicalRestoreRDBMSStatus - PointInTimeRestoreStatus

Field Description Default Validation
targetClusterUID UID TargetClusterUID records the identity of the target cluster. A cluster
that is deleted and created again with the same name is another
cluster, and this restore does not apply to it.
Optional: {}
brokers integer Brokers is the broker count of the broker StatefulSet. The operator
records it before the restore deletes a volume. It sets how many
volumes the restore creates again and how many Jobs run.
Optional: {}
primaryJobNames string array PrimaryJobNames are the restore application Jobs, one for each broker,
in broker order. The operator records them before it creates the Jobs.
A completed restore removes these Jobs. The logs of these Jobs explain
a failed restore.
Optional: {}
recreatedClaims string array RecreatedClaims names the broker data claims that the restore deleted
and created again. Thus the restore does not delete a claim two times.
Optional: {}
firstFailedAt Time FirstFailedAt is when a dependency of the running restore first stopped
resolving. The grace period starts at this time. The field can clear if
the dependency recovers before the restore deletes target indices or
records a recreated broker volume or a broker Job. After that point, the
field stays set, so a dependency that fails and recovers again and
again does not reset the grace period.
Optional: {}
clusterSuspended boolean ClusterSuspended records that this restore suspended its target
cluster. The restore removes that suspension when it reaches
Completed. A cluster that its owner suspended has no such record, so
it stays suspended. The cluster of a failed restore also stays
suspended.
Optional: {}
terminalReason string TerminalReason is the Ready reason that the operator recorded when the
restore reached its final phase.
Optional: {}
failureMessage string FailureMessage names the failed phase and its error. The Ready
condition has the same message.
Optional: {}
completionTime Time CompletionTime is when the restore reached a final phase. Optional: {}
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current state of the restore. Optional: {}

RetainedBackups

RetainedBackups limits the backups that a schedule keeps, for each final phase. When the count of a phase is more than its limit, the operator deletes the oldest backups of that phase. The deletion also tries to remove their stored backup data.

Appears in: - BackupScheduleAttachment - BackupScheduleSpec

Field Description Default Validation
completed integer Completed is how many completed backups the schedule keeps. 7 Minimum: 1
Optional: {}
failed integer Failed is how many failed backups the schedule keeps. With zero, the
operator deletes a failed backup soon after it fails.
3 Minimum: 0
Optional: {}

S3Credentials

S3Credentials holds the static keys of an S3 bucket.

Appears in: - S3StorageAuth

Field Description Default Validation
secretRef S3CredentialsSecretRef SecretRef names the Secret keys that hold the access-key pair.

S3CredentialsSecretRef

S3CredentialsSecretRef references an access-key pair in a Secret in the namespace of the contract.

Appears in: - S3Credentials

Field Description Default Validation
name string Name is the name of the Secret that holds the keys. MinLength: 1
accessKeyIdKey string AccessKeyIDKey is the key in the Secret that holds the access key ID. MinLength: 1
secretAccessKeyKey string SecretAccessKeyKey is the key in the Secret that holds the secret
access key.
MinLength: 1

S3Storage

S3Storage describes an S3 or S3-compatible bucket.

Appears in: - ObjectStorageConfigSpec

Field Description Default Validation
bucketName string BucketName is the name of the bucket, as storage client SDKs use it. MinLength: 1
basePath string BasePath is the key prefix under which consumers write objects,
without leading or trailing slashes. Empty means the bucket root.
Pattern: ^[^/]+(/[^/]+)*$
Optional: {}
region string Region is the region of the bucket. Required unless endpoint is set. Optional: {}
endpoint string Endpoint is the URL of an S3-compatible store (MinIO, Ceph, and more).
Empty means AWS S3, addressed through region.
Optional: {}
forcePathStyle boolean ForcePathStyle forces path-style bucket addressing. Set it for
S3-compatible stores that do not serve virtual-hosted-style requests.
Optional: {}
auth S3StorageAuth Auth selects how consumers authenticate. An absent block means
workload identity through the ServiceAccount.
{ type:workloadIdentity } Optional: {}

S3StorageAuth

S3StorageAuth selects how consumers authenticate against an S3 bucket.

Appears in: - S3Storage

Field Description Default Validation
type ObjectStorageAuthType Type is the authentication choice. Defaults to workloadIdentity. workloadIdentity Enum: [workloadIdentity credentials]
Optional: {}
workloadIdentity S3WorkloadIdentity WorkloadIdentity names the trusted principal. It is valid only with
type workloadIdentity. With an empty or absent block, the operator adds
no annotation. The identity must then be bound on the cloud side, for
example with EKS Pod Identity.
Optional: {}
credentials S3Credentials Credentials are static keys. Required with type credentials. Forbidden
with other types.
Optional: {}

S3WorkloadIdentity

S3WorkloadIdentity names the AWS principal that the bucket trusts. With an empty block, the operator adds no annotation to the ServiceAccount of the consumer. The identity must then be bound on the cloud side, for example with EKS Pod Identity.

Appears in: - S3StorageAuth

Field Description Default Validation
roleArn string RoleARN is the IAM role that consumers assume. When set, the operator
puts it in the eks.amazonaws.com/role-arn annotation of a ServiceAccount
that it creates for the consumer (IRSA). On an existing ServiceAccount,
add the annotation yourself.
Optional: {}

SchedulingSpec

SchedulingSpec holds the scheduling constraints of the pods of a resource. When a resource sets its own block, it replaces the complete scheduling block of its preset. The two blocks never merge field by field.

Appears in: - BackupDumpSpec - CamundaClusterSpec - ConnectorsSpec - ConsoleOverrides - ConsoleSpec - DatabaseServerSpec - DumpPodSpec - ElasticsearchClusterSpec - GatewaySpec - IdentityOverrides - IdentitySpec - KeycloakOverrides - ManagedKeycloakSpec - WebAppSpec - WorkloadSpec - ZeebeSpec

Field Description Default Validation
nodeAffinity NodeAffinity NodeAffinity rules for the pods. Optional: {}
podAffinity PodAffinity PodAffinity rules for the pods. Optional: {}
tolerations Toleration array Tolerations for the pods. Optional: {}

ScratchVolumeSpec

ScratchVolumeSpec sizes the volume that holds a database dump until the upload. An unset block is an emptyDir with the limits of the node. A large database can fill it.

Appears in: - BackupDumpSpec - DumpPodSpec

Field Description Default Validation
sizeLimit Quantity SizeLimit is the size of the emptyDir that holds the dump. Set it to
the size the dump needs, with room to spare.
Optional: {}
storageClassName string StorageClassName makes the scratch volume a PersistentVolumeClaim of
this class, not an emptyDir. Use it when the dump is larger than the
ephemeral storage of a node.
Optional: {}

SecondaryStorageConfig

SecondaryStorageConfig is the namespaced contract CRD that tells an orchestration cluster where its secondary storage is and how to authenticate against it. The storage is an Elasticsearch cluster or a relational database. Consumers find it by name in their own namespace.

Field Description Default Validation
apiVersion string core.camunda.io/v1
kind string SecondaryStorageConfig
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec SecondaryStorageConfigSpec spec defines the desired state of SecondaryStorageConfig Required: {}
status SecondaryStorageConfigStatus status defines the observed state of SecondaryStorageConfig Optional: {}

SecondaryStorageConfigSpec

SecondaryStorageConfigSpec tells an orchestration cluster where its secondary storage is and how to authenticate against it.

Appears in: - SecondaryStorageConfig

Field Description Default Validation
type SecondaryStorageType Type selects the secondary storage backend that this contract
describes.
Enum: [elasticsearch rdbms]
elasticsearch ElasticsearchStorage Elasticsearch holds the Elasticsearch connection details. Required
when type is elasticsearch. Forbidden with other types.
Optional: {}
rdbms RDBMSStorage RDBMS holds the relational database details. Required when type is
rdbms. Forbidden with other types.
Optional: {}

SecondaryStorageConfigStatus

SecondaryStorageConfigStatus is the observed validation state of the contract.

Appears in: - SecondaryStorageConfig

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the operator processed. Optional: {}
conditions Condition array Conditions represent the current validation state. The Ready condition
has the reasons Healthy, MissingSecret, or InvalidReference.
Optional: {}

SecondaryStorageType

Underlying type: string

SecondaryStorageType identifies the secondary storage backend that a contract describes.

Validation: - Enum: [elasticsearch rdbms]

Appears in: - SecondaryStorageConfigSpec

Field Description
elasticsearch SecondaryStorageTypeElasticsearch selects an Elasticsearch backend.
rdbms SecondaryStorageTypeRDBMS selects a relational database backend.

SecretKeyRef

SecretKeyRef references one value in a Secret in a named namespace. A cluster-scoped kind uses it, because it has no namespace of its own. A namespaced kind uses LocalSecretKeyRef.

Appears in: - CamundaPlatformConfigSpec - ConfidentialClientSpec - ManagementAuthConfigSpec - OIDCSpec - WebModelerAPIClientSpec

Field Description Default Validation
name string Name is the name of the Secret that holds the value. MinLength: 1
namespace string Namespace is the namespace of the Secret. MinLength: 1
key string Key is the key in the Secret that holds the value. MinLength: 1

SecureSettingEntry

SecureSettingEntry projects one key of a Secret to a named entry of the Elasticsearch keystore.

Appears in: - SecureSettingsSource

Field Description Default Validation
key string Key in the Secret. MinLength: 1
path string Path is the keystore entry that the key becomes, for example
s3.client.default.access_key.
MinLength: 1

SecureSettingsSource

SecureSettingsSource references a Secret that ECK loads into the keystore of every Elasticsearch node. Elasticsearch reads credentials only from the keystore, never from the settings of a snapshot repository.

Appears in: - ElasticsearchClusterSpec

Field Description Default Validation
secretName string SecretName is the Secret, in the namespace of the ElasticsearchCluster. MinLength: 1
entries SecureSettingEntry array Entries maps single keys to keystore entries. An empty list loads
every key of the Secret under its own name.
Optional: {}

ServiceAccountSpec

ServiceAccountSpec configures the ServiceAccount of the pods of a resource.

Appears in: - CamundaClusterSpec - CamundaManagementClusterSpec - ConnectorsSpec - ConsoleSpec - ElasticsearchClusterSpec - IdentitySpec - ManagedKeycloakSpec - WebModelerSpec

Field Description Default Validation
name string Name is the name of the ServiceAccount. When empty, the operator
derives the name from the name of the resource, as the doc of each kind
states. The cloud provider uses this name. A workload identity that
needs no annotation, such as EKS Pod Identity, binds the principal
system:serviceaccount:<namespace>:<name>.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
create boolean Create makes the operator create and own the ServiceAccount. Defaults
to true. False names a ServiceAccount that already exists. The operator
then does not create, annotate, or own it. If it does not exist, Ready
reports InvalidReference. Ready does not report it on a suspended
ElasticsearchCluster or for connectors that are not enabled. It also
does not report it for a component of a CamundaManagementCluster that
does not run.
While create is false, the operator never takes ownership of the
ServiceAccount, because it deletes an owned one with the resource. A
switch to false removes the owner reference from the account that the
operator created. The account then stays when the resource is deleted.
With create true, the operator owns and annotates the account of that
name, also one that it did not create. An account that another
resource controls is not taken over, and the apply fails.
Optional: {}
annotations object (keys:string, values:string) Annotations to set on the ServiceAccount that the operator creates.
Usually these are workload-identity annotations (IRSA, GCP Workload
Identity, and more) that give the pods access to cloud resources, such
as the snapshot bucket for backups. Except on connectors.serviceAccount
of a CamundaCluster, the operator also adds the identity annotation of
each referenced bucket that names an identity. An annotation set here
wins over it. With create false, the operator sets no annotation. Add them
to the existing ServiceAccount yourself.
Optional: {}

ServiceMonitorSpec

ServiceMonitorSpec configures the Prometheus ServiceMonitors of a resource that runs workloads. The kind of the resource sets what Prometheus scrapes. Elasticsearch serves no Prometheus endpoint, so an ElasticsearchCluster deploys the prometheus-community elasticsearch_exporter and scrapes it. A CamundaCluster scrapes /actuator/prometheus of every process. The operator creates the ServiceMonitor only when the Kubernetes cluster serves the kind.

Appears in: - ClusterMonitoringSpec - MonitoringSpec - OptimizeMonitoringSpec

Field Description Default Validation
enabled boolean Enabled creates the ServiceMonitors (and, for an ElasticsearchCluster,
the exporter) when true. Defaults to false.
Optional: {}
labels object (keys:string, values:string) Labels are extra labels applied to the ServiceMonitor. Optional: {}
annotations object (keys:string, values:string) Annotations are extra annotations applied to the ServiceMonitor. Optional: {}

VolumeStatus

VolumeStatus is the observed size of one data PersistentVolumeClaim of a cluster. A status lists one entry for each bound claim, sorted by name. Thus it also shows a resize of one claim outside the spec, for example by an auto-resize controller.

Appears in: - CamundaClusterStatus - DatabaseServerStatus - ElasticsearchClusterStatus

Field Description Default Validation
name string Name is the name of the PersistentVolumeClaim.
capacity Quantity Capacity is the storage capacity that the bound claim reports.

WebAppSpec

WebAppSpec configures one of the web applications Operate, Tasklist, and Admin.

Appears in: - CamundaClusterSpec

Field Description Default Validation
mode ComponentMode Mode selects a Deployment of the unified binary that serves only this
application (Standalone) or the nearest standalone host up the chain
(Embedded). Defaults to Embedded. The workload fields have an effect
only in Standalone mode. The exception is extraEnv and extraEnvFrom: in
Embedded mode, they apply to the host process.
Enum: [Standalone Embedded]
Optional: {}
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}

WebModelerAPIClientSpec

WebModelerAPIClientSpec is the client of the Web Modeler API. Web Modeler validates two audiences: one for the API that its own user interface calls, and one for the public API that your applications call.

Appears in: - ManagementClients

Field Description Default Validation
clientId string ClientID is the client id at the identity provider. MinLength: 1
audience string Audience is the audience that the component validates in access tokens.
Empty means the client id.
Optional: {}
clientSecretRef SecretKeyRef ClientSecretRef names the Secret key that holds the client secret.
publicApiAudience string PublicAPIAudience is the audience of the Web Modeler public API. Empty
means web-modeler-public-api.
Optional: {}

WebModelerMailSpec

WebModelerMailSpec configures the SMTP server of Web Modeler.

Appears in: - WebModelerOverrides - WebModelerSpec

Field Description Default Validation
smtpHost string SMTPHost is the host name of the SMTP server. MinLength: 1
smtpPort integer SMTPPort is the port of the SMTP server. Defaults to 587. 587 Maximum: 65535
Minimum: 1
Optional: {}
fromAddress string FromAddress is the address that Web Modeler sends from. MinLength: 3
fromName string FromName is the display name of the sender of Web Modeler mail. Optional: {}
tls boolean TLS turns STARTTLS on. Defaults to true. Optional: {}
credentialsSecretRef LocalCredentialsSecretRef CredentialsSecretRef names the Secret with the user and the password of
the SMTP server. Leave it unset for a server that needs no credentials.
Optional: {}

WebModelerSpec

WebModelerSpec configures Web Modeler. Web Modeler runs as two workloads: the restapi process and the websockets process.

Appears in: - CamundaManagementClusterSpec

Field Description Default Validation
version string Version is the Web Modeler version, as a full semantic version. The
operator supports 8.9.0 and later.
Pattern: ^\d+\.\d+\.\d+$
externalUrl string ExternalURL is the URL where browsers reach Web Modeler.
websocketsExternalUrl string WebsocketsExternalURL is the URL where browsers reach the websockets
process. Web Modeler sends live updates through it.
databaseConfigRef string DatabaseConfigRef names the DatabaseConfig of the Web Modeler database,
in the namespace of this resource. Web Modeler needs its own PostgreSQL
database.
MinLength: 1
mail WebModelerMailSpec Mail configures the SMTP server that Web Modeler sends notifications
through. Web Modeler does not start without it.
serviceAccount ServiceAccountSpec ServiceAccount gives the Web Modeler pods a ServiceAccount of their own.
When unset, they run under spec.serviceAccount. When set, they run
under <name>-web-modeler, or under name, and they do not get the access that a
plugin grants to the account of spec.serviceAccount. The name default
needs create false.
Optional: {}
restapi WorkloadSpec Restapi configures the workload of the restapi process. Optional: {}
websockets WorkloadSpec Websockets configures the workload of the websockets process. Optional: {}

WorkloadSpec

WorkloadSpec holds the settings of one process: the size, the environment, the pod metadata, and the scheduling. Every component block of a CamundaCluster uses it, and so does each workload of a CamundaOptimize.

Appears in: - CamundaOptimizeSpec - ConnectorsSpec - ConsoleOverrides - ConsoleSpec - GatewaySpec - IdentityOverrides - IdentitySpec - OptimizeAttachment - WebAppSpec - WebModelerOverrides - WebModelerSpec - ZeebeSpec

Field Description Default Validation
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}

ZeebeSpec

ZeebeSpec configures the brokers. Zeebe is always a standalone StatefulSet with persistent volumes.

Appears in: - CamundaClusterSpec

Field Description Default Validation
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}
partitions integer Partitions is the number of partitions. Defaults to 1. Once set, it can
neither be decreased nor removed.
Minimum: 1
Optional: {}
replicationFactor integer ReplicationFactor is the number of brokers that hold a copy of each
partition. Defaults to 1. It must not exceed replicas.
Minimum: 1
Optional: {}
storageClassName string StorageClassName is the StorageClass of the broker volumes. Defaults to
the default StorageClass of the Kubernetes cluster. The class cannot
change after the broker StatefulSet exists. The API server refuses a
change of a value that the CamundaCluster sets itself. A preset can
change the class, and a cluster that got its class from a preset can
set another one. A cluster whose broker StatefulSet exists, also a
suspended one, then keeps its class and records a
StorageClassChangeIgnored event. A cluster without a broker StatefulSet
takes the new class. Volumes that whenDeleted Retain kept from a
deleted cluster of the same name keep their class.
Optional: {}
storageSize Quantity StorageSize is the size of the data volume of each broker. Defaults to
10Gi. It can only grow. The API server refuses a change of this field
in a CamundaCluster to a smaller value. A smaller value is accepted when
the field was not set before, or when a preset lowers the size. A
cluster whose volumes are already larger then keeps that size and
records a StorageShrinkIgnored event.
When the size grows, the operator expands the existing claims in place.
The storage class must support volume expansion.
Optional: {}
persistentVolumeClaimRetentionPolicy PersistentVolumeClaimRetentionPolicy PersistentVolumeClaimRetentionPolicy says what happens to the broker
volumes when the CamundaCluster is deleted. A scale-down and a
suspension always keep them.
Optional: {}

fleet.camunda.io/v1alpha1

Package v1alpha1 contains API Schema definitions for the fleet v1alpha1 API group. The fleet manager writes the kinds of this group. An environment sets the policy of its namespaces. A claim expands into a cluster or a management cluster.

The v1alpha1 version has no compatibility promise. A later release can change or remove any type, field, or value of this package.

Resource Types

BackupScheduleAttachment

BackupScheduleAttachment holds the BackupSchedule fields that a claim can set. The claim controller sets the cluster reference to the cluster of the claim.

Appears in: - ClusterAttachments

Field Description Default Validation
schedule string Schedule is when the backups run: a five-field cron expression
(minute, hour, day of month, month, day of week), evaluated in UTC.
Pattern: ^\s*([0-9A-Za-z*?,/-]+\s+)\{4\}[0-9A-Za-z*?,/-]+\s*$
Required: {}
retained RetainedBackups Retained limits how many backups of the schedule stay. Unset, the
defaults of the BackupSchedule apply.
Optional: {}

CamundaClusterClaim

CamundaClusterClaim asks for one Camunda cluster. The cluster claim controller expands it into a CamundaCluster of the same name, a PluginRequest for each selection, and the attachments. The Environment of the namespace sets which presets, releases, and registrations the claim can use. The name is a DNS-1035 label of at most 40 characters. The claim adds a suffix to it in the names of the resources that it writes, such as <claim>-es-es-http.

Field Description Default Validation
apiVersion string fleet.camunda.io/v1alpha1
kind string CamundaClusterClaim
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec CamundaClusterClaimSpec spec is the cluster that the claim asks for Required: {}
status CamundaClusterClaimStatus status is the state of the claim Optional: {}

CamundaClusterClaimSpec

CamundaClusterClaimSpec is the cluster that a claim asks for. The cluster claim controller expands it into a CamundaCluster, a PluginRequest for each selection, and the attachments.

Appears in: - CamundaClusterClaim

Field Description Default Validation
presetRef string PresetRef names the CamundaClusterPreset of the cluster. When the
namespace belongs to an Environment, the Environment must list the
preset in spec.presets.camundaCluster. The claim controller checks a
change of an existing claim against the current Environment.
MaxLength: 253
MinLength: 1
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Required: {}
releaseRef string ReleaseRef names the CamundaRelease of the cluster, which sets its
versions. Empty means the default release of the Environment. The
claim controller checks a change of an existing claim against the
current Environment.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
platformConfigRef string PlatformConfigRef names the CamundaPlatformConfig of the cluster.
Empty means spec.platformConfigRef of the Environment.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
cluster CamundaClusterSpec Cluster holds the overrides of the cluster. It has the shape of the
CamundaCluster spec, and it merges over the preset and the release.
The API server refuses these fields here. suspend: false and an empty
presetRef, releaseRef, storageRef, or backupStorageRef count as unset.
- presetRef, releaseRef, platformConfigRef, and suspend: the claim
has its own fields for them.
- version and connectors.version: the release sets them. Use
allowVersionDowngrade for a downgrade.
- serviceAccount.name and connectors.serviceAccount.name: the claim
controller sets them.
- storageRef and backupStorageRef: the secondary-storage and
backup-storage sections fill them.
A selected section fills these fields. The claim controller refuses a
claim that sets one of them with reason SlotConflict. Without a
selection in that section, the claim can set the field.
- externalUrl: access.
- serviceAccount.annotations: cloud-identity.
- connectors.serviceAccount.annotations: connectors-permissions.
- zeebe.storageClassName: volume-encryption.
Optional: {}
plugins PluginSelection array Plugins are the registrations that the claim selects, one item for
each section and registration. The sections and their registrations
are fixed after creation. Only the parameters of a selection can
change.
MaxItems: 32
Optional: {}
attachments ClusterAttachments Attachments are the resources that the claim controller attaches to
the cluster.
Optional: {}
deletionPolicy DeletionPolicy DeletionPolicy says what happens to the resources of the plugin
requests when the claim is deleted. Delete deletes them. Orphan keeps
them. Empty means the deletion default that the claim recorded from its
Environment at creation, or Delete when it recorded none. The claim
controller refuses Orphan with the reason NotAllowed when a selected
registration does not support it. The CamundaCluster and the
attachments are always deleted with the claim, under their own
retention rules.
Enum: [Delete Orphan]
Optional: {}
allowVersionDowngrade string AllowVersionDowngrade is the target version of a confirmed downgrade,
as a full version such as 8.9.3. The claim controller sets the
annotation camunda.io/allow-version-downgrade on the CamundaCluster to
this version until the cluster reports it. The fleet manager clears
the field after the cluster reports the target version.
Pattern: ^(\d+\.\d+\.\d+)?$
Optional: {}
suspend boolean Suspend scales every workload of the cluster to zero and keeps the
data.
Optional: {}

CamundaClusterClaimStatus

CamundaClusterClaimStatus is the state of a CamundaClusterClaim. The cluster claim controller writes it.

Appears in: - CamundaClusterClaim

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the cluster claim
controller processed.
Optional: {}
conditions Condition array Conditions report the state of the claim. Ready is False with reason
NoEnvironment, UnknownEnvironment, NotAllowed, MissingInput,
InvalidReference, SlotConflict, or WiringCycle when a check of the
claim fails. Otherwise Ready follows RequestsReady, ClusterReady, and
AttachmentsReady. When ClusterReady has the reason Creating, Updating,
Failing, Degraded, or Down, its message holds the Ready reason and
message of the CamundaCluster. If the CamundaCluster has no Ready
condition yet, the message says so. With other reasons, such as
Error or PrerequisiteNotMet, the message gives that cause. While the
claim is deleted and waits for objects, Ready is False with the reason
Deleting, and the message names those objects.
Optional: {}
environment string Environment is the Environment of the namespace when the claim was
created. It is empty when no Environment applied.
Optional: {}
resolvedPolicy ResolvedPolicy ResolvedPolicy is the policy that the claim recorded from its
Environment at creation. A later change of the Environment does not
change it.
Optional: {}
requests RequestStatus array Requests is the state of each PluginRequest of the claim. Optional: {}
cluster ClusterRef Cluster names the CamundaCluster of the claim. It is unset until the
claim controller writes the cluster.
Optional: {}

CamundaManagementClusterClaim

CamundaManagementClusterClaim asks for a management plane that serves the clusters of one or more environments. The plane claim controller writes a CamundaManagementCluster with the name of the claim, and the PluginRequests of the selected sections. The name is a DNS-1035 label of at most 40 characters. The claim adds a suffix to it in the names of the resources that it writes.

Field Description Default Validation
apiVersion string fleet.camunda.io/v1alpha1
kind string CamundaManagementClusterClaim
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec CamundaManagementClusterClaimSpec spec is the management plane that the claim asks for Required: {}
status CamundaManagementClusterClaimStatus status is the state of the claim Optional: {}

CamundaManagementClusterClaimSpec

CamundaManagementClusterClaimSpec is the management plane that a team asks for. The plane claim controller writes one PluginRequest for each selected section and one CamundaManagementCluster with the name of the claim.

Appears in: - CamundaManagementClusterClaim

Field Description Default Validation
environments string array Environments are the names of the Environments that the plane serves.
The plane serves the CamundaClusters in the namespaces of these
environments. The claim controller refuses a name that no Environment
has, with the reason InvalidReference.
MaxItems: 64
MinItems: 1
items:MaxLength: 63
items:MinLength: 1
clusterSelector LabelSelector ClusterSelector selects the CamundaClusters that Console and Web
Modeler serve, in the namespaces of the environments. An unset
selector selects no cluster. An empty selector ({}) selects every
cluster.
Optional: {}
platformConfigRef string PlatformConfigRef names the CamundaPlatformConfig of the plane. Empty
means the platformConfigRef of the Environment of the namespace of the
claim.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
management ManagementOverrides Management holds the settings of the plane that the claim can set: the
identity provider, Management Identity, Console, and Web Modeler. The
versions are in versions. The database references come from the
management-database section.
versions ManagementVersions Versions holds the version of each component of the plane. The fleet
manager fills them from its images table, because Identity, Console,
and Web Modeler have their own version lines. For example, with
Camunda 8.9.23, Identity is 8.9.10.
plugins PluginSelection array Plugins holds the registration that the claim selects for each
section, for example access and management-database. The sections and
their registrations are fixed after creation. Only the parameters can
change.
MaxItems: 32
Optional: {}
managementAuthConfigName string ManagementAuthConfigName is the name of the cluster-scoped
ManagementAuthConfig that the plane writes. A CamundaOptimize reads it
through its managementAuthRef. Empty means the name of the claim.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
Optional: {}
deletionPolicy DeletionPolicy DeletionPolicy says what happens to the resources of the
PluginRequests of the claim when the claim is deleted. Delete deletes
them. Orphan keeps them. Empty means the deletion default that the
claim recorded from its Environment at creation, or Delete when it
recorded none. The claim controller refuses Orphan with the reason
NotAllowed when a selected registration does not support it. The
CamundaManagementCluster is always deleted with the claim.
Enum: [Delete Orphan]
Optional: {}
suspend boolean Suspend scales every workload of the plane to zero. The PluginRequests
do not change.
Optional: {}

CamundaManagementClusterClaimStatus

CamundaManagementClusterClaimStatus is the state of a plane claim. The plane claim controller writes it.

Appears in: - CamundaManagementClusterClaim

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the plane claim
controller processed.
Optional: {}
conditions Condition array Conditions report the state of the claim. Ready is False with the
reason NoEnvironment, UnknownEnvironment, NotAllowed, MissingInput,
InvalidReference, SlotConflict, or WiringCycle when the plane claim
controller refuses the claim. The message names the cause. Otherwise
Ready follows RequestsReady and ManagementClusterReady. When
ManagementClusterReady has the reason Creating, Updating, Failing,
Degraded, or Down, its message holds the Ready reason and message of
the CamundaManagementCluster. If the CamundaManagementCluster has no
Ready condition yet, the message says so. With other reasons, such as
Error or PrerequisiteNotMet, the message gives that cause. While the
claim is deleted and waits for objects, Ready is False with the reason
Deleting, and the message names those objects.
Optional: {}
environment string Environment is the Environment of the namespace of the claim when the
claim was created.
Optional: {}
resolvedPolicy ResolvedPolicy ResolvedPolicy is the policy of the environment when the claim was
created. A later change of the environment does not change it.
Optional: {}
requests RequestStatus array Requests lists the PluginRequests of the claim, one for each selected
section.
Optional: {}
managementCluster ManagementClusterRef ManagementCluster names the CamundaManagementCluster of the claim. It
has the name of the claim.
Optional: {}

ClusterAttachments

ClusterAttachments are the resources that a claim attaches to its cluster.

Appears in: - CamundaClusterClaimSpec

Field Description Default Validation
optimize OptimizeAttachment Optimize adds a CamundaOptimize named <claim>-optimize that reads the
cluster. Unset, the claim has no Optimize.
Optional: {}
backupSchedule BackupScheduleAttachment BackupSchedule adds a BackupSchedule named <claim>-backups for the
cluster. Unset, the claim has no backup schedule.
Optional: {}

ConsoleOverrides

ConsoleOverrides configures Console for a plane claim. versions.console is required while it is set.

Appears in: - ManagementOverrides

Field Description Default Validation
externalUrl string ExternalURL is the URL where browsers reach Console. The claim
controller refuses this field with the reason SlotConflict when the
access section has a selection, because the access section then gives
the URL. Without a selection, set it here.
Optional: {}
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}

Environment

Environment sets the policy for the claims in its namespaces. The policy names the releases, presets, and plugin registrations that a claim can use. It also sets the parameter values and the deletion default. A namespace belongs to the Environment that its label fleet.camunda.io/environment names. Without any Environment, the modes and the parameter values of the registrations apply. The name is at most 63 characters, because other objects carry it in a label value.

Field Description Default Validation
apiVersion string fleet.camunda.io/v1alpha1
kind string Environment
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec EnvironmentSpec spec is the policy of the environment Required: {}
status EnvironmentStatus status is the state of the environment Optional: {}

EnvironmentPresets

EnvironmentPresets lists the presets that the claims of an environment can use, for each preset kind.

Appears in: - EnvironmentSpec

Field Description Default Validation
camundaCluster string array CamundaCluster are the names of the CamundaClusterPresets that a
cluster claim can use.
items:MinLength: 1
Optional: {}
elasticsearchCluster string array ElasticsearchCluster are the names of the ElasticsearchClusterPresets
that the built-in Elasticsearch of a claim can use.
items:MinLength: 1
Optional: {}
databaseServer string array DatabaseServer are the names of the DatabaseServerPresets that the
built-in PostgreSQL of a claim can use.
items:MinLength: 1
Optional: {}

EnvironmentReleases

EnvironmentReleases lists the releases that the claims of an environment can use.

Appears in: - EnvironmentSpec

Field Description Default Validation
allowed string array Allowed are the names of the CamundaReleases that a claim can use. MaxItems: 64
items:MaxLength: 253
items:MinLength: 1
Optional: {}
default string Default is the release of a claim that names none. It is one of
allowed.
MaxLength: 253
Optional: {}

EnvironmentSpec

EnvironmentSpec is the policy that an Environment sets for the claims in its namespaces. A namespace belongs to the Environment that its label fleet.camunda.io/environment names.

Appears in: - Environment

Field Description Default Validation
displayName string DisplayName is the name that the fleet manager shows for the
environment, at most 64 characters. It changes nothing for a claim.
MaxLength: 64
Optional: {}
color string Color is the color that the fleet manager shows for the environment,
as a hex color such as #2E7D32. It changes nothing for a claim.
Pattern: ^#[0-9a-fA-F]\{6\}$
Optional: {}
platformConfigRef string PlatformConfigRef names the CamundaPlatformConfig of a claim of the
environment that names none itself.
Optional: {}
presets EnvironmentPresets Presets lists, for each preset kind, the presets that a claim of the
environment can use. The claim controller checks a new claim, and a
preset change of an existing claim, against the current lists.
Optional: {}
releases EnvironmentReleases Releases lists the CamundaReleases that a claim of the environment can
use. The claim controller checks a new claim, and a release change of
an existing claim, against the current list.
Optional: {}
sections object (keys:string, values:SectionPolicy) Sections holds the policy of each PluginSection, by section name. A
claim of the environment can select only a registration that the
policy of its section allows. A section that is not listed offers
only the empty option. A change applies to new claims only.
MaxProperties: 64
Optional: {}
parameters object (keys:string, values:ParameterPolicies) Parameters holds the policy of the parameters of each
PluginRegistration, by registration name and then by parameter name.
A parameter without a policy keeps the value of its registration, and
a claim cannot change it. A change applies to new claims only.
MaxProperties: 64
Optional: {}
deletionPolicy DeletionPolicy DeletionPolicy is the deletion policy of a claim of the environment
that sets none itself. Delete deletes the resources of its plugin
requests with the claim. Orphan keeps them. Unset means Delete. A
change applies to new claims only.
Delete Enum: [Delete Orphan]
Optional: {}
namespaceCreation NamespaceCreation NamespaceCreation lets the create flow of the fleet manager create a
namespace in the environment. Unset, the create flow cannot create a
namespace.
Optional: {}

EnvironmentStatus

EnvironmentStatus is the state of an Environment. The environment controller writes it.

Appears in: - Environment

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation that the environment
controller processed.
Optional: {}
conditions Condition array Conditions report the state of the environment. Ready is False with
reason InvalidReference when a release, preset, platform config,
section, or registration that the spec names does not exist. The
message names each missing object.
Optional: {}
namespaces integer Namespaces is the number of namespaces that carry the label of this
environment. It is unset until the environment controller counts the
namespaces.
Optional: {}

IdentityOverrides

IdentityOverrides configures Management Identity for a plane claim.

Appears in: - ManagementOverrides

Field Description Default Validation
externalUrl string ExternalURL is the URL where browsers reach Management Identity. A URL
with a path other than / must use https. The claim controller refuses
this field with the reason SlotConflict when the access section has a
selection, because the access section then gives the URL. Without a
selection, set it here.
Optional: {}
admin IdentityAdminSpec Admin names the first administrator of the plane. Set claimName and
claimValue in the oidc mode, and username in the Keycloak modes.
Management Identity reads it only on its first start.
replicas integer Replicas is the number of pods of this process. Defaults to 1. On a
CamundaCluster it has no effect on an embedded web application.
Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the container of this process. Optional: {}
extraEnv EnvVar array ExtraEnv are extra environment variables of the container of this
process. On a CamundaCluster, an entry here wins over a top-level entry
with the same name. The entries of an embedded web application apply to
its host process.
The list merges by name under server-side apply. Each field manager owns
only the entries that it applies, so an extension controller can add its
own entry next to yours. One applied manifest cannot hold two entries
with the same name.
Two field managers that apply the same name do not conflict, because the
merge is per field inside the entry. One manager can own value and the
other valueFrom. A container rejects an entry that has both, so the API
server refuses to store such an entry.
Optional: {}
extraEnvFrom EnvFromSource array ExtraEnvFrom are extra environment sources (ConfigMaps, Secrets) of the
container of this process.
Optional: {}
podLabels object (keys:string, values:string) PodLabels are extra labels of the pods of this process. Optional: {}
podAnnotations object (keys:string, values:string) PodAnnotations are extra annotations of the pods of this process. In a
CamundaCluster, the keys camunda.io/config-hash and
camunda.io/service-account-hash belong to the operator, and a value for
them does not reach the pods.
Optional: {}
scheduling SchedulingSpec Scheduling holds the scheduling constraints of the pods of this process.
When set, it replaces all other scheduling blocks for this process, with
no merge. On a CamundaCluster, these are the top-level block and the
block of a preset.
Optional: {}

KeycloakOverrides

KeycloakOverrides configures the Keycloak that the operator runs for a plane claim.

Appears in: - ManagementIdentityProvider

Field Description Default Validation
externalUrl string ExternalURL is the URL where browsers reach Keycloak, with the /auth
path and no query and no fragment. The claim controller refuses this
field with the reason SlotConflict when the access section has a
selection, because the access section then gives the URL. Without a
selection, set it here.
Optional: {}
replicas integer Replicas is the number of Keycloak instances. Defaults to 1. Minimum: 0
Optional: {}
resources ResourceRequirements Resources are the CPU and memory of the Keycloak container. Optional: {}
scheduling SchedulingSpec Scheduling constraints of the Keycloak pods. Optional: {}

LabelValue

Underlying type: string

LabelValue is the value of a Kubernetes label.

Validation: - MaxLength: 63 - Pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$

Appears in: - NamespaceCreation

ManagementClusterRef

ManagementClusterRef names a CamundaManagementCluster in the namespace of the claim.

Appears in: - CamundaManagementClusterClaimStatus

Field Description Default Validation
name string Name is the name of the CamundaManagementCluster. MinLength: 1

ManagementIdentityProvider

ManagementIdentityProvider holds one of the three identity provider modes of a plane claim.

Appears in: - ManagementOverrides

Field Description Default Validation
keycloak KeycloakOverrides Keycloak runs Keycloak through the Keycloak Operator. The Keycloak
Operator must be installed on the Kubernetes cluster. versions.keycloak
is required in this mode.
Optional: {}
externalKeycloak ExternalKeycloakSpec ExternalKeycloak connects Management Identity to a Keycloak that you
run.
Optional: {}
oidc ManagementOIDCSpec OIDC connects Management Identity to the identity provider of the
CamundaPlatformConfig of the plane.
Optional: {}

ManagementOverrides

ManagementOverrides holds the settings of a management plane that a plane claim can set. The claim controller writes them to the CamundaManagementCluster.

Appears in: - CamundaManagementClusterClaimSpec

Field Description Default Validation
identityProvider ManagementIdentityProvider IdentityProvider selects where users sign in. Exactly one of keycloak,
externalKeycloak, or oidc is set. The mode can change after creation.
identity IdentityOverrides Identity configures Management Identity. The plane always runs it.
console ConsoleOverrides Console configures Console. While it is unset, the plane has no
Console.
Optional: {}
webModeler WebModelerOverrides WebModeler configures Web Modeler. While it is unset, the plane has no
Web Modeler.
Optional: {}

ManagementVersions

ManagementVersions holds the version of each component of a plane claim, each as a full semantic version.

Appears in: - CamundaManagementClusterClaimSpec

Field Description Default Validation
identity string Identity is the Management Identity version, for example 8.9.10. Pattern: ^\d+\.\d+\.\d+$
keycloak string Keycloak is the Keycloak version. It is required in the keycloak mode.
Camunda 8.9 supports only Keycloak 26.
Pattern: ^\d+\.\d+\.\d+$
Optional: {}
console string Console is the Console version. It is required while
management.console is set.
Pattern: ^\d+\.\d+\.\d+$
Optional: {}
webModeler string WebModeler is the Web Modeler version. It is required while
management.webModeler is set.
Pattern: ^\d+\.\d+\.\d+$
Optional: {}

NamedValue

NamedValue is one choice of a claim-editable parameter.

Appears in: - ParameterPolicy

Field Description Default Validation
name string Name is what the claim stores when it picks the choice, for example
sqs. It is unique in the list.
MaxLength: 63
MinLength: 1
label string Label is what the fleet manager shows for the choice, for example SQS
access.
MaxLength: 64
MinLength: 1
value JSON Value is what the request gets, for example the ARN of a policy. It
can be any JSON value.

NamespaceCreation

NamespaceCreation controls how the create flow of the fleet manager creates a namespace in an environment. The create flow always sets the label fleet.camunda.io/environment on the new namespace.

Appears in: - EnvironmentSpec

Field Description Default Validation
allowed boolean Allowed lets the create flow create a namespace in the environment. Optional: {}
labels object (keys:string, values:LabelValue) Labels are fixed labels of a new namespace. Each is a valid label. The
label fleet.camunda.io/environment is not allowed here, because the
create flow sets it.
MaxProperties: 32
Optional: {}
requiredLabelKeys string array RequiredLabelKeys are label keys, for example team. The create flow
asks for a value of each key and sets the label on the new namespace.
Each key is a valid label key. The key fleet.camunda.io/environment is
not allowed here.
MaxItems: 16
items:MaxLength: 317
Optional: {}

OptimizeAttachment

OptimizeAttachment holds the CamundaOptimize fields that a claim can set. The claim controller sets the version from the release and the cluster reference to the cluster of the claim.

Appears in: - ClusterAttachments

Field Description Default Validation
managementAuthConfigRef string ManagementAuthConfigRef names the cluster-scoped ManagementAuthConfig
that Optimize signs in against. The claim controller writes it to
managementAuthRef of the CamundaOptimize.
MaxLength: 253
MinLength: 1
Required: {}
externalUrl string ExternalURL is the URL where browsers reach this Optimize, with the
rules of externalUrl on the CamundaOptimize. The claim controller
refuses it with reason SlotConflict when the access section has a
selection, because that section fills it.
Optional: {}
webapp WorkloadSpec Webapp configures the Deployment that serves the Optimize user
interface.
Optional: {}
importer WorkloadSpec Importer configures the Deployment that imports the cluster data into
the Optimize indices. Optimize supports one active importer, so
replicas must be 0 or 1.
Optional: {}
indexReplicas integer IndexReplicas is the replica count of each Optimize index. Unset, the
storage of the cluster gives the count, as on the CamundaOptimize.
Minimum: 0
Optional: {}
monitoring OptimizeMonitoringSpec Monitoring configures the monitoring integrations of Optimize. Optional: {}

ParameterPolicies

Underlying type: object (keys:string, values:ParameterPolicy)

ParameterPolicies holds the policy of each parameter of one PluginRegistration, by parameter name.

Validation: - MaxProperties: 64

Appears in: - EnvironmentSpec - ResolvedPolicy

ParameterPolicy

ParameterPolicy is the policy of an Environment for one parameter of a PluginRegistration.

Appears in: - ParameterPolicies

Field Description Default Validation
value JSON Value replaces the value that the registration gives the parameter. Optional: {}
claimEditable boolean ClaimEditable lets a claim of the environment change the parameter.
Without it, the claim gets the value of the policy or of the
registration.
Optional: {}
allowed NamedValue array Allowed are the choices that a claim can pick for the parameter. The
claim stores the name of a choice, or a list of names for an array
parameter. The claim controller puts the value of each choice in the
request, and refuses an unknown name with NotAllowed. Allowed needs
claimEditable.
MaxItems: 32
Optional: {}

PluginSelection

PluginSelection is the registration that a claim selects for one section.

Appears in: - CamundaClusterClaimSpec - CamundaManagementClusterClaimSpec

Field Description Default Validation
section string Section is the name of the PluginSection. MaxLength: 253
MinLength: 1
registration string Registration is the name of the PluginRegistration. MaxLength: 253
MinLength: 1
parameters JSON Parameters are the parameter values of the selection. Only the
claim-editable parameters of the policy can differ from the policy
values. The claim controller refuses another change with NotAllowed.
Optional: {}

RequestStatus

RequestStatus is the state of one PluginRequest of a claim.

Appears in: - CamundaClusterClaimStatus - CamundaManagementClusterClaimStatus

Field Description Default Validation
section string Section is the name of the PluginSection of the request.
registration string Registration is the name of the PluginRegistration of the request.
name string Name is the name of the PluginRequest.
outputsReady ConditionStatus OutputsReady is the status of the OutputsReady condition of the
request.
Optional: {}
ready ConditionStatus Ready is the status of the Ready condition of the request. Optional: {}

ResolvedPolicy

ResolvedPolicy is the policy that a claim recorded from its environment at creation. A later change of the environment does not change it.

Appears in: - CamundaClusterClaimStatus - CamundaManagementClusterClaimStatus

Field Description Default Validation
sections object (keys:string, values:SectionPolicy) Sections holds the policy of each section, by section name. MaxProperties: 64
Optional: {}
parameters object (keys:string, values:ParameterPolicies) Parameters holds the parameter values and the claim-editable
parameters, by registration name.
MaxProperties: 64
Optional: {}
deletionPolicy DeletionPolicy DeletionPolicy is the deletion default of the environment. Enum: [Delete Orphan]
Optional: {}

SectionPolicy

SectionPolicy is the policy of an Environment for one PluginSection.

Appears in: - EnvironmentSpec - ResolvedPolicy

Field Description Default Validation
required boolean Required makes a claim of the environment select a registration of the
section. The fleet manager then hides the empty option.
Optional: {}
default string Default is the registration that the create flow of the fleet manager
preselects. It is empty or one of allowed.
MaxLength: 253
Optional: {}
allowed string array Allowed are the names of the PluginRegistrations of the section that a
claim of the environment can select. With no item, a claim can select
only the empty option.
MaxItems: 64
items:MaxLength: 253
items:MinLength: 1
Optional: {}

WebModelerOverrides

WebModelerOverrides configures Web Modeler for a plane claim. versions.webModeler is required while it is set.

Appears in: - ManagementOverrides

Field Description Default Validation
externalUrl string ExternalURL is the URL where browsers reach Web Modeler. The claim
controller refuses this field with the reason SlotConflict when the
access section has a selection, because the access section then gives
the URL. Without a selection, set it here.
Optional: {}
websocketsExternalUrl string WebsocketsExternalURL is the URL where browsers get the live updates
of Web Modeler. The claim controller refuses this field with the
reason SlotConflict when the access section has a selection, because
the access section then gives the URL. Without a selection, set it
here.
Optional: {}
mail WebModelerMailSpec Mail configures the SMTP server that Web Modeler sends notifications
through. Web Modeler does not start without it.
restapi WorkloadSpec Restapi configures the workload of the restapi process. Optional: {}
websockets WorkloadSpec Websockets configures the workload of the websockets process. Optional: {}

plugins.camunda.io/v1alpha1

Package v1alpha1 contains API Schema definitions for the plugins v1alpha1 API group. The kinds of this group connect the claims of the fleet manager to the plugin controllers that serve them.

The v1alpha1 version has no compatibility promise. A later release can change or remove any type, field, or value of this package.

Resource Types

Choice

Choice is a preset or an existing resource that a claim can pick for a parameter of a registration.

Appears in: - PluginRegistrationSpec

Field Description Default Validation
name string Name is the value that the claim stores when it picks the choice. MinLength: 1
specs ChoiceSpec array Specs are the facts that the fleet manager shows for the choice, for
example the version, the node count, or the memory.
Optional: {}

ChoiceSpec

ChoiceSpec is one fact of a choice.

Appears in: - Choice

Field Description Default Validation
label string Label names the fact. MinLength: 1
value string Value is the value of the fact.

ClaimKind

Underlying type: string

ClaimKind names a claim kind of the fleet.camunda.io group.

Validation: - Enum: [CamundaClusterClaim CamundaManagementClusterClaim]

Appears in: - ClaimRef - PluginSectionSpec

Field Description
CamundaClusterClaim ClaimKindCamundaClusterClaim is the claim of a CamundaCluster.
CamundaManagementClusterClaim ClaimKindCamundaManagementClusterClaim is the claim of a
CamundaManagementCluster.

ClaimRef

ClaimRef names the claim that wrote a request.

Appears in: - PluginRequestSpec

Field Description Default Validation
kind ClaimKind Kind is the kind of the claim. Enum: [CamundaClusterClaim CamundaManagementClusterClaim]
name string Name is the name of the claim, in the namespace of the request. MinLength: 1

ControllerInfo

ControllerInfo identifies the plugin controller that serves a registration.

Appears in: - PluginRegistrationSpec

Field Description Default Validation
name string Name is the name of the plugin controller. MinLength: 1
version string Version is the version of the plugin controller, from its build info. Optional: {}

DeletionPolicy

Underlying type: string

DeletionPolicy says what happens to the resources of a request when the request is deleted.

Validation: - Enum: [Delete Orphan]

Appears in: - CamundaClusterClaimSpec - CamundaManagementClusterClaimSpec - EnvironmentSpec - PluginRegistrationSpec - PluginRequestSpec - ResolvedPolicy

Field Description
Delete DeletionPolicyDelete deletes the resources that the plugin wrote.
Orphan DeletionPolicyOrphan keeps the resources and removes their owner
reference to the request.

Grant

Grant asks the identity of a cluster for one permission on behalf of a PluginRequest. A plugin controller writes the spec, and the identity extension of the cluster writes the status. The name is at most 63 characters, because other objects carry it in a label value.

Field Description Default Validation
apiVersion string plugins.camunda.io/v1alpha1
kind string Grant
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec GrantSpec spec defines the desired state of Grant Required: {}
status GrantStatus status defines the observed state of Grant Optional: {}

GrantFormat

Underlying type: string

GrantFormat is the format of the fragment of a grant. A later version adds gcp-iam-binding and azure-role-assignment.

Validation: - Enum: [aws-iam-statement]

Appears in: - GrantSpec - GrantTemplate

Field Description
aws-iam-statement

GrantSpec

GrantSpec is the desired state of a Grant. A plugin controller writes it.

Appears in: - Grant

Field Description Default Validation
cluster ClusterRef Cluster names the CamundaCluster whose identity gets the permission,
in the namespace of the grant. It cannot change after the grant is
created.
template string Template is the name of the grant template in the registration that
the fragment is rendered from. It cannot change after the grant is
created.
MinLength: 1
format GrantFormat Format is the format of the fragment. It cannot change after the
grant is created.
Enum: [aws-iam-statement]
fragment JSON Fragment is one permission statement, filled in from the template. It
is a JSON object.
Type: object

GrantStatus

GrantStatus is the observed state of a Grant. The identity extension of the cluster writes it.

Appears in: - Grant

Field Description Default Validation
conditions Condition array Conditions are Applied, MatchesTemplate, and Ready. Applied is False
with reason OverCeiling, OverSizeLimit, or Rejected when the identity
extension refuses the fragment. MatchesTemplate is False with reason
TemplateChanged when the fragment no longer matches its template.
Ready is True with reason Healthy when both are True. Otherwise Ready
has the reason and the message of the first of them that is False.
Optional: {}

GrantTemplate

GrantTemplate is one permission statement that a registration asks for, with placeholders that the plugin fills for each request.

Appears in: - PluginRegistrationSpec

Field Description Default Validation
name string Name is the name of the template. A Grant names the template it was
rendered from.
MinLength: 1
format GrantFormat Format is the format of the statement. Enum: [aws-iam-statement]
template JSON Template is the statement, with Go template placeholders such as
{{ .parameters.x }} and {{ .outputs.x }}. It is a JSON object, like
the fragment of a Grant.
Type: object
description string Description says what the permission is for. Optional: {}
requiresInputs string array RequiresInputs names the inputs that must have a value before the
plugin writes the grant.
MaxItems: 32
items:MaxLength: 63
Optional: {}

InputDecl

InputDecl declares a value that a registration reads from the output of another section.

Appears in: - PluginRegistrationSpec

Field Description Default Validation
name string Name is the name of the input. The request carries its value under
this name.
MaxLength: 63
MinLength: 1
from string From names the output that gives the value, in the form
<section>/<output>.
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/[A-Za-z][A-Za-z0-9]*$
required boolean Required refuses a selection of the option when the input has no value. Optional: {}
formats string array Formats lists the formats of the value that the registration accepts,
for example aws-kms-arn. Empty accepts every format.
Optional: {}

Limit

Limit is a value that the plugin chart fixes, which no Environment and no claim can change.

Appears in: - PluginRegistrationSpec

Field Description Default Validation
label string Label names the limit. MinLength: 1
value string Value is the value of the limit.
description string Description says what the limit means for a claim. Optional: {}

Link is a named URL that a plugin reports for a request, for example the console page of a bucket.

Appears in: - PluginRequestStatus

Field Description Default Validation
name string Name names the link. MinLength: 1
url string URL is the address of the link. MinLength: 1

MetricQuery

MetricQuery is a Prometheus query that the fleet manager shows for a request of the registration.

Appears in: - PluginRegistrationSpec

Field Description Default Validation
label string Label names the metric. MinLength: 1
query string Query is PromQL with Go template placeholders, for example
{{ .namespace }} and {{ .pods }}.
MinLength: 1
unit string Unit is the unit of the value, for example bytes. Optional: {}

Mode

Underlying type: string

Mode is the fallback of a registration when no Environment exists.

Validation: - Enum: [Default Optional]

Appears in: - PluginRegistrationSpec

Field Description
Default ModeDefault selects the option in a new claim.
Optional ModeOptional offers the option, and a new claim does not select it.

OnOrphan

Underlying type: string

OnOrphan says what happens to a resource of a request with the deletion policy Orphan.

Validation: - Enum: [Kept Deleted]

Appears in: - ResourceRef

Field Description
Kept OnOrphanKept keeps the resource.
Deleted OnOrphanDeleted deletes the resource, for example a route to a Service
that is gone.

OutputDecl

OutputDecl declares a value that a plugin writes to the status of a request.

Appears in: - PluginRegistrationSpec - PluginSectionSpec

Field Description Default Validation
key string Key is the key of the output in the status of the request. It starts
with a letter and holds only letters and digits.
Pattern: ^[A-Za-z][A-Za-z0-9]*$
description string Description says what the value is. Optional: {}
format string Format is the format of the value, for example aws-kms-arn. Optional: {}

PluginRegistration

PluginRegistration is one option that a plugin offers to the sections of the create flow of a claim. The plugin controller writes it at startup from its chart values, and the operator writes the built-in registrations. The name is at most 63 characters, because other objects carry it in a label value.

Field Description Default Validation
apiVersion string plugins.camunda.io/v1alpha1
kind string PluginRegistration
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec PluginRegistrationSpec spec defines the option Required: {}
status PluginRegistrationStatus status defines the observed state of PluginRegistration Optional: {}

PluginRegistrationSpec

PluginRegistrationSpec describes one option that a plugin offers in one or more sections: what it needs, what it writes, and which permissions it asks for.

Appears in: - PluginRegistration

Field Description Default Validation
sections string array Sections lists the names of the PluginSections that the option serves.
label string Label is the name of the option in the fleet manager. It names the
outcome, for example "New S3 bucket". Display only. No controller reads
it.
MinLength: 1
description string Description says what the option does. Display only. No controller
reads it.
Optional: {}
docsUrl string DocsURL is the address of the documentation of the option. Display
only. No controller reads it.
Optional: {}
mode Mode Mode says whether a new claim selects the option when no Environment
exists.
Enum: [Default Optional]
controller ControllerInfo Controller names the plugin controller that serves the option and its
version. Display only. No controller reads it.
Optional: {}
serviceAccount ServiceAccountRef ServiceAccount is the ServiceAccount of the plugin controller. The app
shows it. The API server admits a Grant for the option only from a
requester that has the RBAC verb serve on this registration.
operatorVersions string OperatorVersions is the semver range of the operator versions that the
plugin supports, for example ">=0.3.0 <1.0.0". The operator reports a
range that does not hold its version, or that is not a valid range.
Optional: {}
parameters JSON Parameters is the OpenAPI v3 schema of the parameters of a request for
the option.
Optional: {}
parameterValues JSON ParameterValues are the parameter values that the admin set in the
plugin chart. An Environment can override them.
Optional: {}
claimEditable string array ClaimEditable lists the parameters that a claim can change when no
Environment says otherwise.
Optional: {}
choices Choice array Choices are the presets or existing resources that a claim can pick
for a parameter. The claim stores the name of the pick in its
parameters. Display only. No controller reads it.
Optional: {}
inputs InputDecl array Inputs declares the values that the option reads from the outputs of
other sections. Each name is unique.
MaxItems: 32
Optional: {}
outputs OutputDecl array Outputs declares the values that the plugin writes to the status of a
request. It includes the outputs of each section that the option
serves. Each key is unique.
Optional: {}
limits Limit array Limits are the values that the plugin chart fixes, which no
Environment and no claim can change, for example a permissions
boundary. The plugin enforces them from its chart. Display only. No
controller reads it.
Optional: {}
grantTemplates GrantTemplate array GrantTemplates are the permission statements that the option asks for,
one Grant for each template. Each name is unique.
MaxItems: 32
Optional: {}
deletionPolicies DeletionPolicy array DeletionPolicies lists the deletion policies that the plugin supports.
Every plugin supports Delete.
Enum: [Delete Orphan]
MaxItems: 2
metricQueries MetricQuery array MetricQueries are the Prometheus queries that the fleet manager shows
for a request of the option. Display only. No controller reads it.
Optional: {}

PluginRegistrationStatus

PluginRegistrationStatus is the observed state of a PluginRegistration.

Appears in: - PluginRegistration

Field Description Default Validation
observedGeneration integer ObservedGeneration is the last generation of the registration that the
plugin controller processed. Only the plugin controller sets it, so the
field is absent until the plugin controller processes the registration.
The operator is the plugin controller of the built-in registrations
whose requests it serves.
Optional: {}
conditions Condition array Conditions holds Accepted and Ready. The operator sets Accepted. Its
False reasons are SectionMissing, OperatorVersionUnsupported, and
DefaultConflict. The plugin controller sets Ready from its health and
its credentials. On the built-in registrations whose requests the
operator serves, the operator sets Ready. The fleet manager offers the
option only when both are True.
Optional: {}

PluginRequest

PluginRequest asks a plugin for the resources of one section of a claim. A claim controller writes the spec, and the plugin controller that serves the registration writes the status. The claim names a request <claim>-<section>, or <claim>-<section>-<registration> in a section with selection Many. The name is at most 63 characters, because other objects carry it in a label value. A longer name is cut and ends with a hash.

Field Description Default Validation
apiVersion string plugins.camunda.io/v1alpha1
kind string PluginRequest
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec PluginRequestSpec spec defines the desired state of PluginRequest Required: {}
status PluginRequestStatus status defines the observed state of PluginRequest Optional: {}

PluginRequestSpec

PluginRequestSpec is the desired state of a PluginRequest. A claim controller writes it.

Appears in: - PluginRequest

Field Description Default Validation
section string Section is the name of the PluginSection that the request fills. It
cannot change after the request is created.
MinLength: 1
registration string Registration is the name of the PluginRegistration that serves the
request. It cannot change after the request is created.
MinLength: 1
claimRef ClaimRef ClaimRef names the claim that wrote the request. It cannot change
after the request is created.
target TargetRef Target names the resource that the request serves, before the
resource exists. target.kind and target.name cannot change after the
request is created.
inputs object (keys:string, values:string) Inputs are the values of the inputs of the registration, by input
name. The claim controller resolves them from the outputs of other
requests of the same claim.
Optional: {}
parameters JSON Parameters are the settings of the request, as free-form JSON. The
plugin checks them against the parameter schema of the registration.
Optional: {}
deletionPolicy DeletionPolicy DeletionPolicy says what the plugin does with the resources of the
request when the request is deleted. The claim controller copies it
from the claim before it deletes the request.
Enum: [Delete Orphan]

PluginRequestStatus

PluginRequestStatus is the observed state of a PluginRequest. The plugin controller that serves the registration writes it.

Appears in: - PluginRequest

Field Description Default Validation
observedGeneration integer ObservedGeneration is the generation of the spec that the plugin
processed last.
Optional: {}
conditions Condition array Conditions are OutputsReady and Ready. OutputsReady is True when the
outputs are written for the current generation. Ready is False with
reason GrantRejected while a Grant of the request has Ready=False.
Ready is False with reason WaitingForGrants while no Grant of the
request has Ready=False and a Grant does not have Ready=True yet. Ready
is False with reason WaitingForEndpoints while an access request waits
for the endpoints of its target. Ready is False with reason
InvalidParameters when the parameters do not pass the registration.
The plugin sets the other reasons.
Optional: {}
outputs object (keys:string, values:string) Outputs are the values that the plugin publishes for the request, by
output key. A reader trusts them only while OutputsReady is True and
the observedGeneration of that condition equals metadata.generation.
Optional: {}
summary SummaryItem array Summary is a list of facts about the request, for display only. No
controller reads it. The first item is the headline.
Optional: {}
summaryTime Time SummaryTime is when the plugin wrote the summary last, for display
only.
Optional: {}
links Link array Links are named URLs about the request, for example the console page
of a bucket, for display only.
Optional: {}
podSelector LabelSelector PodSelector selects the pods that the plugin runs for the request, for
display only.
Optional: {}
resources ResourceRef array Resources are the resources that the plugin made for the request, in
the cluster or in a cloud, for display only.
Optional: {}

PluginSection

PluginSection is one section of the create flow of a claim, such as "Backup storage" or "Access". The operator writes the core sections, and a plugin chart writes a section that it brings. The name is at most 63 characters, because other objects carry it in a label value.

Field Description Default Validation
apiVersion string plugins.camunda.io/v1alpha1
kind string PluginSection
metadata ObjectMeta Refer to Kubernetes API documentation for fields of metadata. Optional: {}
spec PluginSectionSpec spec defines the section Required: {}

PluginSectionSpec

PluginSectionSpec describes one section of the create flow of a claim. The registrations that serve the section are its options.

Appears in: - PluginSection

Field Description Default Validation
label string Label is the name of the section in the fleet manager, for example
"Backup storage". Display only. No controller reads it.
MinLength: 1
description string Description says what the section is for. Display only. No controller
reads it.
Optional: {}
order integer Order is the position of the section in the create flow. A section
with a lower value comes first. Display only. No controller reads it.
Optional: {}
selection Selection Selection says how many options of the section one claim can select. Enum: [One Many]
emptyOptionLabel string EmptyOptionLabel is the label of the option that selects nothing, for
example "No backups". When it is empty, the section has no empty
option. Display only. No controller reads it.
Optional: {}
slot Slot Slot names the fields of the generated resource that the outputs of
the section fill. When it is empty, the outputs are only inputs of
other registrations.
Enum: [workloadIdentity volumeEncryption backupStorage secondaryStorage externalAccess managementDatabases connectorsIdentity]
Optional: {}
appliesTo ClaimKind array AppliesTo lists the claim kinds that can select an option of the
section. A claim of another kind that selects one is refused with
NotAllowed. For that kind, the section is never required, also when the
Environment marks it required.
Enum: [CamundaClusterClaim CamundaManagementClusterClaim]
outputs OutputDecl array Outputs declares the outputs that every registration of the section
writes.
Optional: {}

ResourceRef

ResourceRef is one resource that a plugin made for a request, in the cluster or in a cloud.

Appears in: - PluginRequestStatus

Field Description Default Validation
kind string Kind is the kind of the resource, for example S3Bucket or StorageClass. MinLength: 1
name string Name is the name of the resource. MinLength: 1
id string ID is the identifier of the resource in its system, for example an ARN. Optional: {}
location string Location is where the resource is, for example a cloud region. Optional: {}
role string Role says what the resource does for the request. Optional: {}
onOrphan OnOrphan OnOrphan says what happens to the resource with the deletion policy
Orphan.
Enum: [Kept Deleted]

Selection

Underlying type: string

Selection says how many options of a section one claim can select.

Validation: - Enum: [One Many]

Appears in: - PluginSectionSpec

Field Description
One SelectionOne lets a claim select at most one option of the section.
Many SelectionMany lets a claim select more than one option of the section.

ServiceAccountRef

ServiceAccountRef names a ServiceAccount in a named namespace.

Appears in: - PluginRegistrationSpec

Field Description Default Validation
namespace string Namespace is the namespace of the ServiceAccount. MaxLength: 63
MinLength: 1
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
name string Name is the name of the ServiceAccount. MaxLength: 253
MinLength: 1
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$

Severity

Underlying type: string

Severity is the weight of a summary item.

Validation: - Enum: [Info Warning Error]

Appears in: - SummaryItem

Field Description
Info SeverityInfo is a fact that needs no action.
Warning SeverityWarning is a fact that needs attention soon.
Error SeverityError is a fact that needs action now.

Slot

Underlying type: string

Slot names the fields of the generated resource that the outputs of a section fill. The set is closed.

Validation: - Enum: [workloadIdentity volumeEncryption backupStorage secondaryStorage externalAccess managementDatabases connectorsIdentity]

Appears in: - PluginSectionSpec

Field Description
workloadIdentity SlotWorkloadIdentity fills the ServiceAccount annotations of the cluster.
volumeEncryption SlotVolumeEncryption fills the storage class of the Zeebe volumes.
backupStorage SlotBackupStorage fills the backup storage reference of the cluster.
secondaryStorage SlotSecondaryStorage fills the secondary storage reference of the cluster.
externalAccess SlotExternalAccess fills the external URLs of a cluster or a
management cluster.
managementDatabases SlotManagementDatabases fills the database references of Keycloak,
Identity, and Web Modeler in a management cluster.
connectorsIdentity SlotConnectorsIdentity fills the ServiceAccount annotations of the
Connectors.

SummaryItem

SummaryItem is one fact that a plugin reports about a request.

Appears in: - PluginRequestStatus

Field Description Default Validation
label string Label names the fact. MinLength: 1
value string Value is the value of the fact.
severity Severity Severity is the weight of the fact. The fleet manager lists Warning
and Error items as warnings.
Info Enum: [Info Warning Error]
Optional: {}

TargetRef

TargetRef names the resource that a request serves. The claim names it before the resource exists.

Appears in: - PluginRequestSpec

Field Description Default Validation
kind string Kind is the kind of the resource, for example CamundaCluster. MinLength: 1
name string Name is the name of the resource, in the namespace of the request. MinLength: 1
serviceAccountName string ServiceAccountName is the ServiceAccount that the pods of the resource
run under.
MaxLength: 253
Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
Optional: {}
additionalServiceAccounts string array AdditionalServiceAccounts are the names of more ServiceAccounts that
the cloud identity of the request also trusts. Examples are the
ServiceAccounts of the built-in storage that takes the backup storage
input. Each name is a ServiceAccount in the namespace of the request.
A name with a namespace part is refused, so that a request never makes
a cloud identity trust a ServiceAccount of another namespace.
items:MaxLength: 253
items:Pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
Optional: {}