Compute
Load Balancing Patterns: AWS vs K8s vs Spring Cloud
So sánh AWS vs K8s vs Spring Cloud
Tổng quan
So sánh các giải pháp Load Balancing và Auto Scaling ở các layer khác nhau:
Server-side vs Client-side Load Balancing
Server-side Load Balancing
Traffic đi qua một LB server trung gian:
| Môi trường | Giải pháp | Mô tả |
|---|---|---|
| AWS | ELB (ALB/NLB/GWLB) | Managed service, tính phí |
| K8s | Service, Ingress | Built-in, miễn phí trong cluster |
| Spring | ❌ Không có | Spring không cung cấp server LB |
Client-side Load Balancing
LB logic nằm trong application code:
| Môi trường | Giải pháp | Mô tả |
|---|---|---|
| AWS | ❌ Không có | AWS không cung cấp client-side LB |
| K8s | ❌ Không có native | Dùng Envoy sidecar, gRPC client |
| Spring | Spring Cloud LoadBalancer | Thư viện trong code |
Ví dụ: Spring Cloud LoadBalancer + Eureka
Câu hỏi: Tại sao client-side LB không cần LB server riêng?
Trả lời: Vì LB logic là thư viện trong code, không phải server. Nhưng vẫn cần Service Registry (như Eureka) để biết danh sách targets.
Flow hoạt động:
So sánh Eureka vs ELB:
| Eureka (Service Registry) | ELB (Load Balancer) | |
|---|---|---|
| Vai trò | Lưu danh sách instances | Route traffic |
| Traffic đi qua | ❌ Không | ✅ Có |
| Single point of failure | Không (client có cache) | Có |
| Chết thì sao | Client dùng cache, vẫn gọi được | Mất kết nối hoàn toàn |
Eureka chết thì sao?
Tóm lại:
| Component | Vai trò | Là server riêng? |
|---|---|---|
| Eureka | Lưu danh sách IP | Có (nhưng không route traffic) |
| Spring Cloud LB | Chọn IP để gọi | Không (là thư viện trong code) |
| ELB | Route traffic | Có |
So sánh
| Tiêu chí | Server-side | Client-side |
|---|---|---|
| LB ở đâu | Server riêng biệt | Trong app code |
| Single point of failure | Có | Không |
| Chi phí | Tốn tiền (ELB, Nginx) | Miễn phí (là code) |
| Latency | Cao hơn (thêm 1 hop) | Thấp hơn (gọi thẳng) |
| Phù hợp cho | External traffic (FE→BE) | Internal traffic (BE→BE) |
| Client cần biết targets | Không | Có (từ Service Discovery) |
Khi nào dùng loại nào?
Traffic FE → BE
Traffic BE → BE
Spring Cloud LoadBalancer + Eureka
Spring Cloud LB cần Service Registry (Eureka) để biết danh sách instances:
Eureka vs ELB
| Eureka (Service Registry) | ELB (Load Balancer) | |
|---|---|---|
| Vai trò | Lưu danh sách instances | Route traffic |
| Traffic đi qua | ❌ Không | ✅ Có |
| Chết thì sao | Client dùng cache, vẫn gọi được | Mất kết nối hoàn toàn |
| Loại | Registry server | Proxy server |
Chi tiết theo môi trường
AWS
Kubernetes
Spring Cloud
So sánh Load Balancing
| Tiêu chí | AWS ELB | K8s Service/Ingress | Spring Cloud LB |
|---|---|---|---|
| Layer | Infrastructure | Container | Application (code) |
| Loại | Server-side | Server-side | Client-side |
| Quản lý bởi | AWS | K8s cluster | Application code |
| Target | EC2, IP, Lambda | Pods | Service instances |
| Cần infra riêng | Có (AWS resource) | Có (K8s cluster) | Không |
| Chi phí | Tính phí | Free trong cluster | Free (là code) |
So sánh Auto Scaling
| Tiêu chí | AWS ASG | K8s HPA/VPA | Spring (không có) |
|---|---|---|---|
| Scale gì | EC2 instances | Pods | ❌ Không scale |
| Dựa trên | CloudWatch metrics | Metrics Server | - |
| Min/Max | Có | Có | - |
| Predictive | Có | Không (cần KEDA) | - |
Các kiến trúc Microservices phổ biến
Kiến trúc 1: AWS Only (không K8s)
Cost estimate (3 services × 3 instances):
| Component | Cost/tháng |
|---|---|
| ALB | ~$20 + data |
| ECS Fargate (9 tasks × 0.5vCPU) | ~$150 |
| Cloud Map | ~$1 |
| Tổng | ~$170+ |
Kiến trúc 2: K8s + K8s Service (không Spring Cloud LB)
Cost estimate:
| Component | Cost/tháng |
|---|---|
| ALB (auto-created) | ~$20 + data |
| EKS Control Plane | ~$75 |
| EC2 Nodes (3 × t3.medium) | ~$90 |
| CoreDNS, K8s Service | $0 (free) |
| Tổng | ~$185+ |
Kiến trúc 3: K8s + Istio Service Mesh
Cost estimate:
| Component | Cost/tháng |
|---|---|
| NLB (Istio Ingress) | ~$20 + data |
| EKS Control Plane | ~$75 |
| EC2 Nodes (3 × t3.large - cần RAM cho Envoy) | ~$180 |
| Istio | $0 (open source) |
| Tổng | ~$275+ |
Kiến trúc 4: Serverless (Lambda + API Gateway)
Cost estimate (1M requests/tháng):
| Component | Cost/tháng |
|---|---|
| API Gateway | ~$3.50 |
| Lambda (1M invocations) | ~$0.20 |
| DynamoDB | ~$5 |
| Tổng | ~$10 |
Kiến trúc 5: AWS + K8s + Spring (Full Stack)
Bảng so sánh tổng hợp
| Tiêu chí | AWS Only | K8s + Service | K8s + Istio | Serverless |
|---|---|---|---|---|
| Cost/tháng | ~$170+ | ~$185+ | ~$275+ | ~$10+ |
| Complexity | Trung bình | Trung bình | Cao | Thấp |
| Auto-scale | ASG | HPA | HPA | Tự động |
| Service-to-service LB | Spring Cloud | K8s Service | Envoy (client-side) | SDK call |
| mTLS | Tự config | Tự config | Built-in | Managed |
| Observability | CloudWatch | Prometheus | Kiali, Jaeger | X-Ray |
| Vendor lock-in | Cao | Thấp | Thấp | Cao |
| Cold start | Không | Không | Không | Có |
| Phù hợp | Đội quen AWS | Đội quen K8s | Cần advanced features | Traffic không đều |
So sánh Cost chi tiết
Decision Tree: Chọn kiến trúc nào?
Tại sao cần AWS ALB trước K8s?
K8s có thể tự tạo LB, nhưng có trường hợp cần ALB riêng:
Cách 1: K8s tự tạo LB (đơn giản)
Cách 2: ALB riêng phía trước (enterprise)
Lý do chọn Cách 2:
| Lý do | Giải thích |
|---|---|
| AWS WAF | Web Application Firewall - chặn SQL injection, XSS |
| AWS Shield | DDoS protection |
| ACM | Quản lý SSL certificates dễ hơn |
| Multi-cluster | 1 ALB cho nhiều K8s clusters |
| Hybrid | Traffic đến cả K8s + EC2 + Lambda |
| Compliance | Logging, audit theo yêu cầu enterprise |