Skip to main content
All operator CRDs

Kafka

Expand a field to see its description, example, and default behavior. Nested fields are grouped under their parent.

API group
krabka.io
Scope
Namespaced
Resource name
kafkas
Short names
kk

Required fields must be present when their parent object exists. [] denotes an array item; {key} denotes a map value. status is written by the operator. Reconcile-time checks and runtime defaults can add requirements beyond the schema.

Examples are illustrative JSON values. Open “View JSON example” for an object or array. Adapt names, endpoints, and credentials to your cluster. Kubernetes applies schema defaults when the containing object exists. Runtime and omission notes describe operator behavior. Status examples show reported data.

Runtime notes and domain examples were reviewed against operator source at b409b56.

View the complete CRD manifest at 618d621
Example manifest

This example includes the required spec fields. Adapt its values and create any referenced resources before applying it.

apiVersion: krabka.io/v1alpha1
kind: Kafka
metadata:
  name: my-cluster
  namespace: default
spec:
  kafkaVersion: 4.0.0

krabka.io/v1alpha1

Served API version · Storage version · 368 schema entries

Complete OpenAPI schema (JSON)
{
  "description": "Auto-generated derived type for KafkaSpec via `CustomResource`",
  "properties": {
    "spec": {
      "description": "Krabka cluster spec. The spec carries only the version label. Sibling\n`KafkaNodePool`s labeled `krabka.io/cluster=<this name>` describe the\nbroker pods.",
      "properties": {
        "authorization": {
          "description": "Cluster-level authorizer selection. When `None`, the broker uses the\ndefault `AllowAll` authorizer and makes no ACL checks. When `Some`, the\noperator renders the `[authorization]` TOML section, so the broker\nbuilds the matching `Arc<dyn Authorizer>`. That is\n`SimpleAclAuthorizer` for `type: simple`, and `OpaAuthorizer` for\n`type: opa`. With `simple` or `opa` selected, the operator's\ninter-broker principal MUST appear in `super_users`. There is no\nimplicit `ANONYMOUS` allow, and operators must opt in explicitly.",
          "nullable": true,
          "properties": {
            "allowOnError": {
              "type": "boolean"
            },
            "expireAfterMs": {
              "minimum": 1000,
              "type": "integer"
            },
            "initialCacheCapacity": {
              "minimum": 0,
              "type": "integer"
            },
            "maximumCacheSize": {
              "minimum": 1,
              "type": "integer"
            },
            "superUsers": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "type": {
              "enum": [
                "simple",
                "opa"
              ],
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "type"
          ],
          "type": "object"
        },
        "brokerTuning": {
          "description": "Validated broker operational policy rendered into `[runtime]`.",
          "nullable": true,
          "properties": {
            "aclMaxPrincipal": {
              "nullable": true,
              "type": "string"
            },
            "aclMaxResourceName": {
              "nullable": true,
              "type": "string"
            },
            "auditEventQueueCapacity": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "auditPartitionWaitTimeout": {
              "nullable": true,
              "type": "string"
            },
            "auditSpoolReplayInterval": {
              "nullable": true,
              "type": "string"
            },
            "auditStatsPollInterval": {
              "nullable": true,
              "type": "string"
            },
            "auditTailReadMax": {
              "nullable": true,
              "type": "string"
            },
            "auditTailWindowOffsets": {
              "format": "int64",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "autoJoinRetryBackoff": {
              "nullable": true,
              "type": "string"
            },
            "autoJoinVoterRequestTimeout": {
              "nullable": true,
              "type": "string"
            },
            "classicGroupInitialRebalanceDelay": {
              "nullable": true,
              "type": "string"
            },
            "cleanerInterval": {
              "nullable": true,
              "type": "string"
            },
            "clientMetricsDefaultInterval": {
              "nullable": true,
              "type": "string"
            },
            "clientMetricsEvictionTick": {
              "nullable": true,
              "type": "string"
            },
            "clientMetricsOtlpQueueCapacity": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "clientMetricsPromSnapshotTtl": {
              "nullable": true,
              "type": "string"
            },
            "clientMetricsStaleFloor": {
              "nullable": true,
              "type": "string"
            },
            "clientMetricsStalePushIntervals": {
              "format": "uint32",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "clientMetricsTelemetryMax": {
              "nullable": true,
              "type": "string"
            },
            "connectionCreationThrottleMax": {
              "nullable": true,
              "type": "string"
            },
            "consumerGroupHeartbeatInterval": {
              "nullable": true,
              "type": "string"
            },
            "consumerGroupMaxHeartbeatInterval": {
              "nullable": true,
              "type": "string"
            },
            "consumerGroupMaxSessionTimeout": {
              "nullable": true,
              "type": "string"
            },
            "consumerGroupMaxSize": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "consumerGroupMinHeartbeatInterval": {
              "nullable": true,
              "type": "string"
            },
            "consumerGroupMinSessionTimeout": {
              "nullable": true,
              "type": "string"
            },
            "consumerGroupSessionTimeout": {
              "nullable": true,
              "type": "string"
            },
            "controlledShutdownDrainTimeout": {
              "nullable": true,
              "type": "string"
            },
            "controllerElectionTimeout": {
              "nullable": true,
              "type": "string"
            },
            "controllerFetchMissLimit": {
              "format": "uint32",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "controllerHeartbeatInterval": {
              "nullable": true,
              "type": "string"
            },
            "coordinatorActorMailboxCapacity": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "coordinatorSessionExpiryTick": {
              "nullable": true,
              "type": "string"
            },
            "coordinatorShutdownAckTimeout": {
              "nullable": true,
              "type": "string"
            },
            "defaultMinInsyncReplicas": {
              "format": "int32",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "delegationTokenDefaultRenewPeriod": {
              "nullable": true,
              "type": "string"
            },
            "delegationTokenExpiryCheckInterval": {
              "nullable": true,
              "type": "string"
            },
            "delegationTokenMaxLifetime": {
              "nullable": true,
              "type": "string"
            },
            "disklessWalFlushInterval": {
              "nullable": true,
              "type": "string"
            },
            "disklessWalFlushMaxSize": {
              "nullable": true,
              "type": "string"
            },
            "disklessWalIndexProjectionTimeout": {
              "nullable": true,
              "type": "string"
            },
            "disklessWalLocalReplicaCount": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "disklessWalTrimSafetyLag": {
              "format": "int64",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "futureLogMoveReadChunk": {
              "nullable": true,
              "type": "string"
            },
            "futureLogMoveRetryBackoff": {
              "nullable": true,
              "type": "string"
            },
            "gaugePollInterval": {
              "nullable": true,
              "type": "string"
            },
            "heartbeatInterval": {
              "nullable": true,
              "type": "string"
            },
            "heartbeatTimeout": {
              "nullable": true,
              "type": "string"
            },
            "interBrokerServerName": {
              "minLength": 1,
              "nullable": true,
              "type": "string"
            },
            "isrScanInterval": {
              "nullable": true,
              "type": "string"
            },
            "leaderImbalanceCheckInterval": {
              "nullable": true,
              "type": "string"
            },
            "leaderImbalancePerBroker": {
              "nullable": true,
              "type": "string"
            },
            "livenessTickInterval": {
              "nullable": true,
              "type": "string"
            },
            "logReadBufferCap": {
              "nullable": true,
              "type": "string"
            },
            "logTimestampScanWindow": {
              "nullable": true,
              "type": "string"
            },
            "maxConnections": {
              "format": "uint",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "maxConnectionsPerIp": {
              "format": "uint",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "maxIncrementalFetchSessionCacheSlots": {
              "format": "uint",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "maxProduceGroup": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "metadataMaxBetweenSnapshots": {
              "nullable": true,
              "type": "string"
            },
            "metadataMaxSnapshotInterval": {
              "nullable": true,
              "type": "string"
            },
            "metadataRaftCommandQueueCapacity": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "metadataRaftFetchMax": {
              "nullable": true,
              "type": "string"
            },
            "metadataSnapshotFetchMax": {
              "nullable": true,
              "type": "string"
            },
            "metadataSnapshotIntervalRecords": {
              "format": "uint64",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "oauthJwksHttpTimeout": {
              "nullable": true,
              "type": "string"
            },
            "observerFetchMax": {
              "nullable": true,
              "type": "string"
            },
            "observerLagBound": {
              "format": "uint64",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "observerPollInterval": {
              "nullable": true,
              "type": "string"
            },
            "offsetsTopicMetadataWaitTimeout": {
              "nullable": true,
              "type": "string"
            },
            "opaHttpTimeout": {
              "nullable": true,
              "type": "string"
            },
            "operatorRecoveryDeadline": {
              "nullable": true,
              "type": "string"
            },
            "partitionDiskScanInterval": {
              "nullable": true,
              "type": "string"
            },
            "partitionWriterQueueDepth": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "producerIdExpiration": {
              "nullable": true,
              "type": "string"
            },
            "producerIdExpirationScanInterval": {
              "nullable": true,
              "type": "string"
            },
            "quotaThrottleMax": {
              "nullable": true,
              "type": "string"
            },
            "recordDecompressionMaxRatio": {
              "nullable": true,
              "type": "string"
            },
            "recordDecompressionOutputCeiling": {
              "nullable": true,
              "type": "string"
            },
            "recordDecompressionOutputFloor": {
              "nullable": true,
              "type": "string"
            },
            "remoteLogManagerInterval": {
              "nullable": true,
              "type": "string"
            },
            "replicaLagTimeMax": {
              "nullable": true,
              "type": "string"
            },
            "replicationEpochFenceBackoff": {
              "nullable": true,
              "type": "string"
            },
            "replicationFetchMax": {
              "nullable": true,
              "type": "string"
            },
            "replicationFetchMaxWait": {
              "nullable": true,
              "type": "string"
            },
            "replicationFetchMin": {
              "nullable": true,
              "type": "string"
            },
            "replicationReconnectDelayCap": {
              "nullable": true,
              "type": "string"
            },
            "replicationReconnectInitialDelay": {
              "nullable": true,
              "type": "string"
            },
            "replicationSendErrorBackoff": {
              "nullable": true,
              "type": "string"
            },
            "replicationThrottleExhaustedBackoff": {
              "nullable": true,
              "type": "string"
            },
            "replicationUnexpectedErrorBackoff": {
              "nullable": true,
              "type": "string"
            },
            "replicationUnknownTopicRetryDelay": {
              "nullable": true,
              "type": "string"
            },
            "rlmmBootstrapBackoffInitial": {
              "nullable": true,
              "type": "string"
            },
            "rlmmBootstrapBackoffMax": {
              "nullable": true,
              "type": "string"
            },
            "rlmmReconcileTick": {
              "nullable": true,
              "type": "string"
            },
            "selfRegistrationBackoffMax": {
              "nullable": true,
              "type": "string"
            },
            "selfRegistrationBackoffMin": {
              "nullable": true,
              "type": "string"
            },
            "selfRegistrationMaxAttempts": {
              "format": "uint32",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "sendfileMin": {
              "nullable": true,
              "type": "string"
            },
            "shareGroupEnable": {
              "nullable": true,
              "type": "boolean"
            },
            "shareGroupHeartbeatInterval": {
              "nullable": true,
              "type": "string"
            },
            "shareGroupIsolationLevel": {
              "nullable": true,
              "type": "string"
            },
            "shareGroupMaxDeliveryAttempts": {
              "format": "int16",
              "maximum": 32767,
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "shareGroupMaxInflightRecords": {
              "format": "int32",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "shareGroupMaxSize": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "shareGroupRecordLockDuration": {
              "nullable": true,
              "type": "string"
            },
            "shareGroupSessionTimeout": {
              "nullable": true,
              "type": "string"
            },
            "shareRecoveryReadMax": {
              "nullable": true,
              "type": "string"
            },
            "shareSessionCacheMaxWhenUnlimited": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "shareStateNumPartitions": {
              "format": "int32",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "shareStateReplicationFactor": {
              "format": "int16",
              "maximum": 32767,
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "socketReceiveBuffer": {
              "nullable": true,
              "type": "string"
            },
            "socketRequestMax": {
              "nullable": true,
              "type": "string"
            },
            "socketSendBuffer": {
              "nullable": true,
              "type": "string"
            },
            "startupLeaderWaitTimeout": {
              "nullable": true,
              "type": "string"
            },
            "streamsGroupAcceptableRecoveryLag": {
              "format": "int64",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "streamsGroupAssignor": {
              "nullable": true,
              "type": "string"
            },
            "streamsGroupEnable": {
              "nullable": true,
              "type": "boolean"
            },
            "streamsGroupHeartbeatInterval": {
              "nullable": true,
              "type": "string"
            },
            "streamsGroupMaxSize": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "streamsGroupNumStandbyReplicas": {
              "format": "int32",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "streamsGroupNumWarmupReplicas": {
              "format": "int32",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "streamsGroupSessionTimeout": {
              "nullable": true,
              "type": "string"
            },
            "streamsGroupTaskOffsetInterval": {
              "nullable": true,
              "type": "string"
            },
            "streamsInternalTopicReplicationFactor": {
              "format": "int16",
              "maximum": 32767,
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "syncGroupFollowerWait": {
              "nullable": true,
              "type": "string"
            },
            "telemetryDecompressedOutputCeiling": {
              "nullable": true,
              "type": "string"
            },
            "telemetryDecompressedOutputFloor": {
              "nullable": true,
              "type": "string"
            },
            "telemetryMaxDecompressionRatio": {
              "nullable": true,
              "type": "string"
            },
            "tlsReloadInterval": {
              "nullable": true,
              "type": "string"
            },
            "transactionMaxTimeout": {
              "nullable": true,
              "type": "string"
            },
            "transactionMinTimeout": {
              "nullable": true,
              "type": "string"
            },
            "transactionRecoveryReadMax": {
              "nullable": true,
              "type": "string"
            },
            "transactionStateNumPartitions": {
              "format": "int32",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "transactionStateReplicationFactor": {
              "format": "int16",
              "maximum": 32767,
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            },
            "txnAbortCleanupInterval": {
              "nullable": true,
              "type": "string"
            },
            "uncleanRecoveryAggressiveDeadline": {
              "nullable": true,
              "type": "string"
            },
            "uncleanRecoveryBalancedDeadline": {
              "nullable": true,
              "type": "string"
            },
            "uncleanRecoveryQueueCapacity": {
              "format": "uint",
              "minimum": 1,
              "nullable": true,
              "type": "integer"
            }
          },
          "type": "object"
        },
        "clientsCa": {
          "description": "Per-cluster CA that signs `KafkaUser` TLS certs. When absent, the\noperator uses a fully-defaulted `CertificateAuthority`.",
          "nullable": true,
          "properties": {
            "generateCertificateAuthority": {
              "default": true,
              "description": "When `true`, which is the default, the operator generates and\nrenews this CA. When `false`, the cluster admin must create the CA\n`Secret` pair first, and the operator refuses to overwrite them.\nThe admin renews a BYO CA. The `CronJob` skips a BYO CA and emits\nan Event when the CA comes near its expiry.",
              "type": "boolean"
            },
            "renewalDays": {
              "default": 30,
              "description": "Window in days before `notAfter` in which the renewal `CronJob`\nreissues the leaf certs. Default 30.",
              "format": "uint32",
              "minimum": 0,
              "type": "integer"
            },
            "validityDays": {
              "default": 365,
              "description": "Cert validity in days. Default 365.",
              "format": "uint32",
              "minimum": 0,
              "type": "integer"
            }
          },
          "type": "object"
        },
        "clusterCa": {
          "description": "Per-cluster CA for inter-broker mTLS and broker certs. When absent,\nthe operator uses a fully-defaulted `CertificateAuthority`, which it\ngenerates itself with 365/30 days.",
          "nullable": true,
          "properties": {
            "generateCertificateAuthority": {
              "default": true,
              "description": "When `true`, which is the default, the operator generates and\nrenews this CA. When `false`, the cluster admin must create the CA\n`Secret` pair first, and the operator refuses to overwrite them.\nThe admin renews a BYO CA. The `CronJob` skips a BYO CA and emits\nan Event when the CA comes near its expiry.",
              "type": "boolean"
            },
            "renewalDays": {
              "default": 30,
              "description": "Window in days before `notAfter` in which the renewal `CronJob`\nreissues the leaf certs. Default 30.",
              "format": "uint32",
              "minimum": 0,
              "type": "integer"
            },
            "validityDays": {
              "default": 365,
              "description": "Cert validity in days. Default 365.",
              "format": "uint32",
              "minimum": 0,
              "type": "integer"
            }
          },
          "type": "object"
        },
        "config": {
          "additionalProperties": {
            "type": "string"
          },
          "description": "Opaque broker properties, in `server.properties`-style key and value\npairs. The operator passes them through to the broker's\n`[server_properties]` TOML table, and the broker treats them as inert\ntoday. Changes propagate through the config hash.",
          "nullable": true,
          "type": "object"
        },
        "delegationToken": {
          "description": "Delegation-token master HMAC key source. When `None`, the broker\nrejects all KIP-48 delegation-token RPCs with err 61\n`DELEGATION_TOKEN_AUTH_DISABLED`. When `Some`, the operator injects\n`KRABKA_DELEGATION_TOKEN_SECRET_KEY` into each broker pod through a\n`valueFrom.secretKeyRef`. The key is then part of the rendered\n`StatefulSet`, so the SSA reconcile does not race with out-of-band\n`kubectl set env` patches.",
          "nullable": true,
          "properties": {
            "secretKeyRef": {
              "description": "Reference to a Kubernetes `Secret` in the same namespace as the\n`Kafka` CR. Its `data.<key>` value is the broker's master HMAC key for\nKIP-48 delegation tokens.",
              "properties": {
                "key": {
                  "description": "Key within the Secret's `data`. Defaults to `secret-key`.",
                  "nullable": true,
                  "type": "string"
                },
                "name": {
                  "description": "Secret name in the same namespace as the `Kafka` CR.",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            }
          },
          "required": [
            "secretKeyRef"
          ],
          "type": "object"
        },
        "interBrokerKerberos": {
          "description": "Inter-broker Kerberos initiate config. It is required when\n`interBrokerListenerName` resolves to a `type: gssapi` listener. It\nsupplies the shared client principal and the KDC. The keytab comes from\nthat listener's `keytabSecretRef`.",
          "nullable": true,
          "properties": {
            "clientPrincipal": {
              "description": "Principal that every broker authenticates as when it dials peers, for\nexample `kafka@EXAMPLE.COM`. It must exist in the shared keytab.",
              "type": "string"
            },
            "kdcUrl": {
              "description": "KDC endpoint, for example `tcp://kdc:88`.",
              "type": "string"
            },
            "serviceName": {
              "description": "Target SPN primary. Defaults to `kafka`.",
              "nullable": true,
              "type": "string"
            }
          },
          "required": [
            "clientPrincipal",
            "kdcUrl"
          ],
          "type": "object"
        },
        "interBrokerListenerName": {
          "description": "Name of the listener for inter-broker traffic. When `None`, the\noperator picks the first `internal` listener. When `listeners` is\nempty, the operator picks the synthesized default `\"PLAIN\"`.",
          "nullable": true,
          "type": "string"
        },
        "kafkaVersion": {
          "description": "Krabka version label. The operator propagates it to all pool pods\nthrough the `app.kubernetes.io/version` label.",
          "type": "string"
        },
        "krb5ConfSecretRef": {
          "description": "Optional process-wide `krb5.conf`. The operator mounts it into the\nbroker pods and points `KRB5_CONFIG` at it. It serves both the accept\npath and the initiate path.",
          "nullable": true,
          "properties": {
            "key": {
              "description": "Key within the Secret whose value is the krb5.conf contents.",
              "type": "string"
            },
            "secretName": {
              "description": "Name of the Secret holding the krb5.conf.",
              "type": "string"
            }
          },
          "required": [
            "key",
            "secretName"
          ],
          "type": "object"
        },
        "listeners": {
          "description": "Named listeners. An empty or absent list synthesizes one internal\n`PLAIN` listener on port 9092.",
          "items": {
            "properties": {
              "authentication": {
                "description": "Per-listener authentication mechanism. Absent means anonymous, and no\nclient identity is required. When the field is `type: tls`, the\nlistener must also have `tls: true`. The reconcile enforces this\nrule.",
                "nullable": true,
                "properties": {
                  "accessTokenIsJwt": {
                    "type": "boolean"
                  },
                  "clientId": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "clientSecret": {
                    "properties": {
                      "key": {
                        "minLength": 1,
                        "type": "string"
                      },
                      "secretName": {
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "key",
                      "secretName"
                    ],
                    "type": "object"
                  },
                  "customClaimCheck": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "enableOauthBearer": {
                    "type": "boolean"
                  },
                  "fallbackUserNameClaim": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "fallbackUserNamePrefix": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "groupsClaim": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "groupsClaimDelimiter": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "introspectionEndpointUri": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "introspectionHttpTimeoutSeconds": {
                    "minimum": 1,
                    "type": "integer"
                  },
                  "jwksEndpointUri": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "jwksExpirySeconds": {
                    "format": "int32",
                    "minimum": 1,
                    "type": "integer"
                  },
                  "jwksIgnoreKeyUse": {
                    "type": "boolean"
                  },
                  "jwksMinRefreshPauseSeconds": {
                    "format": "int32",
                    "minimum": 0,
                    "type": "integer"
                  },
                  "jwksRefreshSeconds": {
                    "minimum": 0,
                    "type": "integer"
                  },
                  "kdc": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "keytabSecretRef": {
                    "properties": {
                      "key": {
                        "minLength": 1,
                        "type": "string"
                      },
                      "secretName": {
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "key",
                      "secretName"
                    ],
                    "type": "object"
                  },
                  "maxClockSkewSeconds": {
                    "minimum": 0,
                    "type": "integer"
                  },
                  "maxSecondsWithoutReauthentication": {
                    "format": "int32",
                    "minimum": 1,
                    "type": "integer"
                  },
                  "maxTimeSkew": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "principalToLocalRules": {
                    "items": {
                      "minLength": 1,
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "realm": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "serviceName": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "tlsTrustedCertificates": {
                    "items": {
                      "properties": {
                        "certificate": {
                          "minLength": 1,
                          "type": "string"
                        },
                        "secretName": {
                          "minLength": 1,
                          "type": "string"
                        }
                      },
                      "required": [
                        "certificate",
                        "secretName"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "type": {
                    "enum": [
                      "tls",
                      "scram-sha-512",
                      "scram-sha-256",
                      "oauth",
                      "gssapi"
                    ],
                    "type": "string"
                  },
                  "userInfoEndpointUri": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "userNameClaim": {
                    "type": "string"
                  },
                  "validAudience": {
                    "type": "string"
                  },
                  "validIssuerUri": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "validTokenType": {
                    "minLength": 1,
                    "type": "string"
                  }
                },
                "required": [
                  "type"
                ],
                "type": "object"
              },
              "configuration": {
                "description": "Optional listener-type-specific configuration.",
                "nullable": true,
                "properties": {
                  "bootstrap": {
                    "nullable": true,
                    "properties": {
                      "annotations": {
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Annotations to add to the bootstrap Service.",
                        "type": "object"
                      },
                      "host": {
                        "description": "`ingress` / `route` only: bootstrap hostname.",
                        "nullable": true,
                        "type": "string"
                      },
                      "labels": {
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Labels to add to the bootstrap Service.",
                        "type": "object"
                      },
                      "loadBalancerIP": {
                        "description": "`loadbalancer` only: pin the bootstrap LB IP.",
                        "nullable": true,
                        "type": "string"
                      },
                      "nodePort": {
                        "description": "`nodeport` only: pin the bootstrap `NodePort`.",
                        "format": "int32",
                        "nullable": true,
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  },
                  "brokers": {
                    "items": {
                      "properties": {
                        "advertisedHost": {
                          "description": "Override the computed advertised host.",
                          "nullable": true,
                          "type": "string"
                        },
                        "advertisedPort": {
                          "description": "Override the computed advertised port.",
                          "format": "int32",
                          "nullable": true,
                          "type": "integer"
                        },
                        "broker": {
                          "description": "Broker id this override applies to (matches the node id).",
                          "format": "int32",
                          "type": "integer"
                        },
                        "host": {
                          "description": "`ingress` / `route` only: per-broker hostname.",
                          "nullable": true,
                          "type": "string"
                        },
                        "loadBalancerIP": {
                          "description": "`loadbalancer` only: pin this broker's `Service.spec.loadBalancerIP`.",
                          "nullable": true,
                          "type": "string"
                        },
                        "nodePort": {
                          "description": "`nodeport` only: pin this broker's `Service.spec.ports[0].nodePort`.",
                          "format": "int32",
                          "nullable": true,
                          "type": "integer"
                        }
                      },
                      "required": [
                        "broker"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "class": {
                    "description": "`ingress` only: the `spec.ingressClassName` that the operator sets on\nevery generated `Ingress`. This is the Strimzi-shaped\n`configuration.class`. It is inert for other listener types.",
                    "nullable": true,
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "name": {
                "description": "Unique within the cluster. Alphanumeric characters and `-`, ≤25\nchars. It is the Kafka listener name, and it appears in\n`bootstrap.servers`-style URLs.",
                "type": "string"
              },
              "networkPolicyPeers": {
                "description": "Per-listener peer allow-list. It is tri-state:\n- `None` gives no per-listener restriction, that is, allow-all on this\n  port.\n- `Some(vec![])` gives deny-all on this listener port. The operator\n  emits no per-listener rule, and the default-deny applies.\n- `Some(non_empty)` lets only the listed peers reach this port.\n\nThe operator reads this field only when `Kafka.spec.networkPolicy` is\nset. In any other case the field is inert. The operator auto-allow rule\nstill fires on this port for deny-all listeners, so that the operator\ncan manage the cluster.",
                "items": {
                  "description": "Subset of `networking.k8s.io/v1.NetworkPolicyPeer`.\n\nThis struct omits `ipBlock` on purpose. Someone can add it later if\nexternal CIDR allow-lists become a real need.",
                  "properties": {
                    "namespaceSelector": {
                      "description": "A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.",
                      "nullable": true,
                      "properties": {
                        "matchExpressions": {
                          "description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.",
                          "items": {
                            "description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.",
                            "properties": {
                              "key": {
                                "description": "key is the label key that the selector applies to.",
                                "type": "string"
                              },
                              "operator": {
                                "description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.",
                                "type": "string"
                              },
                              "values": {
                                "description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.",
                                "items": {
                                  "type": "string"
                                },
                                "type": "array"
                              }
                            },
                            "required": [
                              "key",
                              "operator"
                            ],
                            "type": "object"
                          },
                          "type": "array"
                        },
                        "matchLabels": {
                          "additionalProperties": {
                            "type": "string"
                          },
                          "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.",
                          "type": "object"
                        }
                      },
                      "type": "object"
                    },
                    "podSelector": {
                      "description": "A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.",
                      "nullable": true,
                      "properties": {
                        "matchExpressions": {
                          "description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.",
                          "items": {
                            "description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.",
                            "properties": {
                              "key": {
                                "description": "key is the label key that the selector applies to.",
                                "type": "string"
                              },
                              "operator": {
                                "description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.",
                                "type": "string"
                              },
                              "values": {
                                "description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.",
                                "items": {
                                  "type": "string"
                                },
                                "type": "array"
                              }
                            },
                            "required": [
                              "key",
                              "operator"
                            ],
                            "type": "object"
                          },
                          "type": "array"
                        },
                        "matchLabels": {
                          "additionalProperties": {
                            "type": "string"
                          },
                          "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.",
                          "type": "object"
                        }
                      },
                      "type": "object"
                    }
                  },
                  "type": "object"
                },
                "nullable": true,
                "type": "array"
              },
              "port": {
                "description": "Container port the broker binds. Unique within the cluster.",
                "format": "int32",
                "type": "integer"
              },
              "tls": {
                "default": false,
                "description": "Transport-level TLS. When `true`, the listener uses the per-broker\nkeystore that the cluster CA signed, and clients must use TLS to\nconnect. This field is independent of `authentication`. A `tls: true`\nlistener with no `authentication` is anonymous over TLS.",
                "type": "boolean"
              },
              "type": {
                "description": "Listener type. `internal` is in-cluster. `nodeport` and\n`loadbalancer` create external Services. The schema accepts `ingress`\nand `route`, but the reconcile rejects them.",
                "enum": [
                  "internal",
                  "nodeport",
                  "loadbalancer",
                  "ingress",
                  "route"
                ],
                "type": "string"
              }
            },
            "required": [
              "name",
              "port",
              "type"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "logging": {
          "description": "Broker log configuration. When `None`, the brokers use their built-in\ndefault `RUST_LOG` filter. When `Some`, the operator composes an inline\n`tracing` env-filter string, or reads an external one. The operator\nthen renders it into the broker `ConfigMap` under the `rust.log` key,\nwires it into the `RUST_LOG` env of each broker pod, and rolls the\ncluster on a change through the config hash.",
          "nullable": true,
          "properties": {
            "loggers": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Inline loggers, from tracing target to level. The key `root` is\ncase-insensitive and sets the global default level as a bare\nenv-filter directive. Any other key is a tracing target, that is, a\nRust module path such as `krabka_broker`. The levels are\n`trace|debug|info|warn|error|off`, and they are case-insensitive.\n`fatal` is accepted as an alias for `error`.",
              "type": "object"
            },
            "type": {
              "default": "inline",
              "enum": [
                "inline",
                "external"
              ],
              "type": "string"
            },
            "valueFrom": {
              "description": "External logging source. This field is required when\n`type: external`. The operator uses the value of the referenced\n`ConfigMap` key verbatim as the broker's `RUST_LOG` filter.",
              "nullable": true,
              "properties": {
                "configMapKeyRef": {
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "key",
                    "name"
                  ],
                  "type": "object"
                }
              },
              "required": [
                "configMapKeyRef"
              ],
              "type": "object"
            }
          },
          "type": "object"
        },
        "metadataVersion": {
          "description": "`KRaft` metadata version, the runtime analog of\n`inter.broker.protocol.version`. When unset, it tracks the\n`major.minor` of `kafkaVersion`. When set, it pins the metadata version\nfor a two-step upgrade or an online downgrade. The operator validates\nit against `kafkaVersion`; changes on an existing cluster are finalized\nthrough `UpdateFeatures`, with safe-downgrade semantics for a lower\ntarget. Rejections surface `KafkaVersionValid=False` and leave\n`status.metadataVersion` unchanged.",
          "nullable": true,
          "type": "string"
        },
        "metricsConfig": {
          "description": "Prometheus scrape configuration. When `None`, the brokers do not bind\n`/metrics`, and the operator renders no `PodMonitor` and no\n`ServiceMonitor`. When `Some`, the broker `StatefulSet` gains a\n`metrics` container port on TCP 9404, and the operator SSA-applies the\nresources that `pod_monitor` and `service_monitor` request.",
          "nullable": true,
          "properties": {
            "podMonitor": {
              "nullable": true,
              "properties": {
                "interval": {
                  "nullable": true,
                  "type": "string"
                },
                "labels": {
                  "additionalProperties": {
                    "type": "string"
                  },
                  "type": "object"
                },
                "scrapeTimeout": {
                  "nullable": true,
                  "type": "string"
                }
              },
              "type": "object"
            },
            "serviceMonitor": {
              "nullable": true,
              "properties": {
                "interval": {
                  "nullable": true,
                  "type": "string"
                },
                "labels": {
                  "additionalProperties": {
                    "type": "string"
                  },
                  "type": "object"
                },
                "scrapeTimeout": {
                  "nullable": true,
                  "type": "string"
                }
              },
              "type": "object"
            },
            "type": {
              "default": "prometheus",
              "enum": [
                "prometheus"
              ],
              "type": "string"
            }
          },
          "type": "object"
        },
        "networkPolicy": {
          "description": "Opt-in `NetworkPolicy` generation. When `None`, the operator generates\nno `NetworkPolicy`. When `Some`, even `{}`, the operator renders a\ncluster-level `NetworkPolicy` that gates ingress to the broker and\ncontroller pods.",
          "nullable": true,
          "type": "object"
        },
        "tieredStorage": {
          "description": "KIP-405: cluster-wide tiered storage. When `Some`, every broker pod\nboots with the local-tier RSM enabled, with an `emptyDir` mounted at\n`/var/lib/krabka/remote`, which is the broker's\n`remote_log_storage_dir`, and with `[remote_storage]` rendered in the\nbroker TOML. The per-topic enablement does not change. It stays\n`KafkaTopic.spec.config[\"remote.storage.enable\"] = \"true\"`.\n\nWith the `emptyDir` default and `InmemoryRemoteLogMetadataManager` as\nthe only RLMM, tier data does not survive pod restarts. PVC support\npairs with the production RLMM.",
          "nullable": true,
          "properties": {
            "gcs": {
              "description": "GCS-backend tuning. It is required when `kind == Gcs`, and it must be\nabsent in any other case. The struct has the same shape as\n`krabka_remote_storage::GcsConfig`. The operator renders the\nnon-credential fields verbatim into the broker TOML's\n`[remote_storage.gcs]` block. S3 uses env-var credentials, but GCS does\nnot. The operator mounts an explicit service-account JSON key as a FILE\non the broker pod and gives it to the broker as `service_account_path`\nin the TOML. Unset credentials select keyless Workload Identity or\nADC.",
              "nullable": true,
              "properties": {
                "allowHttp": {
                  "description": "Allow plaintext HTTP. It is off by default. Turn it on for GCS\nemulators that run without TLS. Real GCS never needs it.",
                  "type": "boolean"
                },
                "bucket": {
                  "description": "GCS bucket name. Required.",
                  "type": "string"
                },
                "credentials": {
                  "description": "Optional explicit service-account credentials. When None, the broker\nuses Workload Identity or ADC, which is the keyless GKE path.",
                  "nullable": true,
                  "properties": {
                    "serviceAccountKey": {
                      "description": "Reference to the Secret holding the service-account JSON key.",
                      "properties": {
                        "key": {
                          "description": "Key within the Secret's `data`. Defaults to `secret-key`.",
                          "nullable": true,
                          "type": "string"
                        },
                        "name": {
                          "description": "Secret name in the same namespace as the `Kafka` CR.",
                          "type": "string"
                        }
                      },
                      "required": [
                        "name"
                      ],
                      "type": "object"
                    }
                  },
                  "required": [
                    "serviceAccountKey"
                  ],
                  "type": "object"
                },
                "endpoint": {
                  "description": "Optional custom GCS API base URL, for example for emulators and\nfakes. When `None`, the broker uses the standard Google Cloud Storage\nendpoint.",
                  "nullable": true,
                  "type": "string"
                },
                "multipartChunkSize": {
                  "description": "Override the per-part size for multipart uploads in bytes. When unset,\nthe broker uses\n`krabka_remote_storage::DEFAULT_MULTIPART_CHUNK_SIZE`, which is\n16 MiB.",
                  "format": "uint64",
                  "minimum": 0,
                  "nullable": true,
                  "type": "integer"
                },
                "multipartThreshold": {
                  "description": "Override the single-PUT and multipart cutoff in bytes. When unset, the\nbroker uses `krabka_remote_storage::DEFAULT_MULTIPART_THRESHOLD`, which\nis 100 MiB. Lower it in tests to exercise the multipart path on small\nfixtures.",
                  "format": "uint64",
                  "minimum": 0,
                  "nullable": true,
                  "type": "integer"
                },
                "prefix": {
                  "description": "Optional key prefix inside the bucket. It lets more than one Krabka\ncluster share a bucket without a collision.",
                  "nullable": true,
                  "type": "string"
                }
              },
              "required": [
                "bucket"
              ],
              "type": "object"
            },
            "metadataManager": {
              "description": "KIP-405: pick the `RemoteLogMetadataManager` that the broker pods run.\nWhen the field is absent, or when it is `type: Topic`, the broker\nactivates the durable\n`krabka_remote_storage_topic::TopicBasedRemoteLogMetadataManager`\nagainst the internal `__remote_log_metadata` topic. Tier-segment\nmetadata then survives pod restarts and is consistent across the\nbrokers in the cluster. Only an explicit `type: InMemory` selects the\nin-memory fixture, which is for test and dev only.",
              "nullable": true,
              "properties": {
                "topic": {
                  "description": "Topic-backed tuning. It is optional when `kind == Topic`, and the\nbroker fills the defaults for the bootstrap and topic parameters. It\nmust be absent in any other case.",
                  "nullable": true,
                  "properties": {
                    "bootstrap": {
                      "description": "`host:port` that the broker pod dials to reach its own listener, so\nthat it can publish and consume `__remote_log_metadata`. This is\nusually the pod's loopback inter-broker listener, for example\n`127.0.0.1:9094`.",
                      "type": "string"
                    },
                    "eventQueueCapacity": {
                      "description": "Capacity of the shared metadata-event delivery queue.",
                      "format": "uint",
                      "minimum": 1,
                      "nullable": true,
                      "type": "integer"
                    },
                    "fetchMaxBytes": {
                      "description": "Maximum bytes returned by each per-partition metadata fetch.",
                      "nullable": true,
                      "type": "string"
                    },
                    "fetchMaxWait": {
                      "description": "Maximum wait for each per-partition metadata fetch.",
                      "nullable": true,
                      "type": "string"
                    },
                    "fetchRetryBackoff": {
                      "description": "Backoff after a failed metadata fetch.",
                      "nullable": true,
                      "type": "string"
                    },
                    "numPartitions": {
                      "description": "Partition count for `__remote_log_metadata` on the first creation.\nDefaults to 50, which is the Kafka\n`remote.log.metadata.topic.num.partitions`.",
                      "format": "int32",
                      "nullable": true,
                      "type": "integer"
                    },
                    "replication": {
                      "description": "Replication factor for `__remote_log_metadata` on the first creation.\nDefaults to 3, which is the Kafka\n`remote.log.metadata.topic.replication.factor`.",
                      "format": "int32",
                      "nullable": true,
                      "type": "integer"
                    },
                    "snapshotInterval": {
                      "description": "RLMM cache snapshot cadence.",
                      "nullable": true,
                      "type": "string"
                    },
                    "topicCreateTimeout": {
                      "description": "Timeout for provisioning each internal metadata topic.",
                      "nullable": true,
                      "type": "string"
                    }
                  },
                  "required": [
                    "bootstrap"
                  ],
                  "type": "object"
                },
                "type": {
                  "description": "Implementation selector.",
                  "enum": [
                    "InMemory",
                    "Topic"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "type"
              ],
              "type": "object"
            },
            "persistence": {
              "description": "KIP-405: durable storage for the local-tier directory. It is valid\nonly with `type=Local`. When it is absent, which is the default, the\noperator renders an `emptyDir` for `tier-storage`. When `Some`, the\noperator renders a `volumeClaimTemplate` of the configured size and\nclass, so tier data survives pod restarts. Together with the\ntopic-backed RLMM, this closes the \"tier data is lost on pod restart\"\ncaveat.",
              "nullable": true,
              "properties": {
                "class": {
                  "description": "Storage class name. `None` means the cluster default.",
                  "nullable": true,
                  "type": "string"
                },
                "deleteClaim": {
                  "default": false,
                  "description": "`true` gives\n`persistentVolumeClaimRetentionPolicy.whenDeleted: Delete`. It must\nmatch the parent `KafkaNodePool.spec.storage.deleteClaim` when both\nPVCs are present, because K8s `StatefulSets` have one set-wide\nretention policy and no per-template override. The operator validates\nthis at reconcile time, and a mismatch surfaces as\n`TieredStorageInvalid`.",
                  "type": "boolean"
                },
                "size": {
                  "description": "K8s `Quantity`, for example `\"50Gi\"` or `\"500Mi\"`. It must be\nnon-empty. The Kubernetes API server validates the resource-quantity\nform at SSA time.",
                  "type": "string"
                }
              },
              "required": [
                "size"
              ],
              "type": "object"
            },
            "s3": {
              "description": "S3-backend tuning. It is required when `kind == S3`, and it must be\nabsent in any other case. The struct has the same shape as\n`krabka_remote_storage::S3Config`. The operator renders the\nnon-credential fields verbatim into the broker TOML's\n`[remote_storage.s3]` block. The credentials come from Kubernetes\nSecrets, and the operator injects them as the broker-pod env vars\n`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.",
              "nullable": true,
              "properties": {
                "allowHttp": {
                  "description": "Allow plaintext HTTP. It is off by default. Turn it on for a `MinIO`\nthat runs without TLS. AWS S3 never needs it.",
                  "type": "boolean"
                },
                "bucket": {
                  "description": "S3 bucket name. Required.",
                  "type": "string"
                },
                "credentials": {
                  "description": "Optional explicit credentials. When `None`, the broker falls back to\nthe AWS credential chain, such as IRSA on EKS or an instance profile on\nEC2.",
                  "nullable": true,
                  "properties": {
                    "accessKeyId": {
                      "description": "Reference to the Secret holding the `AWS_ACCESS_KEY_ID` value.",
                      "properties": {
                        "key": {
                          "description": "Key within the Secret's `data`. Defaults to `secret-key`.",
                          "nullable": true,
                          "type": "string"
                        },
                        "name": {
                          "description": "Secret name in the same namespace as the `Kafka` CR.",
                          "type": "string"
                        }
                      },
                      "required": [
                        "name"
                      ],
                      "type": "object"
                    },
                    "secretAccessKey": {
                      "description": "Reference to the Secret holding the `AWS_SECRET_ACCESS_KEY` value.",
                      "properties": {
                        "key": {
                          "description": "Key within the Secret's `data`. Defaults to `secret-key`.",
                          "nullable": true,
                          "type": "string"
                        },
                        "name": {
                          "description": "Secret name in the same namespace as the `Kafka` CR.",
                          "type": "string"
                        }
                      },
                      "required": [
                        "name"
                      ],
                      "type": "object"
                    }
                  },
                  "required": [
                    "accessKeyId",
                    "secretAccessKey"
                  ],
                  "type": "object"
                },
                "endpoint": {
                  "description": "Optional custom endpoint URL, for example `http://minio:9000` for\n`MinIO`, or `https://<account>.r2.cloudflarestorage.com` for Cloudflare\nR2. When `None`, the broker uses the AWS S3 endpoint for the configured\nregion.",
                  "nullable": true,
                  "type": "string"
                },
                "multipartChunkSize": {
                  "description": "Override the per-part size for multipart uploads in bytes. When unset,\nthe broker uses\n`krabka_remote_storage::DEFAULT_MULTIPART_CHUNK_SIZE`, which is\n16 MiB.",
                  "format": "uint64",
                  "minimum": 0,
                  "nullable": true,
                  "type": "integer"
                },
                "multipartThreshold": {
                  "description": "Override the single-PUT and multipart cutoff in bytes. When unset, the\nbroker uses `krabka_remote_storage::DEFAULT_MULTIPART_THRESHOLD`, which\nis 100 MiB. Lower it in tests to exercise the multipart path on small\nfixtures.",
                  "format": "uint64",
                  "minimum": 0,
                  "nullable": true,
                  "type": "integer"
                },
                "prefix": {
                  "description": "Optional key prefix inside the bucket. It lets more than one Krabka\ncluster share a bucket without a collision.",
                  "nullable": true,
                  "type": "string"
                },
                "region": {
                  "description": "AWS region. It is required even for the non-AWS endpoints `MinIO` and\nR2, because the `AmazonS3Builder` of `object_store` rejects an empty\nregion.",
                  "type": "string"
                }
              },
              "required": [
                "bucket",
                "region"
              ],
              "type": "object"
            },
            "type": {
              "description": "Backend kind selector.",
              "enum": [
                "Local",
                "S3",
                "Gcs"
              ],
              "type": "string"
            }
          },
          "required": [
            "type"
          ],
          "type": "object"
        },
        "tracing": {
          "description": "Distributed-tracing wiring for the broker pods. When `Some`, the\noperator renders the matching `KRABKA_OTLP_*` env vars onto every\nbroker pod. The broker's telemetry pipeline reads them with\n`TelemetryConfig::from_env` and installs the OTLP tracer at startup.\nWhen `None`, the operator emits no OTLP env vars, and the broker leaves\ntracing off. That is the default.",
          "nullable": true,
          "properties": {
            "otlp": {
              "description": "OTLP-backend tuning. Required when `kind == Otlp`.",
              "nullable": true,
              "properties": {
                "endpoint": {
                  "description": "Required. OTLP collector endpoint in the form `scheme://host:port`.\nThe operator renders it as `KRABKA_OTLP_ENDPOINT`. A set field also\nsets `KRABKA_OTLP_ENABLED=true`.",
                  "type": "string"
                },
                "protocol": {
                  "description": "OTLP wire protocol selector. It has the same shape as the broker's\ninternal `OtlpProtocol` enum and the `OTEL_EXPORTER_OTLP_PROTOCOL` spec\nvalues.",
                  "enum": [
                    "grpc",
                    "http_protobuf"
                  ],
                  "nullable": true,
                  "type": "string"
                },
                "sampleRatio": {
                  "description": "Optional sampling ratio in `[0.0, 1.0]`. The operator renders it as\n`KRABKA_OTLP_SAMPLE_RATIO`. An unset field leaves the binary's own\ndefault of `1.0`, which samples every trace.",
                  "format": "double",
                  "nullable": true,
                  "type": "number"
                },
                "serviceName": {
                  "description": "Optional `service.name` resource attribute. The operator renders it as\n`OTEL_SERVICE_NAME`. An unset field leaves the binary's own name, which\nis `\"krabka-broker\"` for `Kafka` and `\"krabka-gres\"` for `Gres`.",
                  "nullable": true,
                  "type": "string"
                },
                "timeout": {
                  "description": "Optional export timeout. The operator renders it as\n`KRABKA_OTLP_TIMEOUT`. An unset field leaves the binary's own default\nof `10s`.",
                  "nullable": true,
                  "type": "string"
                }
              },
              "required": [
                "endpoint"
              ],
              "type": "object"
            },
            "type": {
              "description": "Tracing backend selector.",
              "enum": [
                "Otlp"
              ],
              "type": "string"
            }
          },
          "required": [
            "type"
          ],
          "type": "object"
        }
      },
      "required": [
        "kafkaVersion"
      ],
      "type": "object"
    },
    "status": {
      "nullable": true,
      "properties": {
        "clientsCa": {
          "description": "Status surface for one CA.\n\nThe reconciler fills it in from the parsed CA cert and the CRD spec.",
          "nullable": true,
          "properties": {
            "certGeneration": {
              "default": 0,
              "description": "Monotonic generation of the active signing cert. It increments on\na same-key renewal and on a key promotion.",
              "format": "uint64",
              "minimum": 0,
              "type": "integer"
            },
            "generated": {
              "description": "`true` when the operator generated this CA, that is, when\n`generateCertificateAuthority == true`. `false` for a BYO CA.",
              "type": "boolean"
            },
            "keyGeneration": {
              "default": 0,
              "description": "Monotonic generation of the active signing key. It increments only\non a key replacement.",
              "format": "uint64",
              "minimum": 0,
              "type": "integer"
            },
            "notAfter": {
              "description": "RFC3339 `notAfter` of the current CA cert, which is the signing\ncert.",
              "type": "string"
            },
            "rotationPhase": {
              "description": "Staged key-replacement phase. One of `idle`, `key-replace-trust`,\nand `key-replace-promote`.",
              "nullable": true,
              "type": "string"
            },
            "trustAnchors": {
              "description": "Number of CA certs in the trust bundle now.",
              "format": "uint",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            }
          },
          "required": [
            "generated",
            "notAfter"
          ],
          "type": "object"
        },
        "clusterCa": {
          "description": "Status surface for one CA.\n\nThe reconciler fills it in from the parsed CA cert and the CRD spec.",
          "nullable": true,
          "properties": {
            "certGeneration": {
              "default": 0,
              "description": "Monotonic generation of the active signing cert. It increments on\na same-key renewal and on a key promotion.",
              "format": "uint64",
              "minimum": 0,
              "type": "integer"
            },
            "generated": {
              "description": "`true` when the operator generated this CA, that is, when\n`generateCertificateAuthority == true`. `false` for a BYO CA.",
              "type": "boolean"
            },
            "keyGeneration": {
              "default": 0,
              "description": "Monotonic generation of the active signing key. It increments only\non a key replacement.",
              "format": "uint64",
              "minimum": 0,
              "type": "integer"
            },
            "notAfter": {
              "description": "RFC3339 `notAfter` of the current CA cert, which is the signing\ncert.",
              "type": "string"
            },
            "rotationPhase": {
              "description": "Staged key-replacement phase. One of `idle`, `key-replace-trust`,\nand `key-replace-promote`.",
              "nullable": true,
              "type": "string"
            },
            "trustAnchors": {
              "description": "Number of CA certs in the trust bundle now.",
              "format": "uint",
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            }
          },
          "required": [
            "generated",
            "notAfter"
          ],
          "type": "object"
        },
        "conditions": {
          "default": [],
          "description": "Standard Kubernetes-style condition list. It shows `Ready`,\n`ListenersValid`, and `ListenersReady`.",
          "items": {
            "properties": {
              "lastTransitionTime": {
                "description": "RFC3339 timestamp.",
                "type": "string"
              },
              "message": {
                "description": "Human-readable message.",
                "type": "string"
              },
              "reason": {
                "description": "CamelCase machine reason.",
                "type": "string"
              },
              "status": {
                "description": "`True`, `False`, or `Unknown`.",
                "type": "string"
              },
              "type": {
                "description": "For example, `Ready`.",
                "type": "string"
              }
            },
            "required": [
              "lastTransitionTime",
              "message",
              "reason",
              "status",
              "type"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "kafkaVersion": {
          "description": "Echo of `spec.kafkaVersion`, for observability.",
          "nullable": true,
          "type": "string"
        },
        "listeners": {
          "description": "Per-listener resolved addresses. The operator fills them in once\n`ListenersReady=True`.",
          "items": {
            "properties": {
              "addresses": {
                "default": [],
                "items": {
                  "properties": {
                    "host": {
                      "type": "string"
                    },
                    "port": {
                      "format": "int32",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "host",
                    "port"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "bootstrapServers": {
                "description": "`host:port` that clients put in `bootstrap.servers`.",
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "type": {
                "enum": [
                  "internal",
                  "nodeport",
                  "loadbalancer",
                  "ingress",
                  "route"
                ],
                "type": "string"
              }
            },
            "required": [
              "bootstrapServers",
              "name",
              "type"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "metadataVersion": {
          "description": "The operator-finalized metadata version. On an existing cluster it\nadvances only after `UpdateFeatures` accepts the requested level.",
          "nullable": true,
          "type": "string"
        },
        "readyReplicas": {
          "description": "The same value as `StatefulSet.status.readyReplicas`.",
          "format": "int32",
          "nullable": true,
          "type": "integer"
        },
        "replicas": {
          "description": "The same value as `StatefulSet.status.replicas`.",
          "format": "int32",
          "nullable": true,
          "type": "integer"
        },
        "targetMetadataVersion": {
          "description": "The metadata feature level requested by the current spec. This may be\nnewer than `metadataVersion` while broker pools are rolling.",
          "nullable": true,
          "type": "string"
        }
      },
      "type": "object"
    }
  },
  "required": [
    "spec"
  ],
  "title": "Kafka",
  "type": "object"
}

spec

spec object Required 17 fields

Krabka cluster spec. The spec carries only the version label. Sibling KafkaNodePools labeled krabka.io/cluster=<this name> describe the broker pods.

Example
View JSON example
{
  "kafkaVersion": "4.0.0"
}
Default No schema default
Not declared
authorization object | null Optional 7 fields

Cluster-level authorizer selection. When None, the broker uses the default AllowAll authorizer and makes no ACL checks. When Some, the operator renders the [authorization] TOML section, so the broker builds the matching Arc<dyn Authorizer>. That is SimpleAclAuthorizer for type: simple, and OpaAuthorizer for type: opa. With simple or opa selected, the operator's inter-broker principal MUST appear in super_users. There is no implicit ANONYMOUS allow, and operators must opt in explicitly.

Example
View JSON example
{
  "type": "simple",
  "superUsers": [
    "User:admin",
    "ANONYMOUS"
  ]
}
Default Runtime / omission

AllowAll when omitted: the broker makes no ACL checks.

allowOnError boolean Optional
Example
false
Default Runtime / omission

false for OPA authorization. Deny requests when OPA returns an error.

#
expireAfterMs integer Optional
Example
3600000
Default Runtime / omission

Unset: use the broker's OPA cache entry TTL.

Validation and schema details
Minimum
1000
#
initialCacheCapacity integer Optional
Example
1000
Default Runtime / omission

Unset: use the broker's initial OPA cache capacity.

Validation and schema details
Minimum
0
#
maximumCacheSize integer Optional
Example
50000
Default Runtime / omission

Unset: use the broker's maximum OPA cache size.

Validation and schema details
Minimum
1
#
superUsers array Optional 1 field
Example
View JSON example
[
  "User:admin",
  "ANONYMOUS"
]
Default Runtime / omission

[] when omitted for simple authorization. With opa, the operator adds its mTLS principal.

[] string Array item
Example
"User:admin"
Default No independent default
Defined by the parent
#
#
type string Required
Example
"simple"
Default No schema default
Not declared
Allowed values"simple""opa"
#
url string Optional
Example
"http://opa:8181/v1/data/kafka/authz/allow"
Default No schema default
Not declared
#
#
brokerTuning object | null Optional 139 fields

Validated broker operational policy rendered into [runtime].

Example
View JSON example
{
  "aclMaxPrincipal": "1MiB"
}
Default No schema default
Not declared
aclMaxPrincipal string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
aclMaxResourceName string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
auditEventQueueCapacity integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
auditPartitionWaitTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
auditSpoolReplayInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
auditStatsPollInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
auditTailReadMax string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
auditTailWindowOffsets integer | null (int64) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
autoJoinRetryBackoff string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
autoJoinVoterRequestTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
classicGroupInitialRebalanceDelay string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
cleanerInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
clientMetricsDefaultInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
clientMetricsEvictionTick string | null Optional
Example
"60000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
clientMetricsOtlpQueueCapacity integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
clientMetricsPromSnapshotTtl string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
clientMetricsStaleFloor string | null Optional
Example
"600000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
clientMetricsStalePushIntervals integer | null (uint32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
clientMetricsTelemetryMax string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
connectionCreationThrottleMax string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
consumerGroupHeartbeatInterval string | null Optional
Example
"5000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
consumerGroupMaxHeartbeatInterval string | null Optional
Example
"15000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
consumerGroupMaxSessionTimeout string | null Optional
Example
"60000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
consumerGroupMaxSize integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
consumerGroupMinHeartbeatInterval string | null Optional
Example
"5000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
consumerGroupMinSessionTimeout string | null Optional
Example
"45000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
consumerGroupSessionTimeout string | null Optional
Example
"45000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
controlledShutdownDrainTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
controllerElectionTimeout string | null Optional
Example
"5000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
controllerFetchMissLimit integer | null (uint32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
controllerHeartbeatInterval string | null Optional
Example
"500ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
coordinatorActorMailboxCapacity integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
coordinatorSessionExpiryTick string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
coordinatorShutdownAckTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
defaultMinInsyncReplicas integer | null (int32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
delegationTokenDefaultRenewPeriod string | null Optional
Example
"86400000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
delegationTokenExpiryCheckInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
delegationTokenMaxLifetime string | null Optional
Example
"604800000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
disklessWalFlushInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
disklessWalFlushMaxSize string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
disklessWalIndexProjectionTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
disklessWalLocalReplicaCount integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
disklessWalTrimSafetyLag integer | null (int64) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
futureLogMoveReadChunk string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
futureLogMoveRetryBackoff string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
gaugePollInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
heartbeatInterval string | null Optional
Example
"3000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
heartbeatTimeout string | null Optional
Example
"9000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
interBrokerServerName string | null Optional
Example
"my-cluster.kafka.svc.cluster.local"
Default Runtime / omission

Unset; the broker uses its configured default.

Validation and schema details
Minimum length
1
#
isrScanInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
leaderImbalanceCheckInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
leaderImbalancePerBroker string | null Optional
Example
"50%"
Default Runtime / omission

Unset; the broker uses its configured default.

#
livenessTickInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
logReadBufferCap string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
logTimestampScanWindow string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
maxConnections integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
maxConnectionsPerIp integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
maxIncrementalFetchSessionCacheSlots integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
maxProduceGroup integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
metadataMaxBetweenSnapshots string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
metadataMaxSnapshotInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
metadataRaftCommandQueueCapacity integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
metadataRaftFetchMax string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
metadataSnapshotFetchMax string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
metadataSnapshotIntervalRecords integer | null (uint64) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
oauthJwksHttpTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
observerFetchMax string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
observerLagBound integer | null (uint64) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
observerPollInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
offsetsTopicMetadataWaitTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
opaHttpTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
operatorRecoveryDeadline string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
partitionDiskScanInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
partitionWriterQueueDepth integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
producerIdExpiration string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
producerIdExpirationScanInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
quotaThrottleMax string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
recordDecompressionMaxRatio string | null Optional
Example
"50%"
Default Runtime / omission

Unset; the broker uses its configured default.

#
recordDecompressionOutputCeiling string | null Optional
Example
"1GiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
recordDecompressionOutputFloor string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
remoteLogManagerInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicaLagTimeMax string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationEpochFenceBackoff string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationFetchMax string | null Optional
Example
"1048576B"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationFetchMaxWait string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationFetchMin string | null Optional
Example
"1B"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationReconnectDelayCap string | null Optional
Example
"5000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationReconnectInitialDelay string | null Optional
Example
"100ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationSendErrorBackoff string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationThrottleExhaustedBackoff string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationUnexpectedErrorBackoff string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
replicationUnknownTopicRetryDelay string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
rlmmBootstrapBackoffInitial string | null Optional
Example
"250ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
rlmmBootstrapBackoffMax string | null Optional
Example
"10000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
rlmmReconcileTick string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
selfRegistrationBackoffMax string | null Optional
Example
"5000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
selfRegistrationBackoffMin string | null Optional
Example
"100ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
selfRegistrationMaxAttempts integer | null (uint32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
sendfileMin string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
shareGroupEnable boolean | null Optional
Example
true
Default No schema default
Not declared
#
shareGroupHeartbeatInterval string | null Optional
Example
"5s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
shareGroupIsolationLevel string | null Optional
Example
"read-committed"
Default Runtime / omission

Unset; the broker uses its configured default.

#
shareGroupMaxDeliveryAttempts integer | null (int16) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Maximum
32767
Minimum
1
#
shareGroupMaxInflightRecords integer | null (int32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
shareGroupMaxSize integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
shareGroupRecordLockDuration string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
shareGroupSessionTimeout string | null Optional
Example
"45s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
shareRecoveryReadMax string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
shareSessionCacheMaxWhenUnlimited integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
shareStateNumPartitions integer | null (int32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
shareStateReplicationFactor integer | null (int16) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Maximum
32767
Minimum
1
#
socketReceiveBuffer string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
socketRequestMax string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
socketSendBuffer string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
startupLeaderWaitTimeout string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
streamsGroupAcceptableRecoveryLag integer | null (int64) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
streamsGroupAssignor string | null Optional
Example
"auto"
Default Runtime / omission

Unset; the broker uses its configured default.

#
streamsGroupEnable boolean | null Optional
Example
true
Default No schema default
Not declared
#
streamsGroupHeartbeatInterval string | null Optional
Example
"5s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
streamsGroupMaxSize integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
streamsGroupNumStandbyReplicas integer | null (int32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
streamsGroupNumWarmupReplicas integer | null (int32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
streamsGroupSessionTimeout string | null Optional
Example
"45s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
streamsGroupTaskOffsetInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
streamsInternalTopicReplicationFactor integer | null (int16) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Maximum
32767
Minimum
1
#
syncGroupFollowerWait string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
telemetryDecompressedOutputCeiling string | null Optional
Example
"1073741824B"
Default Runtime / omission

Unset; the broker uses its configured default.

#
telemetryDecompressedOutputFloor string | null Optional
Example
"16777216B"
Default Runtime / omission

Unset; the broker uses its configured default.

#
telemetryMaxDecompressionRatio string | null Optional
Example
"50%"
Default Runtime / omission

Unset; the broker uses its configured default.

#
tlsReloadInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
transactionMaxTimeout string | null Optional
Example
"900000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
transactionMinTimeout string | null Optional
Example
"1000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
transactionRecoveryReadMax string | null Optional
Example
"1MiB"
Default Runtime / omission

Unset; the broker uses its configured default.

#
transactionStateNumPartitions integer | null (int32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
transactionStateReplicationFactor integer | null (int16) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Maximum
32767
Minimum
1
#
txnAbortCleanupInterval string | null Optional
Example
"1s"
Default Runtime / omission

Unset; the broker uses its configured default.

#
uncleanRecoveryAggressiveDeadline string | null Optional
Example
"2000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
uncleanRecoveryBalancedDeadline string | null Optional
Example
"30000ms"
Default Runtime / omission

Unset; the broker uses its configured default.

#
uncleanRecoveryQueueCapacity integer | null (uint) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
#
clientsCa object | null Optional 3 fields

Per-cluster CA that signs KafkaUser TLS certs. When absent, the operator uses a fully-defaulted CertificateAuthority.

Example
View JSON example
{
  "generateCertificateAuthority": true,
  "validityDays": 365,
  "renewalDays": 30
}
Default Runtime / omission

Generate the CA, with 365 days of validity and a 30-day renewal window.

generateCertificateAuthority boolean Optional

When true, which is the default, the operator generates and renews this CA. When false, the cluster admin must create the CA Secret pair first, and the operator refuses to overwrite them. The admin renews a BYO CA. The CronJob skips a BYO CA and emits an Event when the CA comes near its expiry.

Example
true
Default Schema default
true
#
renewalDays integer (uint32) Optional

Window in days before notAfter in which the renewal CronJob reissues the leaf certs. Default 30.

Example
30
Default Schema default
30
Validation and schema details
Minimum
0
#
validityDays integer (uint32) Optional

Cert validity in days. Default 365.

Example
365
Default Schema default
365
Validation and schema details
Minimum
0
#
#
clusterCa object | null Optional 3 fields

Per-cluster CA for inter-broker mTLS and broker certs. When absent, the operator uses a fully-defaulted CertificateAuthority, which it generates itself with 365/30 days.

Example
View JSON example
{
  "generateCertificateAuthority": true,
  "validityDays": 365,
  "renewalDays": 30
}
Default Runtime / omission

Generate the CA, with 365 days of validity and a 30-day renewal window.

generateCertificateAuthority boolean Optional

When true, which is the default, the operator generates and renews this CA. When false, the cluster admin must create the CA Secret pair first, and the operator refuses to overwrite them. The admin renews a BYO CA. The CronJob skips a BYO CA and emits an Event when the CA comes near its expiry.

Example
true
Default Schema default
true
#
renewalDays integer (uint32) Optional

Window in days before notAfter in which the renewal CronJob reissues the leaf certs. Default 30.

Example
30
Default Schema default
30
Validation and schema details
Minimum
0
#
validityDays integer (uint32) Optional

Cert validity in days. Default 365.

Example
365
Default Schema default
365
Validation and schema details
Minimum
0
#
#
config object | null Optional 1 field

Opaque broker properties, in server.properties-style key and value pairs. The operator passes them through to the broker's [server_properties] TOML table, and the broker treats them as inert today. Changes propagate through the config hash.

Example
View JSON example
{
  "log.retention.ms": "604800000"
}
Default No schema default
Not declared
Validation and schema details
Additional properties
{
  "type": "string"
}
{key} string Map value
Example
"604800000"
Default No independent default
Defined by the parent
#
#
delegationToken object | null Optional 1 field

Delegation-token master HMAC key source. When None, the broker rejects all KIP-48 delegation-token RPCs with err 61 DELEGATION_TOKEN_AUTH_DISABLED. When Some, the operator injects KRABKA_DELEGATION_TOKEN_SECRET_KEY into each broker pod through a valueFrom.secretKeyRef. The key is then part of the rendered StatefulSet, so the SSA reconcile does not race with out-of-band kubectl set env patches.

Example
View JSON example
{
  "secretKeyRef": {
    "name": "delegation-token-key",
    "key": "secret-key"
  }
}
Default Runtime / omission

Disabled when omitted. Delegation-token RPCs return DELEGATION_TOKEN_AUTH_DISABLED (61).

secretKeyRef object Required 2 fields

Reference to a Kubernetes Secret in the same namespace as the Kafka CR. Its data.<key> value is the broker's master HMAC key for KIP-48 delegation tokens.

Example
View JSON example
{
  "name": "delegation-token-key"
}
Default No schema default
Not declared
key string | null Optional

Key within the Secret's data. Defaults to secret-key.

Example
"secret-key"
Default Runtime / omission

secret-key when omitted.

#
name string Required

Secret name in the same namespace as the Kafka CR.

Example
"delegation-token-key"
Default No schema default
Not declared
#
#
#
interBrokerKerberos object | null Optional 3 fields

Inter-broker Kerberos initiate config. It is required when interBrokerListenerName resolves to a type: gssapi listener. It supplies the shared client principal and the KDC. The keytab comes from that listener's keytabSecretRef.

Example
View JSON example
{
  "clientPrincipal": "kafka@EXAMPLE.COM",
  "kdcUrl": "tcp://kdc:88"
}
Default No schema default
Not declared
clientPrincipal string Required

Principal that every broker authenticates as when it dials peers, for example kafka@EXAMPLE.COM. It must exist in the shared keytab.

Example
"kafka@EXAMPLE.COM"
Default No schema default
Not declared
#
kdcUrl string Required

KDC endpoint, for example tcp://kdc:88.

Example
"tcp://kdc:88"
Default No schema default
Not declared
#
serviceName string | null Optional

Target SPN primary. Defaults to kafka.

Example
"kafka"
Default Runtime / omission

kafka when omitted.

#
#
interBrokerListenerName string | null Optional

Name of the listener for inter-broker traffic. When None, the operator picks the first internal listener. When listeners is empty, the operator picks the synthesized default "PLAIN".

Example
"plain"
Default Runtime / omission

Use the first internal listener. If listeners is empty, use the generated PLAIN listener.

#
kafkaVersion string Required

Krabka version label. The operator propagates it to all pool pods through the app.kubernetes.io/version label.

Example
"4.0.0"
Default No schema default
Not declared
#
krb5ConfSecretRef object | null Optional 2 fields

Optional process-wide krb5.conf. The operator mounts it into the broker pods and points KRB5_CONFIG at it. It serves both the accept path and the initiate path.

Example
View JSON example
{
  "key": "krb5.conf",
  "secretName": "kerberos-config"
}
Default No schema default
Not declared
key string Required

Key within the Secret whose value is the krb5.conf contents.

Example
"krb5.conf"
Default No schema default
Not declared
#
secretName string Required

Name of the Secret holding the krb5.conf.

Example
"kerberos-config"
Default No schema default
Not declared
#
#
listeners array Optional 1 field

Named listeners. An empty or absent list synthesizes one internal PLAIN listener on port 9092.

Example
View JSON example
[
  {
    "name": "plain",
    "port": 9092,
    "type": "internal",
    "tls": false
  }
]
Default Runtime / omission

Absent or empty: create an internal PLAIN listener on port 9092.

[] object Array item 7 fields
Example
View JSON example
{
  "name": "plain",
  "port": 9092,
  "type": "internal",
  "tls": false
}
Default No independent default
Defined by the parent
authentication object | null Optional 31 fields

Per-listener authentication mechanism. Absent means anonymous, and no client identity is required. When the field is type: tls, the listener must also have tls: true. The reconcile enforces this rule.

Example
View JSON example
{
  "type": "scram-sha-512"
}
Default Runtime / omission

Anonymous access when omitted. No client identity is required.

accessTokenIsJwt boolean Optional
Example
true
Default Runtime / omission

true for OAuth authentication. Validate signed JWTs against jwksEndpointUri.

#
clientId string Optional
Example
"kafka-broker"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
clientSecret object Optional 2 fields
Example
View JSON example
{
  "secretName": "oauth-client",
  "key": "client-secret"
}
Default No schema default
Not declared
key string Required
Example
"client-secret"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
secretName string Required
Example
"oauth-client"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
#
customClaimCheck string Optional
Example
"$.scope[?@ == 'kafka.write']"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
enableOauthBearer boolean Optional
Example
true
Default Runtime / omission

true for OAuth authentication. Advertise the OAUTHBEARER SASL mechanism.

#
fallbackUserNameClaim string Optional
Example
"client_id"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
fallbackUserNamePrefix string Optional
Example
"service-account-"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
groupsClaim string Optional
Example
"$.realm_access.roles[*]"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
groupsClaimDelimiter string Optional
Example
","
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
introspectionEndpointUri string Optional
Example
"https://identity.example.com/realms/kafka/protocol/openid-connect/token/introspect"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
introspectionHttpTimeoutSeconds integer Optional
Example
10
Default Runtime / omission

10 seconds for OAuth token introspection when omitted.

Validation and schema details
Minimum
1
#
jwksEndpointUri string Optional
Example
"https://identity.example.com/realms/kafka/protocol/openid-connect/certs"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
jwksExpirySeconds integer (int32) Optional
Example
360
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
jwksIgnoreKeyUse boolean Optional
Example
false
Default Runtime / omission

false for JWT authentication. Keep signing keys with use=sig.

#
jwksMinRefreshPauseSeconds integer (int32) Optional
Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
jwksRefreshSeconds integer Optional
Example
300
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
kdc string Optional
Example
"tcp://kdc:88"
Default Runtime / omission

Use krb5.conf discovery when omitted.

Validation and schema details
Minimum length
1
#
keytabSecretRef object Optional 2 fields
Example
View JSON example
{
  "secretName": "kafka-keytab",
  "key": "kafka.keytab"
}
Default No schema default
Not declared
key string Required
Example
"kafka.keytab"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
secretName string Required
Example
"kafka-keytab"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
#
maxClockSkewSeconds integer Optional
Example
30
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
maxSecondsWithoutReauthentication integer (int32) Optional
Example
3600
Default Runtime / omission

Unset: the session lasts until the token's natural expiry.

Validation and schema details
Minimum
1
#
maxTimeSkew string Optional
Example
"5m"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
principalToLocalRules array Optional 1 field
Example
View JSON example
[
  "DEFAULT"
]
Default Runtime / omission

[] when omitted; no explicit principal mapping rules.

[] string Array item
Example
"DEFAULT"
Default No independent default
Defined by the parent
Validation and schema details
Minimum length
1
#
#
realm string Optional
Example
"EXAMPLE.COM"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
serviceName string Optional
Example
"kafka"
Default Runtime / omission

kafka for GSSAPI authentication when omitted.

Validation and schema details
Minimum length
1
#
tlsTrustedCertificates array Optional 1 field
Example
View JSON example
[
  {
    "secretName": "identity-ca",
    "certificate": "ca.crt"
  }
]
Default Runtime / omission

[] for OAuth authentication. Create no trust-bundle Secret or mount.

[] object Array item 2 fields
Example
View JSON example
{
  "secretName": "identity-ca",
  "certificate": "ca.crt"
}
Default No independent default
Defined by the parent
certificate string Required
Example
"ca.crt"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
secretName string Required
Example
"identity-ca"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
#
#
type string Required
Example
"tls"
Default No schema default
Not declared
Allowed values"tls""scram-sha-512""scram-sha-256""oauth""gssapi"
#
userInfoEndpointUri string Optional
Example
"https://identity.example.com/realms/kafka/protocol/openid-connect/userinfo"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
userNameClaim string Optional
Example
"preferred_username"
Default Runtime / omission

sub for OAuth authentication when omitted.

#
validAudience string Optional
Example
"kafka"
Default Runtime / omission

No audience check when omitted.

#
validIssuerUri string Optional
Example
"https://identity.example.com/realms/kafka"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
validTokenType string Optional
Example
"Bearer"
Default No schema default
Not declared
Validation and schema details
Minimum length
1
#
#
configuration object | null Optional 3 fields

Optional listener-type-specific configuration.

Example
View JSON example
{
  "bootstrap": {
    "annotations": {
      "example": "example-value"
    }
  }
}
Default No schema default
Not declared
bootstrap object | null Optional 5 fields
Example
View JSON example
{
  "annotations": {
    "example": "example-value"
  }
}
Default No schema default
Not declared
annotations object Optional 1 field

Annotations to add to the bootstrap Service.

Example
View JSON example
{
  "example": "example-value"
}
Default No schema default
Not declared
Validation and schema details
Additional properties
{
  "type": "string"
}
{key} string Map value
Example
"example-value"
Default No independent default
Defined by the parent
#
#
host string | null Optional

ingress / route only: bootstrap hostname.

Example
"kafka.example.com"
Default No schema default
Not declared
#
labels object Optional 1 field

Labels to add to the bootstrap Service.

Example
View JSON example
{
  "example": "kafka"
}
Default No schema default
Not declared
Validation and schema details
Additional properties
{
  "type": "string"
}
{key} string Map value
Example
"kafka"
Default No independent default
Defined by the parent
#
#
loadBalancerIP string | null Optional

loadbalancer only: pin the bootstrap LB IP.

Example
"192.0.2.10"
Default No schema default
Not declared
#
nodePort integer | null (int32) Optional

nodeport only: pin the bootstrap NodePort.

Example
32092
Default No schema default
Not declared
#
#
brokers array Optional 1 field
Example
View JSON example
[
  {
    "broker": 1
  }
]
Default No schema default
Not declared
[] object Array item 6 fields
Example
View JSON example
{
  "broker": 1
}
Default No independent default
Defined by the parent
advertisedHost string | null Optional

Override the computed advertised host.

Example
"broker-0.kafka.example.com"
Default No schema default
Not declared
#
advertisedPort integer | null (int32) Optional

Override the computed advertised port.

Example
9092
Default No schema default
Not declared
#
broker integer (int32) Required

Broker id this override applies to (matches the node id).

Example
1
Default No schema default
Not declared
#
host string | null Optional

ingress / route only: per-broker hostname.

Example
"broker-0.kafka.example.com"
Default No schema default
Not declared
#
loadBalancerIP string | null Optional

loadbalancer only: pin this broker's Service.spec.loadBalancerIP.

Example
"192.0.2.11"
Default No schema default
Not declared
#
nodePort integer | null (int32) Optional

nodeport only: pin this broker's Service.spec.ports[0].nodePort.

Example
32093
Default No schema default
Not declared
#
#
#
class string | null Optional

ingress only: the spec.ingressClassName that the operator sets on every generated Ingress. This is the Strimzi-shaped configuration.class. It is inert for other listener types.

Example
"nginx"
Default No schema default
Not declared
#
#
name string Required

Unique within the cluster. Alphanumeric characters and -, ≤25 chars. It is the Kafka listener name, and it appears in bootstrap.servers-style URLs.

Example
"plain"
Default No schema default
Not declared
#
networkPolicyPeers array | null Optional 1 field

Per-listener peer allow-list. It is tri-state:

  • None gives no per-listener restriction, that is, allow-all on this port.
  • Some(vec![]) gives deny-all on this listener port. The operator emits no per-listener rule, and the default-deny applies.
  • Some(non_empty) lets only the listed peers reach this port.

The operator reads this field only when Kafka.spec.networkPolicy is set. In any other case the field is inert. The operator auto-allow rule still fires on this port for deny-all listeners, so that the operator can manage the cluster.

Example
View JSON example
[
  {
    "podSelector": {
      "matchLabels": {
        "app": "kafka-client"
      }
    }
  }
]
Default Runtime / omission

No per-listener restriction when omitted. [] denies clients on this port; the operator's automatic allow rule still applies. Used only when networkPolicy is set.

[] object Array item 2 fields

Subset of networking.k8s.io/v1.NetworkPolicyPeer.

This struct omits ipBlock on purpose. Someone can add it later if external CIDR allow-lists become a real need.

Example
View JSON example
{
  "namespaceSelector": {
    "matchExpressions": [
      {
        "key": "app",
        "operator": "In"
      }
    ]
  }
}
Default No independent default
Defined by the parent
namespaceSelector object | null Optional 2 fields

A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.

Example
View JSON example
{
  "matchExpressions": [
    {
      "key": "app",
      "operator": "In"
    }
  ]
}
Default No schema default
Not declared
matchExpressions array Optional 1 field

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

Example
View JSON example
[
  {
    "key": "app",
    "operator": "In"
  }
]
Default No schema default
Not declared
[] object Array item 3 fields

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

Example
View JSON example
{
  "key": "app",
  "operator": "In"
}
Default No independent default
Defined by the parent
key string Required

key is the label key that the selector applies to.

Example
"app"
Default No schema default
Not declared
#
operator string Required

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

Example
"In"
Default No schema default
Not declared
#
values array Optional 1 field

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

Example
View JSON example
[
  "kafka"
]
Default No schema default
Not declared
[] string Array item
Example
"kafka"
Default No independent default
Defined by the parent
#
#
#
#
matchLabels object Optional 1 field

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

Example
View JSON example
{
  "example": "kafka"
}
Default No schema default
Not declared
Validation and schema details
Additional properties
{
  "type": "string"
}
{key} string Map value
Example
"kafka"
Default No independent default
Defined by the parent
#
#
#
podSelector object | null Optional 2 fields

A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.

Example
View JSON example
{
  "matchExpressions": [
    {
      "key": "app",
      "operator": "In"
    }
  ]
}
Default No schema default
Not declared
matchExpressions array Optional 1 field

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

Example
View JSON example
[
  {
    "key": "app",
    "operator": "In"
  }
]
Default No schema default
Not declared
[] object Array item 3 fields

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

Example
View JSON example
{
  "key": "app",
  "operator": "In"
}
Default No independent default
Defined by the parent
key string Required

key is the label key that the selector applies to.

Example
"app"
Default No schema default
Not declared
#
operator string Required

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

Example
"In"
Default No schema default
Not declared
#
values array Optional 1 field

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

Example
View JSON example
[
  "kafka"
]
Default No schema default
Not declared
[] string Array item
Example
"kafka"
Default No independent default
Defined by the parent
#
#
#
#
matchLabels object Optional 1 field

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

Example
View JSON example
{
  "example": "kafka"
}
Default No schema default
Not declared
Validation and schema details
Additional properties
{
  "type": "string"
}
{key} string Map value
Example
"kafka"
Default No independent default
Defined by the parent
#
#
#
#
#
port integer (int32) Required

Container port the broker binds. Unique within the cluster.

Example
9092
Default No schema default
Not declared
#
tls boolean Optional

Transport-level TLS. When true, the listener uses the per-broker keystore that the cluster CA signed, and clients must use TLS to connect. This field is independent of authentication. A tls: true listener with no authentication is anonymous over TLS.

Example
false
Default Schema default
false
#
type string Required

Listener type. internal is in-cluster. nodeport and loadbalancer create external Services. The schema accepts ingress and route, but the reconcile rejects them.

Example
"internal"
Default No schema default
Not declared
Allowed values"internal""nodeport""loadbalancer""ingress""route"
#
#
#
logging object | null Optional 3 fields

Broker log configuration. When None, the brokers use their built-in default RUST_LOG filter. When Some, the operator composes an inline tracing env-filter string, or reads an external one. The operator then renders it into the broker ConfigMap under the rust.log key, wires it into the RUST_LOG env of each broker pod, and rolls the cluster on a change through the config hash.

Example
View JSON example
{
  "type": "inline",
  "loggers": {
    "root": "info",
    "krabka_broker": "debug"
  }
}
Default Runtime / omission

Use the broker's built-in RUST_LOG filter when omitted.

loggers object Optional 1 field

Inline loggers, from tracing target to level. The key root is case-insensitive and sets the global default level as a bare env-filter directive. Any other key is a tracing target, that is, a Rust module path such as krabka_broker. The levels are trace|debug|info|warn|error|off, and they are case-insensitive. fatal is accepted as an alias for error.

Example
View JSON example
{
  "root": "info",
  "krabka_broker": "debug"
}
Default Runtime / omission

{} when omitted; no inline logger overrides.

Validation and schema details
Additional properties
{
  "type": "string"
}
{key} string Map value
Example
"info"
Default No independent default
Defined by the parent
#
#
type string Optional
Example
"inline"
Default Schema default
"inline"
Allowed values"inline""external"
#
valueFrom object | null Optional 1 field

External logging source. This field is required when type: external. The operator uses the value of the referenced ConfigMap key verbatim as the broker's RUST_LOG filter.

Example
View JSON example
{
  "configMapKeyRef": {
    "name": "broker-logging",
    "key": "rust.log"
  }
}
Default No schema default
Not declared
configMapKeyRef object Required 2 fields
Example
View JSON example
{
  "key": "rust.log",
  "name": "broker-logging"
}
Default No schema default
Not declared
key string Required
Example
"rust.log"
Default No schema default
Not declared
#
name string Required
Example
"broker-logging"
Default No schema default
Not declared
#
#
#
#
metadataVersion string | null Optional

KRaft metadata version, the runtime analog of inter.broker.protocol.version. When unset, it tracks the major.minor of kafkaVersion. When set, it pins the metadata version for a two-step upgrade or an online downgrade. The operator validates it against kafkaVersion; changes on an existing cluster are finalized through UpdateFeatures, with safe-downgrade semantics for a lower target. Rejections surface KafkaVersionValid=False and leave status.metadataVersion unchanged.

Example
"4.0"
Default Runtime / omission

Use the major.minor version from kafkaVersion when omitted.

#
metricsConfig object | null Optional 3 fields

Prometheus scrape configuration. When None, the brokers do not bind /metrics, and the operator renders no PodMonitor and no ServiceMonitor. When Some, the broker StatefulSet gains a metrics container port on TCP 9404, and the operator SSA-applies the resources that pod_monitor and service_monitor request.

Example
View JSON example
{
  "type": "prometheus",
  "podMonitor": {}
}
Default Runtime / omission

Disabled when omitted: no metrics listener, PodMonitor, or ServiceMonitor.

podMonitor object | null Optional 3 fields
Example
View JSON example
{
  "interval": "30s"
}
Default No schema default
Not declared
interval string | null Optional
Example
"30s"
Default No schema default
Not declared
#
labels object Optional 1 field
Example
View JSON example
{
  "example": "kafka"
}
Default No schema default
Not declared
Validation and schema details
Additional properties
{
  "type": "string"
}
{key} string Map value
Example
"kafka"
Default No independent default
Defined by the parent
#
#
scrapeTimeout string | null Optional
Example
"10s"
Default No schema default
Not declared
#
#
serviceMonitor object | null Optional 3 fields
Example
View JSON example
{
  "interval": "30s"
}
Default No schema default
Not declared
interval string | null Optional
Example
"30s"
Default No schema default
Not declared
#
labels object Optional 1 field
Example
View JSON example
{
  "example": "kafka"
}
Default No schema default
Not declared
Validation and schema details
Additional properties
{
  "type": "string"
}
{key} string Map value
Example
"kafka"
Default No independent default
Defined by the parent
#
#
scrapeTimeout string | null Optional
Example
"10s"
Default No schema default
Not declared
#
#
type string Optional
Example
"prometheus"
Default Schema default
"prometheus"
Allowed values"prometheus"
#
#
networkPolicy object | null Optional

Opt-in NetworkPolicy generation. When None, the operator generates no NetworkPolicy. When Some, even {}, the operator renders a cluster-level NetworkPolicy that gates ingress to the broker and controller pods.

Example
View JSON example
{}
Default Runtime / omission

Create no NetworkPolicy when omitted. {} enables policy generation.

#
tieredStorage object | null Optional 5 fields

KIP-405: cluster-wide tiered storage. When Some, every broker pod boots with the local-tier RSM enabled, with an emptyDir mounted at /var/lib/krabka/remote, which is the broker's remote_log_storage_dir, and with [remote_storage] rendered in the broker TOML. The per-topic enablement does not change. It stays KafkaTopic.spec.config["remote.storage.enable"] = "true".

With the emptyDir default and InmemoryRemoteLogMetadataManager as the only RLMM, tier data does not survive pod restarts. PVC support pairs with the production RLMM.

Example
View JSON example
{
  "type": "Local"
}
Default Runtime / omission

Absent: the operator renders no tiered-storage configuration. Set type and backend settings to enable it.

gcs object | null Optional 7 fields

GCS-backend tuning. It is required when kind == Gcs, and it must be absent in any other case. The struct has the same shape as krabka_remote_storage::GcsConfig. The operator renders the non-credential fields verbatim into the broker TOML's [remote_storage.gcs] block. S3 uses env-var credentials, but GCS does not. The operator mounts an explicit service-account JSON key as a FILE on the broker pod and gives it to the broker as service_account_path in the TOML. Unset credentials select keyless Workload Identity or ADC.

Example
View JSON example
{
  "bucket": "kafka-tiered-data"
}
Default No schema default
Not declared
allowHttp boolean Optional

Allow plaintext HTTP. It is off by default. Turn it on for GCS emulators that run without TLS. Real GCS never needs it.

Example
false
Default Runtime / omission

false: require HTTPS. Set true for a GCS emulator without TLS.

#
bucket string Required

GCS bucket name. Required.

Example
"kafka-tiered-data"
Default No schema default
Not declared
#
credentials object | null Optional 1 field

Optional explicit service-account credentials. When None, the broker uses Workload Identity or ADC, which is the keyless GKE path.

Example
View JSON example
{
  "serviceAccountKey": {
    "name": "gcs-credentials",
    "key": "service-account.json"
  }
}
Default Runtime / omission

Use Workload Identity or Application Default Credentials when omitted.

serviceAccountKey object Required 2 fields

Reference to the Secret holding the service-account JSON key.

Example
View JSON example
{
  "name": "gcs-credentials"
}
Default No schema default
Not declared
key string | null Optional

Key within the Secret's data. Defaults to secret-key.

Example
"service-account.json"
Default Runtime / omission

secret-key when omitted.

#
name string Required

Secret name in the same namespace as the Kafka CR.

Example
"gcs-credentials"
Default No schema default
Not declared
#
#
#
endpoint string | null Optional

Optional custom GCS API base URL, for example for emulators and fakes. When None, the broker uses the standard Google Cloud Storage endpoint.

Example
"http://gcs-emulator:4443"
Default Runtime / omission

Use the standard Google Cloud Storage endpoint when omitted.

#
multipartChunkSize integer | null (uint64) Optional

Override the per-part size for multipart uploads in bytes. When unset, the broker uses krabka_remote_storage::DEFAULT_MULTIPART_CHUNK_SIZE, which is 16 MiB.

Example
16777216
Default Runtime / omission

16 MiB (16777216 bytes) when omitted.

Validation and schema details
Minimum
0
#
multipartThreshold integer | null (uint64) Optional

Override the single-PUT and multipart cutoff in bytes. When unset, the broker uses krabka_remote_storage::DEFAULT_MULTIPART_THRESHOLD, which is 100 MiB. Lower it in tests to exercise the multipart path on small fixtures.

Example
104857600
Default Runtime / omission

100 MiB (104857600 bytes) when omitted.

Validation and schema details
Minimum
0
#
prefix string | null Optional

Optional key prefix inside the bucket. It lets more than one Krabka cluster share a bucket without a collision.

Example
"my-cluster/"
Default No schema default
Not declared
#
#
metadataManager object | null Optional 2 fields

KIP-405: pick the RemoteLogMetadataManager that the broker pods run. When the field is absent, or when it is type: Topic, the broker activates the durable krabka_remote_storage_topic::TopicBasedRemoteLogMetadataManager against the internal __remote_log_metadata topic. Tier-segment metadata then survives pod restarts and is consistent across the brokers in the cluster. Only an explicit type: InMemory selects the in-memory fixture, which is for test and dev only.

Example
View JSON example
{
  "type": "Topic"
}
Default Runtime / omission

Use the topic-backed metadata manager (type Topic) when omitted.

topic object | null Optional 9 fields

Topic-backed tuning. It is optional when kind == Topic, and the broker fills the defaults for the bootstrap and topic parameters. It must be absent in any other case.

Example
View JSON example
{
  "bootstrap": "127.0.0.1:9094"
}
Default Runtime / omission

For type Topic, use the broker's bootstrap and topic defaults when omitted.

bootstrap string Required

host:port that the broker pod dials to reach its own listener, so that it can publish and consume __remote_log_metadata. This is usually the pod's loopback inter-broker listener, for example 127.0.0.1:9094.

Example
"127.0.0.1:9094"
Default No schema default
Not declared
#
eventQueueCapacity integer | null (uint) Optional

Capacity of the shared metadata-event delivery queue.

Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
1
#
fetchMaxBytes string | null Optional

Maximum bytes returned by each per-partition metadata fetch.

Example
"1MiB"
Default No schema default
Not declared
#
fetchMaxWait string | null Optional

Maximum wait for each per-partition metadata fetch.

Example
"500ms"
Default No schema default
Not declared
#
fetchRetryBackoff string | null Optional

Backoff after a failed metadata fetch.

Example
"1s"
Default No schema default
Not declared
#
numPartitions integer | null (int32) Optional

Partition count for __remote_log_metadata on the first creation. Defaults to 50, which is the Kafka remote.log.metadata.topic.num.partitions.

Example
50
Default Runtime / omission

50 partitions when omitted.

#
replication integer | null (int32) Optional

Replication factor for __remote_log_metadata on the first creation. Defaults to 3, which is the Kafka remote.log.metadata.topic.replication.factor.

Example
3
Default Runtime / omission

3 replicas when omitted.

#
snapshotInterval string | null Optional

RLMM cache snapshot cadence.

Example
"60s"
Default No schema default
Not declared
#
topicCreateTimeout string | null Optional

Timeout for provisioning each internal metadata topic.

Example
"30s"
Default No schema default
Not declared
#
#
type string Required

Implementation selector.

Example
"InMemory"
Default No schema default
Not declared
Allowed values"InMemory""Topic"
#
#
persistence object | null Optional 3 fields

KIP-405: durable storage for the local-tier directory. It is valid only with type=Local. When it is absent, which is the default, the operator renders an emptyDir for tier-storage. When Some, the operator renders a volumeClaimTemplate of the configured size and class, so tier data survives pod restarts. Together with the topic-backed RLMM, this closes the "tier data is lost on pod restart" caveat.

Example
View JSON example
{
  "size": "50Gi",
  "deleteClaim": false
}
Default Runtime / omission

For type Local, use emptyDir storage when omitted.

class string | null Optional

Storage class name. None means the cluster default.

Example
"fast-ssd"
Default Runtime / omission

Use the cluster's default StorageClass when omitted.

#
deleteClaim boolean Optional

true gives persistentVolumeClaimRetentionPolicy.whenDeleted: Delete. It must match the parent KafkaNodePool.spec.storage.deleteClaim when both PVCs are present, because K8s StatefulSets have one set-wide retention policy and no per-template override. The operator validates this at reconcile time, and a mismatch surfaces as TieredStorageInvalid.

Example
false
Default Schema default
false
#
size string Required

K8s Quantity, for example "50Gi" or "500Mi". It must be non-empty. The Kubernetes API server validates the resource-quantity form at SSA time.

Example
"50Gi"
Default No schema default
Not declared
#
#
s3 object | null Optional 8 fields

S3-backend tuning. It is required when kind == S3, and it must be absent in any other case. The struct has the same shape as krabka_remote_storage::S3Config. The operator renders the non-credential fields verbatim into the broker TOML's [remote_storage.s3] block. The credentials come from Kubernetes Secrets, and the operator injects them as the broker-pod env vars AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.

Example
View JSON example
{
  "bucket": "kafka-tiered-data",
  "region": "us-west-2"
}
Default No schema default
Not declared
allowHttp boolean Optional

Allow plaintext HTTP. It is off by default. Turn it on for a MinIO that runs without TLS. AWS S3 never needs it.

Example
false
Default Runtime / omission

false: require HTTPS. Set true for a MinIO endpoint without TLS.

#
bucket string Required

S3 bucket name. Required.

Example
"kafka-tiered-data"
Default No schema default
Not declared
#
credentials object | null Optional 2 fields

Optional explicit credentials. When None, the broker falls back to the AWS credential chain, such as IRSA on EKS or an instance profile on EC2.

Example
View JSON example
{
  "accessKeyId": {
    "name": "s3-credentials",
    "key": "access-key-id"
  },
  "secretAccessKey": {
    "name": "s3-credentials",
    "key": "secret-access-key"
  }
}
Default Runtime / omission

Use the AWS credential chain when omitted, such as IRSA or an instance profile.

accessKeyId object Required 2 fields

Reference to the Secret holding the AWS_ACCESS_KEY_ID value.

Example
View JSON example
{
  "name": "s3-credentials"
}
Default No schema default
Not declared
key string | null Optional

Key within the Secret's data. Defaults to secret-key.

Example
"access-key-id"
Default Runtime / omission

secret-key when omitted.

#
name string Required

Secret name in the same namespace as the Kafka CR.

Example
"s3-credentials"
Default No schema default
Not declared
#
#
secretAccessKey object Required 2 fields

Reference to the Secret holding the AWS_SECRET_ACCESS_KEY value.

Example
View JSON example
{
  "name": "s3-credentials"
}
Default No schema default
Not declared
key string | null Optional

Key within the Secret's data. Defaults to secret-key.

Example
"secret-access-key"
Default Runtime / omission

secret-key when omitted.

#
name string Required

Secret name in the same namespace as the Kafka CR.

Example
"s3-credentials"
Default No schema default
Not declared
#
#
#
endpoint string | null Optional

Optional custom endpoint URL, for example http://minio:9000 for MinIO, or https://<account>.r2.cloudflarestorage.com for Cloudflare R2. When None, the broker uses the AWS S3 endpoint for the configured region.

Example
"http://minio:9000"
Default Runtime / omission

Use the AWS S3 endpoint for the configured region when omitted.

#
multipartChunkSize integer | null (uint64) Optional

Override the per-part size for multipart uploads in bytes. When unset, the broker uses krabka_remote_storage::DEFAULT_MULTIPART_CHUNK_SIZE, which is 16 MiB.

Example
16777216
Default Runtime / omission

16 MiB (16777216 bytes) when omitted.

Validation and schema details
Minimum
0
#
multipartThreshold integer | null (uint64) Optional

Override the single-PUT and multipart cutoff in bytes. When unset, the broker uses krabka_remote_storage::DEFAULT_MULTIPART_THRESHOLD, which is 100 MiB. Lower it in tests to exercise the multipart path on small fixtures.

Example
104857600
Default Runtime / omission

100 MiB (104857600 bytes) when omitted.

Validation and schema details
Minimum
0
#
prefix string | null Optional

Optional key prefix inside the bucket. It lets more than one Krabka cluster share a bucket without a collision.

Example
"my-cluster/"
Default No schema default
Not declared
#
region string Required

AWS region. It is required even for the non-AWS endpoints MinIO and R2, because the AmazonS3Builder of object_store rejects an empty region.

Example
"us-west-2"
Default No schema default
Not declared
#
#
type string Required

Backend kind selector.

Example
"Local"
Default No schema default
Not declared
Allowed values"Local""S3""Gcs"
#
#
tracing object | null Optional 2 fields

Distributed-tracing wiring for the broker pods. When Some, the operator renders the matching KRABKA_OTLP_* env vars onto every broker pod. The broker's telemetry pipeline reads them with TelemetryConfig::from_env and installs the OTLP tracer at startup. When None, the operator emits no OTLP env vars, and the broker leaves tracing off. That is the default.

Example
View JSON example
{
  "type": "Otlp",
  "otlp": {
    "endpoint": "http://otel-collector:4317"
  }
}
Default Runtime / omission

Disabled when omitted: emit no OTLP environment variables.

otlp object | null Optional 5 fields

OTLP-backend tuning. Required when kind == Otlp.

Example
View JSON example
{
  "endpoint": "http://otel-collector:4317"
}
Default No schema default
Not declared
endpoint string Required

Required. OTLP collector endpoint in the form scheme://host:port. The operator renders it as KRABKA_OTLP_ENDPOINT. A set field also sets KRABKA_OTLP_ENABLED=true.

Example
"http://otel-collector:4317"
Default No schema default
Not declared
#
protocol string | null Optional

OTLP wire protocol selector. It has the same shape as the broker's internal OtlpProtocol enum and the OTEL_EXPORTER_OTLP_PROTOCOL spec values.

Example
"grpc"
Default Runtime / omission

grpc when omitted.

Allowed values"grpc""http_protobuf"
#
sampleRatio number | null (double) Optional

Optional sampling ratio in [0.0, 1.0]. The operator renders it as KRABKA_OTLP_SAMPLE_RATIO. An unset field leaves the binary's own default of 1.0, which samples every trace.

Example
0.1
Default Runtime / omission

1.0 when omitted; sample every trace.

#
serviceName string | null Optional

Optional service.name resource attribute. The operator renders it as OTEL_SERVICE_NAME. An unset field leaves the binary's own name, which is "krabka-broker" for Kafka and "krabka-gres" for Gres.

Example
"krabka-broker"
Default Runtime / omission

krabka-broker when omitted on a Kafka resource.

#
timeout string | null Optional

Optional export timeout. The operator renders it as KRABKA_OTLP_TIMEOUT. An unset field leaves the binary's own default of 10s.

Example
"10s"
Default Runtime / omission

10s when omitted.

#
#
type string Required

Tracing backend selector.

Example
"Otlp"
Default No schema default
Not declared
Allowed values"Otlp"
#
#
#

status

status object | null Optional 9 fields
Example
View JSON example
{
  "clientsCa": {
    "generated": true,
    "notAfter": "2027-10-05T00:00:00Z"
  }
}
Default No schema default
Not declared
clientsCa object | null Optional 6 fields

Status surface for one CA.

The reconciler fills it in from the parsed CA cert and the CRD spec.

Example
View JSON example
{
  "generated": true,
  "notAfter": "2027-10-05T00:00:00Z"
}
Default No schema default
Not declared
certGeneration integer (uint64) Optional

Monotonic generation of the active signing cert. It increments on a same-key renewal and on a key promotion.

Example
0
Default Schema default
0
Validation and schema details
Minimum
0
#
generated boolean Required

true when the operator generated this CA, that is, when generateCertificateAuthority == true. false for a BYO CA.

Example
true
Default No schema default
Not declared
#
keyGeneration integer (uint64) Optional

Monotonic generation of the active signing key. It increments only on a key replacement.

Example
0
Default Schema default
0
Validation and schema details
Minimum
0
#
notAfter string Required

RFC3339 notAfter of the current CA cert, which is the signing cert.

Example
"2027-10-05T00:00:00Z"
Default No schema default
Not declared
#
rotationPhase string | null Optional

Staged key-replacement phase. One of idle, key-replace-trust, and key-replace-promote.

Example
"idle"
Default No schema default
Not declared
#
trustAnchors integer | null (uint) Optional

Number of CA certs in the trust bundle now.

Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
#
clusterCa object | null Optional 6 fields

Status surface for one CA.

The reconciler fills it in from the parsed CA cert and the CRD spec.

Example
View JSON example
{
  "generated": true,
  "notAfter": "2027-10-05T00:00:00Z"
}
Default No schema default
Not declared
certGeneration integer (uint64) Optional

Monotonic generation of the active signing cert. It increments on a same-key renewal and on a key promotion.

Example
0
Default Schema default
0
Validation and schema details
Minimum
0
#
generated boolean Required

true when the operator generated this CA, that is, when generateCertificateAuthority == true. false for a BYO CA.

Example
true
Default No schema default
Not declared
#
keyGeneration integer (uint64) Optional

Monotonic generation of the active signing key. It increments only on a key replacement.

Example
0
Default Schema default
0
Validation and schema details
Minimum
0
#
notAfter string Required

RFC3339 notAfter of the current CA cert, which is the signing cert.

Example
"2027-10-05T00:00:00Z"
Default No schema default
Not declared
#
rotationPhase string | null Optional

Staged key-replacement phase. One of idle, key-replace-trust, and key-replace-promote.

Example
"idle"
Default No schema default
Not declared
#
trustAnchors integer | null (uint) Optional

Number of CA certs in the trust bundle now.

Example
1
Default No schema default
Not declared
Validation and schema details
Minimum
0
#
#
conditions array Optional 1 field

Standard Kubernetes-style condition list. It shows Ready, ListenersValid, and ListenersReady.

Example
View JSON example
[
  {
    "lastTransitionTime": "2026-10-05T12:00:00Z",
    "message": "The resource is ready.",
    "reason": "Reconciled",
    "status": "True",
    "type": "Ready"
  }
]
Default Schema default
[]
[] object Array item 5 fields
Example
View JSON example
{
  "lastTransitionTime": "2026-10-05T12:00:00Z",
  "message": "The resource is ready.",
  "reason": "Reconciled",
  "status": "True",
  "type": "Ready"
}
Default No schema default
Not declared
lastTransitionTime string Required

RFC3339 timestamp.

Example
"2026-10-05T12:00:00Z"
Default No schema default
Not declared
#
message string Required

Human-readable message.

Example
"The resource is ready."
Default No schema default
Not declared
#
reason string Required

CamelCase machine reason.

Example
"Reconciled"
Default No schema default
Not declared
#
status string Required

True, False, or Unknown.

Example
"True"
Default No schema default
Not declared
#
type string Required

For example, Ready.

Example
"Ready"
Default No schema default
Not declared
#
#
#
kafkaVersion string | null Optional

Echo of spec.kafkaVersion, for observability.

Example
"4.0.0"
Default No schema default
Not declared
#
listeners array Optional 1 field

Per-listener resolved addresses. The operator fills them in once ListenersReady=True.

Example
View JSON example
[
  {
    "bootstrapServers": "kafka.example.com:9092",
    "name": "plain",
    "type": "internal"
  }
]
Default No schema default
Not declared
[] object Array item 4 fields
Example
View JSON example
{
  "bootstrapServers": "kafka.example.com:9092",
  "name": "plain",
  "type": "internal"
}
Default No schema default
Not declared
addresses array Optional 1 field
Example
View JSON example
[
  {
    "host": "kafka.example.com",
    "port": 9092
  }
]
Default Schema default
[]
[] object Array item 2 fields
Example
View JSON example
{
  "host": "kafka.example.com",
  "port": 9092
}
Default No schema default
Not declared
host string Required
Example
"kafka.example.com"
Default No schema default
Not declared
#
port integer (int32) Required
Example
9092
Default No schema default
Not declared
#
#
#
bootstrapServers string Required

host:port that clients put in bootstrap.servers.

Example
"kafka.example.com:9092"
Default No schema default
Not declared
#
name string Required
Example
"plain"
Default No schema default
Not declared
#
type string Required
Example
"internal"
Default No schema default
Not declared
Allowed values"internal""nodeport""loadbalancer""ingress""route"
#
#
#
metadataVersion string | null Optional

The operator-finalized metadata version. On an existing cluster it advances only after UpdateFeatures accepts the requested level.

Example
"4.0"
Default No schema default
Not declared
#
readyReplicas integer | null (int32) Optional

The same value as StatefulSet.status.readyReplicas.

Example
1
Default No schema default
Not declared
#
replicas integer | null (int32) Optional

The same value as StatefulSet.status.replicas.

Example
1
Default No schema default
Not declared
#
targetMetadataVersion string | null Optional

The metadata feature level requested by the current spec. This may be newer than metadataVersion while broker pools are rolling.

Example
"4.0"
Default No schema default
Not declared
#
#

Resource schema

Resource schema object Resource schema

Auto-generated derived type for KafkaSpec via CustomResource

Example
View JSON example
{
  "apiVersion": "krabka.io/v1alpha1",
  "kind": "Kafka",
  "metadata": {
    "name": "my-cluster",
    "namespace": "default"
  },
  "spec": {
    "kafkaVersion": "4.0.0"
  }
}
Default No resource default
None
#