Skip to main content

Broker configuration reference

krabka-broker --config-file PATH reads one TOML document. This page lists every key that document accepts, with the type, the default, the units, and the description from the field’s doc comment. A key whose default is broker default leaves the broker’s built-in value in place when it is absent. The CLI flag or environment variable for the same setting, when one exists, wins over the file.

The schema behind this page is docs/config-schema.json, which krabka-broker --print-config-schema prints. Two annotated examples sit beside it: broker-single-node.toml and broker-three-node-quorum.toml.

A duration is a string with a unit suffix, for example "500ms", "30s", or "10m". A byte size is a string with a unit suffix, for example "1MiB" or "10GB". A ratio is a string such as "10%" or "0.1". A key whose units column says milliseconds or seconds is a plain integer in that unit.

Top-level keys

Key Type Default Units Description
audit table broker default [audit] section of broker.toml (FedRAMP 20x MLA). See [audit] below.
authorization table broker default TOML shape of [authorization]. type (renamed to authz_type on the Rust side to avoid shadowing the keyword) defaults to AllowAll; super_users is the principal bypass list consulted by every concrete authorizer impl. Omitting the whole block leaves the cluster with no authorizer, which is what Kafka has when authorizer.class.name is unset: every principal is allowed everything, and the ACL administration RPCs – DescribeAcls, CreateAcls and DeleteAcls – answer SECURITY_DISABLED (54) rather than an empty listing or a stored binding nothing would consult. kafka-acls reports that refusal. deny_unknown_fields so a misspelled super_user typo at the top of the [authorization] block is rejected at parse time rather than silently producing the wrong authorizer. See [authorization] below.
auto_join boolean broker default Enable automatic dynamic controller enrollment.
bootstrap_servers array of string [] KIP-853 controller discovery endpoints. Hosts remain unresolved so DNS names can be refreshed on each retry.
break_glass table broker default TOML shape of [break_glass]. Maps to crate::config::BreakGlassConfig. Every field is Option, so approvers = [] and signed_actions = [] are each a written choice and are distinct from omitting the key. deny_unknown_fields so a misspelled key is rejected at parse time. See [break_glass] below.
broker_id integer (int32) broker default This node’s id, Kafka’s node.id / broker.id. It is the id the broker registers with the controller and reports in Metadata responses. Absent leaves the BrokerConfig default intact.
connections_max_idle string broker default duration How long a connection may go without a complete request frame before the broker closes it (Kafka connections.max.idle.ms). Absent leaves the BrokerConfig default of ten minutes, which is Kafka’s 600000. A [[listeners]] entry may carry its own connections_max_idle, which wins for that listener.
connections_max_reauth string broker default duration KIP-368 connections.max.reauth.ms: how long an authenticated SASL session may live before the client must re-authenticate in band. Absent, or non-positive, disables re-authentication, which is Kafka’s default. It applies to every mechanism: PLAIN, SCRAM and GSSAPI sessions are bounded by it alone, while an OAUTHBEARER or delegation-token session expires at the earlier of its credential’s expiry and this window. A [[listeners]] entry may carry its own connections_max_reauth, which wins for that listener.
controller_election_timeout string broker default duration Controller election timeout, Kafka’s controller.quorum.fetch.timeout.ms. It is the follower fetch watchdog, and 1.5x of it is the leader’s check-quorum window: a leader that has not been fetched from by a majority of the voters within that window resigns its epoch. Absent leaves the BrokerConfig default intact.
controller_heartbeat_interval string broker default duration Controller heartbeat interval. Absent leaves the BrokerConfig default intact.
controller_listener_protocol string broker default Controller listener security protocol. When Some(Ssl) the controller listener terminates TLS using tls_config.
controller_quorum_voters array of string [] KIP-595 static controller quorum voter set. Each entry is <node_id>@<host>:<port> pointing at a broker’s controller listener (port 9093). At apply time each entry is parsed (NOT DNS-resolved) and its <host>:<port> is carried verbatim into BrokerConfig::controller_quorum_voters. The inter-broker dialer re-resolves the host on every (re)connect (TcpStream::connect), so a peer that restarts on a new pod IP (a StatefulSet pod keeps its stable DNS name but gets a fresh A record) is reached again without restarting this broker — pre-resolving here would freeze the peer’s boot-time IP and strand a rejoining voter. Empty leaves the single self-voter the binary seeds (standalone).
controller_server_name string broker default TLS server name (SNI) presented when dialing a PEER’s controller listener for the KIP-595 quorum. The operator renders the shared headless-Service FQDN here — a SAN on every broker’s serving cert — so mTLS validation succeeds no matter which peer (resolved to a pod IP) is dialed. Absent falls back to "localhost". Maps to crate::BrokerConfig::controller_server_name.
delegation_token table broker default TOML shape of [delegation_token]. Maps to the three delegation_token_* fields on crate::BrokerConfig. See [delegation_token] below.
extra_log_dirs array of string [] Additional JBOD data directories (KIP-113). Maps to crate::BrokerConfig::extra_log_dirs.
freeze table broker default TOML shape of [freeze]. Maps to crate::config::FreezeConfig. Every field is Option: a present value replaces the current broker value, an absent one retains it. deny_unknown_fields so a misspelled require_signature is rejected at parse time rather than leaving the broker on the opposite policy to the one the operator wrote. See [freeze] below.
gssapi table broker default TOML shape of [gssapi]. Maps to crate::network::auth::GssapiConfig. principal_to_local_rules are parsed into KerberosRule at apply_to time. See [gssapi] below.
heartbeat_interval string broker default duration How often this broker sends BrokerHeartbeat to the controller leader. Absent leaves the BrokerConfig default intact.
heartbeat_timeout string broker default duration Controller-side session timeout for broker heartbeats. Absent leaves the BrokerConfig default intact.
inter_broker_credentials table broker default TOML shape of [inter_broker_credentials]. A type discriminator selects the variant. PLAIN/SCRAM inter-broker over TOML remain intentionally unexposed. See the [inter_broker_credentials] sections below.
inter_broker_listener_name string broker default Name of the listener that carries inter-broker traffic — raft, replication, and heartbeats. Kafka’s inter.broker.listener.name. It must match a name in [listeners][Self::listeners] when that list is non-empty. Absent leaves the BrokerConfig default "PLAINTEXT".
inter_broker_principal_node_ids map of string to integer (uint64) broker default Exact authenticated principal name to broker node ID bindings for diskless WAL follower fetches.
listeners array of tables [] See [[listeners]] below.
log_dir string broker default Primary log directory, the first entry of Kafka’s log.dirs. It is the partition data directory when [extra_log_dirs][Self::extra_log_dirs] is empty, and it holds the __cluster_metadata-0 raft log unless [metadata_log_dir][Self::metadata_log_dir] names another directory. Absent leaves the BrokerConfig default intact.
max_connections integer (uint) broker default Maximum number of live broker connections across all listeners (Kafka max.connections). Connections accepted past this ceiling are closed immediately. Absent leaves the BrokerConfig default usize::MAX (unlimited), matching Kafka’s Integer.MAX_VALUE.
max_connections_per_ip integer (uint) broker default Maximum number of live connections from any single client IP (Kafka max.connections.per.ip). Absent leaves the BrokerConfig default usize::MAX (unlimited).
metadata_log_dir string broker default The metadata log directory, Kafka’s metadata.log.dir. It holds the __cluster_metadata-0 raft log, its snapshots, the node’s meta.properties and the bootstrap records. A directory that is none of the data directories holds the metadata log only: no partition is placed there, and DescribeLogDirs does not report it. Absent keeps the metadata log in [log_dir][Self::log_dir], as Kafka keeps it in the first entry of log.dirs. --metadata-log-dir wins over it.
oauthbearer table broker default TOML shape of [oauthbearer]. Maps to krabka_security::OAuthBearerValidator. Setting jwks_endpoint_uri selects the signed-JWT validator; setting introspection_endpoint_uri selects the RFC 7662 introspection validator; the two endpoint URIs are mutually exclusive. With neither set, the unsecured-JWS validator (development only) is used, and that fallback is rejected at config-load unless allow_unsecured = true. See [oauthbearer] below.
operator_keys array of tables [] [[operator_keys]] — the shared operator key trust set. Top-level rather than nested under [break_glass], because two subsystems verify against it: a freeze record’s detached signature and a break-glass approval’s. One provisioning step covers both. Empty is the default and means no operator key is configured. See [[operator_keys]] below.
process table broker default [process] TOML section — KRaft process.roles. See [process] below.
rack string broker default KIP-392: this broker’s rack id. Maps to BrokerConfig::rack.
remote_storage table broker default TOML shape of [remote_storage]. Maps to crate::BrokerConfig::remote_storage_backend. Exactly one of storage_dir (local filesystem), [remote_storage.s3] (S3-compatible object store), or [remote_storage.gcs] (native Google Cloud Storage) should be set. Setting more than one errors at load time. See [remote_storage] below.
replica_lag_time_max string broker default duration Maximum follower lag before the leader proposes ISR shrink. Absent leaves the BrokerConfig default intact.
replica_selector string broker default KIP-392: replica selector name ("leader" | "rack-aware"). Maps to BrokerConfig::replica_selector.
runtime table broker default Validated operational policy loaded from [runtime]. See [runtime] below.
sasl_plain table broker default TOML shape of [sasl_plain]. Maps to crate::BrokerConfig::plain_credentials. See [sasl_plain] below.
schema_registry table broker default TOML shape of [schema_registry]. Mirrors the constructor arguments of crate::schema_validation::SchemaValidator::new, the one registry client each broker holds. deny_unknown_fields so a misspelled key is rejected at parse time. A silently ignored fail_open would leave the operator with the opposite of the policy they wrote. See [schema_registry] below.
server_properties map of string to string {} Raw Apache Kafka server.properties keys, for the settings krabka reads under their Kafka names rather than a dedicated TOML key. The broker consults transaction.two.phase.commit.enable, quota.window.num, quota.window.size.seconds, num.partitions, default.replication.factor, log.roll.ms, delete.topic.enable, auto.create.topics.enable, transaction.partition.verification.enable, the KIP-1066 cordoned.log.dirs, the KIP-1331 group.streams.topology.description.plugin.class, and Kafka’s two internal switches. krabka cannot load a JVM class, so group.streams.topology.description.plugin.class accepts only org.apache.kafka.server.streams.InMemoryTopologyDescriptionPlugin. krabka builds in that plugin, which keeps the latest topology description of each streams group in memory until the broker stops. unstable.api.versions.enable (default false) advertises and serves what krabka implements from Kafka trunk beyond 4.3.1: ApiVersions v5 (KIP-1242), TxnOffsetCommit v6 (KIP-1319), StreamsGroupHeartbeat and StreamsGroupDescribe v1 (KIP-1331, KIP-1357), StreamsGroupTopologyDescriptionUpdate (93) and UnregisterController (94), InitProducerId v6 and with 2PC the KIP-939 keepPreparedTxn recovery, and trunk’s group config keys; while it is false every listener serves exactly Kafka 4.3.1’s API versions. unstable.feature.versions.enable (default false) lets this node support metadata.version past 4.3.1’s 4.3-IV0 (30), up to trunk’s 4.5-IV0 (34), which the CIDR ACL hosts of KIP-1276 and the controller unregistration of KIP-1312 need. Any other entry is accepted and ignored. A key set here loses to the equivalent dedicated key, which is applied first.
stretch table broker default [stretch] TOML section — the three-site stretch deployment. The table is all-or-nothing. When it is present, all three fields must be, because a half-built profile would let the broker start with a site layout that no node agrees on. See [stretch] below.
super_users array of string broker default Principals that are unconditionally authorized for all operations, including KIP-48 delegation-token act-as. Super-user status does not substitute for authentication. The delegation-token RPCs (CreateDelegationToken, RenewDelegationToken, ExpireDelegationToken) require a principal that authenticated with SASL or mTLS, and answer DELEGATION_TOKEN_REQUEST_NOT_ALLOWED (64) on a PLAINTEXT or one-way-TLS connection whatever this list holds. An entry may use Kafka’s User:<name> form. As in Kafka, User:ANONYMOUS is accepted: it makes every unauthenticated client a super user, and a PLAINTEXT controller listener with a deny-capable authorizer needs it. None and Some(empty) are equivalent — both leave BrokerConfig.super_users empty.
tls_config table broker default TLS material for the controller listener (and any listener whose protocol is TLS-bearing). See [tls_config] below.
topic_policy table broker default TOML shape of [topic_policy]. Maps to crate::topic_policy::TopicPolicy. The whole table is the KIP-108 / KIP-133 policy Kafka loads from a Java class named by create.topic.policy.class.name and alter.config.policy.class.name. krabka cannot load a class, so the rules are declared here instead. Omitting the table declares no rule, which is Kafka’s default of no policy class: every CreateTopics and every topic AlterConfigs that passes ordinary config validation is accepted. A request that breaks a rule is answered with POLICY_VIOLATION (44) and an error_message naming the rule, which is what a PolicyViolationException from a Java policy class produces. The two replica rules apply to CreateTopics alone, because an AlterConfigs request carries neither number, exactly as AlterConfigPolicy.RequestMetadata does not. deny_unknown_fields so a misspelled rule name is rejected at parse time rather than leaving the broker enforcing nothing where the operator wrote a rule. See [topic_policy] below.

