Blog
December 2, 2025

Cilium + Traefik: The Superhighway and Traffic Cop Pattern for Multi-Cloud Networking

Cilium and Traefik Work Together

It's 3 AM. You're the on-call engineer, and your globally distributed payment API is timing out on AWS, but running fine on Azure. The API is spread across multiple clouds for high availability and low latency. You pull up three different dashboards—AWS CloudWatch, Azure Monitor, and your homegrown Grafana—trying to correlate logs across environments.

After an hour of intense archaeology, bug hunting, documentation review, and support forum reading, you discover the culprit: AWS ALB's default timeout of 60 seconds versus Azure App Gateway's 90-second default is causing long-running transactions to time out. It's the same application code, different cloud plumbing, and production is still down.

Different provider settings are the hidden tax of multi-cloud architecture.

We tell ourselves, "Kubernetes abstracts the infrastructure." That's true for compute. But for networking? Kubernetes gives you portability at Layer 7 while leaving you stranded in the quicksand of Layers 3 and 4. The networking rules in EKS differ from those in AKS. Load balancers speak different dialects. At scale, your networking configuration compounds with every new service until troubleshooting feels like defusing a bomb in the dark.

It's like driving across Europe in the 1970s. Every border crossing means new road signs, new traffic laws, and a new currency to fumble with.

But there's a better way. A new architectural pattern is emerging that actually delivers on Kubernetes' portability promise. It combines the kernel-level performance of Cilium (the Superhighway) with the application-layer intelligence of Traefik (the Traffic Cop)

For platform engineers tired of maintaining three different networking stacks, here's why this combo is becoming the new standard.

The Legacy Bottleneck: When Every Packet Hits a Red Light

Let's be honest about what we're replacing.

Traditional Kubernetes networking routes traffic through Linux firewall tools like iptables. This technology, designed in the 1990s, was built for firewalls, not for orchestrating thousands of microservices. Every packet that enters a node triggers a linear scan through potentially thousands of rules. The more services and rules you add, the slower every packet gets processed, and the more difficult it becomes to debug.

Picture a city where every intersection has a stop sign and a traffic cop manually checking every car's paperwork. That's iptables. It works fine for 10 cars (services). It becomes complex at 100 rules, and a maintenance headache at 1,000+.

The symptoms are familiar:

  • CPU spikes during deployment rollouts as firewall chains rebuild due to the rapid creation and destruction of containers.
  • Unpredictable latency as rule chains grow longer.
  • Debugging that requires deep Linux kernel knowledge.
  • Connection tracking tables that overflow under load.

The Superhighway: How Cilium Rewrites the Rules

The breakthrough came from eBPF (Extended Berkeley Packet Filter). Cilium is its best implementation for Kubernetes networking.

Instead of sequential rule checking, Cilium uses hash maps for instant lookups. Crucially, instead of context-switching between user space and kernel space, eBPF programs run directly in the kernel. It's the difference between stopping at every intersection versus taking a grade-separated freeway at constant speed.

The Real Shift: Cloud Providers Are Standardizing on Cilium

This is what changes the game for multi-cloud architecture: for the first time, the networking data plane is becoming identical across clouds.

  • Azure: "Azure CNI Powered by Cilium" is now the recommended option for AKS
  • Google Cloud: "GKE Dataplane V2" is Cilium under the hood
  • AWS: Cilium is the de facto choice for performance-conscious EKS deployments

The road surface is the same whether you're running in Virginia, Dublin, or Singapore. This means:

  • Predictable latency: Sub-millisecond service mesh overhead regardless of cloud
  • Consistent observability: Hubble flow logs look the same everywhere
  • Portable NetworkPolicies: Your security rules work identically across environments
  • No more cloud-specific tuning: The kernel-level plumbing just works

The Traffic Cop: Why Speed Alone Isn't Enough

A frictionless highway is powerful, but speed without direction is just a fast way to crash. You need intelligent control at the application layer. You need someone at the exit ramp deciding which requests go where, enforcing speed limits, and blocking bad actors.

You need Traefik.

The Multi-Cloud Load Balancer Problem

