Apache Kafka is a distributed event streaming platform used to build scalable, real-time data pipelines and applications. When paired with Quarkus—a modern, Kubernetes-native Java framework—it becomes an efficient solution for high-throughput, event-driven services.
In this guide, we’ll walk you through configuring Kafka in Quarkus using
application.properties. We'll use Docker for development and Kubernetes for production, keeping things clean by separating configurations with Quarkus profiles (
dev and
prod).
Step 1: Add Kafka and Kubernetes Dependencies
First, include the necessary dependencies in your
pom.xml file:
<dependencies>
<!-- Kafka Messaging -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-reactive-messaging-kafka</artifactId>
</dependency>
<!-- Kubernetes Config -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-config</artifactId>
</dependency>
</dependencies>
These enable Kafka messaging support and Kubernetes ConfigMap/Secret integration for production.
Step 2: Set Up Kafka with Docker for Development
To run Kafka locally, use Docker Compose or a containerized setup like the one below:
docker network create kafka-net
docker run -d --name zookeeper --network kafka-net \
-e ALLOW_ANONYMOUS_LOGIN=yes \
-p 2181:2181 bitnami/zookeeper
docker run -d --name kafka --network kafka-net \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-p 9092:9092 bitnami/kafka
This creates a basic Kafka setup accessible at
localhost:9092.
Step 3: Configure application-dev.properties
Create a
application-dev.properties file for development:
%dev.mp.messaging.incoming.kafka-channel.connector=smallrye-kafka
%dev.mp.messaging.incoming.kafka-channel.topic=dev-topic
%dev.mp.messaging.incoming.kafka-channel.bootstrap.servers=localhost:9092
%dev.mp.messaging.incoming.kafka-channel.group.id=dev-group
%dev.mp.messaging.outgoing.kafka-out.connector=smallrye-kafka
%dev.mp.messaging.outgoing.kafka-out.topic=dev-topic
%dev.mp.messaging.outgoing.kafka-out.bootstrap.servers=localhost:9092
This config sets up an incoming Kafka consumer (
kafka-channel) and an outgoing producer (
kafka-out) using the local Docker Kafka broker.
To activate this profile:
./mvnw quarkus:dev -Dquarkus.profile=dev
Step 4: Production Setup with Kubernetes
In a production environment, you’ll want to use environment variables and Kubernetes resources to avoid hardcoding connection info.
Step 4.1: Create a Kafka ConfigMap and Secret
ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: kafka-config
data:
kafka.bootstrap.servers: kafka-service:9092
kafka.topic: prod-topic
Secret (optional, if using auth):
apiVersion: v1
kind: Secret
metadata:
name: kafka-secret
type: Opaque
data:
kafka.username: cHJvZHVzZXI= # base64 for 'produser'
kafka.password: cHJvZHBhc3M= # base64 for 'prodpass'
Step 4.2: Configure application-prod.properties
Now create
application-prod.properties with placeholders for environment values:
%prod.mp.messaging.incoming.kafka-channel.connector=smallrye-kafka
%prod.mp.messaging.incoming.kafka-channel.topic=${kafka.topic}
%prod.mp.messaging.incoming.kafka-channel.bootstrap.servers=${kafka.bootstrap.servers}
%prod.mp.messaging.incoming.kafka-channel.group.id=prod-group
%prod.mp.messaging.outgoing.kafka-out.connector=smallrye-kafka
%prod.mp.messaging.outgoing.kafka-out.topic=${kafka.topic}
%prod.mp.messaging.outgoing.kafka-out.bootstrap.servers=${kafka.bootstrap.servers}
%prod.quarkus.kubernetes-config.enabled=true
%prod.quarkus.kubernetes-config.config-maps=kafka-config
%prod.quarkus.kubernetes-config.secrets=kafka-secret
This setup enables Quarkus to fetch values dynamically from Kubernetes at runtime.
Step 5: Deploy to Kubernetes
In your Kubernetes deployment YAML, include the necessary environment configuration:
containers:
- name: quarkus-app
image: your-app-image
env:
- name: QUARKUS_PROFILE
value: prod
Quarkus will automatically activate the
prod profile and pull values from the ConfigMap and Secret if mounted properly.
image quote pre code