[audit]

[audit] section of broker.toml (FedRAMP 20x MLA).

Key Type Default Units Description
checkpoint table broker default [audit.checkpoint] — checkpoint cadence. See [audit.checkpoint] below.
enabled boolean true Whether the audit subsystem is active.
failure_mode string broker default Whether privileged operations continue when audit processing fails.
signing table broker default [audit.signing] — Ed25519 checkpoint signing key. See [audit.signing] below.
spool table broker default [audit.spool] — durable spool for the AU-5 degraded path. See [audit.spool] below.
topic string "__krabka_audit" Internal topic name for audit records. It has to start with __: the broker reports it internal on Metadata and refuses to freeze it by that prefix, and a name outside the convention would satisfy only the first of the two.

[audit.checkpoint]

[audit.checkpoint] — checkpoint cadence.

Key Type Default Units Description
every_n integer (uint64) 1000 Emit a checkpoint after this many audit records.
every_secs integer (uint64) 60 seconds Emit a checkpoint at least this often, in seconds.

[audit.signing]

[audit.signing] — Ed25519 checkpoint signing key.

Key Type Default Units Description
key_id string required Key id recorded on each checkpoint, so a verifier can follow a key rotation.
key_path string required Path to the PKCS#8 Ed25519 private key that signs audit checkpoints.

[audit.spool]

[audit.spool] — durable spool for the AU-5 degraded path.

Key Type Default Units Description
dir string "audit-spool" Directory that holds the spool files. A relative path resolves under the broker’s log directory.
max_bytes integer (uint64) 1073741824 bytes Cap on the total size of the spool on disk.
sync_every_n integer (uint64) 1 Number of appended records between durable file syncs.

[authorization]

TOML shape of [authorization]. type (renamed to authz_type on the Rust side to avoid shadowing the keyword) defaults to AllowAll; super_users is the principal bypass list consulted by every concrete authorizer impl. Omitting the whole block leaves the cluster with no authorizer, which is what Kafka has when authorizer.class.name is unset: every principal is allowed everything, and the ACL administration RPCs – DescribeAcls, CreateAcls and DeleteAcls – answer SECURITY_DISABLED (54) rather than an empty listing or a stored binding nothing would consult. kafka-acls reports that refusal. deny_unknown_fields so a misspelled super_user typo at the top of the [authorization] block is rejected at parse time rather than silently producing the wrong authorizer.

Key Type Default Units Description
allow_everyone_if_no_acl_found boolean false Kafka’s allow.everyone.if.no.acl.found. Only consulted by type = "simple". When true, a request is allowed if NO ACL at all applies to the resource – by type, name, and LITERAL/PREFIXED/wildcard pattern, regardless of principal, host, operation, or permission type. If at least one ACL applies to the resource and none of them matches, the request is still denied. Default false, matching Kafka’s StandardAuthorizer.
opa table broker default TOML shape of [authorization.opa]. Mirrors the constructor arguments of crate::authorizer::opa::OpaAuthorizer::new. Defaults are picked to match Strimzi’s KafkaAuthorizationOpa (50_000 LRU entries, 1 h TTL, fail-closed on OPA error). See [authorization.opa] below.
super_users array of string [] Principals that bypass every ACL check, Kafka’s super.users. The active authorizer and the delegation-token act-as gate both read it. An entry may use Kafka’s User:<name> form. User:ANONYMOUS is accepted, as in Kafka. Empty is the default and grants no bypass.
type one of allow_all, simple, opa broker default Which crate::authorizer::Authorizer impl to instantiate. snake_case to match the spec’s type = "allow_all" | "simple" | "opa" wire shape. allow_all is the default and is not an authorizer: it allows every principal every operation, and the ACL administration RPCs answer SECURITY_DISABLED (54), as Kafka does with no authorizer.class.name. simple and opa are decision points, and under either the ACL RPCs serve requests normally.

[authorization.opa]

TOML shape of [authorization.opa]. Mirrors the constructor arguments of crate::authorizer::opa::OpaAuthorizer::new. Defaults are picked to match Strimzi’s KafkaAuthorizationOpa (50_000 LRU entries, 1 h TTL, fail-closed on OPA error).

Key Type Default Units Description
allow_on_error boolean false Security-sensitive. Permit the operation when the OPA call fails (timeout, 5xx, parse error). When true, an OPA outage authorizes every request (fail-open). Default false (fail-closed) — omitting this field denies on error, matching the upstream Open Policy Agent Kafka plugin’s allow.on.error = false.
expire_after_ms integer (int64) 3600000 milliseconds Decision TTL, in milliseconds. Default 3_600_000 (1 h).
maximum_cache_size integer (uint) 50000 entries LRU cache capacity, in entries. Default 50_000.
url string required OPA decision endpoint URL — must include the data-API path, e.g. http://opa:8181/v1/data/kafka/authz/allow.

[break_glass]

TOML shape of [break_glass]. Maps to crate::config::BreakGlassConfig. Every field is Option, so approvers = [] and signed_actions = [] are each a written choice and are distinct from omitting the key. deny_unknown_fields so a misspelled key is rejected at parse time.

Key Type Default Units Description
approvers array of string broker default Principals that may approve a proposal. Omitted leaves the BrokerConfig value, which is empty.
background_unclean_recovery one of off, audit-only, require broker default What the background unclean-recovery path does when it cannot ask anybody for a break-glass approval. The controller starts unclean recovery from leader election and from the broker-heartbeat path. Neither carries a request context, so neither has a caller to refuse. An operator who types an unclean election can be asked for a second signature; a controller that reacts to a dead broker at 03:00 cannot. The TOML spelling is off | audit-only | require, so the serde rename is kebab-case.
proposal_ttl string broker default duration How long a proposal stays usable. Default crate::config::DEFAULT_BREAK_GLASS_PROPOSAL_TTL.
required_approvals integer (uint) broker default Distinct approving principals a proposal needs. Default crate::config::DEFAULT_BREAK_GLASS_REQUIRED_APPROVALS. Values below crate::config::MIN_BREAK_GLASS_REQUIRED_APPROVALS are a startup error: a two-person rule with one approval is one person.
signed_actions array of string broker default Actions whose approvals must also carry a detached operator signature. Omitted inside a present [break_glass] section selects crate::config::DEFAULT_BREAK_GLASS_SIGNED_ACTIONS, the irreversible set. Naming any action with no [[operator_keys]] entry is a startup error; write signed_actions = [] to demand no signature.

[delegation_token]

TOML shape of [delegation_token]. Maps to the three delegation_token_* fields on crate::BrokerConfig.

