Managed Kafka and Cloud Choices
Why teams choose managed Kafka over self-hosting, how Confluent Cloud, Amazon MSK, Redpanda, and WarpStream actually differ, Kubernetes-based self-management with Strimzi as a middle ground, real cost-model trade-offs, migration considerations, and a decision framework for choosing based on team size, cloud provider, compliance, and throughput.
Running Kafka Yourself Is a Real, Ongoing Team-Time Cost — Not Just a Server Bill
Every module up to this point has treated "the Kafka cluster" as a given — brokers exist, they have leaders and followers, they store data on disk. What those modules did not cover is who keeps that cluster alive: who patches broker versions, plans disk capacity ahead of growth, responds when a broker's disk fills at 3 AM, rebalances partitions after adding hardware, and keeps ZooKeeper or a KRaft controller quorum healthy. Self-hosting Kafka means a team owns all of that, indefinitely, on top of building the actual data pipelines the business needs.
This is the real reason managed Kafka exists and has grown to dominate new deployments: it is not that self-hosted Kafka is unreliable — plenty of large, sophisticated companies run it well — it is that operating a distributed, stateful system well requires specialized, ongoing expertise that many teams would rather not build and staff for, when a vendor can provide the same capability as a managed service.
What self-hosting actually requires a team to own, continuously:
Capacity planning — provisioning enough broker disk and network throughput ahead of growth, not after a topic starts rejecting writes because a broker ran out of disk, a failure mode covered in the data-engineering broker module.
Version upgrades and patching — Kafka broker upgrades, especially major version jumps, require careful rolling-restart sequencing to avoid downtime, and security patches on the underlying JVM and host OS need their own cadence.
On-call for broker and disk failures — a broker disk failing, a network partition between brokers, or an under-replicated partition alert are 3 AM pages on a self-hosted cluster; on a managed service, the vendor's own on-call team absorbs the infrastructure-layer half of that page.
Security and access control plumbing — TLS certificate rotation, SASL credential management, and ACL administration all need an owner, continuously, not just at initial setup.
None of this means self-hosting is the wrong choice for every team — Part 05 covers exactly when it still makes sense. But the decision should be made with the full, ongoing cost in view, not just the sticker price of running broker VMs, which is usually the smallest part of the real cost.
Confluent Cloud — the Broadest Feature Parity, From the Company Kafka's Original Creators Founded
Confluent was founded by the original creators of Kafka at LinkedIn, and Confluent Cloud is its fully managed Kafka offering. Because Confluent has spent over a decade building the broader ecosystem around Kafka — Schema Registry, ksqlDB, a large library of Kafka Connect connectors, and the reference implementations several of those pieces are built around — Confluent Cloud generally offers the broadest feature parity with a full, self-hosted open-source Kafka ecosystem of any managed option.
What comes managed, beyond just brokers
A meaningful distinction from other managed Kafka options: Confluent Cloud does not just manage broker infrastructure, it manages the surrounding ecosystem components as fully hosted services too — a managed Schema Registry (the same Avro/Protobuf schema-compatibility enforcement covered in the Kafka Connect module), managed Kafka Connect (many of the same source and sink connectors covered in that module, offered as a point-and-click managed service rather than something you deploy and operate on your own Connect cluster), and managed ksqlDB for stream processing without managing a Kafka Streams application's own deployment.
| Component | Self-hosted, the way earlier modules covered it | Confluent Cloud equivalent |
|---|---|---|
| Brokers | Deployed, patched, and capacity-planned by your team | Fully managed, provisioned by cluster type and throughput tier |
| Schema Registry | A separate service you deploy and operate | A managed service, provisioned alongside the cluster |
| Kafka Connect | A distributed Connect cluster you deploy, per Module 13 | Managed connectors, configured through Confluent's own console/API rather than a self-run Connect REST API |
| ksqlDB / stream processing | Deployed and scaled as your own application or cluster | Managed ksqlDB clusters, provisioned per workload |
The practical implication for a team evaluating Confluent Cloud: if the pipeline design already depends on Schema Registry, Connect, or ksqlDB — which, having gone through the Kafka Connect module, most production pipelines in this track's scope do — Confluent Cloud is worth strong consideration specifically because it removes the operational burden of those pieces too, not just the brokers.
Amazon MSK — Managed Brokers With Deep AWS Integration, More Client-Side Responsibility Left to You
Amazon Managed Streaming for Apache Kafka (MSK) is AWS's managed Kafka offering. It manages broker provisioning, patching, and the underlying infrastructure, but MSK's managed surface is narrower than Confluent Cloud's — it does not bundle a managed Schema Registry, managed Connect, or managed ksqlDB as first-party equivalents (AWS offers a separate, related but distinct service, MSK Connect, for running Kafka Connect connectors, and Glue Schema Registry as a separate product for schema management, rather than these being unified into one MSK offering the way Confluent bundles them).
Deep AWS IAM and VPC integration
MSK's strongest differentiator is how tightly it integrates with the rest of AWS. Broker access can be authenticated using IAM roles and policies directly — the same access-control model used for S3 buckets, Lambda functions, and every other AWS service — rather than managing a separate SASL credential system. MSK clusters run inside your own VPC by default, meaning network-level access control, security groups, and private connectivity to other AWS services (S3, Lambda, Kinesis, RDS) work the same way they do for any other AWS-native resource, with no separate networking model to learn.
# A producer authenticating to MSK using IAM, rather than SASL/SCRAM:
producer_config = {
"bootstrap.servers": "b-1.mycluster.abc123.kafka.us-east-1.amazonaws.com:9098",
"security.protocol": "SASL_SSL",
"sasl.mechanism": "AWS_MSK_IAM",
# No static username/password anywhere in this config --
# the AWS SDK's normal credential chain (an EC2 instance role,
# an ECS task role, or an assumed IAM role) is what authenticates.
}
# The IAM policy attached to that role grants specific Kafka
# actions on specific resources, the same policy-document model
# used for every other AWS service:
{
"Effect": "Allow",
"Action": ["kafka-cluster:Connect", "kafka-cluster:WriteData"],
"Resource": "arn:aws:kafka:us-east-1:123456789012:topic/mycluster/*/orders"
}MSK Serverless — usage-based, no capacity planning
MSK Serverless is a variant that removes broker sizing and partition capacity planning entirely — you create topics and produce/consume, and AWS scales the underlying capacity automatically, billing based on actual throughput and storage rather than provisioned broker instances. This trades some of the fine-grained performance tuning available on provisioned MSK clusters (and a higher per-unit cost at sustained high throughput) for meaningfully less operational thinking about cluster sizing — closer in spirit to how a team would think about a fully serverless database.
| MSK Provisioned | MSK Serverless | |
|---|---|---|
| Capacity planning | You choose broker instance types, count, and storage — similar mental model to self-hosting, minus the patching | None — capacity scales automatically with actual usage |
| Pricing model | Per broker-hour plus storage, regardless of whether it's fully utilized | Per GB produced/consumed plus storage — usage-based |
| Performance tuning surface | Broker-level configuration is more exposed and tunable | Less exposed — AWS manages more of the tuning decisions internally |
| Best fit | Predictable, sustained high-throughput workloads where provisioned capacity is well-utilized | Spiky, unpredictable, or lower-throughput workloads where the ops savings outweigh the per-unit cost premium |
Redpanda and WarpStream — Kafka-Protocol-Compatible, Built on Fundamentally Different Architectures
A newer category of entrant does not run Apache Kafka's actual broker code at all. Instead, these systems implement the Kafka wire protocol — the same network protocol every Kafka client library already speaks — on top of a completely different internal architecture. The practical significance is that existing Kafka producer and consumer client code can often point at one of these systems with just a configuration change, no application code rewrite, because from the client's point of view, the protocol looks like Kafka.
Redpanda — Kafka-API-compatible, not built on the JVM
Redpanda is a from-scratch reimplementation of a Kafka-compatible broker, written in C++ rather than Java, with no JVM in its runtime at all. Its stated design goals center on avoiding JVM garbage-collection pauses (a real source of the session-timeout and rebalance issues covered in the producers-consumers-brokers module) and simplifying operations by removing ZooKeeper-or-KRaft as a separate concern — Redpanda bundles its own Raft-based consensus directly into each broker process rather than requiring a distinct controller quorum to operate.
WarpStream — Kafka-API-compatible, built directly on object storage
WarpStream takes a more radical architectural departure: rather than brokers with attached local disks holding partition data the way Kafka, Redpanda, and MSK all fundamentally work, WarpStream's brokers are stateless and write data directly to object storage (S3 or an equivalent) as the primary and only durable store — there is no broker-local disk holding the canonical copy of a partition's data at all. This removes the need for the broker-to-broker replication mechanics covered in the message-brokers module (leaders, followers, ISRs) as the durability mechanism, since object storage itself provides the durability, at the cost of the higher latency inherent to writing through an object store rather than a local disk.
| Apache Kafka / MSK | Redpanda | WarpStream | |
|---|---|---|---|
| Runtime | JVM | C++, no JVM | Go, stateless brokers |
| Primary durable storage | Local broker disk, replicated to followers | Local broker disk, replicated to followers | Object storage (S3 or equivalent) directly — no broker-local canonical copy |
| Consensus/coordination | KRaft controller quorum (or legacy ZooKeeper) | Built into each broker via Raft, no separate quorum service | Coordination metadata also object-storage-backed, in WarpStream's architecture |
| Kafka wire protocol compatible | Is Kafka | Yes — client libraries generally work unmodified | Yes — client libraries generally work unmodified |
| Maturity / ecosystem breadth | The reference implementation, broadest tooling and connector support | Younger, growing connector and tooling ecosystem | Newest of the three, narrowest ecosystem maturity as of this writing |
The reason these options are worth knowing conceptually, even for a team that ultimately chooses Confluent Cloud or MSK: they represent a genuinely different set of trade-offs — lower operational complexity and different cost curves in exchange for a younger ecosystem — and understanding what "no JVM" or "object-storage-native" actually changes structurally (not just as a marketing claim) is what lets you evaluate whether that trade-off fits a specific workload's needs.
Self-Managed Kafka on Kubernetes — Control Without Hand-Rolling Every Operational Script
Between fully managed and fully hand-rolled self-hosting sits a middle ground: running Kafka yourself, but on Kubernetes, using an operator that automates the operational mechanics that would otherwise be manual scripts and runbooks. Strimzi is the most widely adopted open-source Kafka operator for this purpose.
A Kubernetes operator, in general, is a piece of software that encodes operational knowledge about running a specific system as Kubernetes-native automation — instead of a human running a rolling restart script for a broker version upgrade, the operator watches a declarative configuration (expressed as Kubernetes custom resources) and reconciles the running cluster to match it, handling the sequencing of broker restarts, and coordinating changes across the cluster safely.
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: freshcart-kafka
spec:
kafka:
replicas: 3
version: 3.7.0
config:
default.replication.factor: 3
min.insync.replicas: 2
storage:
type: persistent-claim
size: 500Gi
entityOperator:
topicOperator: {}
userOperator: {}
# Bumping "version: 3.7.0" to a newer version and re-applying this
# resource triggers Strimzi's own controlled, rolling upgrade of
# every broker in the cluster -- the same operation Part 01 described
# as a real, careful, manual process on a hand-rolled self-hosted setup.| Hand-rolled self-hosting | Strimzi on Kubernetes | Fully managed (Confluent Cloud / MSK) | |
|---|---|---|---|
| Who patches broker versions | Your team, via a manual/scripted runbook | Your team declares the target version; Strimzi automates the rolling upgrade sequence | The vendor, on their own schedule and SLA |
| Who owns the underlying compute | Your team, VMs or bare metal | Your team, via your existing Kubernetes cluster | The vendor, entirely |
| Configuration model | Broker config files, managed by hand or your own IaC | Kubernetes custom resources — declarative, GitOps-friendly | Vendor console/API/Terraform provider |
| Control over broker-level tuning | Full | Full — same underlying Kafka, exposed through the operator's config surface | Reduced — many tuning decisions are abstracted or unavailable |
| Team ops burden | Highest | Meaningfully reduced by the operator, but the team still owns Kubernetes itself | Lowest |
Cost Isn't One Number — Self-Hosted Trades Infra Cost for Headcount Cost, Managed Trades It Back
Comparing "self-hosted Kafka" against "managed Kafka" purely on a cloud infrastructure bill is a category error. The honest cost comparison has to include the ongoing engineering time from Part 01 — capacity planning, patching, on-call, security administration — priced at that team's actual fully-loaded cost, not treated as free because it does not show up as a separate line item on a cloud invoice.
Self-hosted total cost, roughly:
infrastructure cost (broker VMs, disk, network)
+ ongoing engineering time (capacity planning, patching,
on-call, security admin) x fully-loaded engineer cost
+ the opportunity cost of that engineering time not being
spent on product work
Managed total cost, roughly:
usage-based or capacity-based vendor pricing
(which already has the vendor's own ops cost baked in)
+ a smaller amount of engineering time for integration,
monitoring, and vendor-specific configuration
Neither number is universally smaller. The crossover point
depends entirely on throughput scale and how much the team's
engineering time is worth relative to the vendor's markup.Where the crossover point tends to sit
At low-to-moderate, steady throughput, managed pricing is usually the cheaper total-cost choice for most teams, because the ongoing engineering-time cost of self-hosting a small cluster well rarely justifies itself against a modest vendor bill — a small team keeping a Kafka expert on call for a cluster processing a few hundred megabytes a day is spending far more in engineering time than the equivalent managed service would cost.
At sustained very high throughput, usage-based managed pricing can grow to significantly exceed the cost of self-hosted infrastructure plus a dedicated operations team, because the per-unit markup on managed pricing is charged against every byte at scale, while the engineering-time cost of running a larger self-hosted team does not scale linearly with throughput the same way — a platform team sized to operate a 50-broker cluster well is not meaningfully bigger than one sized to operate a 15-broker cluster well.
| Scale profile | Where cost usually favors |
|---|---|
| Low-to-moderate, steady throughput; small team; no dedicated platform/infra function | Managed — the vendor markup is smaller than the cost of building dedicated Kafka expertise for this scale |
| Sustained very high throughput; existing platform/infra team; multi-year time horizon | Self-hosted or Kubernetes-based (Strimzi) — usage-based managed pricing scales with volume in a way infrastructure-plus-headcount cost does not |
| Spiky, unpredictable throughput at any scale | Usage-based managed options (MSK Serverless, or Confluent Cloud's consumption pricing) — paying for idle provisioned capacity is the specific cost self-hosting and provisioned managed clusters both share |
Migrating Between Kafka Deployments — Client Code Doesn't Change, the Operational Surface Does
Because every option covered in this module — self-hosted Apache Kafka, MSK, Confluent Cloud, Redpanda, WarpStream, Strimzi-on-Kubernetes — speaks the same Kafka wire protocol, a producer or consumer written against one of them generally requires no application code changes to point at another. The bootstrap servers change, authentication configuration changes, and TLS settings change — the actual producer.send() or consumer.poll() call in the application does not.
# Before: self-hosted Kafka cluster
producer_config = {
"bootstrap.servers": "kafka-1.internal:9092,kafka-2.internal:9092",
"security.protocol": "SASL_SSL",
"sasl.mechanism": "SCRAM-SHA-512",
"sasl.username": "orders-service",
"sasl.password": "...",
}
# After: migrated to Confluent Cloud
producer_config = {
"bootstrap.servers": "pkc-abc123.us-east-1.aws.confluent.cloud:9092",
"security.protocol": "SASL_SSL",
"sasl.mechanism": "PLAIN",
"sasl.username": "<API key>",
"sasl.password": "<API secret>",
}
# The application code calling producer.send(topic, key, value)
# is IDENTICAL before and after. Every acks, retries, batching,
# and idempotence setting from the producers-consumers-brokers
# module still means exactly what it meant before.What does change, and requires real planning, is the operational surface: monitoring dashboards and alerting rules built against self-hosted broker metrics need to be rebuilt against whatever observability surface the new platform exposes, topic and ACL administration workflows change to whatever the new platform's management interface is, and any tooling that assumed direct SSH access to broker hosts (for log inspection, disk checks, or manual intervention) has no equivalent on a fully managed platform, where that layer is intentionally not exposed to the customer.
| What migrates unchanged | What has to be rebuilt |
|---|---|
| Producer/consumer application code and its Kafka client library calls | Bootstrap servers, authentication mechanism, and TLS configuration |
| Topic-level semantics: keys, partitioning, ordering guarantees, compaction behavior | Broker-level monitoring dashboards and alerting rules built against self-hosted metrics |
| Kafka Connect connector configurations, in most cases (the connector plugin itself is portable) | Connect deployment model, if moving from self-hosted distributed Connect to a managed Connect offering with a different management interface |
| Schema Registry-enforced schemas and compatibility rules, if the same registry is retained or a compatible one is used | Direct host-level operational tooling — SSH-based log inspection, manual disk checks — that assumed access a managed platform does not expose |
A useful practical consequence of this: a team is not locked into a migration decision the way it might be with a database that requires a genuine data-model rewrite. A poor initial choice of managed provider, or a self-hosted setup that has outgrown a team's operational capacity, is a real but bounded migration project — mostly configuration, deployment tooling, and monitoring rework — rather than an application rewrite.
Choosing a Deployment Model — A Framework Based on Team Size, Cloud Provider, Compliance, and Throughput
With every option's real trade-offs on the table, the actual decision comes down to four factors most teams weigh, in roughly this order of practical importance.
Factor 1 — team size and existing platform expertise
A small team with no dedicated platform or infrastructure function should weight heavily toward a fully managed option (Confluent Cloud or MSK), because the ongoing engineering-time cost from Part 06 is disproportionately expensive for a small team relative to the vendor markup. A team that already runs a mature Kubernetes platform, with existing operational muscle for exactly the kind of concerns Strimzi automates, has a much more viable self-managed path than a team starting from zero.
Factor 2 — existing cloud provider
A team already deeply invested in AWS — using IAM for access control everywhere else, running workloads inside a carefully designed VPC topology — gets real, compounding value from MSK's native IAM and VPC integration that a cloud-agnostic managed service like Confluent Cloud does not replicate as tightly, even though Confluent Cloud also runs on AWS (and GCP and Azure) as underlying infrastructure. Conversely, a team intentionally avoiding cloud-provider lock-in, or running a genuinely multi-cloud footprint, often prefers a provider-agnostic managed option specifically to avoid deepening a single-cloud dependency.
Factor 3 — compliance and data-residency requirements
Regulated industries with specific data-residency requirements (data must stay within a specific country's borders, or within a specific certified environment) need to verify a managed provider's available regions and compliance certifications (SOC 2, HIPAA, PCI-DSS, FedRAMP, and equivalents) cover their specific requirement before committing — availability varies by provider and by region, and this is exactly the kind of requirement that can rule out an otherwise-preferred option outright, making it worth verifying early rather than after most of the evaluation is done.
Factor 4 — throughput and its predictability
As covered in Part 06, sustained very high and predictable throughput tends to favor self-hosted or Kubernetes-based deployment on a long enough time horizon, while low, moderate, or unpredictable throughput tends to favor managed, usage-based pricing. This factor is deliberately weighted last in this framework because, in practice, most teams evaluating this decision are not yet at the throughput scale where this factor dominates the other three — it becomes the deciding factor specifically for larger, more mature platforms.
| Team profile | Reasonable starting recommendation |
|---|---|
| Small team, no dedicated platform function, general cloud usage | Confluent Cloud, or MSK Serverless if already AWS-committed — minimize ops burden first |
| Team deeply invested in AWS, wants tight IAM/VPC integration | Amazon MSK (Provisioned if throughput is predictable, Serverless if it is not) |
| Team wants broadest ecosystem parity — Connect, Schema Registry, ksqlDB — without operating any of it | Confluent Cloud |
| Team already runs Kubernetes at scale, wants control without hand-rolled ops | Strimzi on Kubernetes |
| Team evaluating lower-operational-complexity alternatives, willing to accept a younger ecosystem | Redpanda or WarpStream, evaluated against the specific features the workload depends on (Part 04's caution applies directly here) |
| Very high, sustained, predictable throughput; existing platform team; multi-year horizon | Self-hosted or Strimzi — the cost crossover from Part 06 usually favors this at real scale |
| Strict data-residency or compliance certification requirements | Verify the specific provider and region meet the requirement before any other factor is weighed |
What to Actually Check Before Committing — A Practical Evaluation Checklist
The decision framework in Part 08 narrows the field. Before signing a contract or migrating production traffic, it is worth running a short, concrete evaluation against the specific shortlisted options, rather than deciding purely on paper feature comparisons and pricing pages.
Throughput and latency, measured against your own traffic shape
Published benchmarks from any vendor — including Confluent, AWS, Redpanda, and WarpStream — are run against traffic patterns chosen to showcase that vendor's strengths. A team's own producer batching settings, message sizes, partition counts, and acks configuration (all covered in the producers-consumers-brokers module) materially change real-world throughput and latency, often by a wide margin from a generic published number. Running an actual load test with representative traffic — same message sizes, same partition strategy, same acks setting the production workload will use — against each shortlisted option is the only way to get a number that means anything for the specific workload in question.
Support responsiveness and escalation paths
A fully managed service's support tier and SLA matter disproportionately more than they would for a less operationally critical system, precisely because choosing managed means deliberately giving up the direct operational visibility self-hosting would provide. Before committing, it is worth understanding concretely what happens during an actual incident — what response-time SLA applies at the specific pricing tier being considered, whether there is a direct escalation path to an engineer versus a generic support queue, and what visibility the platform provides into an in-progress incident on the vendor's side (a public status page is a minimum bar, not a complete answer).
1. Run an actual load test with representative message sizes,
partition counts, and acks settings -- not the vendor's
published benchmark numbers.
2. Test every specific Connect connector, Schema Registry
compatibility rule, or ksqlDB feature the pipeline design
already depends on -- don't assume "supports Kafka" covers
every feature in use today.
3. Confirm the specific compliance certifications and available
regions cover the requirement (Part 08, Factor 3) -- in writing,
not from a general marketing page.
4. Ask directly: what is the support SLA at this pricing tier,
and what does escalation actually look like during an incident?
5. Estimate cost at both current throughput AND a realistic
growth projection 12-24 months out -- usage-based pricing
that looks fine today can cross the Part 06 crossover point
sooner than expected if growth is fast.
6. Confirm the migration path back out is understood before
migrating in -- per Part 07, this should be a configuration
project, not a surprise application rewrite, but it is worth
confirming that understanding explicitly rather than assuming it.Multi-Region Kafka — How the Deployment Model Changes the Disaster-Recovery Story
A single-region Kafka cluster, whether self-hosted or managed, is only as durable as that region. A team with a genuine business requirement to survive a full regional outage needs a multi-region story, and how straightforward that story is differs sharply across the deployment models this module has covered.
Cluster linking and cross-cluster replication — the general mechanism
Regardless of provider, cross-region Kafka durability is generally achieved by replicating topics from a primary cluster in one region to a standby cluster in another, using a cluster-to-cluster replication tool — MirrorMaker 2 in the open-source ecosystem, or a vendor-specific equivalent (Confluent Cluster Linking, for instance) that offers the same underlying capability with tighter integration into that vendor's own management tooling. This is a fundamentally different mechanism from the in-cluster replication (leaders, followers, ISRs) covered in the message-brokers module — that replication protects against a single broker failing within one cluster; cross-region replication protects against an entire cluster, and the region it runs in, becoming unavailable.
| Deployment model | Multi-region story |
|---|---|
| Confluent Cloud | Cluster Linking is a first-party managed feature — replication between Confluent Cloud clusters in different regions (or between a self-hosted cluster and Confluent Cloud) is configured, not self-operated |
| Amazon MSK | MirrorMaker 2 (self-operated, deployed by the team, often on MSK Connect or a separate Connect cluster) or a third-party replication tool — AWS does not provide a fully managed cross-region replication product bundled into MSK itself |
| Self-hosted / Strimzi | MirrorMaker 2, self-operated end to end — the team owns deploying, scaling, and monitoring the replication pipeline itself, on top of everything else it already owns |
| Redpanda / WarpStream | Each has its own evolving story here — Redpanda offers its own tiered/remote replication tooling, and WarpStream's object-storage-native architecture changes the cross-region durability calculus in ways worth evaluating specifically against the requirement, not assumed from either open-source or Confluent's model |
The practical takeaway: multi-region requirements are a real, additional factor beyond Part 08's four-factor framework for a team that genuinely needs to survive a regional outage, and the operational cost of that requirement varies significantly by provider — a fully managed, first-party cross-region feature (as with Confluent Cloud) is a meaningfully different commitment than deploying and operating MirrorMaker 2 as an additional piece of self-managed infrastructure on top of an otherwise-managed cluster, which is closer to the MSK reality today.
Who Actually Owns What — Team Topology Changes More Than the Infrastructure Diagram
Moving from self-hosted to managed Kafka, or the reverse, is not purely an infrastructure decision — it changes what a platform or infrastructure team's job actually consists of day to day, and getting that team-topology shift wrong is a common, under-discussed source of friction after a migration that was technically successful.
Self-hosted — a platform team owns the full stack
With self-hosted Kafka (or Strimzi-on-Kubernetes), a platform team's Kafka-related work spans the full stack: broker capacity, version upgrades, security patching, topic and ACL administration, and being the first responder for every category of incident, from a single flaky broker to a full cluster outage. This is a substantial, specialized skill set, and teams that build it well tend to develop deep operational intuition about their specific cluster's behavior under their specific workload — a real asset, but one that takes real time and dedicated headcount to build and, importantly, to retain as engineers move on to other roles or companies.
Managed — the platform team's job shifts toward integration and governance
With a fully managed provider, a platform team's Kafka-related work shifts away from infrastructure operations and toward integration, governance, and cost management: onboarding new teams onto shared clusters or topics, administering topic-naming and schema-governance conventions (the same naming-discipline concerns covered for Kafka Connect apply directly here), managing the vendor relationship and monitoring spend against the cost model from Part 06, and being the escalation point to the vendor's own support organization during an incident rather than being the incident's first, and only, responder.
| Responsibility | Self-hosted / Strimzi | Fully managed |
|---|---|---|
| Broker capacity and version upgrades | Owned directly by the platform team | Owned by the vendor |
| First incident response for broker/disk/network failures | The platform team, directly | The vendor's own on-call, with the platform team as an informed escalation point |
| Topic naming, schema governance, ACL conventions | Owned by the platform team either way | Owned by the platform team either way |
| Cost and capacity forecasting | Infrastructure capacity planning against workload growth | Usage-based spend forecasting against the pricing model, per Part 06 |
| Vendor relationship management | Not applicable | A genuinely new, ongoing responsibility — contract terms, support tier, roadmap alignment |
Security Configuration Looks Similar Everywhere — the Access-Control Model Underneath Differs
Every option covered in this module supports the same broad security building blocks the earlier Kafka modules assumed — TLS in transit, authentication, and per-topic authorization — but how those building blocks are configured and administered differs enough across providers to be worth a direct comparison, especially for a team that will be running many teams' workloads on one shared cluster.
Authentication mechanisms, by provider
| Provider | Primary authentication mechanism | How credentials are administered |
|---|---|---|
| Self-hosted / Strimzi | SASL/SCRAM, SASL/PLAIN, or mTLS, entirely as configured by the operating team | Fully self-managed — credential rotation, storage, and distribution are the team's own responsibility |
| Confluent Cloud | API keys (a Confluent-specific credential concept) or OAuth/OIDC integration | Managed through Confluent's own console and API, with role-based access control (RBAC) layered on top |
| Amazon MSK | IAM roles and policies, or SASL/SCRAM as an alternative | IAM-based auth reuses the same AWS-wide identity system the rest of a team's AWS resources already use, per Part 03 |
| Redpanda / WarpStream | SASL mechanisms compatible with the Kafka protocol, with provider-specific management consoles for administration | Each has its own administration surface — check the specific product's current documentation for RBAC maturity relative to the two established players |
Multi-tenancy — many teams, one cluster
A shared cluster serving many internal teams needs a clear multi-tenancy model: which team can create topics, who can read or write to a given topic, and how one team's misbehaving producer or consumer (a runaway retry loop, an unbounded topic) is prevented from degrading service for every other team on the same cluster. Quotas — per-client-ID or per-user limits on produce/consume throughput — are the standard mechanism for the second concern, available in some form across every provider covered here, though the specific configuration surface (a Kafka-native quota config on self-hosted clusters, versus a managed provider's own throughput-tier and quota controls) differs by provider.
# Limiting one client's produce and consume throughput,
# to prevent it from starving other tenants on a shared cluster:
kafka-configs --bootstrap-server broker:9092 --alter \
--add-config 'producer_byte_rate=5242880,consumer_byte_rate=10485760' \
--entity-type clients --entity-name reporting-service-readonly
# reporting-service-readonly is now capped at 5MB/s produce and
# 10MB/s consume, regardless of how much the underlying broker
# hardware could otherwise deliver to it -- protecting every other
# tenant's share of the cluster's real capacity.What You Can See Differs by Provider — and That Difference Shapes On-Call
Part 01 framed self-hosting's operational cost partly in terms of who responds to a 3 AM broker failure. The other half of that picture is what an on-call engineer can actually see when something goes wrong, and that visibility differs meaningfully depending on how much infrastructure sits behind the vendor's abstraction layer.
| Self-hosted / Strimzi | MSK | Confluent Cloud | |
|---|---|---|---|
| Broker-level JVM/OS metrics (GC pauses, disk I/O, page cache hit rate) | Full access — the same metrics covered throughout this track | Exposed via CloudWatch, reasonably detailed | More abstracted — Confluent surfaces cluster-level and topic-level metrics, less raw broker-internal detail |
| Direct host access for deep debugging (attaching a profiler, reading raw log segment files) | Full access | Not available — MSK brokers are not directly accessible | Not available |
| Consumer lag, throughput, and topic-level metrics | Self-instrumented, or via standard exporters | Native CloudWatch metrics, integrates with existing AWS observability | Native Confluent Cloud metrics API and console, integrates with Confluent's own tooling |
| Underlying infrastructure incident visibility (a host failing, a network partition between brokers) | Directly visible — it is your infrastructure | Visible only as symptoms (elevated latency, ISR shrink) — root cause on AWS's side is opaque unless AWS's own status page or support says otherwise | Same opacity — the underlying cause of a managed-side incident is only as visible as the vendor's own status communication |
This is not an argument against managed platforms — for most teams, trading away the deepest tier of host-level visibility is a reasonable trade for not needing to build the expertise to interpret it in the first place. But it is worth setting on-call expectations accurately: an engineer debugging an incident on a fully managed cluster will, at some point, hit a wall where the next diagnostic step is "open a support ticket," rather than "SSH into the broker" — and that hand-off point should be a known, rehearsed part of the team's incident response process, not a surprise discovered mid-incident.
Five Misconceptions About Managed Kafka and Cloud Choices
What This Looks Like on Day One
At Vercel (a platform company whose entire product is built on making infrastructure decisions disappear for its customers): internally, the platform engineering team faces the same build-vs-buy question this module covers, but pointed at their own event pipelines. A small platform team supporting rapid product iteration does not want its senior engineers spending a quarter building Kafka operational tooling when a managed offering gets them the same reliability with a fraction of the internal build cost — the same Part 01 and Part 06 trade-off this module walks through, evaluated by a company whose entire business model is making exactly this kind of infrastructure trade-off invisible to its own customers.
At HashiCorp (whose own products — Vault, Consul, Terraform — are frequently the tools teams use to manage the infrastructure decisions this module covers): an internal platform team standardizing on Kubernetes across the company evaluates Strimzi specifically because their organization already runs Kubernetes everywhere for other services, and adding a second, unrelated ops model (a hand-rolled VM-based Kafka cluster, or a new vendor relationship) would work against the operational consistency the company generally optimizes for internally — exactly Part 05's framing that Strimzi is the stronger choice specifically for a team with existing Kubernetes muscle.
At Fivetran (a company built on moving data reliably between systems, including into and out of Kafka-compatible platforms for its customers): a solutions engineer working with a mid-market customer walks them through the decision framework from Part 08 directly — the customer is deeply committed to AWS, has moderate but growing throughput, and has no dedicated Kafka expertise on staff. The recommendation that falls out of the framework is MSK Serverless to start, specifically because of the AWS IAM/VPC fit and the customer's small team, with an explicit note that the decision is revisitable later without an application rewrite, per Part 07, if throughput growth eventually makes provisioned MSK or a different platform more cost-effective.
5 Interview Questions — With Complete Answers
Mistakes Beginners Make Constantly
Errors and Surprises You Will Hit — And Exactly Why They Happen
🎯 Key Takeaways
- ✓Self-hosting Kafka is a real, ongoing engineering-time cost — capacity planning, version upgrades, on-call, and security administration — not just a server bill. Weigh that time at its fully-loaded cost when comparing against managed pricing.
- ✓Confluent Cloud offers the broadest ecosystem feature parity — managed Schema Registry, Connect, and ksqlDB alongside brokers — generally at a higher price point than a brokers-only managed offering.
- ✓Amazon MSK manages brokers with deep native AWS IAM and VPC integration, but leaves Schema Registry and Connect as separate AWS products rather than a unified managed experience; MSK Serverless removes capacity planning entirely at usage-based pricing.
- ✓Redpanda (C++, no JVM) and WarpStream (stateless brokers on object storage) are Kafka-wire-protocol-compatible, so basic client code generally works unmodified — but protocol compatibility is not the same claim as full ecosystem feature parity, and specific dependencies need explicit testing.
- ✓Strimzi on Kubernetes automates Kafka-specific operational mechanics (rolling upgrades, reconciliation) through a declarative operator model, but shifts the operational burden into Kubernetes expertise rather than eliminating it — a strong fit specifically for teams with existing Kubernetes maturity.
- ✓The self-hosted vs. managed cost crossover depends on scale: managed pricing usually wins at low-to-moderate throughput once engineering time is priced in; self-hosted or Kubernetes-based deployment can win at sustained very high throughput with an existing platform team.
- ✓Migrating between Kafka platforms is mostly a configuration and operational-tooling project, not an application rewrite, because every option in this module speaks the same Kafka wire protocol — client send() and poll() calls are typically unchanged.
- ✓Choose a deployment model using team size and existing platform expertise first, then cloud-provider fit, then compliance/data-residency requirements, then throughput and its predictability — and treat the decision as revisitable, not permanent.
Discussion
0Have a better approach? Found something outdated? Share it — your knowledge helps everyone learning here.