Skip to main content
Back to Blogs
AWS
Kubernetes
Serverless
Cloud Architecture
DevOps
Performance

AWS Serverless vs. Kubernetes: A Cost & Performance Benchmark (2026)

Amit Divekar
5 min read · 1,202 words

The Question Every Cloud Architect Faces

Should you go serverless or run Kubernetes? This isn't a theoretical exercise — it's a decision that determines your infrastructure costs, operational complexity, and engineering velocity for years.

After architecting systems on both sides, I built this benchmark to give you real numbers, not opinions. Every metric here comes from production-equivalent workloads tested on AWS in the ap-south-1 (Mumbai) region.

The Contenders

Serverless Stack

  • Compute: AWS Lambda (Node.js 20, 512MB-1024MB memory)
  • API Layer: API Gateway (REST API)
  • Database: DynamoDB (on-demand capacity)
  • Orchestration: Step Functions
  • Monitoring: CloudWatch + X-Ray

Kubernetes Stack

  • Compute: Amazon EKS (3x t3.medium nodes)
  • API Layer: NGINX Ingress Controller
  • Database: PostgreSQL on RDS (db.t3.medium)
  • Orchestration: Argo Workflows
  • Monitoring: Prometheus + Grafana

Benchmark Methodology

I tested three workload profiles that represent common real-world applications:

  1. API Gateway Pattern — REST API handling CRUD operations (read-heavy)
  2. Data Processing Pipeline — Batch processing with fan-out/fan-in
  3. Real-Time Application — WebSocket connections with sustained throughput

Each test ran for 72 hours with realistic traffic patterns (peak/off-peak cycles).

Results: Cost Comparison

Monthly Cost at Different Scale Points

MetricServerlessKubernetes
10K requests/day$3.50$145
100K requests/day$28$145
1M requests/day$185$290
10M requests/day$1,450$580
50M requests/day$7,200$1,740

The Crossover Point

At approximately 2-3 million requests per day, Kubernetes becomes more cost-effective than Serverless.

Below this threshold, you're paying for idle Kubernetes nodes. Above it, Lambda's per-invocation pricing adds up fast.

Cost ($)
│
│     Serverless ─────────────────/
│                              /
│                            /
│     ──────────────────────/────── Kubernetes
│                         /
│                       /
│                     /
│     ──────────── /
│                /
│              /
│            /
│     ─────/
│        /
│       /
│      /
│─────/──────────────────────────────────
└────────────────────────────────────── Requests/day
     100K        1M      3M    10M    50M
                    ↑
              Crossover Point

Results: Latency Benchmarks

Cold Start Analysis

MetricLambda (512MB)Lambda (1024MB)Kubernetes Pod
Cold start (p50)320ms180ms0ms*
Cold start (p99)890ms520ms0ms*
Warm start (p50)8ms5ms3ms
Warm start (p99)45ms28ms15ms

*Kubernetes pods are already running, so there's no equivalent to a cold start. However, pod scaling takes 30-90 seconds.

API Response Times (p95)

Endpoint TypeServerlessKubernetes
Simple GET35ms12ms
GET with DB query65ms28ms
POST with validation48ms18ms
Complex aggregation180ms95ms

Takeaway: Kubernetes wins on raw latency. Serverless adds ~20-40ms of overhead from API Gateway and Lambda initialization.

Results: Data Processing Pipeline

Processing 1 million records through a 5-stage ETL pipeline:

MetricStep Functions + LambdaArgo Workflows + K8s
Total time12 minutes8 minutes
Cost per run$0.85$0.12*
Max parallelism1,000 concurrentLimited by cluster
Error recoveryBuilt-in retryManual configuration
ObservabilityX-Ray tracesCustom Prometheus

*K8s cost amortized across cluster utilization.

Takeaway: Serverless excels at burst processing and built-in error handling. Kubernetes is cheaper at sustained high throughput.

Decision Framework