Key Type Default Units Description
default_renew_period_ms integer (int64) broker default milliseconds Default renew period — the initial expiry_timestamp_ms offset at create time and the implicit renew period when RenewDelegationToken.renew_period_ms == -1. Distinct from max_lifetime_ms (the absolute ceiling). Default 24 hours.
expiry_check_interval_ms integer (int64) broker default milliseconds Background sweep cadence, ms. Default 1 hour.
max_lifetime_ms integer (int64) broker default milliseconds Hard upper bound on token lifetime, ms. Default 7 days.
secret_key string broker default HMAC master key. Overridden by KRABKA_DELEGATION_TOKEN_SECRET_KEY when set. Bytes are wrapped in krabka_security::SecretBytes before reaching BrokerConfig.

[freeze]

TOML shape of [freeze]. Maps to crate::config::FreezeConfig. Every field is Option: a present value replaces the current broker value, an absent one retains it. deny_unknown_fields so a misspelled require_signature is rejected at parse time rather than leaving the broker on the opposite policy to the one the operator wrote.

Key Type Default Units Description
max_entries integer (uint) broker default entries Ceiling on live freeze registry entries. Default crate::config::DEFAULT_FREEZE_MAX_ENTRIES. Must be at least 1.
require_signature boolean broker default Security-sensitive. Demand a detached operator signature on a freeze as well as on a thaw. Default false, which keeps a freeze available in one command during an incident on a cluster with no key material yet. A thaw is signed either way. Setting this to true with no [[operator_keys]] entry is a startup error: there would be no key to verify the demanded signature against.
signature_max_skew string broker default duration How far a signed freeze record’s timestamp may sit from the controller’s clock. Default crate::config::DEFAULT_FREEZE_SIGNATURE_MAX_SKEW.

[gssapi]

TOML shape of [gssapi]. Maps to crate::network::auth::GssapiConfig. principal_to_local_rules are parsed into KerberosRule at apply_to time.

