Chapter 25. Rack schema reference
Used in: KafkaBridgeSpec
, KafkaClusterSpec
, KafkaConnectSpec
, KafkaMirrorMaker2Spec
Full list of Rack
schema properties
The rack
option configures rack awareness. A rack can represent an availability zone, data center, or an actual rack in your data center. The rack is configured through a topologyKey
. topologyKey
identifies a label on OpenShift nodes that contains the name of the topology in its value. An example of such a label is topology.kubernetes.io/zone
(or failure-domain.beta.kubernetes.io/zone
on older OpenShift versions), which contains the name of the availability zone in which the OpenShift node runs. You can configure your Kafka cluster to be aware of the rack in which it runs, and enable additional features such as spreading partition replicas across different racks or consuming messages from the closest replicas.
For more information about OpenShift node labels, see Well-Known Labels, Annotations and Taints. Consult your OpenShift administrator regarding the node label that represents the zone or rack into which the node is deployed.
25.1. Spreading partition replicas across racks
When rack awareness is configured, Streams for Apache Kafka will set broker.rack
configuration for each Kafka broker. The broker.rack
configuration assigns a rack ID to each broker. When broker.rack
is configured, Kafka brokers will spread partition replicas across as many different racks as possible. When replicas are spread across multiple racks, the probability that multiple replicas will fail at the same time is lower than if they would be in the same rack. Spreading replicas improves resiliency, and is important for availability and reliability. To enable rack awareness in Kafka, add the rack
option to the .spec.kafka
section of the Kafka
custom resource as shown in the example below.
Example rack
configuration for Kafka
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... rack: topologyKey: topology.kubernetes.io/zone # ...
The rack in which brokers are running can change in some cases when the pods are deleted or restarted. As a result, the replicas running in different racks might then share the same rack. Use Cruise Control and the KafkaRebalance
resource with the RackAwareGoal
to make sure that replicas remain distributed across different racks.
When rack awareness is enabled in the Kafka
custom resource, Streams for Apache Kafka will automatically add the OpenShift preferredDuringSchedulingIgnoredDuringExecution
affinity rule to distribute the Kafka brokers across the different racks. However, the preferred rule does not guarantee that the brokers will be spread. Depending on your exact OpenShift and Kafka configurations, you should add additional affinity
rules or configure topologySpreadConstraints
for both ZooKeeper and Kafka to make sure the nodes are properly distributed accross as many racks as possible. For more information see Configuring pod scheduling.
25.2. Consuming messages from the closest replicas
Rack awareness can also be used in consumers to fetch data from the closest replica. This is useful for reducing the load on your network when a Kafka cluster spans multiple datacenters and can also reduce costs when running Kafka in public clouds. However, it can lead to increased latency.
In order to be able to consume from the closest replica, rack awareness has to be configured in the Kafka cluster, and the RackAwareReplicaSelector
has to be enabled. The replica selector plugin provides the logic that enables clients to consume from the nearest replica. The default implementation uses LeaderSelector
to always select the leader replica for the client. Specify RackAwareReplicaSelector
for the replica.selector.class
to switch from the default implementation.
Example rack
configuration with enabled replica-aware selector
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... rack: topologyKey: topology.kubernetes.io/zone config: # ... replica.selector.class: org.apache.kafka.common.replica.RackAwareReplicaSelector # ...
In addition to the Kafka broker configuration, you also need to specify the client.rack
option in your consumers. The client.rack
option should specify the rack ID in which the consumer is running. RackAwareReplicaSelector
associates matching broker.rack
and client.rack
IDs, to find the nearest replica and consume from it. If there are multiple replicas in the same rack, RackAwareReplicaSelector
always selects the most up-to-date replica. If the rack ID is not specified, or if it cannot find a replica with the same rack ID, it will fall back to the leader replica.
Figure 25.1. Example showing client consuming from replicas in the same availability zone

You can also configure Kafka Connect, MirrorMaker 2 and Kafka Bridge so that connectors consume messages from the closest replicas. You enable rack awareness in the KafkaConnect
, KafkaMirrorMaker2
, and KafkaBridge
custom resources. The configuration does does not set affinity rules, but you can also configure affinity
or topologySpreadConstraints
. For more information see Configuring pod scheduling.
When deploying Kafka Connect using Streams for Apache Kafka, you can use the rack
section in the KafkaConnect
custom resource to automatically configure the client.rack
option.
Example rack
configuration for Kafka Connect
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect # ... spec: # ... rack: topologyKey: topology.kubernetes.io/zone # ...
When deploying MirrorMaker 2 using Streams for Apache Kafka, you can use the rack
section in the KafkaMirrorMaker2
custom resource to automatically configure the client.rack
option.
Example rack
configuration for MirrorMaker 2
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 # ... spec: # ... rack: topologyKey: topology.kubernetes.io/zone # ...
When deploying Kafka Bridge using Streams for Apache Kafka, you can use the rack
section in the KafkaBridge
custom resource to automatically configure the client.rack
option.
Example rack
configuration for Kafka Bridge
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge # ... spec: # ... rack: topologyKey: topology.kubernetes.io/zone # ...
25.3. Rack
schema properties
Property | Property type | Description |
---|---|---|
topologyKey | string |
A key that matches labels assigned to the OpenShift cluster nodes. The value of the label is used to set a broker’s |