DEV Community

ANKUSH CHOUDHARY JOHAL
ANKUSH CHOUDHARY JOHAL

Posted on • Originally published at johal.in

Hot Take: You Should Not Use Service Mesh for Small K8s Clusters – Use Calico 3.28 Instead

Hot Take: You Should Not Use Service Mesh for Small K8s Clusters – Use Calico 3.28 Instead

If you’re running a small Kubernetes cluster (think: fewer than 10 nodes, under 50 active pods, or a non-production/staging environment), you’ve probably been told you need a service mesh like Istio or Linkerd to handle networking, security, and observability. That’s bad advice. For small setups, service mesh adds unnecessary overhead, complexity, and cost — and Calico 3.28 delivers every feature you actually need without the bloat.

Why Service Mesh Is Overkill for Small Clusters

Service meshes solve real problems: they provide mutual TLS (mTLS) for pod-to-pod traffic, advanced traffic routing, observability, and policy enforcement for large, distributed Kubernetes deployments. But they achieve this by injecting a sidecar proxy (like Envoy) into every single pod, plus running a dedicated control plane with multiple components.

For a small cluster with 50 pods, that’s 50 extra sidecar containers consuming CPU and memory, plus 3-5 control plane pods. In testing, this can eat up 20-30% of your cluster’s total resources — resources that should be running your actual workloads. You also add operational complexity: you now have to troubleshoot proxy configs, manage control plane upgrades, and learn a new set of abstractions just to get basic networking features.

Service meshes are built for scale: multi-cluster deployments, global traffic management, canary releases across hundreds of services. If you’re running a small cluster, you don’t need any of that. You need three things: reliable pod networking, basic security (mTLS, network policy), and enough observability to debug issues. Calico 3.28 gives you all three, with a fraction of the overhead.

What Makes Calico 3.28 the Better Fit

Calico is a widely used Kubernetes CNI (Container Network Interface) plugin, but its 3.28 release added critical features that close the gap with service mesh for small clusters — without sidecars or extra control planes. Here’s what you get:

  • Sidecar-Free mTLS: Calico 3.28 supports native mTLS for all pod-to-pod traffic, using either its eBPF data plane or kernel-level enforcement. No sidecar proxies means no extra resource usage, and setup takes minutes via a single configuration flag.
  • Layer 7 Network Policy: Unlike most CNIs, Calico 3.28 supports L7 policy enforcement for HTTP, gRPC, and other application-layer protocols. You can restrict access based on HTTP methods, paths, or headers — the same level of granularity service meshes offer, without sidecars.
  • Built-In Observability: Calico 3.28 includes native flow logging, Prometheus metrics for network traffic, and integration with tools like Grafana and Jaeger. You get full visibility into pod-to-pod traffic without deploying extra telemetry sidecars.
  • Lightweight Resource Usage: Calico runs as a single daemonset (one pod per node) plus an optional controller for policy management. Total resource usage is typically 2-5% of cluster capacity, even for small setups.
  • Simple Traffic Management: Calico supports Kubernetes-native services, basic load balancing, and topology-aware routing. For small clusters, this is more than enough to handle service discovery and traffic splitting.

Service Mesh vs Calico 3.28: Small Cluster Comparison

Feature

Service Mesh (Istio/Linkerd)

Calico 3.28

Resource Overhead

20-30% of cluster capacity

2-5% of cluster capacity

mTLS Implementation

Sidecar proxy per pod

Kernel/eBPF, no sidecars

Network Policy

L4 + L7 (via sidecars)

L4 + L7 (native, no sidecars)

Observability

Sidecar metrics + extra tools

Native flow logs + Prometheus metrics

Operational Complexity

High (control plane + sidecar management)

Low (daemonset + optional controller)

When Should You Still Use a Service Mesh?

This isn’t a blanket “service mesh is bad” take. If you’re running a large cluster (50+ nodes, 200+ pods), multi-cluster deployments, or need advanced features like fault injection, circuit breaking, or global traffic routing, a service mesh is still the right choice. But for the vast majority of small clusters — staging environments, side projects, small production workloads — it’s overkill.

How to Switch to Calico 3.28

Migrating from a service mesh to Calico 3.28 is straightforward:

  1. Back up your current cluster configuration and any service mesh custom resources.
  2. Uninstall your service mesh using its official uninstallation guide (e.g., istioctl uninstall --purge for Istio).
  3. Install Calico 3.28 using the official manifest: kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml
  4. Enable mTLS and L7 policy via Calico’s custom resources (see the Calico 3.28 docs for details).
  5. Verify pod networking, mTLS, and policies work as expected before decommissioning old resources.

Final Verdict

For small Kubernetes clusters, service mesh is a solution looking for a problem. Calico 3.28 gives you all the networking, security, and observability you need — with 1/10th the resource usage and a fraction of the complexity. Save the service mesh for when you actually scale. Your cluster (and your cloud bill) will thank you.

Top comments (0)