Skip to content
_CORE
AI & Agentic Systems Core Information Systems Cloud & Platform Engineering Data Platform & Integration Security & Compliance QA, Testing & Observability IoT, Automation & Robotics Mobile & Digital Banking & Finance Insurance Public Administration Defense & Security Healthcare Energy & Utilities Telco & Media Manufacturing Logistics & E-commerce Retail & Loyalty
References Technologies Blog Know-how Tools
About Collaboration Careers
CS EN DE
Let's talk

Service Mesh — Istio, Cilium and the Future of the Network Layer

25. 12. 2025 Updated: 28. 03. 2026 14 min read CORE SYSTEMSinfrastructure
Service Mesh — Istio, Cilium and the Future of the Network Layer

Kubernetes solved container orchestration. But network communication between microservices — observability, security, and traffic management — remained a problem for a long time. Service mesh solves this problem. In 2026, the landscape has changed dramatically: eBPF is replacing sidecar proxies, Ambient mode in Istio is changing the game, and Cilium has become the de facto standard for cloud-native networking. How do you make sense of it all?

What is a service mesh and why do you need it

A service mesh is an infrastructure layer that manages network communication between microservices. Instead of each service implementing its own logic for retry, circuit breaking, mTLS, or load balancing, these functions are moved to the network layer.

Think of it as a highway system for your microservices. Without a service mesh, each service has its own GPS navigation, its own right-of-way rules, and its own security system. A service mesh creates a unified traffic infrastructure with rules, monitoring, and traffic management.

When you actually need a service mesh

Not every cluster needs a service mesh. If you have 5 services and one team, the overhead is not worth it. A service mesh starts to make sense when:

  • You have 20+ microservices with complex communication patterns
  • Multiple teams share a cluster and need traffic isolation
  • Regulatory requirements demand mTLS everywhere and an audit trail
  • Zero trust security is an architectural requirement
  • Canary deployments and traffic splitting are part of the release process
  • Observability at the L7 level (HTTP/gRPC) is needed without code instrumentation

What a service mesh solves

Area Without service mesh With service mesh
Encryption Manual TLS configuration per service Automatic mTLS everywhere
Observability In-code instrumentation (OpenTelemetry SDK) Automatic metrics, traces, access logs
Traffic management Kubernetes Service (L4 only) L7 routing, canary, traffic splitting
Resilience Retry/circuit breaker in code Declarative policies
Authorization Custom middleware per service Central policies (OPA, AuthorizationPolicy)
Rate limiting Per-service implementation Global and per-route limits

Architecture: Sidecar vs Sidecarless

Historically, all service mesh implementations used the sidecar pattern — a proxy container (typically Envoy) is attached to each pod, intercepting all network traffic.

Sidecar model (classic)

┌─────────────────────────┐
│ Pod                     │
│ ┌─────────┐ ┌─────────┐│
│ │  App    │↔│ Envoy   ││
│ │Container│ │ Sidecar ││
│ └─────────┘ └─────────┘│
└─────────────────────────┘

Advantages: - Full L7 functionality (HTTP headers, gRPC metadata) - Isolation — compromising a proxy does not affect other pods - Mature, battle-tested (Istio since 2017)

Disadvantages: - Resource overhead — each pod consumes an additional 50-100 MB RAM and 0.1-0.5 vCPU - Latency — two extra TCP connections per request (~1-3 ms) - Startup delay — init container + sidecar injection slows down cold start - Upgrade complexity — rolling restart of all pods when upgrading the proxy

Sidecarless model (eBPF-based)

┌─────────────────────────┐
│ Node (kernel)           │
│ ┌─────────────────────┐ │
│ │ eBPF programs       │ │
│ │ (L3/L4 processing)  │ │
│ └─────────────────────┘ │
│ ┌───────┐ ┌───────┐    │
│ │ Pod A │ │ Pod B │    │
│ │ (app) │ │ (app) │    │
│ └───────┘ └───────┘    │
└─────────────────────────┘

Advantages: - Minimal overhead — eBPF programs run in the kernel, no extra container - Lower latency — kernel-level processing, no user-space proxy - Simpler upgrades — update DaemonSet instead of restarting all pods - Lower consumption — 10-30% less CPU and RAM compared to the sidecar model