Most teams hit multi-cloud and immediately face this choice:

  1. Use each cloud's native load balancer (AWS ALB, Azure App Gateway, GCP Load Balancer, etc.)
  2. Deploy and maintain your own Ingress Controller

Option 1 seems easier until you realize you're hiring a different traffic cop for every city ... and they don't speak the same language or follow the same rules:

AWS ALB:

annotations:
  alb.ingress.kubernetes.io/scheme: internet-facing
  alb.ingress.kubernetes.io/target-type: ip
  alb.ingress.kubernetes.io/healthcheck-path: /health

Azure App Gateway:

annotations:
  appgw.ingress.kubernetes.io/health-probe-path: /health
  appgw.ingress.kubernetes.io/request-timeout: "90"

GCP Load Balancer:

annotations:
  cloud.google.com/neg: '{"ingress": true}'
  cloud.google.com/backend-config: '{"default": "backend-config"}'

Same intention. Three different languages. Three different configuration systems. Three different failure modes to debug at 3 AM.

Traefik: Bring Your Own Traffic Cop

When you deploy Traefik as your Ingress Controller across all clouds, you establish universal laws:

One Configuration Language

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: payment-api
spec:
  routes:
  - match: Host(`api.example.com`) && PathPrefix(`/payments`)
    kind: Rule
    services:
    - name: payment-svc
      port: 8080
    middlewares:
    - name: rate-limit
    - name: auth-oidc

This YAML works identically on AWS, Azure, and GCP. Change it once, deploy everywhere.

Portable Intelligence

  • Rate-limiting rules that follow your app across clouds
  • OIDC/OAuth flows that don't require cloud-specific IAM translation when using a central Identity Provider (IdP)
  • Circuit breakers that understand your application's failure modes
  • A/B testing and canary deployments with consistent behavior

Developer Velocity
Your developers define routing via standard Kubernetes resources. They don't need to know whether they're deploying to EKS or AKS. The platform team maintains a single Traefik configuration, rather than three cloud-specific load balancer setups.

Why Not Cilium Ingress?

Cilium does offer a basic Ingress controller built on the eBPF data plane. However, ingress is not its primary focus, and it typically offers the bare minimum necessary for Layer 7 entry.

For complex, multi-cloud environments, Traefik is better suited as the Traffic Cop because it provides an application-centric control plane. Traefik delivers advanced Layer 7 features—like portable middleware, integrated OIDC/OAuth, A/B testing, and comprehensive circuit breakers—that are central to managing a complex application portfolio at scale.

The "Better Together" Synergy

The architecture gets elegant when you look at how these two layers interact.

Traefik operates at Layer 7 (HTTP/gRPC), making intelligent routing decisions based on headers, paths, and application-level logic. Cilium operates at Layer 3 and 4, handling the actual packet forwarding with kernel-level efficiency.

The handoff is seamless:

  1. External request hits your LoadBalancer Service (backed by a simple cloud LB)
  2. Traefik receives the request, processes middleware, terminates TLS, and selects a backend
  3. Traefik hands off to a Kubernetes Service (just an IP:port)
  4. Cilium bypasses iptables entirely, using eBPF to route directly to the pod
  5. Response follows the same optimized path back

The result: You get Layer 7 intelligence without Layer 3/4 bottlenecks. No tradeoffs.

Full-Stack Observability: The "X-Ray" Effect

This multi-layer observability is the key to platform team sanity.

If you've ever debugged a 502 Bad Gateway error, you know the frustration:

  • Traefik logs: "Request sent to backend, connection refused".
  • Application logs: "I never received a request".
  • Network monitoring: "I see packets moving, but no idea what they contain".

Three different monitoring systems, three different stories, zero root cause. This is the observability air gap that kills productivity.

The breakthrough: Distributed tracing stitched across network layers. Traefik and Cilium solve multi-layer observability together through a deceptively simple mechanism:

  1. Traefik mints (or reuses) the trace ID: When a request hits your edge, Traefik generates a unique TraceParent header (OpenTelemetry W3C standard), or reuses one if it already exists. Think of this as stamping a license plate on the car before it enters the highway.
  2. Cilium carries the context: As the request flows through the network, Cilium's Hubble observability engine reads HTTP headers at the kernel level, without slowing the packet down. It sees the same trace ID and logs the network path, latency, and any TCP-level failures.
  3. One timeline, complete picture: In your observability backend (Grafana Tempo, Jaeger, Datadog), you search for that trace ID and get:
    • Edge ingress at Traefik (Layer 7)
    • Network path through Cilium with exact latency and packet drops (Layer 3/4)
    • Application processing time (Layer 7)

