Skip to main content
Cilium vs Istio: eBPF Service Mesh Compared (2026)

Cilium vs Istio: eBPF Service Mesh Compared (2026)

KU
• 6 min read•Updated •164 views

A practitioner's comparison of Cilium's eBPF, sidecar-less dataplane against Istio's Envoy sidecar and ambient mesh models.

Key takeaways

  • Choose Cilium if it is already your CNI and you mainly need identity-aware network policy, encryption, and flow visibility; choose Istio, in ambient mode since it went GA in Istio 1.24, when you need rich L7 routing, canaries, and mTLS everywhere.
  • Both are CNCF Graduated, and Cilium can run as the CNI underneath Istio ambient.

If Cilium is already your CNI, start with its mesh features and add Istio only when you need deep L7 traffic management. Cilium does L3/L4 forwarding and policy in the kernel with eBPF; Istio runs Envoy, either per pod or, in ambient mode, as a per-node ztunnel plus optional waypoints. They also compose well.

For the wider picture, see our service mesh guide. If your shortlist also includes Linkerd, the Istio vs Linkerd comparison is the companion read.

The core architectural split

Istio's classic model puts an Envoy sidecar in every pod. All traffic in and out is intercepted by that proxy, which gives Istio a very rich L7 story: fine-grained routing, retries, fault injection, header manipulation, and per-request telemetry. The cost is one proxy process per pod plus the redirect plumbing.

Ambient mode, generally available since Istio 1.24 in November 2024, changes the shape. A per-node proxy written in Rust, ztunnel, handles mTLS, L4 authorization, and telemetry, and tunnels traffic over HBONE. Envoy-based waypoint proxies run outside application pods only for workloads that need L7 features, so you pay for L7 only where you use it.

Cilium comes from the opposite direction. It started as an eBPF-based CNI and network-policy engine and grew mesh features on top. eBPF programs in the kernel handle IP, TCP, and UDP; when you need HTTP, gRPC, or DNS awareness, Cilium hands that traffic to a per-node Envoy it manages. Both projects converged on per-node proxies for L7, but Cilium never had a sidecar to shed.

(as of October 2026)CiliumIstio sidecarIstio ambient
L3/L4 dataplaneeBPF in the kernelEnvoy per podztunnel per node
L7 proxyPer-node EnvoyThe sidecarOptional waypoint Envoy
Encryption / identityIPsec or WireGuard; SPIFFE mutual auth in betamTLS with SPIFFE identitiesmTLS in ztunnel over HBONE
Policy objectCiliumNetworkPolicy, L3 to L7AuthorizationPolicyAuthorizationPolicy
ObservabilityHubble flow logsEnvoy metrics and tracingztunnel and waypoint telemetry
CNCF statusGraduated, October 2023Graduated, July 2023Graduated, July 2023

mTLS and encryption

Istio's mTLS is the most battle-tested part of the project: SPIFFE identities, certificates distributed to sidecars or ztunnel, and mutual TLS between workloads as a policy toggle.

Cilium's transparent encryption works at the node level with IPsec or WireGuard, plus a ztunnel mode that is in beta. Its SPIFFE-based mutual authentication is also still beta per the Cilium docs. If a regulator cares about the exact encryption boundary, read those pages rather than assuming parity with per-connection mTLS.

Network policy vs mesh policy

Because Cilium began as a CNI, CiliumNetworkPolicy is mature and can express L3/L4 and L7 rules in one object:

yaml.yaml
# cilium/allow-api-get.yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-api-get
spec:
  endpointSelector:
    matchLabels:
      app: backend
  ingress:
    - fromEndpoints:
        - matchLabels:
            app: frontend
      toPorts:
        - ports:
            - port: "8080"
              protocol: TCP
          rules:
            http:
              - method: "GET"
                path: "/api/.*"

That policy lets the frontend reach the backend only for GET requests under /api/. If identity-aware segmentation is the goal, Cilium delivers it without a full mesh. Istio's AuthorizationPolicy is equally expressive but lives in the mesh layer. For the policy side alone, see Kubernetes network policies.

Observability

Cilium ships Hubble, which taps the same eBPF layer for flow-level visibility with no app instrumentation:

bash.bash
$ hubble observe --namespace payments --protocol http --verdict DROPPED

That surfaces dropped flows, DNS lookups, and L7 requests with identities attached, which is the fastest way we know to debug a policy. Istio's Envoy telemetry feeds Prometheus, Grafana, and tracing through Jaeger or Tempo, and is richer for application-behavior questions. Hubble is stronger for network-level truth about what actually flowed.

Performance: read the benchmark's byline

The most cited numbers come from Istio's own blog (Mitch Connors, October 21, 2024), so treat them as vendor-authored. On a 1,000-node cluster with 50,000 pods and constant churn, Istio ambient served 2,178 queries per core against Cilium's 1,815, which the post summarizes as "56% more queries at 20% lower tail latency." Cilium used about 30% less measured CPU, but the post notes that Prometheus only counts user-space resources, so Cilium's in-kernel work and encryption were not measured. Benchmark with your own traffic; connection churn and payload size move the result.

Can you run both?

Yes, and it is often the right answer. Cilium's docs describe integration with Istio in both sidecar and ambient modes: Cilium stays the CNI, handling pod networking, L3/L4 policy, and Hubble, while Istio owns mTLS and L7 routing. You get kernel-level networking without giving up Istio's traffic management. The cost is two control planes to upgrade and understand.

Questions people ask

Cilium vs Istio: which is faster?

It depends on what you measure. Istio's October 2024 benchmark at 1,000 nodes found ambient mode handled 56% more queries at 20% lower tail latency than Cilium, while Cilium used about 30% less user-space CPU; kernel-side costs were not counted. Istio wrote that benchmark, so rerun it on your workload. For pure L3/L4 forwarding, an in-kernel path avoids proxy hops entirely.

Do I need Istio if I already run Cilium?

Often not. If your needs are segmentation, encryption between nodes, ingress through Gateway API, and flow visibility, Cilium covers them with CiliumNetworkPolicy, WireGuard or IPsec, and Hubble. Add Istio when you need progressive delivery, traffic mirroring, fault injection, or per-request mTLS everywhere, and run it in ambient mode on top of Cilium.

Is Istio ambient mode production ready?

Istio declared ambient mode generally available in release 1.24 on November 7, 2024. Its core, ztunnel for L4 mTLS and authorization plus waypoint proxies for L7, is stable; some individual features in the docs are still marked alpha. Check the status of any feature you depend on, such as multi-cluster, before migrating sidecar workloads.

The decision, concretely

  • Already run Cilium as your CNI? Turn on its mesh features first; a second system may never be needed.
  • Need identity-aware segmentation more than L7 shaping? Cilium plus Hubble, with less overhead.
  • Need canaries, weighted routing, and a broad extension ecosystem? Istio in ambient mode.
  • Multi-cluster? Cilium Cluster Mesh for connectivity and policy; Istio multi-primary for consistent L7 policy.

The call we'd make

Greenfield, we'd run Cilium as CNI with its mesh features, and layer Istio ambient on top only when the L7 gap actually bites. Hubble alone often justifies Cilium. If your requirements are L7-heavy from day one, go straight to Cilium plus Istio ambient. Either way, prototype against your own traffic and recheck release notes, because the feature line between the two keeps moving.

Sources

Explore topics:KubernetesDevOps
React
Share this post
KU

Kiril Urbonas

AI Engineer

560 articles
View all articles by Kiril Urbonas

You might have missed

Evergreen posts worth revisiting.