Key Type Default Units Description
kdc string broker default KDC endpoint (e.g. tcp://kdc:88) that bypasses krb5.conf discovery; falls back to krb5.conf when omitted.
keytab_path string required Keytab that holds this broker’s Kerberos service key. The SASL/GSSAPI accept path reads it to answer a client’s ticket.
max_time_skew string broker default duration Maximum tolerated difference between client and broker clocks.
principal_to_local_rules array of string ["DEFAULT"] auth_to_local rule specs, applied in order (first match wins). Kafka’s default for sasl.kerberos.principal.to.local.rules is ["DEFAULT"], and an empty list maps no principal.
realm string broker default Default Kerberos realm, the only realm the DEFAULT rule accepts. Kafka reads it from krb5.conf; when it is omitted DEFAULT matches no principal and the rules have to name the realm.
service_name string broker default sasl.kerberos.service.name. Defaults to "kafka" when omitted.

[inter_broker_credentials] with type = "gssapi"

Key Type Default Units Description
client_principal string required Kerberos principal this broker authenticates as when it dials a peer.
kdc_url string required KDC endpoint (for example tcp://kdc:88) used to obtain the service ticket, bypassing krb5.conf discovery.
keytab_path string required Keytab that holds the key for client_principal.
service_name string broker default The peer’s sasl.kerberos.service.name. Defaults to "kafka" when omitted.
type constant "gssapi" required Selects this variant of the table.

[inter_broker_credentials] with type = "oauth-bearer"

Key Type Default Units Description
token_path string required File containing the bearer token. A trailing newline is ignored. The token itself never appears in the parsed config’s Debug form.
type constant "oauth-bearer" required Selects this variant of the table.

[[listeners]]

Key Type Default Units Description
advertised string required host:port published to clients in Metadata responses, Kafka’s advertised.listeners entry for this listener.
bind_addr string required Local host:port this listener binds.
connections_max_idle string broker default duration Per-listener connections.max.idle.ms. Absent leaves this listener on the broker-wide connections_max_idle. Maps to an entry in crate::BrokerConfig::connections_max_idle_overrides.
connections_max_reauth string broker default duration Per-listener KIP-368 connections.max.reauth.ms. Absent leaves this listener on the broker-wide connections_max_reauth. Maps to an entry in crate::BrokerConfig::connections_max_reauth_overrides.
name string required Listener name, for example "PLAINTEXT" or "SASL_SSL". It is the name inter_broker_listener_name and Kafka’s listener.security.protocol.map refer to.
protocol string required Security protocol this listener speaks: Plaintext, Ssl, SaslPlaintext, or SaslSsl.
sasl_config table broker default See [listeners.sasl_config] below.
tls_config table broker default See [listeners.tls_config] below.

[listeners.sasl_config]

Key Type Default Units Description
enabled_mechanisms array of string [] SASL mechanisms this listener accepts, Kafka’s sasl.enabled.mechanisms. Each entry is a wire name such as PLAIN, SCRAM-SHA-256, GSSAPI, or OAUTHBEARER; an unknown name is rejected at parse time.

[listeners.tls_config]

Key Type Default Units Description
cert_path string required PEM file holding this listener’s server certificate chain.
client_auth one of Disabled, Optional, Required broker default Whether a TLS listener asks for and requires a client certificate, Kafka’s ssl.client.auth. Disabled is the default and never asks; Optional asks and accepts a connection that presents none; Required rejects a connection that presents none. Optional and Required both need a client_ca_path.
client_ca_path string broker default PEM file of CA(s) this listener validates client certificates against. Absent leaves mTLS without a client trust store, so client_auth has to be Disabled.
key_path string required PEM file holding the private key for cert_path.
principal_mapping_rules array of string ["DEFAULT"] KIP-371 ssl.principal.mapping.rules: how the Subject DN of an mTLS peer certificate becomes the principal name ACLs and super_users are written against. Each entry is either DEFAULT, which uses the DN itself, or RULE:pattern/replacement/[L|U], where pattern has to match the whole DN, replacement may reference capture groups as $1, and a trailing L or U lowercases or uppercases the result. The rules are tried in order and the first match wins. Defaults to ["DEFAULT"], so a listener that says nothing keeps Kafka’s behaviour of using the full DN. A malformed entry is rejected at startup. Case-insensitive backreferences have a Unicode compatibility edge: under (?i), non-ASCII case pairs may match here when Java rejects them (for example é and É); under (?iu), pairs Java accepts may fail here (for example i and İ, or s and ſ). Ordinary ASCII DNs are unaffected. Keep both captured and referenced text ASCII, or avoid case-insensitive backreferences when exact Java behavior matters.
trust_roots_path string broker default PEM file of CA(s) this broker trusts when validating a PEER’s server cert as an outbound inter-broker / controller-quorum dialer. The operator renders the cluster CA here so KIP-595 controller peers can mutually authenticate over the controller listener. Maps to krabka_security::TlsConfig::trust_roots_path.

[oauthbearer]

TOML shape of [oauthbearer]. Maps to krabka_security::OAuthBearerValidator. Setting jwks_endpoint_uri selects the signed-JWT validator; setting introspection_endpoint_uri selects the RFC 7662 introspection validator; the two endpoint URIs are mutually exclusive. With neither set, the unsecured-JWS validator (development only) is used, and that fallback is rejected at config-load unless allow_unsecured = true.

Key Type Default Units Description
allow_unsecured boolean broker default Opt-in for the unsecured-JWS (alg:none) development validator. Default false. With neither jwks_endpoint_uri nor introspection_endpoint_uri set and a listener enabling OAUTHBEARER, the broker refuses to start rather than silently trusting unsigned tokens; set this to true to accept that fallback in development. Never set it in production.
allowable_clock_skew_ms integer (int64) broker default milliseconds Clock-skew tolerance, in milliseconds, for exp / iat / nbf. Default 30000.
custom_claim_check string broker default Optional JsonPath expression (RFC 9535, via jsonpath-rust) evaluated against the token claim set. Token is rejected when the expression yields empty/null/false. Compiled once at broker startup; malformed expressions panic with a descriptive error.
expected_audience string broker default When set, the token aud claim must contain this. Signed validator only.
fallback_user_name_claim string broker default Alternate claim name for principal-name fallback.
fallback_user_name_prefix string broker default Prepended on fallback only.
groups_claim string broker default JsonPath expression (RFC 9535) extracting groups. Compiled once at broker startup; malformed expression panics with descriptive error.
groups_claim_delimiter string broker default When groups_claim resolves to a string, split on this delimiter.
idp_tls_trust string broker default PEM file containing the CA certificate(s) used to verify the IdP’s TLS certificate on ALL outbound HTTPS to the IdP — JWKS endpoint, introspection endpoint, and userinfo endpoint. When set, these are the only trust roots used for the outbound HTTPS (replaces the default webpki-roots — Strimzi-shaped). When unset, the broker uses reqwest’s default rustls webpki-roots.
introspection_client_id string broker default client_id the broker uses to authenticate (HTTP Basic Auth) against the introspection endpoint. Required when introspection_endpoint_uri is set.
introspection_client_secret_path string broker default Filesystem path to a file containing the client secret the broker uses to authenticate against the introspection endpoint. Required when introspection_endpoint_uri is set. File-based (not literal) so secret material doesn’t sit in the TOML; operator mounts a Secret and writes the mount path here. The file’s trailing newline (if any) is stripped at config-load.
introspection_endpoint_uri string broker default RFC 7662 introspection endpoint URL. When set, selects the introspection validator (mutually exclusive with jwks_endpoint_uri).
introspection_http_timeout_ms integer (uint64) broker default milliseconds Timeout for the introspection (and userinfo) HTTP requests, in milliseconds. Default 10 000 (10 s).
jwks_endpoint_uri string broker default JWKS endpoint URL. When set, tokens are validated as signed JWTs (RS256 / ES256) against the keys fetched from this URL, and the broker spawns a background refresher. When unset, the unsecured-JWS (alg:none) development validator is used.
jwks_expiry_seconds integer (uint32) broker default seconds Maximum age (seconds) of the cached JWKS before validators reject tokens until the next successful refresh. Strimzi default 360 (6 minutes). Unset = no expiry check. Fails closed on prolonged IdP outage. Signed validator only.
jwks_ignore_key_use boolean broker default When true, the JWKS parser keeps keys regardless of use field. Default false (filter out use=enc). Some identity providers publish signing keys with use="enc" by mistake; operators set this to true to accept them. Signed validator only.
jwks_min_refresh_pause_seconds integer (uint32) broker default seconds Minimum pause (seconds) between on-demand JWKS refreshes triggered by validator signals (unknown-kid / bad-signature tokens). Defaults to 1 (Strimzi parity). Signed validator only.
jwks_refresh_interval_ms integer (uint64) broker default milliseconds JWKS re-fetch interval, in milliseconds. Default 300000 (5 minutes). Signed validator only.
principal_claim_name string broker default Claim whose value becomes the principal name. Default sub.
userinfo_endpoint_uri string broker default Optional OIDC userinfo endpoint URL. When set, the introspection validator calls GET userinfo after a successful introspection and merges the profile claims over the introspection claims (introspection wins for active, exp, iat, nbf, scope, client_id, sub).
valid_issuer_uri string broker default When set, the token iss claim must equal this. Signed validator only.
valid_token_type string broker default Optional JWT typ header check. When set, JWT-mode validators (unsecured + signed JWS) require the JWT header’s typ field to equal this string. Introspection-mode skips (no JWT header). Ignored when unset.

[[operator_keys]]

TOML shape of one [[operator_keys]] entry. Maps to crate::operator_keys::OperatorKeyEntry. deny_unknown_fields so a misspelled key is rejected at parse time. An ignored principal typo would leave a key bound to nobody, and the principal binding is what stops one operator’s key signing in another operator’s name.

Key Type Default Units Description
key_id string required Stable identifier that a signed freeze record or break-glass approval names. Must be unique across the array.
principal string required The principal this key speaks for, e.g. "User:alice". Must be unique across the array. The broker refuses a signed record whose claimed author is not this principal.
public_key_path string required Path to the raw 32-byte Ed25519 public key, the bytes an krabka_audit::FileEd25519Signer reports as its public key. It is read at startup, so a bad path stops the broker at boot and not in the middle of an incident.

[process]

[process] TOML section — KRaft process.roles.

Key Type Default Units Description
roles array of string [] Role strings: "controller", "broker", "witness" (case-insensitive). Empty or absent leaves the BrokerConfig default [Controller, Broker]. A "witness" entry is a modifier: it must come with both of the other two roles.

[remote_storage]

TOML shape of [remote_storage]. Maps to crate::BrokerConfig::remote_storage_backend. Exactly one of storage_dir (local filesystem), [remote_storage.s3] (S3-compatible object store), or [remote_storage.gcs] (native Google Cloud Storage) should be set. Setting more than one errors at load time.

Key Type Default Units Description
copier_threads integer (uint) broker default How many partitions may be copying segments to the remote tier at once. Kafka’s remote.log.manager.copier.thread.pool.size; defaults to 10. Raising it is the remedy for a copy backlog on an object store with bandwidth to spare.
copy_timeout string broker default duration Deadline on one segment copy to the remote tier. Defaults to 10 minutes. A partition holds one copier slot for the whole of its copy pass, so a copy that hangs on a stalled object store spends that slot on a partition moving no bytes. Past this deadline the copy is abandoned and retried on the next tick; the segment stays in CopySegmentStarted, which local retention refuses to delete against.
expiration_threads integer (uint) broker default How many partitions may be running their local- and remote-retention passes at once. Kafka’s remote.log.manager.expiration.thread.pool.size; defaults to 10.
gcs table broker default TOML shape of [remote_storage.gcs]. Maps to krabka_remote_storage::GcsConfig. Omitting all credential fields (service_account_path, service_account_key, application_credentials_path) selects GKE Workload Identity / Application Default Credentials (keyless) — the primary production path. See [remote_storage.gcs] below.
index_cache_size string broker default byte size Byte budget of the on-disk cache of remote segment indexes under <log_dir>/remote-log-index-cache. Kafka’s remote.log.index.file.cache.total.size.bytes; defaults to 1 GiB.
kafka_metadata table broker default TOML shape of [remote_storage.kafka_metadata]. Maps to crate::config::KafkaRlmmConfig. See [remote_storage.kafka_metadata] below.
reader_max_pending_tasks integer (uint) broker default How many cold-tier reads may wait for a reader slot before one is refused. Kafka’s remote.log.reader.max.pending.tasks; defaults to 100.
reader_threads integer (uint) broker default How many cold-tier reads may run at once. Kafka’s remote.log.reader.threads; defaults to 10.
s3 table broker default TOML shape of [remote_storage.s3]. Maps to krabka_remote_storage::S3Config. See [remote_storage.s3] below.
storage_dir string broker default Root directory for the local LocalTieredStorage backend.
worm table broker default TOML shape of [remote_storage.worm]. Maps to krabka_remote_storage::WormConfig. Presence of the table enables WORM archive mode. Unlike FileRemoteStorageS3Config this derives Debug plainly, and that is deliberate: it holds a path to a signing key and the key’s public id, neither of which is credential material, and an operator debugging a chain needs to see which key signed it. Do not “fix” this into a redacting impl. See [remote_storage.worm] below.

[remote_storage.gcs]

TOML shape of [remote_storage.gcs]. Maps to krabka_remote_storage::GcsConfig. Omitting all credential fields (service_account_path, service_account_key, application_credentials_path) selects GKE Workload Identity / Application Default Credentials (keyless) — the primary production path.

Key Type Default Units Description
allow_http boolean false Allow plaintext HTTP (off-by-default; required by emulators running without TLS).
application_credentials_path string broker default Path to an Application Default Credentials JSON file. Omit (along with the other credential fields) to use Workload Identity / ADC.
bucket string required GCS bucket name.
connect_timeout string broker default duration Ceiling on the connect phase alone. When None, krabka_object_store::DEFAULT_CONNECT_TIMEOUT (5s) applies.
endpoint string broker default Optional custom GCS API base URL (for emulators / fakes).
max_retries integer (uint) broker default How many times one object-store request is retried before the error reaches the broker. When None, krabka_object_store::DEFAULT_MAX_RETRIES (10) applies; 0 disables retries. Under a store that answers 503 SlowDown this is what bounds how long one call holds its caller before the failure is counted and the sweep moves on.
multipart_chunk_size integer (uint) broker default bytes Optional override of the per-part multipart chunk size (bytes). When None, krabka_remote_storage::DEFAULT_MULTIPART_CHUNK_SIZE applies.
multipart_threshold integer (uint64) broker default bytes Optional override of the multipart-upload threshold (bytes). When None, krabka_remote_storage::DEFAULT_MULTIPART_THRESHOLD applies. Operators typically leave this alone; lower it to force multipart on smaller segments for testing.
prefix string broker default Optional key prefix inside the bucket (lets multiple clusters share a bucket).
request_timeout string broker default duration Ceiling on one HTTP request, connect phase included. When None, krabka_object_store::DEFAULT_REQUEST_TIMEOUT (30s) applies. This is the bound on a store that accepts the connection and then answers nothing.
retry_timeout string broker default duration Ceiling on the wall-clock time one request may spend across all of its retries. When None, krabka_object_store::DEFAULT_RETRY_TIMEOUT (3m) applies. Keep it under 5 minutes: retries reuse the original request’s credentials.
service_account_key string broker default Inline service-account JSON key. Omit (along with the other credential fields) to use Workload Identity / ADC.
service_account_path string broker default Path to a service-account JSON key file. Omit (along with the other credential fields) to use Workload Identity / ADC.

[remote_storage.kafka_metadata]

TOML shape of [remote_storage.kafka_metadata]. Maps to crate::config::KafkaRlmmConfig.

Key Type Default Units Description
bootstrap string "" host:port the manager dials to reach its own broker. May be empty; the broker derives the address from the inter-broker listener at startup.
event_queue_capacity integer (uint) broker default Capacity of the shared metadata-event delivery queue.
fetch_max_bytes string broker default byte size Maximum bytes returned by each per-partition metadata fetch.
fetch_max_wait string broker default duration Maximum wait for each per-partition metadata fetch.
fetch_retry_backoff string broker default duration Backoff after a failed metadata fetch.
in_memory boolean false Explicit opt-out: run the non-durable in-memory RLMM instead of the topic-backed default. Tests / single-node dev only.
min_isr integer (int32) broker default min.insync.replicas for __remote_log_metadata on first creation. Defaults to 2 (Kafka’s remote.log.metadata.topic.min.isr). Keep it at or below replication: a topic whose min.insync.replicas exceeds its replica count rejects every acks=all write, so a single-broker setup that sets replication = 1 sets this to 1 as well.
num_partitions integer (int32) broker default Partition count for __remote_log_metadata on first creation. Defaults to 50 (Kafka’s remote.log.metadata.topic.num.partitions).
replication integer (int32) broker default Replication factor for __remote_log_metadata on first creation. Defaults to 3 (Kafka’s remote.log.metadata.topic.replication.factor).
snapshot_interval string broker default duration RLMM cache snapshot cadence.
topic_create_timeout string broker default duration Timeout for provisioning each internal metadata topic.

[remote_storage.s3]

TOML shape of [remote_storage.s3]. Maps to krabka_remote_storage::S3Config.

Key Type Default Units Description
access_key_id string broker default Explicit access key id. Falls back to the AWS credential chain (env vars, instance profile, …) when omitted.
allow_http boolean false Allow plaintext HTTP (off-by-default; required by MinIO running without TLS).
bucket string required S3 bucket name.
checksum_sha256 boolean broker default Optional override of the x-amz-checksum-sha256 header, which has the server verify each object on ingest. When None, the krabka_remote_storage::S3Config default of true applies.
conditional_put boolean broker default Optional override of conditional puts (If-None-Match), which make a create-mode write fail on an existing key instead of overwriting it. When None, the krabka_remote_storage::S3Config default of true applies. Turn it off only for an S3-compatible store that mishandles the header; WORM archive mode relies on it.
connect_timeout string broker default duration Ceiling on the connect phase alone. When None, krabka_object_store::DEFAULT_CONNECT_TIMEOUT (5s) applies.
endpoint string broker default Optional custom endpoint URL (e.g. MinIO or Cloudflare R2).
max_retries integer (uint) broker default How many times one object-store request is retried before the error reaches the broker. When None, krabka_object_store::DEFAULT_MAX_RETRIES (10) applies; 0 disables retries. Under a store that answers 503 SlowDown this is what bounds how long one call holds its caller before the failure is counted and the sweep moves on.
multipart_chunk_size integer (uint) broker default bytes Optional override of the per-part multipart chunk size (bytes). When None, krabka_remote_storage::DEFAULT_MULTIPART_CHUNK_SIZE applies. AWS requires parts ≥ 5 MiB except the last; MinIO tolerates smaller values.
multipart_threshold integer (uint64) broker default bytes Optional override of the multipart-upload threshold (bytes). When None, krabka_remote_storage::DEFAULT_MULTIPART_THRESHOLD applies. Operators typically leave this alone; lower it to force multipart on smaller segments for testing.
prefix string broker default Optional key prefix inside the bucket (lets multiple clusters share a bucket).
region string required AWS region. Required even for non-AWS endpoints (use any value).
request_timeout string broker default duration Ceiling on one HTTP request, connect phase included. When None, krabka_object_store::DEFAULT_REQUEST_TIMEOUT (30s) applies. This is the bound on a store that accepts the connection and then answers nothing.
retry_timeout string broker default duration Ceiling on the wall-clock time one request may spend across all of its retries. When None, krabka_object_store::DEFAULT_RETRY_TIMEOUT (3m) applies. Keep it under 5 minutes: retries reuse the original request’s credentials.
secret_access_key string broker default Explicit secret access key. Falls back to the AWS credential chain when omitted.

[remote_storage.worm]

TOML shape of [remote_storage.worm]. Maps to krabka_remote_storage::WormConfig. Presence of the table enables WORM archive mode. Unlike FileRemoteStorageS3Config this derives Debug plainly, and that is deliberate: it holds a path to a signing key and the key’s public id, neither of which is credential material, and an operator debugging a chain needs to see which key signed it. Do not “fix” this into a redacting impl.

Key Type Default Units Description
signing_key_id string broker default Stable identifier recorded in every manifest signature, so a chain stays verifiable across a key rotation. Default: unset. Setting this requires signing_key_path as well.
signing_key_path string broker default Path to the PKCS#8 Ed25519 key that signs each segment manifest. Default: unset. Manifests then carry no signature, and the archive keeps only the per-object digests and the hash chain. Setting this requires signing_key_id as well.
write_only boolean false Refuse every remote fetch from this archive. Default: false. When true, remote fetch is unavailable: a consumer that asks for an offset whose local segment has already been evicted gets an error, not a slow read. The archive is then a compliance sink, not a storage tier.

[runtime]

Validated operational policy loaded from [runtime].

Key Type Default Units Description
audit_event_queue_capacity integer (uint) broker default Capacity of the asynchronous audit event queue.
audit_partition_wait_timeout string broker default duration Maximum wait for the audit partition to become available.
audit_spool_replay_interval string broker default duration Cadence at which the audit spool replays records it could not append.
audit_stats_poll_interval string broker default duration Cadence of the audit statistics poll.
audit_tail_read_max string broker default byte size Maximum bytes read by one audit tail request.
audit_tail_window_offsets integer (int64) broker default Number of offsets included in one audit tail request.
auto_join_retry_backoff string broker default duration Retry delay between KIP-853 dynamic-quorum auto-join attempts.
auto_join_voter_request_timeout string broker default duration Timeout carried by a dynamic-quorum AddRaftVoter request.
barrier_injection_timeout string broker default duration Deadline for one barrier injection to reach every target partition.
barrier_max_groups integer (uint) broker default Maximum number of barrier groups the cluster accepts.
barrier_max_topics_per_group integer (uint) broker default Maximum number of topics in one barrier group.
barrier_min_injection_interval string broker default duration Shortest periodic injection interval a barrier group may ask for.
barrier_recovery_read_max string broker default byte size Maximum bytes requested by one __barrier_state recovery read.
barrier_retained_cuts integer (int32) broker default Number of cuts a barrier group keeps before it tombstones the oldest.
barrier_state_num_partitions integer (int32) broker default Partition count of the __barrier_state internal topic.
barrier_state_replication_factor integer (int16) broker default Replication factor of the __barrier_state internal topic.
classic_group_initial_rebalance_delay string broker default duration Initial delay before a classic group begins rebalancing, Kafka’s group.initial.rebalance.delay.ms. Zero completes a new group’s first rebalance as soon as its first member joins.
classic_group_max_session_timeout string broker default duration Upper bound on a classic JoinGroup session timeout, Kafka’s group.max.session.timeout.ms.
classic_group_max_size integer (uint) broker default Maximum number of members in one classic group, Kafka’s group.max.size.
classic_group_min_session_timeout string broker default duration Lower bound on a classic JoinGroup session timeout, Kafka’s group.min.session.timeout.ms.
cleaner_interval string broker default duration Cadence of log cleaner maintenance.
client_metrics_default_interval string broker default duration Default KIP-714 client telemetry subscription push interval.
client_metrics_enable boolean broker default Whether the broker advertises the KIP-714 client-metrics RPCs, GetTelemetrySubscriptions (71) and PushTelemetry (72). Kafka advertises them only when metric.reporters holds a ClientTelemetry implementation, so the default here is false as well and a client starts no telemetry handshake the broker has nowhere to forward. A configured [telemetry] OTLP endpoint turns them on without this key.
client_metrics_eviction_tick string broker default duration Cadence at which the KIP-714 client-metrics cache evicts entries.
client_metrics_otlp_queue_capacity integer (uint) broker default Capacity of the client-metrics OTLP forwarding queue.
client_metrics_prom_snapshot_ttl string broker default duration Lifetime of a Prometheus client-metrics snapshot.
client_metrics_stale_floor string broker default duration Minimum age at which a client-metrics entry counts as stale.
client_metrics_stale_push_intervals integer (uint32) broker default Number of missed push intervals after which client metrics expire.
client_metrics_telemetry_max string broker default byte size Maximum accepted KIP-714 client telemetry payload size.
connection_creation_throttle_max string broker default duration Maximum KIP-612 connection-creation quota delay.
connection_failed_authentication_delay string broker default duration How long a failed SASL authentication holds its response and the close that follows, Kafka’s connection.failed.authentication.delay.ms. Zero closes at once.
consumer_group_heartbeat_interval string broker default duration Default KIP-848 consumer-group heartbeat interval, Kafka’s group.consumer.heartbeat.interval.ms.
consumer_group_max_heartbeat_interval string broker default duration Upper bound on the negotiated consumer-group heartbeat interval, Kafka’s group.consumer.max.heartbeat.interval.ms.
consumer_group_max_session_timeout string broker default duration Upper bound on the negotiated consumer-group session timeout, Kafka’s group.consumer.max.session.timeout.ms.
consumer_group_max_size integer (uint) broker default Maximum number of members in one consumer group, Kafka’s group.consumer.max.size.
consumer_group_min_heartbeat_interval string broker default duration Lower bound on the negotiated consumer-group heartbeat interval, Kafka’s group.consumer.min.heartbeat.interval.ms.
consumer_group_min_session_timeout string broker default duration Lower bound on the negotiated consumer-group session timeout, Kafka’s group.consumer.min.session.timeout.ms.
consumer_group_session_timeout string broker default duration Default KIP-848 consumer-group session timeout, Kafka’s group.consumer.session.timeout.ms.
controlled_shutdown_drain_timeout string broker default duration How long a controlled shutdown waits for the controller to acknowledge should_shut_down before it falls back to a hard shutdown.
controller_election_timeout string broker default duration Controller election timeout, Kafka’s controller.quorum.fetch.timeout.ms. It is the follower fetch watchdog, and 1.5x of it is the leader’s check-quorum window: a leader that a majority of the voters has not fetched from within that window resigns its epoch.
controller_fetch_miss_limit integer (uint32) broker default Consecutive follower fetch misses tolerated before a new election.
controller_heartbeat_interval string broker default duration Raft heartbeat interval on the controller quorum. It should stay at or below controller_election_timeout / 3.
controller_mutation_quota_window string broker default duration Time window whose throughput defines the KIP-599 controller-mutation quota burst capacity (default 11 s), Kafka’s controller.quota.window.num x controller.quota.window.size.seconds.
coordinator_actor_mailbox_capacity integer (uint) broker default Mailbox capacity of each coordinator actor.
coordinator_session_expiry_tick string broker default duration Cadence of the consumer-group session expiry scan.
coordinator_shutdown_ack_timeout string broker default duration Maximum wait for coordinator shutdown acknowledgements.
default_min_insync_replicas integer (int32) broker default Broker default for a topic’s min.insync.replicas, Kafka’s min.insync.replicas. A topic override wins over it.
default_replication_factor integer (int16) broker default Replication factor of a topic that CreateTopics creates with replication_factor = -1, Kafka’s default.replication.factor.
delegation_token_default_renew_period string broker default duration KIP-48: default renew period, Kafka’s delegation.token.expiry.time.ms. It is the initial expiry offset at create time, and the implicit renew period when a RenewDelegationToken request asks for -1.
delegation_token_expiry_check_interval string broker default duration KIP-48: cadence of the sweep that tombstones expired delegation tokens, Kafka’s delegation.token.expiry.check.interval.ms.
delegation_token_max_lifetime string broker default duration KIP-48: hard upper bound on a delegation token’s lifetime, Kafka’s delegation.token.max.lifetime.ms. A renew request is clamped to it.
diskless_wal_flush_interval string broker default duration Cadence of diskless WAL flushes to the object store.
diskless_wal_flush_max_size string broker default byte size Maximum bytes included in one diskless WAL object-store flush.
diskless_wal_hot_tail_max_size string broker default byte size Broker-wide byte ceiling for quorum-committed diskless hot-tail batches.
diskless_wal_index_projection_timeout string broker default duration Maximum wait for a published diskless WAL index record to be projected.
diskless_wal_local_replica_count integer (uint) broker default Local replica count used in diskless WAL mode.
diskless_wal_trim_safety_lag integer (int64) broker default Committed offsets retained behind the diskless WAL trim frontier.
fetch_max_bytes string broker default byte size Maximum bytes returned by one consumer Fetch or ShareFetch, Kafka’s fetch.max.bytes. Kafka’s default is 57,671,680 bytes.
future_log_move_read_chunk string broker default byte size Bytes copied per read during a KIP-113 future-log move.
future_log_move_retry_backoff string broker default duration Retry delay after a KIP-113 future-log move fails.
gauge_poll_interval string broker default duration Cadence at which broker gauges are refreshed.
heartbeat_interval string broker default duration How often this broker sends BrokerHeartbeat to the controller leader.
heartbeat_timeout string broker default duration How long the controller waits without a heartbeat before it marks a broker dead.
inter_broker_server_name string broker default TLS SNI and SASL server name used for outbound inter-broker connections.
isr_scan_interval string broker default duration Cadence of in-sync-replica maintenance.
leader_imbalance_check_interval string broker default duration How often the auto-rebalance ticker fires, Kafka’s leader.imbalance.check.interval.seconds.
legacy_request_versions_enable boolean broker default Whether the broker serves the request versions Kafka 4.x removed: Fetch v0-v3, ListOffsets v0 and Produce v0-v2. krabka-only, with no Kafka equivalent. The default is false, which advertises and accepts exactly Kafka 4.3.1’s minimums (Fetch v4, ListOffsets v1, and Produce v3 though it is still advertised from v0, KAFKA-18659) and closes a connection that sends an older version, as a 4.3.1 broker does. true keeps a pre-0.11 client working.
liveness_tick_interval string broker default duration Cadence of broker liveness maintenance.
log_delivery_clock_uncertainty string broker default duration Declared bound on how far this broker’s clock can be from true time. It has an effect only under the scheduled delivery policy: a batch becomes visible once max_timestamp + log_delivery_clock_uncertainty <= now, so delivery is never early and is late by at most twice this bound.
log_read_ahead_max string broker default byte size Cap on how far past a fetch read’s own byte range the broker asks the kernel to read ahead, so a consumer that is behind finds its next fetch in the page cache. The hint reaches up to one more range of the same size, and no further than this. The default is 4 MiB, and 0 limits the hint to the fetch’s own range. The hint has no effect on a host other than Linux.
log_read_buffer_cap string broker default byte size Cap on the initial allocation a decoded or raw segment read makes.
log_retention_check_interval string broker default duration Cadence of local-retention maintenance: how often retention.ms, retention.bytes and segment.ms are applied to every hosted log.
log_segment_bytes string broker default byte size Roll the active segment once it grows past this. Kafka’s log.segment.bytes, the broker default for a topic’s segment.bytes.
log_tail_cache_size string broker default byte size How much of the newest data a partition with preallocate=true keeps in memory to serve reads with. Such a partition writes its active segment through O_DIRECT, which bypasses the page cache, so without this a consumer reading right behind the producer reads from disk. Every such partition holds up to this much, plus one batch. The default is 32 MiB, and 0 keeps only the newest batch.
log_timestamp_scan_window string broker default byte size Size of the window a timestamp search reads the log in.
max_connections integer (uint) broker default Maximum number of live broker connections across all listeners, Kafka’s max.connections. A connection accepted past this ceiling is closed immediately.
max_connections_per_ip integer (uint) broker default Maximum number of live connections from any single client IP, Kafka’s max.connections.per.ip.
max_incremental_fetch_session_cache_slots integer (uint) broker default KIP-227: maximum number of incremental-fetch sessions kept in the per- broker cache, Kafka’s max.incremental.fetch.session.cache.slots. When the cache is full, a new session displaces only a session that has been unused for more than two minutes, or a smaller one created more than two minutes ago (a follower-fetch session may also displace any consumer session); otherwise it is refused and the fetch runs sessionless, as in Kafka’s FetchSessionCacheShard.tryEvict.
max_produce_group integer (uint) broker default Maximum number of produce requests combined into one append group.
max_request_partition_size_limit integer (int32) broker default Upper clamp on DescribeTopicPartitions’ response_partition_limit, Kafka’s max.request.partition.size.limit.
message_max_bytes string broker default byte size Kafka’s broker-wide message.max.bytes: the largest record batch a topic that sets no max.message.bytes accepts.
metadata_log_segment_bytes string broker default byte size Largest size of one metadata-log segment, Kafka’s metadata.log.segment.bytes. The active segment rolls before an append that takes it past this size. A whole number of bytes from 8 MiB to 2147483647 bytes, as Kafka’s INT with atLeast(8388608).
metadata_log_segment_roll_interval string broker default duration Longest time one metadata-log segment stays active, Kafka’s metadata.log.segment.ms. A positive whole number of milliseconds.
metadata_max_bytes_between_snapshots string broker default byte size Committed metadata-log bytes between snapshots, Kafka’s metadata.log.max.record.bytes.between.snapshots.
metadata_max_idle_interval string broker default duration KIP-835: how often the active controller appends a NoOpRecord to the metadata log, Kafka’s metadata.max.idle.interval.ms. A whole number of milliseconds up to 2147483647 ms. Zero disables the no-op records.
metadata_max_retention string broker default duration Age after which a metadata snapshot and the log prefix it covers are deleted, Kafka’s metadata.max.retention.ms. A whole number of milliseconds. Zero is a value. Kafka’s negative value, which sets no age limit, has no form here.
metadata_max_retention_bytes string broker default byte size Largest combined size of the metadata log and its snapshots before the oldest snapshot and the log prefix it covers are deleted, Kafka’s metadata.max.retention.bytes. A whole number of bytes. Zero is a value. Kafka’s negative value, which sets no size limit, has no form here.
metadata_max_snapshot_interval string broker default duration Maximum time between metadata-log snapshots, Kafka’s metadata.log.max.snapshot.interval.ms. Zero disables the time-based cap.
metadata_raft_command_queue_capacity integer (uint) broker default Capacity of the metadata Raft engine command queue.
metadata_raft_fetch_max string broker default byte size Per-read and per-snapshot-request byte budget on the metadata Raft log.
metadata_snapshot_fetch_max string broker default byte size Maximum metadata snapshot size a follower fetches. The Raft core enforces an immutable 1 GiB ceiling above it.
metadata_snapshot_interval_records integer (uint64) broker default KIP-630: snapshot the metadata log once the committed offset advances this many records past the last snapshot. The metadata log keeps the records below a snapshot until its retention limits let them go.
num_partitions integer (int32) broker default Partition count of a topic that CreateTopics creates with num_partitions = -1, Kafka’s num.partitions.
oauth_jwks_http_timeout string broker default duration Timeout for one OAuth JWKS fetch.
observer_fetch_max string broker default byte size Maximum bytes fetched by one metadata observer request.
observer_lag_bound integer (uint64) broker default KIP-853: maximum log-entry lag an observer may have and still be promotable to a voter.
observer_poll_interval string broker default duration Cadence of the KIP-853 observer promotion poll.
offsets_retention string broker default duration How long a committed consumer offset is kept after its group becomes empty, Kafka’s offsets.retention.minutes. It must be a whole number of minutes.
offsets_retention_check_interval string broker default duration Cadence of the expired-offset sweep, Kafka’s offsets.retention.check.interval.ms.
offsets_topic_num_partitions integer (int32) broker default Partition count of the __consumer_offsets internal topic, Kafka’s offsets.topic.num.partitions.
offsets_topic_replication_factor integer (int16) broker default Replication factor of the __consumer_offsets internal topic, Kafka’s offsets.topic.replication.factor.
offsets_topic_segment_bytes string broker default byte size segment.bytes of the __consumer_offsets internal topic, Kafka’s offsets.topic.segment.bytes.
opa_http_timeout string broker default duration Timeout for one OPA authorization request.
operator_recovery_deadline string broker default duration Deadline for an operator-triggered unclean recovery.
partition_disk_scan_interval string broker default duration Cadence of the partition disk-usage scan that feeds the partition_disk_bytes gauge. Zero disables the scanner and spawns no background task.
partition_writer_queue_depth integer (uint) broker default Capacity of each partition-writer request queue.
producer_id_expiration string broker default duration How long a producer id may stay idle before its state expires, Kafka’s producer.id.expiration.ms.
producer_id_expiration_scan_interval string broker default duration Cadence of the producer-state expiry scan, Kafka’s producer.id.expiration.check.interval.ms.
queued_max_request_bytes string broker default byte size Maximum byte size across all queued requests before accepting additional requests is paused, Kafka’s queued.max.request.bytes.
queued_max_requests integer (uint) broker default Maximum number of queued requests allowed in the broker dispatch queue, Kafka’s queued.max.requests.
quota_throttle_max string broker default duration Maximum request-quota throttle delay, which bounds how long one response over request_percentage mutes a client. Equivalent to Kafka’s quota.window.size.seconds; byte-rate and controller-mutation throttles are not bounded.
quota_window string broker default duration Time window that sizes the client byte-rate quota token bucket’s burst capacity. Equivalent to Kafka’s sampling window quota.window.num * quota.window.size.seconds.
record_decompression_max_ratio string broker default ratio Maximum accepted decompression ratio for a produced record batch.
record_decompression_output_ceiling string broker default byte size Maximum decompressed-output allowance granted to a record batch.
record_decompression_output_floor string broker default byte size Minimum decompressed-output allowance granted to a record batch, whatever the ratio bound computes.
remote_log_manager_interval string broker default duration KIP-405: tick cadence of the RemoteLogManager copy and retention task. Kafka’s remote.log.manager.task.interval.ms.
replica_fetchers integer (uint) broker default How many fetchers this broker runs per leader it follows, Kafka’s num.replica.fetchers. Every partition followed from one leader is hashed onto one of that leader’s fetchers, and each fetcher holds one connection and sends one batched Fetch per round.
replica_lag_time_max string broker default duration Maximum follower lag before the leader proposes an ISR shrink. Kafka’s replica.lag.time.max.ms.
replication_epoch_fence_backoff string broker default duration Retry delay after a leader-epoch fence.
replication_fetch_max string broker default byte size Maximum bytes a follower requests from a leader in one replication fetch. It reaches the leader as the fetch request’s max_bytes.
replication_fetch_max_wait string broker default duration Maximum time a leader holds a replication fetch that is not yet satisfied. It reaches the leader as the fetch request’s max_wait_ms.
replication_fetch_min string broker default byte size Minimum bytes that satisfy a replication fetch. It reaches the leader as the fetch request’s min_bytes, which the leader honours as a floor.
replication_reconnect_delay_cap string broker default duration Maximum delay between leader reconnection attempts.
replication_reconnect_initial_delay string broker default duration Initial delay before a follower reconnects to a leader.
replication_send_error_backoff string broker default duration Retry delay after sending a replication request fails.
replication_throttle_exhausted_backoff string broker default duration Delay after a follower exhausts its replication throttle budget.
replication_unexpected_error_backoff string broker default duration Retry delay after an unexpected replication error.
replication_unknown_topic_retry_delay string broker default duration Retry delay when the leader does not yet know the topic.
rlmm_bootstrap_backoff_initial string broker default duration Initial retry delay while remote-log metadata bootstrap is incomplete.
rlmm_bootstrap_backoff_max string broker default duration Maximum retry delay while remote-log metadata bootstrap is incomplete.
rlmm_reconcile_tick string broker default duration Cadence of KIP-405 remote-log metadata reconciliation.
sasl_server_max_receive string broker default byte size Largest request frame a connection may send before it finishes authenticating on a SASL listener, Kafka’s sasl.server.max.receive.size. It replaces socket_request_max for that stretch, and a larger frame fails the authentication.
schema_registry_http_timeout string broker default duration Timeout for one schema-registry request.
self_registration_backoff_max string broker default duration Maximum delay between broker self-registration attempts.
self_registration_backoff_min string broker default duration Initial delay between broker self-registration attempts.
self_registration_max_attempts integer (uint32) broker default Maximum self-registration attempts before startup fails.
sendfile_min string broker default byte size Minimum response size eligible for a sendfile kernel drain. Smaller responses go through the pread and write copy.
share_cold_partition_snapshot_interval string broker default duration How old the latest snapshot of a share key may get before the share coordinator writes a new one, Kafka’s share.coordinator.cold.partition.snapshot.interval.ms.
share_coordinator_append_linger_ms integer (int32) broker default milliseconds Kafka’s share.coordinator.append.linger.ms, a whole number of milliseconds, or -1 (the default) for an adaptive linger. Accepted and has no effect: each share-state write is its own append, and the partition writer groups concurrent appends without waiting for more.
share_coordinator_cached_buffer_max_bytes string broker default byte size Kafka’s share.coordinator.cached.buffer.max.bytes, at least 512KiB, default 1MiB plus 12 bytes. Accepted and has no effect: the share coordinator encodes each record into a new buffer and keeps no buffer for reuse.
share_coordinator_load_buffer_size string broker default byte size Maximum bytes read by one share-state recovery read, Kafka’s share.coordinator.load.buffer.size.
share_coordinator_threads integer (int32) broker default Kafka’s share.coordinator.threads, at least 1. Accepted and has no effect: the share coordinator runs as tasks on the broker’s shared async runtime rather than on a thread pool of its own.
share_coordinator_write_timeout string broker default duration How long an append to __share_group_state may take before the share coordinator answers COORDINATOR_NOT_AVAILABLE, Kafka’s share.coordinator.write.timeout.ms.
share_group_backlog_poll_interval string broker default duration Cadence of the share-group backlog poll.
share_group_delivery_count_limit integer (int16) broker default The delivery count at which a share record is archived, Kafka’s group.share.delivery.count.limit: from 2 to 10, within the minimum and maximum below.
share_group_heartbeat_interval string broker default duration Default share-group heartbeat interval, Kafka’s group.share.heartbeat.interval.ms.
share_group_max_delivery_count_limit integer (int16) broker default Upper bound on the delivery count limit, and on a group’s share.delivery.count.limit, Kafka’s group.share.max.delivery.count.limit: from 5 to 25.
share_group_max_heartbeat_interval string broker default duration Upper bound on the share-group heartbeat interval, and on a group’s share.heartbeat.interval.ms, Kafka’s group.share.max.heartbeat.interval.ms.
share_group_max_partition_max_record_locks integer (int32) broker default Upper bound on the record lock limit, and on a group’s share.partition.max.record.locks, Kafka’s group.share.max.partition.max.record.locks: from 2000 to 10000.
share_group_max_record_lock_duration string broker default duration Upper bound on the record lock duration, and on a group’s share.record.lock.duration.ms, Kafka’s group.share.max.record.lock.duration.ms: from 30s to 1h.
share_group_max_session_timeout string broker default duration Upper bound on the share-group session timeout, and on a group’s share.session.timeout.ms, Kafka’s group.share.max.session.timeout.ms.
share_group_max_size integer (uint) broker default Maximum number of members in one share group, Kafka’s group.share.max.size: from 1 to 1000.
share_group_min_delivery_count_limit integer (int16) broker default Lower bound on the delivery count limit, and on a group’s share.delivery.count.limit, Kafka’s group.share.min.delivery.count.limit: from 2 to 5.
share_group_min_heartbeat_interval string broker default duration Lower bound on the share-group heartbeat interval, and on a group’s share.heartbeat.interval.ms, Kafka’s group.share.min.heartbeat.interval.ms.
share_group_min_partition_max_record_locks integer (int32) broker default Lower bound on the record lock limit, and on a group’s share.partition.max.record.locks, Kafka’s group.share.min.partition.max.record.locks: from 100 to 2000.
share_group_min_record_lock_duration string broker default duration Lower bound on the record lock duration, and on a group’s share.record.lock.duration.ms, Kafka’s group.share.min.record.lock.duration.ms: from 1s to 30s.
share_group_min_session_timeout string broker default duration Lower bound on the share-group session timeout, and on a group’s share.session.timeout.ms, Kafka’s group.share.min.session.timeout.ms.
share_group_partition_max_record_locks integer (int32) broker default Maximum records a share partition may hold in flight, Kafka’s group.share.partition.max.record.locks: from 100 to 10000, within the minimum and maximum below.
share_group_record_lock_duration string broker default duration How long an acquired share record stays locked before it is released for redelivery, Kafka’s group.share.record.lock.duration.ms: a whole number of milliseconds from 1s to 1h, within the minimum and maximum below.
share_group_session_timeout string broker default duration Default share-group session timeout, Kafka’s group.share.session.timeout.ms.
share_session_cache_max_when_unlimited integer (uint) broker default Ceiling on the share-session cache when the group count is unlimited.
share_snapshot_update_records_per_snapshot integer (uint32) broker default Updates of one share key between two snapshots of it, Kafka’s share.coordinator.snapshot.update.records.per.snapshot. At most 500.
share_state_compression_codec integer (int32) broker default Codec of the batches the share coordinator appends to __share_group_state, Kafka’s share.coordinator.state.topic.compression.codec, as Kafka’s codec id: 0 none (the default), 1 gzip, 2 snappy, 3 lz4 or 4 zstd.
share_state_min_isr integer (int32) broker default min.insync.replicas of the __share_group_state internal topic, Kafka’s share.coordinator.state.topic.min.isr.
share_state_num_partitions integer (int32) broker default Partition count of the __share_group_state internal topic, Kafka’s share.coordinator.state.topic.num.partitions.
share_state_prune_interval string broker default duration How often the share coordinator trims the redundant prefix of each __share_group_state partition it leads, Kafka’s share.coordinator.state.topic.prune.interval.ms.
share_state_replication_factor integer (int16) broker default Replication factor of the __share_group_state internal topic, Kafka’s share.coordinator.state.topic.replication.factor.
share_state_segment_bytes string broker default byte size segment.bytes of the __share_group_state internal topic, Kafka’s share.coordinator.state.topic.segment.bytes.
socket_receive_buffer string broker default byte size Broker socket receive-buffer size, Kafka’s socket.receive.buffer.bytes.
socket_request_max string broker default byte size Maximum encoded request size accepted from a socket, Kafka’s socket.request.max.bytes.
socket_send_buffer string broker default byte size Broker socket send-buffer size, Kafka’s socket.send.buffer.bytes.
startup_leader_wait_timeout string broker default duration Maximum time the broker waits for a controller leader during startup.
streams_group_acceptable_recovery_lag integer (int64) broker default Changelog lag, in records, below which a task is treated as caught up, the group’s streams.acceptable.recovery.lag.
streams_group_assignor string broker default Server-side task assignor for streams groups: auto, sticky, or highly-available. auto picks highly-available when the topology has a stateful subtopology and sticky otherwise.
streams_group_enable boolean broker default Whether the broker serves KIP-1071 streams groups.
streams_group_heartbeat_interval string broker default duration Default streams-group heartbeat interval, the group’s streams.heartbeat.interval.ms.
streams_group_max_heartbeat_interval string broker default duration Highest heartbeat interval a streams group may run with, Kafka’s group.streams.max.heartbeat.interval.ms.
streams_group_max_session_timeout string broker default duration Highest session timeout a streams group may run with, Kafka’s group.streams.max.session.timeout.ms.
streams_group_max_size integer (uint) broker default Maximum number of members in one streams group.
streams_group_min_heartbeat_interval string broker default duration Lowest heartbeat interval a streams group may run with, Kafka’s group.streams.min.heartbeat.interval.ms.
streams_group_min_session_timeout string broker default duration Lowest session timeout a streams group may run with, Kafka’s group.streams.min.session.timeout.ms.
streams_group_num_standby_replicas integer (int32) broker default Number of standby replicas the assignor places for each task, the group’s streams.num.standby.replicas.
streams_group_num_warmup_replicas integer (int32) broker default Maximum number of warm-up replicas the assignor may move at once, the group’s streams.num.warmup.replicas.
streams_group_rack_aware_assignment_tags array of string broker default Client tag keys every streams-group member must send, Kafka’s group.streams.rack.aware.assignment.tags and the default of a group’s streams.rack.aware.assignment.tags. A repeated or an empty tag key is refused.
streams_group_session_timeout string broker default duration Default streams-group session timeout, the group’s streams.session.timeout.ms.
streams_group_task_offset_interval string broker default duration Cadence at which members report task offsets, the group’s streams.task.offset.interval.ms.
sync_group_follower_wait string broker default duration Maximum time a classic-protocol follower waits for its SyncGroup assignment.
tls_reload_interval string broker default duration Cadence at which the TLS watcher polls the certificate, key, and client-CA files and rebuilds the server configuration if any changed. Zero disables the periodic watcher.
transaction_max_timeout string broker default duration Maximum transaction timeout a producer may request, Kafka’s transaction.max.timeout.ms.
transaction_partition_verification_enable boolean broker default Whether a partition leader checks with the transaction coordinator that a transaction contains a partition before it appends transactional records to it, Kafka’s transaction.partition.verification.enable. This is the static value. A dynamic broker config of the same name, per-broker or cluster-wide, overrides it, and the server_properties entry of that name applies only when this key is absent. The default is true.
transaction_recovery_read_max string broker default byte size Maximum bytes requested by one __transaction_state recovery read.
transaction_state_min_isr integer (int32) broker default min.insync.replicas of the __transaction_state internal topic, Kafka’s transaction.state.log.min.isr.
transaction_state_num_partitions integer (int32) broker default Partition count of the __transaction_state internal topic, Kafka’s transaction.state.log.num.partitions.
transaction_state_replication_factor integer (int16) broker default Replication factor of the __transaction_state internal topic, Kafka’s transaction.state.log.replication.factor.
transaction_state_segment_bytes string broker default byte size segment.bytes of the __transaction_state internal topic, Kafka’s transaction.state.log.segment.bytes.
txn_abort_cleanup_interval string broker default duration KIP-98: how often the idle-transaction reaper scans for Ongoing transactions whose timeout has elapsed and aborts them. Kafka’s transaction.abort.timed.out.transaction.cleanup.interval.ms. Zero disables the reaper and spawns no background task.
txn_id_expiration string broker default duration KIP-98: how long a transactional id may sit in a terminal or idle state before the coordinator tombstones it out of __transaction_state. Kafka’s transactional.id.expiration.ms.
txn_id_expiration_cleanup_interval string broker default duration KIP-98: how often the transactional-id expiry sweep scans the __transaction_state partitions this broker leads. Kafka’s transaction.remove.expired.transaction.cleanup.interval.ms. Zero disables the sweep and spawns no background task.
unclean_recovery_aggressive_deadline string broker default duration Replica-log collection deadline under the aggressive unclean-recovery strategy.
unclean_recovery_balanced_deadline string broker default duration Replica-log collection deadline under the balanced unclean-recovery strategy.
unclean_recovery_queue_capacity integer (uint) broker default Capacity of the unclean-recovery work queue.

[sasl_plain]

TOML shape of [sasl_plain]. Maps to crate::BrokerConfig::plain_credentials.

Key Type Default Units Description
credentials_path string broker default Filesystem path to the SASL/PLAIN credential file: one username=password per line, split at the first =, so a password may contain =. Line endings are stripped. A line whose trimmed content is empty or starts with # is ignored. The username is trimmed of surrounding whitespace, since it is matched against the SASL authcid and padding there is a typo rather than intent; the password is stored exactly as written, including any leading or trailing whitespace, so a secret is never silently rewritten. File-based (not literal) so no password sits in the TOML; the operator mounts a Secret and writes the mount path here.

[schema_registry]

TOML shape of [schema_registry]. Mirrors the constructor arguments of crate::schema_validation::SchemaValidator::new, the one registry client each broker holds. deny_unknown_fields so a misspelled key is rejected at parse time. A silently ignored fail_open would leave the operator with the opposite of the policy they wrote.

Key Type Default Units Description
basic_auth_password_path string broker default File containing the HTTP Basic password. One trailing newline is ignored. Set this together with basic_auth_username; keeping the password in a separate mounted secret avoids putting it in broker arguments or TOML.
basic_auth_username string broker default HTTP Basic username for an authenticated registry. Set this together with basic_auth_password_path.
expire_after_ms integer (int64) 300000 milliseconds Schema-cache entry TTL, in milliseconds. Default 300_000, which is 5 minutes.
fail_open boolean false Security-sensitive. Admit a record that the broker could not validate because the registry was unreachable. When true, a validated topic accepts whatever it is sent for the length of a registry outage. That is fail-open. Default false, which fails the produce instead. An unknown schema id, or a body that does not match its schema, is a rejection under either setting. This field governs only the case where the broker could not get an answer at all.
maximum_cache_size integer (uint) 50000 entries Schema-cache capacity, in entries. Default 50_000.
url string required Base URL of the Confluent-compatible schema registry, e.g. http://schema-registry:8081. The registry API path is appended to it.

[stretch]

[stretch] TOML section — the three-site stretch deployment. The table is all-or-nothing. When it is present, all three fields must be, because a half-built profile would let the broker start with a site layout that no node agrees on.

Key Type Default Units Description
preferred_leader_site string broker default The site that partition leadership prefers while both data sites are up. It must not be the witness site.
sites array of string broker default The three site names. Each one is a rack value that some node of the cluster reports.
witness_site string broker default The site that holds the witness nodes.

[tls_config]

TLS material for the controller listener (and any listener whose protocol is TLS-bearing).

Key Type Default Units Description
cert_path string required PEM file holding this listener’s server certificate chain.
client_auth one of Disabled, Optional, Required broker default Whether a TLS listener asks for and requires a client certificate, Kafka’s ssl.client.auth. Disabled is the default and never asks; Optional asks and accepts a connection that presents none; Required rejects a connection that presents none. Optional and Required both need a client_ca_path.
client_ca_path string broker default PEM file of CA(s) this listener validates client certificates against. Absent leaves mTLS without a client trust store, so client_auth has to be Disabled.
key_path string required PEM file holding the private key for cert_path.
principal_mapping_rules array of string ["DEFAULT"] KIP-371 ssl.principal.mapping.rules: how the Subject DN of an mTLS peer certificate becomes the principal name ACLs and super_users are written against. Each entry is either DEFAULT, which uses the DN itself, or RULE:pattern/replacement/[L|U], where pattern has to match the whole DN, replacement may reference capture groups as $1, and a trailing L or U lowercases or uppercases the result. The rules are tried in order and the first match wins. Defaults to ["DEFAULT"], so a listener that says nothing keeps Kafka’s behaviour of using the full DN. A malformed entry is rejected at startup. Case-insensitive backreferences have a Unicode compatibility edge: under (?i), non-ASCII case pairs may match here when Java rejects them (for example é and É); under (?iu), pairs Java accepts may fail here (for example i and İ, or s and ſ). Ordinary ASCII DNs are unaffected. Keep both captured and referenced text ASCII, or avoid case-insensitive backreferences when exact Java behavior matters.
trust_roots_path string broker default PEM file of CA(s) this broker trusts when validating a PEER’s server cert as an outbound inter-broker / controller-quorum dialer. The operator renders the cluster CA here so KIP-595 controller peers can mutually authenticate over the controller listener. Maps to krabka_security::TlsConfig::trust_roots_path.

[topic_policy]

TOML shape of [topic_policy]. Maps to crate::topic_policy::TopicPolicy. The whole table is the KIP-108 / KIP-133 policy Kafka loads from a Java class named by create.topic.policy.class.name and alter.config.policy.class.name. krabka cannot load a class, so the rules are declared here instead. Omitting the table declares no rule, which is Kafka’s default of no policy class: every CreateTopics and every topic AlterConfigs that passes ordinary config validation is accepted. A request that breaks a rule is answered with POLICY_VIOLATION (44) and an error_message naming the rule, which is what a PolicyViolationException from a Java policy class produces. The two replica rules apply to CreateTopics alone, because an AlterConfigs request carries neither number, exactly as AlterConfigPolicy.RequestMetadata does not. deny_unknown_fields so a misspelled rule name is rejected at parse time rather than leaving the broker enforcing nothing where the operator wrote a rule.

Key Type Default Units Description
forbidden map of string to string {} Config keys the topic must not set to the named value, written as a TOML table: forbidden = { "unclean.leader.election.enable" = "true" }. Any other value for that key, and omitting the key, both pass.
max_partitions integer (uint) broker default Highest partition count CreateTopics may be asked for, checked against the effective count. Omitted enforces no ceiling. Must be at least 1.
min_insync_replicas integer (uint) broker default Lowest min.insync.replicas a topic may carry. A topic that does not set the key passes: it runs on the cluster default, which the same operator sets. Omitted enforces no floor. Must be at least 1.
min_replication_factor integer (uint) broker default Lowest replication factor CreateTopics may be asked for. The effective factor is checked, so a request that leaves it -1 is judged on the factor the placement resolved. Omitted enforces no floor. Must be at least 1.
required map of string to string {} Config keys the topic must set, with the exact value it must set them to, written as a TOML table: required = { "cleanup.policy" = "delete" }. A topic that omits the key, or sets it to another value, is refused.