Choose Serverless When:

  • Traffic is unpredictable — You get spiky, event-driven workloads
  • Team is small — You don't have dedicated DevOps/SRE capacity
  • Time-to-market matters — Faster to ship, fewer moving parts
  • Cost efficiency below 3M req/day — Pay-per-use model wins at lower scale
  • Event-driven architecture — Triggers from S3, SQS, DynamoDB Streams
  • Prototype/MVP stage — Validate ideas without infrastructure investment

Choose Kubernetes When:

  • Traffic is sustained and predictable — Consistent baseline load
  • Latency is critical — Sub-20ms response time requirements
  • Multi-cloud/portability matters — Not locked to AWS
  • Complex microservices — Service mesh, circuit breakers, advanced networking
  • Cost efficiency above 3M req/day — Fixed infrastructure becomes cheaper
  • WebSocket/long-running connections — Lambda has a 15-minute timeout
  • GPU workloads — ML inference, video processing

The Hybrid Approach (What I Recommend)

For most production systems, the answer isn't either/or:

┌─────────────────────────────────────────┐
│              API Gateway                 │
│         (CloudFront + WAF)              │
├────────────────┬────────────────────────┤
│                │                        │
│  Serverless    │     Kubernetes         │
│  ┌──────────┐  │  ┌────────────────┐   │
│  │ Lambda   │  │  │ Core API       │   │
│  │ Functions │  │  │ (Express/Nest) │   │
│  └──────────┘  │  └────────────────┘   │
│  - Auth hooks  │  - Main API           │
│  - Webhooks    │  - WebSockets         │
│  - Image proc. │  - ML inference       │
│  - Cron jobs   │  - Background workers │
│                │                        │
├────────────────┴────────────────────────┤
│           Shared Data Layer             │
│    (DynamoDB + RDS + ElastiCache)       │
└─────────────────────────────────────────┘

Use Kubernetes for your core API and long-running services where latency and throughput matter. Use Lambda for event-driven tasks, webhooks, cron jobs, and bursty workloads.

Infrastructure as Code

Serverless (AWS CDK)

typescript
import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as apigateway from 'aws-cdk-lib/aws-apigateway'; export class ServerlessStack extends cdk.Stack { constructor(scope: cdk.App, id: string) { super(scope, id); const fn = new lambda.Function(this, 'ApiHandler', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'index.handler', code: lambda.Code.fromAsset('lambda'), memorySize: 1024, timeout: cdk.Duration.seconds(30), environment: { NODE_ENV: 'production', }, }); new apigateway.LambdaRestApi(this, 'Api', { handler: fn, proxy: true, }); } }

Kubernetes (Helm Chart)

yaml
# values.yaml replicaCount: 3 image: repository: your-ecr-repo/api tag: latest resources: requests: cpu: 250m memory: 256Mi limits: cpu: 500m memory: 512Mi autoscaling: enabled: true minReplicas: 3 maxReplicas: 20 targetCPUUtilizationPercentage: 70 ingress: enabled: true className: nginx hosts: - host: api.example.com paths: - path: / pathType: Prefix

Operational Complexity Score

CategoryServerlessKubernetes
Initial setup⭐ Easy⭐⭐⭐ Complex
Monitoring⭐⭐ Moderate⭐⭐⭐ Complex
Scaling⭐ Automatic⭐⭐ Needs HPA config
Debugging⭐⭐⭐ Difficult⭐⭐ Moderate
Security patches⭐ Managed⭐⭐⭐ Your responsibility
Cost prediction⭐⭐⭐ Variable⭐⭐ Predictable
Disaster recovery⭐ Built-in⭐⭐⭐ Manual setup

Key Takeaways

  1. There is no universal winner. The right choice depends on your workload, team, and scale.
  2. The crossover point is ~3M requests/day. Below that, serverless is cheaper. Above it, Kubernetes wins.
  3. Kubernetes has better raw performance but requires significant operational investment.
  4. Serverless has better DX for small teams and event-driven architectures.
  5. The hybrid approach gives you the best of both worlds and is what most production systems should target.

Don't let Twitter hot-takes drive your architecture decisions. Benchmark your specific workload, understand your cost constraints, and choose the tool that fits your engineering culture.


Written by Amit Divekar — Cloud Architect & Full-Stack Engineer. Building resilient cloud systems and high-performance web applications.