Problems with Traditional Deployments
Deep dive into the limitations of physical server, virtual machine, and early deployment strategies that drove the need for container-based orchestration.
03 — Problems with Traditional Deployments
“Those who cannot remember the past are condemned to repeat it.” Understanding how deployments used to work — and why they failed — is the foundation for appreciating modern cloud-native approaches.
📌 Table of Contents
- Three Eras of Deployment
- Era 1 — Physical Servers
- Era 2 — Virtual Machines
- Era 3 — Containers
- The Deployment Workflow Problem
- The “It Works on My Machine” Problem
- Resource Waste & Cost Problems
- Scaling Problems
- Summary Comparison
Three Eras of Deployment
Era 1 — Physical Servers
In the early days, each application was deployed directly onto a dedicated physical (bare-metal) server.
Problems with Physical Server Deployments
| Problem | Description |
|---|---|
| Resource waste | Each server runs one app at ~10–20% utilisation |
| High cost | Separate hardware, power, cooling for each app |
| Slow provisioning | Weeks to order, rack, and configure new servers |
| No isolation | One app crash or bug can affect the whole OS |
| Scaling is painful | Scaling means buying more physical hardware |
| Dependency conflicts | App A needs Python 2, App B needs Python 3 — impossible on same OS |
| Hardware failures | Single point of failure with no easy fallback |
Era 2 — Virtual Machines
VMs solved the resource waste problem by running multiple virtual machines on a single physical server using a hypervisor.
What VMs Solved ✅
- Multiple apps on one physical server → better utilisation
- Isolation between apps (separate Guest OS per VM)
- Snapshots for backup and recovery
- Faster provisioning vs bare metal
Problems That VMs Introduced ❌
| Problem | Description |
|---|---|
| Heavy OS overhead | Each VM carries a full OS (1–4 GB RAM wasted per VM) |
| Slow boot time | VMs take 1–3 minutes to start |
| Image bloat | VM images are GBs in size; slow to transfer/deploy |
| Environment drift | VMs configured differently in dev vs staging vs prod |
| Still needs manual ops | Someone must monitor, restart, and scale VMs |
| Slow CI/CD | Spinning up test VMs for each build takes too long |
Era 3 — Containers
Containers share the host OS kernel, so they have no Guest OS overhead. They are lightweight, start in milliseconds, and are completely portable.
Containers vs VMs — Side by Side
| Feature | Virtual Machine | Container |
|---|---|---|
| Size | GBs (full OS included) | MBs (just app + libs) |
| Boot time | 1–3 minutes | Milliseconds |
| OS overhead | Full Guest OS per VM | Shared Host OS kernel |
| Isolation | Strong (hardware-level) | Good (process-level) |
| Portability | Limited | Excellent |
| Density | 10s of VMs per host | 100s of containers per host |
The Deployment Workflow Problem
Even with containers, the deployment pipeline in traditional setups was fragile and manual.
Issues in Traditional Deployment Pipelines
- Manual SSH deployments — error-prone, not repeatable
- Snowflake servers — each server configured slightly differently over time
- No rollback strategy — reverting a bad deploy requires manual steps
- Config stored on server — if the server dies, config is lost
- Works on my machine — code works locally, fails on the server
The “It Works on My Machine” Problem
This is arguably the most famous problem in software deployment history.
(macOS, Node 18) participant OPS as 🔧 Ops Team
(Ubuntu, Node 14) participant PROD as 🏭 Production
(CentOS, Node 12) DEV->>OPS: "The app is ready!\nWorks perfectly on my Mac ✅" OPS->>PROD: Deploy to staging PROD-->>OPS: ❌ App crashes on startup OPS->>DEV: "It's broken in staging" DEV->>DEV: "But it works on my machine 🤷" Note over DEV,PROD: Root cause: Different Node.js versions,
OS libraries, and env variables Note over DEV,PROD: Containers SOLVE this by packaging
the exact environment with the app
Resource Waste & Cost Problems
📊 Traditional (bar): Average 15% CPU utilisation — 85% of compute is wasted. 📈 Containers + K8s (line): 75–85% utilisation — resources are efficiently shared.
Scaling Problems
Traditional Scaling (Manual & Slow)
Kubernetes Scaling (Automatic & Instant)
Summary Comparison
🔗 Further Reading
- The Twelve-Factor App — methodology for modern deployments
- CNCF Whitepaper: Cloud Native
- Google’s Borg Paper — what inspired Kubernetes
← Previous: 02 - Why Kubernetes? Next → 04 - Monolithic vs Microservices