Flagship case study
Kafka Streaming Platform
I built the path from sensor events to a queryable dashboard: Python producers and consumers, replicated Kafka state and PostgreSQL on Kubernetes. Strimzi manages the cluster; Argo CD controls the rollout order.
My scopeArchitecture · Application services · Kubernetes · GitOps
Independent engineering projectScope & provenance
Designed and built in my own environment to demonstrate event-streaming and GitOps delivery capability. No former-employer systems, source code or operational data are used.
- System type
- Event streaming platform
- Runtime
- 3 combined KRaft nodes
- Resilience
- RF 3 and minimum ISR 2
- Delivery
- 6 ordered GitOps waves
Engineering brief
The goal was to build a realistic event-driven system that ingests sensor readings, preserves a clear processing path and exposes the resulting operational data through both an API and a dashboard.
The architecture had to demonstrate more than a Kafka installation. It needed application services, persistence, health handling, secret delivery and a repeatable Kubernetes rollout that respects component dependencies.
Architecture
- ProducersPython services generate IoT-style readings and publish them into Kafka topics.
- Kafka clusterStrimzi manages three combined broker/controller nodes without a ZooKeeper dependency.
- Consumer APIA Python service consumes events, applies the application flow and persists records in PostgreSQL.
- DashboardThe browser interface reads API endpoints for recent events and aggregate data instead of reaching into storage directly.
Engineering decisions
Separate application and platform ownership
Python services own event production and consumption. Kubernetes manifests define runtime behavior, while ArgoCD owns reconciliation and rollout order. This keeps data-flow logic independent from the deployment mechanism.
Use KRaft for the Kafka control plane
KRaft removes the ZooKeeper dependency. Strimzi supplies the Kubernetes operator model and declarative cluster management.
Keep credentials outside images and manifests
Database credentials are mounted at runtime through a secrets integration. Application containers consume files or environment references without embedding secret values in the image.
Tradeoffs & verification
- Keep the demonstration compact
- The three KRaft nodes combine broker and controller roles. This keeps the project footprint small while making replication and persistence visible. Separate roles are a design choice to evaluate for a different workload.
- Make dependencies part of delivery
- Six Argo CD sync waves express the order between prerequisites, the operator, Kafka, persistence, applications and ingress. The rollout can be reviewed alongside the manifests.
- State what the evidence establishes
- The runtime inventory documents three nodes, replication factor three, minimum ISR two and persistent storage. These are configuration and runtime observations; workload throughput and recovery-time guarantees would require separate testing.
Delivery sequence
- Namespace and prerequisitesCreate the application boundary and establish the resources required by later components.
- Strimzi operatorInstall the Kafka operator before submitting the Kafka custom resources it manages.
- Kafka KRaft clusterReconcile the broker/controller layer and wait for a usable streaming endpoint.
- PostgreSQL and credentialsDeploy persistence and mount runtime credentials before starting the consumer service.
- Producer, consumer API and dashboardRoll out the application services with dependency-aware readiness checks.
- IngressExpose the dashboard only after the internal services are available.
Verified runtime
Runtime capture: Argo CD application health, Kubernetes workloads and the sensor dashboard. Select the image to inspect it.
Engineering outcome
The deployed system carries events from Python producers through Kafka and PostgreSQL to the API and dashboard. Runtime secrets, health checks, persistent storage and six ordered GitOps waves support that delivery path. The evidence documents the implementation and running workloads; throughput and recovery targets need separate tests.