Real-World Example
A developer reports "users in Tokyo are seeing 2-second response times". You pull up the trace ID:

  • Traefik reports: Request took 2100ms total, 2000ms waiting for backend.
  • Hubble reports: TCP connection from Tokyo pod exists to both Tokyo database AND us-east database.
  • Application reports: Query took 50ms locally, 1950ms on cross-region query.
  • Root cause: Misconfigured service selector routing 10% of Tokyo traffic across continents.

Same debugging workflow whether you're troubleshooting EKS, AKS, or GKE.

The Technical Detail (Read This Before Deploying)
By default, Cilium prioritizes maximum speed, so it acts like a courier who reads the address on the box (IP/Port) without opening it. This makes it incredibly fast, but it means it can't see the specific "Trace ID" stamped inside the package headers.

To connect the dots between Traefik and the network, you must explicitly enable "Deep Packet Inspection" for your specific services. This is done using a CiliumNetworkPolicy.

Think of this as flipping a switch that says, "For this specific application, it's okay to peek inside the envelope to read the tracking number." It is a simple, one-time configuration per namespace, but without it, your observability layers won't communicate.

The Honest Complexity Tradeoff

Let's be clear: This isn't the right stack for everyone.

You probably don't need this if:

  • You're running on a single cloud with no plans to expand.
  • You have 10 microservices and 3 engineers.
  • Your cloud provider's defaults work fine for your scale.

This stack pays off when:

  • You're running production workloads across 2+ clouds.
  • You're managing 50+ microservices with complex routing needs.
  • You need consistent security policies and observability across environments.
  • Your platform team is tired of maintaining cloud-specific configurations.
  • Developer velocity matters more than "using cloud-native defaults".

The upfront complexity is real. You're deploying and managing Cilium and Traefik instead of clicking "enable" in a cloud console. But the payoff is a platform that your team masters once and runs everywhere.

The Bottom Line: Platform Team Sanity as a Service

Multi-cloud isn't going away. Whether you're pursuing vendor negotiation leverage, data sovereignty requirements, or genuinely distributed architecture, you need networking that works the same everywhere.

The old approach (maintaining separate networking configurations per cloud) doesn't scale. Your platform team becomes translators, converting concepts between AWS-speak, Azure-speak, and GCP-speak. Your developers slow down, waiting for platform teams to implement the same feature three different ways.

The Cilium + Traefik stack inverts this:

  • Cilium: Universal, high-performance data plane (the cloud providers are standardizing on it anyway)
  • Traefik: Portable, developer-friendly control plane (you own it, not the cloud vendor)

You get predictable performance, consistent debugging, and configurations that travel with your applications. Your platform team maintains one networking stack, not three. Your developers deploy with confidence, knowing the rules are the same everywhere.

The roads are open. The traffic is moving. And for the first time, the highway and the traffic cop speak the same language. No matter which cloud you're driving through.

Ready to build a truly portable Kubernetes platform?
Start with Cilium for your CNI and Traefik for your Ingress Controller. You'll thank yourself the next time production spikes.

About the Author

Product Manager with 14+ years of tech industry experience, excelling at connecting business needs with technology, driving innovation and strategy. CKA, CPM, CSM, AWS CP, homelabber, former CTO.

Latest from Traefik Labs

AI Sovereignty: Why Control Is Your Ultimate Operating Leverage
Blog

AI Sovereignty: Why Control Is Your Ultimate Operating Leverage

Read more
The Hub-and-Spoke Ingress Pattern: Unifying EKS, ECS, and EC2 at Scale
Blog

The Hub-and-Spoke Ingress Pattern: Unifying EKS, ECS, and EC2 at Scale

Read more
The Sovereign AI Infrastructure Imperative: Why Control Matters More Than Convenience
White Papers

The Sovereign AI Infrastructure Imperative: Why Control Matters More Than Convenience

Read white paper