Service-Mesh vs Ingress/API GatewayΒΆ
TasksΒΆ
They handle different traffic:
- Service Mesh = Pod-to-Pod (EAST-WEST) inside cluster
- Ingress = External-to-Pod (NORTH-SOUTH) into cluster
Visual ExplanationΒΆ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NORTH-SOUTH vs EAST-WEST TRAFFIC
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
External Users
(Internet/Corp Network)
β
β NORTH-SOUTH
β (Ingress handles this)
β
ββββββββββββββΌβββββββββββββ
β KUBERNETES CLUSTER β
β β
β ββββββββββββββββ β
β β Ingress β β
β β Controller β β
β ββββββββ¬ββββββββ β
β β β
β ββββββββββΌβββββββββ β
β β Frontend Pod β β
β ββββββββββ¬βββββββββ β
β β β
β β EAST-WEST β
β β (Service Mesh handles this)
β β β
β ββββββββββΌβββββββββ β
β β API Pod ββββββΌββΊ Database Pod
β ββββββββββ¬βββββββββ β
β β β
β ββββββββββΌβββββββββ β
β β Auth Pod ββββββΌββΊ Cache Pod
β βββββββββββββββββββ β
β β
βββββββββββββββββββββββββββ
What Each DoesΒΆ
Ingress/API Gateway (NORTH-SOUTH)ΒΆ
Purpose: Get traffic INTO the cluster
Handles:
β
External β Cluster routing
β
TLS termination (HTTPS)
β
Hostname routing (api.mci.local)
β
Path routing (/users, /orders)
β
External load balancing
β
Public IP exposure
Example Flow:
User Browser (Internet)
β
http://api.mci.local/users
β
LoadBalancer IP (192.168.228.200)
β
Ingress Controller
β
Routes to "api-service"
β
API Pod receives request
Service Mesh (EAST-WEST)ΒΆ
Purpose: Manage traffic BETWEEN pods inside cluster
Handles:
β
Pod β Pod communication
β
mTLS (encrypted pod-to-pod)
β
Service-to-service policies
β
Retries, timeouts, circuit breakers
β
Traffic splitting (A/B testing)
β
Observability between services
β
Service discovery
Example Flow:
API Pod wants to call Auth Service
β
Service Mesh intercepts
β
Checks: Is API pod allowed to call Auth?
β
Encrypts with mTLS
β
Load balances across Auth pods
β
Tracks latency, errors
β
Auth Pod receives request
Complete ArchitectureΒΆ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
BOTH INGRESS AND SERVICE MESH TOGETHER
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
External User
β
β 1. NORTH-SOUTH (Ingress)
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Ingress Controller (Cilium Envoy) β
β β’ TLS termination β
β β’ Hostname routing β
β β’ External authentication β
ββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
Frontend Pod
β
β 2. EAST-WEST (Service Mesh)
β β’ mTLS encryption
β β’ L7 policies
β β’ Retry logic
β β’ Circuit breaker
βΌ
API Pod βββββββΊ Auth Pod
β β
β β 3. EAST-WEST
β βΌ
β Database Pod
β
β 4. EAST-WEST
βΌ
Payment Pod ββββΊ Kafka Pod
β
β 5. EAST-WEST
βΌ
Notification Pod
Why You Need BothΒΆ
Scenario Without Service Mesh (Only Ingress)ΒΆ
β
External traffic reaches cluster
β No encryption between pods
β No pod-to-pod policies
β No retry logic between services
β No circuit breakers
β Limited observability of internal traffic
β No canary deployments
Scenario Without Ingress (Only Service Mesh)ΒΆ
β External traffic can't reach cluster
β No TLS termination for external clients
β No hostname-based routing from outside
β
Internal pod-to-pod works great
Cilium's Unique PositionΒΆ
Cilium does BOTH Ingress AND Service Mesh!
ββββββββββββββββββββββββββββββββββββββββββββββ
β CILIUM STACK β
β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β Ingress Controller (Cilium Envoy) β β
β β Handles: NORTH-SOUTH β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β Service Mesh (Cilium + Envoy) β β
β β Handles: EAST-WEST β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β Kube-proxy Replacement (eBPF) β β
β β Handles: Load balancing β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β Network Policies (eBPF + Envoy) β β
β β Handles: L3/L4/L7 security β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β Observability (Hubble) β β
β β Handles: All traffic visibility β β
β ββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββ
This is why Cilium is powerful - it's an all-in-one solution.
Feature ComparisonΒΆ
| Feature | Ingress Only | Service Mesh Only | Both (Cilium) |
|---|---|---|---|
| External access | β | β | β |
| TLS termination | β | β | β |
| Hostname routing | β | β | β |
| Pod-to-pod mTLS | β | β | β |
| Retries/timeouts | β | β | β |
| Circuit breakers | β | β | β |
| Traffic splitting | β | β | β |
| L7 observability | β οΈ (edge only) | β (internal) | β (everywhere) |
| Network policies | β οΈ (limited) | β | β |
Real-World ExampleΒΆ
E-commerce ApplicationΒΆ
User Request: https://shop.mci.local/checkout
β
β βββββββββββββββββββββββββββββββββββββββββββ
β β INGRESS NEEDED β
β β β’ Accept HTTPS from internet β
β β β’ Route /checkout to frontend β
β β β’ TLS termination β
β βββββββββββββββββββββββββββββββββββββββββββ
βΌ
Frontend Pod
β
β Makes API call: POST /api/payment
β
β βββββββββββββββββββββββββββββββββββββββββββ
β β SERVICE MESH NEEDED β
β β β’ Encrypt traffic (mTLS) β
β β β’ Retry if payment service down β
β β β’ Circuit breaker if failing β
β β β’ L7 policy: only POST allowed β
β βββββββββββββββββββββββββββββββββββββββββββ
βΌ
Payment Service Pod
β
β Calls: GET /api/inventory
β
β βββββββββββββββββββββββββββββββββββββββββββ
β β SERVICE MESH NEEDED β
β β β’ Check authorization β
β β β’ Track latency β
β β β’ Load balance across inventory pods β
β βββββββββββββββββββββββββββββββββββββββββββ
βΌ
Inventory Service Pod
You need both:
- Ingress to get the user's request into the cluster
- Service Mesh to manage the internal service calls
When You DON'T Need Service MeshΒΆ
Simple applications:
If you have:
- Only 1-3 services
- No pod-to-pod communication
- No need for mTLS
- No complex retry logic
- Simple architecture
Then skip Service Mesh, just use Ingress.
When You DON'T Need IngressΒΆ
Internal-only cluster:
Examples:
- Data processing cluster (Kafka, Spark)
- Batch job cluster
- ML training cluster
Then skip Ingress, just use Service Mesh.
Summary TableΒΆ
| Traffic Type | Component | Purpose | Do You Need It? |
|---|---|---|---|
| External β Cluster | Ingress | Get traffic in | β YES (always) |
| Pod β Pod | Service Mesh | Manage internal traffic | β οΈ Only if microservices |
| External APIs | API Gateway | Advanced API features | β Not for internal tools |
Bottom LineΒΆ
Service Mesh β Replacement for Ingress
They're complementary:
- Ingress = Front door to your cluster
- Service Mesh = Internal traffic management
For MCI:
- β Use Cilium Ingress (you need external access)
- β οΈ Service Mesh features later (if you build microservices)
- β Skip API Gateway (internal tools don't need it)