The distribution ships config/server.properties (combined mode), controller.properties and broker.properties. The six-node cluster uses trimmed versions of the last two; the start script fills in NODE_ID.
process.roles=controller
node.id=NODE_ID
controller.quorum.bootstrap.servers=l3-c1:9093,l3-c2:9093,l3-c3:9093
listeners=CONTROLLER://:9093
advertised.listeners=CONTROLLER://l3-cNODE_ID:9093
controller.listener.names=CONTROLLER
listener.security.protocol.map=CONTROLLER:PLAINTEXT
log.dirs=/var/lib/kafka/data
# defaults for new topics: in KRaft the active controller creates topics, so they belong here
num.partitions=3
default.replication.factor=3
min.insync.replicas=2process.roles=broker
node.id=NODE_ID
controller.quorum.bootstrap.servers=l3-c1:9093,l3-c2:9093,l3-c3:9093
controller.listener.names=CONTROLLER
listeners=DOCKER://:9092,HOST://:9094
advertised.listeners=DOCKER://l3-bNODE_ID:9092,HOST://localhost:3319NODE_ID
listener.security.protocol.map=DOCKER:PLAINTEXT,HOST:PLAINTEXT,CONTROLLER:PLAINTEXT
inter.broker.listener.name=DOCKER
log.dirs=/var/lib/kafka/data
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
share.coordinator.state.topic.replication.factor=3
share.coordinator.state.topic.min.isr=2
group.initial.rebalance.delay.ms=0
log.retention.check.interval.ms=10000A broker adds client and inter-broker listeners and internal-topic replication to what a controller needs. Topic defaults belong on the controllers: in KRaft the active controller creates topics with its own num.partitions, default.replication.factor and min.insync.replicas, and with them only in broker.properties new topics silently got one partition and one replica. Better, set them per topic (Topic Configuration). The 10-second retention check only speeds up Retention and Compaction.