Disadvantages: - Limited L7 functionality in pure eBPF (per-node proxy needed for L7) - Kernel version dependency (Linux 5.10+, ideally 6.1+) - Less isolation — shared per-node component

Hybrid: Istio Ambient Mode

In 2024, Istio introduced Ambient mode as an alternative to sidecar injection. In 2026, Ambient mode is GA and is becoming the recommended deployment model.

Ambient mode uses a two-layer architecture:

  1. ztunnel (zero-trust tunnel) — per-node DaemonSet for L4 (mTLS, TCP routing)
  2. waypoint proxy — optional per-namespace/service Envoy proxy for L7 (HTTP routing, AuthorizationPolicy)
┌──────────────────────────────────┐
│ Node                             │
│ ┌──────────┐                     │
│ │ ztunnel  │ ← L4: mTLS, TCP    │
│ │(DaemonSet)│                    │
│ └──────────┘                     │
│ ┌───────┐ ┌───────┐ ┌─────────┐ │
│ │ Pod A │ │ Pod B │ │Waypoint │ │
│ └───────┘ └───────┘ │ (opt.)  │ │
│                      └─────────┘ │
└──────────────────────────────────┘

Why this is revolutionary: - mTLS without sidecar — ztunnel provides L4 encryption without any injection - L7 only where you need it — waypoint proxy is deployed only for services requiring HTTP routing - 60-70% reduction in resource overhead compared to the classic sidecar model - Zero config mTLS — add a label to the namespace and you’re done

The Big Three: Istio vs Cilium vs Linkerd

Istio — enterprise standard

Istio is the most widely adopted service mesh with the largest ecosystem. In 2026, it is at version 1.25+ with full Ambient mode support.

Strengths: - Broadest feature set — traffic management, security, observability - Massive community and enterprise support (Google, Solo.io, Tetrate) - Ambient mode eliminates the main pain point (sidecar overhead) - Integration with most cloud providers (GKE, AKS, EKS) - Gateway API support (Kubernetes standard for ingress/egress)

Weaknesses: - Steep learning curve — CRDs, Envoy configuration, debugging - Control plane overhead (istiod is relatively heavy) - Historical baggage — many deprecated APIs and configuration patterns

Ideal for: Enterprise environments with complex traffic management requirements and multi-cluster deployments.

# Service Mesh in 2026 — Istio, Cilium and the Future of the Network Layer
apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    istio.io/dataplane-mode: ambient

---
# Waypoint proxy for L7 policies
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: production-waypoint
  namespace: production
  labels:
    istio.io/waypoint-for: service
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE

Cilium Service Mesh — eBPF-native

Cilium started as a CNI plugin for Kubernetes and grew into a complete networking, observability, and security platform. Cilium Service Mesh is a natural extension — it uses eBPF for L3/L4 and per-node Envoy for L7.

Strengths: - eBPF performance — lowest latency and overhead of all mesh solutions - Unified platform — CNI + service mesh + observability (Hubble) in one - Network policies at L3/L4/L7 — most granular in the ecosystem - Hubble — real-time observability without sidecar - Tetragon — runtime security enforcement at the kernel level - Mutual authentication without sidecar proxy

Weaknesses: - Kernel dependency (5.10+, ideally 6.1+) - Smaller L7 feature set compared to Istio (gradually catching up) - Vendor lock-in risk (Isovalent -> Cisco acquisition) - More complex debugging (eBPF programs vs Envoy access logs)

Ideal for: Organizations that want a unified networking stack with maximum performance.

# Cilium — L7 traffic policy
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: api-l7-policy
  namespace: production
spec:
  endpointSelector:
    matchLabels:
      app: api-gateway
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:
        - method: GET
          path: "/api/v1/.*"
        - method: POST
          path: "/api/v1/orders"
          headers:
          - 'Content-Type: application/json'

Linkerd — simplicity as a feature

Linkerd is the lightest service mesh. It uses its own ultra-lightweight proxy (linkerd2-proxy, written in Rust) instead of Envoy.

Strengths: - Simplest deployment and operation — 5-minute install - Lowest resource footprint in the sidecar model (proxy <10 MB RAM) - Rust proxy — faster and safer than Envoy (C++) - Opinionated — less configuration = fewer errors - CNCF graduated — vendor neutral

