Skip to main content

Managed Kafka: Topics & Configuration

Purpose: For platform engineers, shows how to create, configure, and manage Kafka topics via KafkaTopic CRDs.

Task Summary

Kafka topics in the openCenter blueprint are managed declaratively through Strimzi's KafkaTopic CRD. This guide covers creating topics, tuning configuration, and handling common lifecycle operations. All changes go through GitOps — no imperative topic creation in production.

Prerequisites

  • A running Kafka cluster deployed per Deploying Kafka
  • The Strimzi Entity Operator running (it manages topic reconciliation)
  • kubectl access to the data-kafka namespace

Creating a Topic

Define a KafkaTopic resource in your GitOps repository:

# applications/overlays/<cluster>/managed-services/kafka/topics/orders.yaml
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: orders
namespace: data-kafka
labels:
strimzi.io/cluster: production
spec:
partitions: 12
replicas: 3
config:
retention.ms: "604800000" # 7 days
min.insync.replicas: "2"
cleanup.policy: "delete"
segment.bytes: "1073741824" # 1 GiB segments

The strimzi.io/cluster: production label tells the Entity Operator which Kafka cluster owns this topic.

Commit and push. FluxCD reconciles the resource, and the Entity Operator creates the topic on the brokers.

Verify:

kubectl get kafkatopic orders -n data-kafka
# NAME CLUSTER PARTITIONS REPLICATION FACTOR READY
# orders production 12 3 True

Topic Configuration Reference

Config KeyDefaultDescription
retention.ms604800000 (7d)How long messages are retained before deletion
retention.bytes-1 (unlimited)Max bytes retained per partition before deletion
min.insync.replicas2Minimum ISR count for a write to succeed (with acks=all)
cleanup.policydeletedelete removes old segments; compact keeps latest per key
segment.bytes1073741824Size of a single log segment file
max.message.bytes1048588Maximum message size (including headers)
compression.typeproducerBroker-side compression: producer, gzip, snappy, lz4, zstd

Common Topic Patterns

Event Stream (Time-Based Retention)

spec:
partitions: 12
replicas: 3
config:
retention.ms: "2592000000" # 30 days
cleanup.policy: "delete"
min.insync.replicas: "2"

Compacted Topic (Latest-Value Lookup)

spec:
partitions: 6
replicas: 3
config:
cleanup.policy: "compact"
min.cleanable.dirty.ratio: "0.5"
delete.retention.ms: "86400000" # 1 day tombstone retention
min.insync.replicas: "2"

High-Throughput Ingestion

spec:
partitions: 24
replicas: 3
config:
retention.ms: "86400000" # 1 day
segment.bytes: "536870912" # 512 MiB segments
compression.type: "lz4"
min.insync.replicas: "2"

Modifying a Topic

Change the spec.config fields in the KafkaTopic YAML and commit. The Entity Operator applies the configuration change without downtime.

Partition count can be increased but not decreased:

spec:
partitions: 24 # was 12 — increase is allowed

Decreasing partitions requires deleting and recreating the topic, which causes data loss.

Deleting a Topic

Remove the KafkaTopic resource from the GitOps repository and commit. FluxCD prunes the resource (if prune: true is set on the Kustomization), and the Entity Operator deletes the topic from the brokers.

Confirm deletion:

kubectl get kafkatopic orders -n data-kafka
# Error from server (NotFound): kafkatopics.kafka.strimzi.io "orders" not found

Topic deletion is destructive and irreversible. All messages in the topic are lost.

Listing Topics

kubectl get kafkatopics -n data-kafka -l strimzi.io/cluster=production

For detailed status including partition assignments:

kubectl get kafkatopic orders -n data-kafka -o yaml

Verification

After creating or modifying a topic:

  1. Check the KafkaTopic status:
    kubectl get kafkatopic <name> -n data-kafka -o jsonpath='{.status.conditions[*].type}'
    # Expected: Ready
  2. Verify from inside the cluster:
    kubectl exec -n data-kafka production-kafka-0 -- \
    bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders

Troubleshooting

Topic stuck in NotReady — Check the Entity Operator logs:

kubectl logs -n data-kafka -l strimzi.io/name=production-entity-operator -c topic-operator

Common causes: missing strimzi.io/cluster label, replication factor exceeds broker count, or the topic name conflicts with an internal topic.

Partition increase not applied — The Entity Operator reconciles on an interval. Wait up to 2 minutes, then check the operator logs for errors.

Cannot decrease partitions — This is a Kafka limitation. To reduce partitions, delete the topic and recreate it with the desired count. Plan for data loss.