Part 5: From One Server to Many – The Need for Orchestration
Jenkins
Source: Dev.to | Dec 22, 2025 (UTC)
Series: From “Just Put It on a Server” to Production DevOps
Reading time: 11 minutes
Level: Intermediate
The Production Reality Check
Your SSPP platform is live! Docker Compose works beautifully on your local machine and even on your single production server.
Then Black Friday hits. Traffic spikes 50x.
What do you do?
You can’t just run docker-compose up --scale worker=50 because:
One server doesn’t have 50x the resources
The database would be overwhelmed
You’d need multiple servers
So you start manually:
# Rent 5 more Linode servers # SSH into each one # Install Docker on each # Copy docker-compose.yml to each # Modify each to avoid port conflicts # Start containers manually # Configure a load balancer somehow # Hope nothing breaks
Enter fullscreen mode
Exit fullscreen mode
Time to scale: 3-4 hours (if you’re fast and lucky)
By the time you’re done, Black Friday is over.
Failure Scenario 1: Container Crashes
Let’s simulate a production crash:
# Start your stack docker-compose up -d # Kill the API container docker kill sspp-api
Enter fullscreen mode
Exit fullscreen mode
What happens?
The API is dead. Docker Compose doesn’t restart it automatically.
Check status:
docker-compose ps NAME STATE sspp-api Exited (137) sspp-worker Up sspp-postgres Up sspp-redis Up
Enter fullscreen mode
Exit fullscreen mode
Users see 500 errors. Your on-call phone explodes. 📱💥
Load balancing: Distribute traffic across instances
Service discovery: Containers find each other dynamically
Rolling updates: Deploy without downtime
Rollback capability: Revert bad deploys instantly
Health checks: Don’t route traffic to sick containers
Resource limits: Prevent one container from starving others
Secrets management: No passwords in plain text
Multi-server orchestration: Run across many machines
Docker Compose gives you none of these in production.
The Orchestration Gap
Docker Compose is great for development:
Single server
Manual starts/stops
Simple networking
Quick iteration
But terrible for production:
No multi-server support
No automatic recovery
No scaling logic
No deployment strategies
No resource management
No production-grade networking
You’ve hit the orchestration wall.
The Emotional Journey
Stage 1: Denial
“Docker Compose works fine. I’ll just run it on a big server.”
Stage 2: Anger
“Why is this so hard?! I just want to run containers!”
Stage 3: Bargaining
“Maybe I can script this with bash and cron jobs?”
Stage 4: Depression
“I’m spending 80% of my time managing infrastructure, 20% building features.”
Stage 5: Acceptance
“I need an orchestrator. I need Kubernetes.”
Why Kubernetes Exists
Kubernetes solves all the problems we just experienced:
Problem
Docker Compose
Kubernetes
Auto-restart
❌ Manual
✅ Automatic
Multi-server
❌ Single server
✅ Cluster of servers
Load balancing
❌ Manual HAProxy
✅ Built-in Service
Scaling
❌ Manual --scale
✅ Auto-scaling (HPA)
Rolling updates
❌ Restart (downtime)
✅ Zero-downtime
Rollback
❌ Manual
✅ One command
Health checks
⚠️ Basic
✅ Advanced (liveness, readiness)
Secrets
❌ Plain text
✅ Encrypted
Resource limits
⚠️ Basic
✅ Fine-grained
Service discovery
⚠️ DNS-based
✅ Dynamic
Kubernetes is Docker Compose for production, multiplied by 1000.
But Why Not Just… [Alternative]?
“Why not Docker Swarm?”
Docker Swarm is simpler than Kubernetes, but:
Smaller ecosystem
Fewer features (no HPA, limited RBAC)
Less adoption (most tools target K8s)
Docker Inc. de-prioritized it
Use case: Small teams, simple apps.
“Why not managed services (AWS ECS, Cloud Run)?”
Managed services work great, but:
Vendor lock-in (can’t easily move)
Limited customization
Higher costs at scale
Not portable (can’t run locally)
Use case: Fully bought into one cloud provider.
“Why not Nomad?”
HashiCorp Nomad is excellent, but:
Smaller community
Fewer integrations
Less tooling
Harder to hire for
Use case: Already using HashiCorp stack (Terraform, Vault, Consul).
“Why Kubernetes?”
Industry standard (most jobs require it)
Huge ecosystem (tools for everything)
Cloud-agnostic (AWS, GCP, Azure, Linode)
Local development (k3s, Minikube, Kind)
Portable (same manifests everywhere)
Kubernetes won the orchestration war.
What You’ll Learn in Part 6
In the next article, we’ll deploy SSPP to Kubernetes on Linode.
But we won’t just throw kubectl commands at you.
We’ll explain:
What Pods, Deployments, and Services actually are
Why Kubernetes seems complicated (and how to think about it)
How to run Kubernetes locally (k3s) before going to production
Real deployment strategies (rolling updates, blue/green)
How our SSPP manifests work
No magic. No copy-paste. Just understanding.
The Mindset Shift
Before Kubernetes, you think:
“I have a server. I’ll put containers on it.”
After Kubernetes, you think:
“I have a cluster. I’ll declare what I want running. Kubernetes makes it happen.”
It’s declarative infrastructure:
# You say what you want apiVersion: apps/v1 kind: Deployment spec: replicas: 5 # I want 5 API instances # Kubernetes makes it happen # - Schedules 5 pods # - Distributes across servers # - Monitors them # - Restarts if they die # - Scales up/down dynamically
Enter fullscreen mode
Exit fullscreen mode
You describe the desired state. Kubernetes maintains it.
Try It Yourself (Before Part 6)
Challenge: Break Docker Compose in creative ways:
Kill containers—see if they restart (they won’t)
Overload the API—see if it auto-scales (it won’t)
Deploy a new version—see if there’s downtime (there will be)
Simulate high CPU—see if K8s would help (it would)
Write down your frustrations. They’ll make Part 6 more satisfying.
Discussion
What production incident convinced you that you needed orchestration?
Залишити відповідь