Weaknesses: - Limited feature set compared to Istio (no egress gateway, limited traffic splitting) - Smaller ecosystem and community - License change (2024) — edge releases under Buoyant Enterprise License - No sidecarless/ambient mode (stays with sidecar)

Ideal for: Smaller teams and organizations where simplicity > features.

# Linkerd — install in 5 minutes
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -
linkerd check

# Mesh namespace
kubectl annotate namespace production linkerd.io/inject=enabled
kubectl rollout restart deployment -n production

Practical performance comparison

Benchmarks from real clusters (100 pods, 10k RPS, 2026 versions):

Metric Istio Ambient Cilium SM Linkerd Istio Sidecar
P50 latency +0.3 ms +0.1 ms +0.5 ms +1.2 ms
P99 latency +1.1 ms +0.4 ms +1.8 ms +4.5 ms
RAM per pod ~5 MB (ztunnel shared) ~3 MB (eBPF) ~10 MB (sidecar) ~50 MB (Envoy)
CPU overhead 2-5% 1-3% 3-6% 8-15%
Install time 10 min 15 min 5 min 10 min
L7 features ★★★★★ ★★★★☆ ★★★☆☆ ★★★★★
mTLS setup Label namespace Config flag Annotate + restart Automatic

mTLS everywhere — zero trust networking

One of the most important service mesh features is automatic mutual TLS (mTLS). In the zero trust model, we do not rely on the network perimeter — every communication must be encrypted and authenticated.

How mTLS works in a service mesh

  1. Identity — each workload receives a SPIFFE identity (URI format: spiffe://cluster.local/ns/production/sa/api-server)
  2. Certificate issuance — the control plane issues an X.509 certificate with a short validity period (typically 24h)
  3. Automatic rotation — certificates are automatically rotated without restart
  4. Mutual verification — both sides of the communication verify each other’s certificate
# Istio PeerAuthentication — enforcing mTLS
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: strict-mtls
  namespace: production
spec:
  mtls:
    mode: STRICT

---
# AuthorizationPolicy — who is allowed to communicate with whom
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: api-access
  namespace: production
spec:
  selector:
    matchLabels:
      app: api-server
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - "cluster.local/ns/production/sa/frontend"
        - "cluster.local/ns/production/sa/mobile-bff"
    to:
    - operation:
        methods: ["GET", "POST"]
        paths: ["/api/v1/*"]

SPIFFE and identity federation

SPIFFE (Secure Production Identity Framework For Everyone) standardizes workload identity. In multi-cluster and hybrid-cloud environments, SPIFFE federation is key — it allows workloads in different clusters to trust each other without sharing a root CA.

Cluster A (on-prem)          Cluster B (cloud)
┌─────────────────┐         ┌─────────────────┐
│ Trust Domain:    │         │ Trust Domain:    │
│ cluster-a.local  │◄──────►│ cluster-b.cloud  │
│                  │ Bundle  │                  │
│ ┌─────┐ ┌─────┐│Exchange ││ ┌─────┐ ┌─────┐│
│ │Svc A│ │Svc B││         ││ │Svc C│ │Svc D││
│ └─────┘ └─────┘│         │└─────┘ └─────┘│
└─────────────────┘         └─────────────────┘

Traffic management in practice

Canary deployment with automatic rollback

# Istio VirtualService — gradual canary with metrics
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: api-server
  namespace: production
spec:
  hosts:
  - api-server
  http:
  - match:
    - headers:
        x-canary:
          exact: "true"
    route:
    - destination:
        host: api-server
        subset: canary
  - route:
    - destination:
        host: api-server
        subset: stable
      weight: 90
    - destination:
        host: api-server
        subset: canary
      weight: 10
    retries:
      attempts: 3
      perTryTimeout: 2s
      retryOn: 5xx,reset,connect-failure
    timeout: 10s

---
# Flagger — automatic canary with rollback
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  name: api-server
  namespace: production
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-server
  service:
    port: 8080
  analysis:
    interval: 1m
    threshold: 5
    maxWeight: 50
    stepWeight: 10
    metrics:
    - name: request-success-rate
      thresholdRange:
        min: 99
      interval: 1m
    - name: request-duration
      thresholdRange:
        max: 500
      interval: 1m

Fault injection for chaos engineering

# Simulating latency and errors for resilience testing
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: payment-service-chaos
spec:
  hosts:
  - payment-service
  http:
  - fault:
      delay:
        percentage:
          value: 10
        fixedDelay: 5s
      abort:
        percentage:
          value: 5
        httpStatus: 503
    route:
    - destination:
        host: payment-service

Observability without instrumentation

Service mesh provides automatic observability without the need to modify application code.

Metrics (Prometheus)

Service mesh automatically generates RED metrics (Rate, Errors, Duration) for each service:

# Request rate per service
sum(rate(istio_requests_total{reporter="destination"}[5m])) by (destination_service)

# Error rate
sum(rate(istio_requests_total{response_code=~"5.*"}[5m])) by (destination_service)
/ sum(rate(istio_requests_total[5m])) by (destination_service)

# P99 latency
histogram_quantile(0.99,
  sum(rate(istio_request_duration_milliseconds_bucket[5m])) by (le, destination_service)
)

Distributed tracing

The mesh automatically propagates trace headers (B3, W3C Trace Context), but applications must propagate headers between incoming and outgoing requests. This is a common misconception — a service mesh does not create end-to-end traces automatically.

# Applications must propagate headers
from flask import Flask, request
import requests

app = Flask(__name__)

TRACE_HEADERS = [
    'x-request-id', 'x-b3-traceid', 'x-b3-spanid',
    'x-b3-parentspanid', 'x-b3-sampled', 'x-b3-flags',
    'traceparent', 'tracestate'
]

@app.route('/api/orders')
def get_orders():
    # Propagate trace headers to downstream service
    headers = {h: request.headers.get(h) for h in TRACE_HEADERS if request.headers.get(h)}
    response = requests.get('http://inventory-service:8080/stock', headers=headers)
    return process_orders(response.json())

Hubble (Cilium) — real-time flow visibility

# Monitor traffic in real time
hubble observe --namespace production --protocol http

# Top services by traffic volume
hubble observe --namespace production -o json | \
  jq -r '.flow.destination.identity' | sort | uniq -c | sort -rn | head

# Dropped connections (security policy violations)
hubble observe --namespace production --verdict DROPPED

# Service map export for Grafana
hubble observe --namespace production -o json > flows.json

Multi-cluster service mesh

Enterprise environments rarely run on a single cluster. Multi-cluster mesh enables transparent communication between clusters with unified security policies.

Istio multi-cluster topologies

Primary-Remote: One control plane, remote clusters connect to it.

# Primary cluster — istiod manages all clusters
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    global:
      meshID: mesh1
      multiCluster:
        clusterName: cluster1
      network: network1
  meshConfig:
    defaultConfig:
      proxyMetadata:
        ISTIO_META_DNS_CAPTURE: "true"
        ISTIO_META_DNS_AUTO_ALLOCATE: "true"

Multi-Primary: Each cluster has its own control plane, synchronization via east-west gateway.

Cilium Cluster Mesh

Cilium offers native multi-cluster networking without the need for an external gateway:

# Connecting two clusters
cilium clustermesh enable --context cluster1
cilium clustermesh enable --context cluster2
cilium clustermesh connect --context cluster1 --destination-context cluster2

# Global service available from both clusters
kubectl annotate service api-server \
  service.cilium.io/global="true" \
  service.cilium.io/shared="true"

Migrating to a service mesh — step by step

Phase 1: Assessment (2 weeks)

  1. Map your services — how many pods, which protocols (HTTP, gRPC, TCP), what communication patterns
  2. Identify quick wins — which services benefit the most from mTLS and observability
  3. Verify compatibility — kernel version (for Cilium), sidecar compatibility (init containers, hostNetwork)
  4. Define success metrics — what you want to measure (latency, security posture, MTTR)

Phase 2: Pilot (4 weeks)

  1. Staging cluster — deploy the mesh to a non-production environment
  2. Permissive mTLS — start with PERMISSIVE mode (accepts plaintext as well)
  3. Observability first — deploy dashboards, teach the team to read metrics
  4. One namespace — start with a non-critical namespace in production

Phase 3: Rollout (8-12 weeks)

  1. Namespace by namespace — gradually enable the mesh
  2. Strict mTLS — switch to STRICT after verifying that everything communicates over mTLS
  3. Authorization policies — gradually add L7 policies
  4. Traffic management — canary deployments, fault injection tests

Phase 4: Hardening (ongoing)

  1. Default deny — AuthorizationPolicy with an allow-list approach
  2. Audit logging — access logs for compliance
  3. Performance tuning — right-sizing proxy resources, connection pooling
  4. DR testing — simulating control plane outages

Common mistakes and how to avoid them

1. Deploying mesh to everything at once

The biggest mistake. Mesh adds complexity and a new failure mode. If you deploy it to the entire cluster at once and something breaks, you have no baseline for comparison.

Solution: Namespace by namespace, with a rollback plan.

2. Ignoring proxy resource limits

An Envoy sidecar without resource limits can consume more CPU and RAM than the application itself.

# Setting resource limits for sidecar
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    defaultConfig:
      proxyMetadata: {}
  values:
    global:
      proxy:
        resources:
          requests:
            cpu: 50m
            memory: 64Mi
          limits:
            cpu: 200m
            memory: 256Mi

3. Not propagating trace headers

Service mesh generates spans, but end-to-end tracing only works if the application propagates headers. Without this, you get isolated spans instead of a continuous trace.

4. mTLS breakage with external services

Services outside the mesh (databases, external APIs) cannot communicate over mTLS. You need a DestinationRule with DISABLE TLS for external services.

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: external-database
spec:
  host: database.external.svc
  trafficPolicy:
    tls:
      mode: DISABLE

5. Underestimating day-2 operations

Upgrading a service mesh is a complex operation. The control plane and data plane must be compatible, sidecar proxies require rolling restarts. Automate the upgrade pipeline from the start.

The future: where service mesh is heading

eBPF as the default

By the end of 2026, we predict that most new deployments will be eBPF-based. The sidecar model will survive for L7-heavy use cases, but L3/L4 will move to the kernel.

Gateway API as the standard

Kubernetes Gateway API (GA since K8s 1.27) is replacing Ingress and proprietary CRDs. Service mesh implementations are converging on a unified API for traffic management.

Ambient mesh goes mainstream

Istio Ambient mode will remove the biggest barrier to adoption (sidecar overhead). We predict 50%+ of new Istio installations will use Ambient mode by the end of 2026.

AI-driven traffic management

Predictive autoscaling and traffic routing based on ML models analyzing historical metrics. Automatic circuit breaking based on anomaly detection instead of static thresholds.

Market consolidation

Cisco’s acquisition of Isovalent (Cilium), Solo.io’s dominance in Istio enterprise. We expect further consolidation — possibly a merge of Linkerd into another project or its marginalization.

CORE SYSTEMS recommendations

Based on dozens of service mesh implementations, we recommend:

  1. New deployments (greenfield): Cilium Service Mesh — unified stack, best performance, the future is eBPF
  2. Existing Kubernetes with Istio: Migration to Ambient mode — immediate overhead reduction without losing features
  3. Small teams, simple requirements: Linkerd — fastest time-to-value
  4. Multi-cloud / hybrid: Istio — best multi-cluster support and ecosystem
  5. High performance / low latency: Cilium — eBPF latency is unbeatable

CORE SYSTEMS offers

  • Service Mesh Assessment — analysis of your infrastructure readiness
  • Pilot Implementation — deployment and configuration of mesh on a pilot project
  • Migration Planning — strategy for transitioning from monolith or sidecar to ambient/eBPF
  • Training — workshops for developers and operators
  • Managed Operations — service mesh operation and monitoring as a service

Service mesh is not a silver bullet — it is an infrastructure investment that pays off in the right context. If your cluster is growing, security requirements are increasing, and you need observability without instrumentation, service mesh is the right choice. The key is to start with a small pilot, measure the impact, and scale gradually.

Need help with deployment? Contact us — we will help you choose and implement the right solution.

service-meshistiociliumkubernetesnetworkingebpfzero-trust
Share:

CORE SYSTEMS

We build core systems and AI agents that keep operations running. 15 years of experience with enterprise IT.

Need help with implementation?

Our experts can help with design, implementation, and operations. From architecture to production.

Contact us
Need help with implementation? Schedule a meeting