Answer-first: AWS EKS tối ưu cho các hệ thống microservices quy mô lớn đòi hỏi hệ sinh thái CNCF tiêu chuẩn (GitOps với ArgoCD, KEDA event-driven autoscaling, Dapr sidecar mesh, Karpenter node provisioning trong 45 giây) và tính linh hoạt multi-cloud, nhưng chịu chi phí control plane $0.10/giờ/cluster cùng phụ phí Extended Support $0.60/giờ. Ngược lại, AWS ECS tối ưu cho các đội ngũ tinh gọn, không tốn phí control plane ($0/tháng), triển khai production trong 60 phút và tích hợp mượt mà với toàn bộ hệ sinh thái dịch vụ AWS không ma sát vận hành.
🇬🇧 Read the English version of this article on tanhdev.com
Trong bức tranh điều phối container trên Amazon Web Services, hai cái tên AWS ECS (Elastic Container Service) và AWS EKS (Elastic Kubernetes Service) luôn là đề tài tranh luận sôi nổi nhất ở mọi giai đoạn khởi đầu dự án. Những người ủng hộ ECS ca ngợi sự đơn giản, không phí quản lý và độ ổn định chuẩn AWS. Trong khi đó, các kỹ sư EKS khẳng định Kubernetes là tiêu chuẩn công nghiệp toàn cầu mà không doanh nghiệp lớn nào có thể bỏ qua.
Tôi từng trực tiếp thiết kế và vận hành cả hai nền tảng này trong môi trường production. Tại Vigo Retail, tôi đã phát triển hệ thống backend gồm các microservices viết bằng Go chạy trên cụm EKS tại region ap-southeast-1, phục vụ các đợt khuyến mãi cao điểm lên tới hàng triệu lượt requests/tháng. Tôi cũng từng quản lý các cụm ECS Fargate cho các dự án nội bộ và dịch vụ thanh toán phụ trợ. Bài viết này là sự đúc kết thực chiến, phân tích chi tiết từ kiến trúc, bảng giá ngầm, Terraform manifests đến khung ra quyết định dứt khoát.
1. TL;DR — Bảng Quyết Định Nhanh
| Tiêu Chí Đánh Giá | Chọn AWS ECS | Chọn AWS EKS |
|---|---|---|
| Phí Control Plane | $0 / tháng (Hoàn toàn miễn phí) | $73 / tháng ($0.10/giờ, $876/năm) |
| Phí Extended Support | Không có (AWS tự quản lý runtime) | $438 / tháng (áp dụng khi K8s quá 14 tháng) |
| Thời gian thiết lập lên Production | 30 – 60 phút (rất nhanh) | 4 – 8 giờ (đòi hỏi cấu hình nhiều add-ons) |
| Trình độ chuyên môn yêu cầu | Kỹ năng AWS cơ bản (IAM, ALB, VPC) | Chuyên sâu Kubernetes (RBAC, CRD, Networking) |
| GitOps Engine | Hạn chế (Dùng AWS CodeDeploy/GitHub Actions) | ArgoCD / FluxCD (Hỗ trợ first-class) |
| Tự Động Cấp Node (Autoscaler) | Auto Scaling Group (mất 3–5 phút) | Karpenter (Cấp phát node trong 45–60 giây) |
| Autoscaling theo sự kiện (Event-driven) | CloudWatch Alarms (chậm, chi phí cao) | KEDA (Scale-to-zero theo SQS, Kafka, Redis) |
| Giới hạn Sidecar / Task | Tối đa 10 containers / task | Không giới hạn số lượng containers trong Pod |
| Nguồn lực kỹ sư vận hành (FTE) | ~0.1 FTE | 0.5 – 2 FTE chuyên trách Platform |
| Khả năng di chuyển (Multi-cloud) | Bị khóa chặt vào AWS | Port YAML manifests sang GKE, AKS, On-premise |
2. So Sánh Kiến Trúc Lõi: Control Plane & Data Plane
flowchart TD
subgraph ECS_Arch ["Kiến Trúc AWS ECS"]
ECS_CP["ECS Control Plane\n(AWS Quản Lý - Miễn Phí $0)"]
ECS_TASK["Task Definition (JSON/Terraform)\nTối đa 10 containers/task"]
ECS_DP["Data Plane: Fargate hoặc EC2 Capacity Providers"]
ECS_ALB["Application Load Balancer"]
ECS_CP --> ECS_TASK --> ECS_DP
ECS_ALB --> ECS_DP
end
subgraph EKS_Arch ["Kiến Trúc AWS EKS"]
EKS_CP["EKS Managed Control Plane\n(API Server, etcd - $73/tháng)"]
EKS_ADDONS["Core Add-ons: VPC CNI, CoreDNS, Kube-Proxy"]
EKS_CNCF["Hệ Sinh Thái CNCF: ArgoCD, KEDA, Dapr, Karpenter"]
EKS_DP["Data Plane: EC2 Managed NodeGroups / Karpenter / Fargate"]
EKS_CP --> EKS_ADDONS & EKS_CNCF --> EKS_DP
end
2.1 Amazon ECS — Sự Tinh Gọn Của Hệ Sinh Thái AWS Thuần Túy
ECS hoạt động dựa trên 3 khái niệm nền tảng:
- Task Definition: Bản mô tả JSON quy định container image, giới hạn CPU/Memory, biến môi trường, IAM Task Role và chế độ mạng (
awsvpc). - Service: Quản lý số lượng bản sao mong muốn (desired count), tích hợp trực tiếp với ALB Target Groups và hỗ trợ rolling update.
- Cluster: Vùng biên logic kết nối tài nguyên compute (EC2 hoặc Fargate) nằm trong một VPC.
Ưu điểm tuyệt đối của ECS là tính gắn kết tự nhiên với IAM và CloudWatch. Bạn không cần cài đặt controller trung gian để gán quyền AWS cho container. Tuy nhiên, giới hạn cứng 10 container trên mỗi Task Definition là một rào cản lớn đối với các kiến trúc Service Mesh hoặc Dapr sidecar phức tạp.
2.2 Amazon EKS — Sức Mạnh Toàn Diện Của Chuẩn Kubernetes
EKS cung cấp cụm Kubernetes tiêu chuẩn tương thích 100% với kubectl, Helm charts và CRDs. AWS đảm bảo tính sẵn sàng cao (High Availability) cho cụm etcd và API Server trải rộng trên 3 Availability Zones (AZs).
Tất cả các công cụ công nghệ tiên tiến nhất của thế giới container đều vận hành trơn tru trên EKS: ArgoCD cho GitOps, KEDA cho autoscaling theo độ dài hàng đợi Kafka/SQS, OpenTelemetry Operator cho distributed tracing và Cilium eBPF cho bảo mật mạng tầng sâu.
3. Bài Toán Chi Phí Thực Tế: Bẫy Control Plane & Phụ Phí Ngầm
Nhiều người lầm tưởng rằng ECS rẻ hơn EKS rất nhiều. Sự thật là chi phí tính toán (Compute - EC2/Fargate) giữa hai bên là hoàn toàn giống nhau nếu sử dụng cùng loại instance tại cùng một region. Sự chênh lệch chi phí nằm ở các khoản phí vô hình:
3.1 Bẫy Phí Extended Support Của EKS
Từ tháng 4/2024, AWS áp dụng chính sách Extended Support cho EKS:
- Standard Support: 14 tháng đầu tiên kể từ khi phiên bản Kubernetes ra mắt: $0.10 / giờ ($73 / tháng).
- Extended Support: Từ tháng thứ 15 đến tháng thứ 26: Tăng vọt lên $0.60 / giờ ($438 / tháng / cluster).
Nếu doanh nghiệp của bạn vận hành 4 clusters (Dev, Staging, Prod Tokyo, Prod Osaka) và đội ngũ kỹ sư lười nâng cấp phiên bản K8s hàng năm, hóa đơn chỉ riêng tiền duy trì control plane sẽ tiêu tốn: $$4 \times $438 \times 12 = \mathbf{$21.024 / \text{năm}}$$
Trong khi đó, với AWS ECS, phí control plane luôn luôn bằng $0, bất kể bạn chạy bao nhiêu năm!
flowchart LR
subgraph EKS_Cost ["Chi Phí Control Plane EKS Theo Thời Gian"]
M0["Tháng 1 - 14: Standard ($73/tháng)"] -->|Hết hạn 14 tháng| M15["Tháng 15 - 26: Extended ($438/tháng - Tăng gấp 6 lần!)"]
end
3.2 Bảng Ước Tính Tổng Chi Phí Hạ Tầng Thực Tế (Hệ Thống 10 Services Tại Singapore)
| Khoản Mục Chi Phí | ECS Fargate (x86) | ECS Fargate Graviton (ARM64) | EKS EC2 + Karpenter Spot |
|---|---|---|---|
| Control Plane Fee | $0 | $0 | $73 / tháng |
| Compute (10 services x 1vCPU / 2GB) | ~$310 / tháng | ~$248 / tháng (Rẻ hơn 20%) | ~$115 / tháng (Nhờ Spot & Bin-packing) |
| Load Balancer (ALB) | $25 / tháng | $25 / tháng | $25 / tháng |
| NAT Gateway Egress (500GB) | $24 / tháng | $24 / tháng | $24 / tháng |
| CloudWatch / Container Insights | $18 / tháng | $18 / tháng | $35 / tháng (Do metric cardinality cao) |
| Chi phí nhân sự bảo trì (Ops FTE) | ~$500 / tháng (0.1 FTE) | ~$500 / tháng (0.1 FTE) | ~$3.000 / tháng (0.5 FTE) |
| TỔNG CỘNG HÀNG THÁNG | ~$877 / tháng | ~$815 / tháng | ~$3.272 / tháng |
4. Hiệu Năng & Tốc Độ Co Giãn (Autoscaling Velocity)
Khi đối mặt với lưu lượng tăng đột biến gấp 10 lần trong 2 phút (Flash Sale), tốc độ cấp phát node quyết định việc hệ thống sống hay chết:
gantt
title So Sánh Thời Gian Cấp Phát Compute Khi Traffic Tăng Đột Biến
dateFormat X
axisFormat %s s
section EKS Karpenter
Phát hiện Pod Pending :0, 5
Gọi trực tiếp EC2 Fleet API :5, 20
Node Boot & Join Cluster :20, 45
Pod Running & Ready :45, 55
section ECS Capacity Provider
CloudWatch Alarm Kích Hoạt :0, 60
ASG Kích Hoạt Launch Template :60, 120
EC2 Khởi Động & Cài ECS Agent :120, 240
Task Khởi Chạy Trên Node :240, 300
- Karpenter trên EKS: Đánh giá trực tiếp nhu cầu tài nguyên của các Pods đang ở trạng thái
Pending, bỏ qua cấu trúc Auto Scaling Group (ASG) truyền thống và gọi thẳng EC2 Fleet API. Node mới sẵn sàng tiếp nhận Pod trong vòng 45 – 60 giây. - ECS Capacity Provider: Phụ thuộc vào cơ chế CloudWatch Metric Alarms và ASG. Thời gian để một EC2 instance mới được khởi động, cài đặt ECS agent và nhận task thường mất từ 3 đến 5 phút. Trong khoảng thời gian này, hàng nghìn requests của khách hàng sẽ bị nghẽn trong hàng đợi hoặc trả lỗi HTTP 504 Gateway Timeout.
5. Terraform / OpenTofu Manifests Chuẩn Production
Để minh họa sự khác biệt trong việc quản lý cơ sở hạ tầng dưới dạng mã nguồn (IaC), dưới đây là cấu hình Terraform cho cả hai giải pháp:
5.1 Cấu Hình AWS ECS Fargate Service Với Network Mode awsvpc
resource "aws_ecs_cluster" "main" {
name = "production-ecs-cluster"
setting {
name = "containerInsights"
value = "enabled"
}
}
resource "aws_ecs_task_definition" "payment_service" {
family = "payment-service"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = "1024" # 1 vCPU
memory = "2048" # 2 GB
execution_role_arn = aws_iam_role.ecs_execution_role.arn
task_role_arn = aws_iam_role.payment_task_role.arn
runtime_platform {
operating_system_family = "LINUX"
cpu_architecture = "ARM64" # Tối ưu chi phí với Graviton
}
container_definitions = jsonencode([
{
name = "payment-api"
image = "123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/payment:v2.1.0"
essential = true
portMappings = [
{
containerPort = 8080
hostPort = 8080
protocol = "tcp"
}
]
logConfiguration = {
logDriver = "awslogs"
options = {
"awslogs-group" = "/ecs/payment-service"
"awslogs-region" = "ap-southeast-1"
"awslogs-stream-prefix" = "payment"
}
}
}
])
}
resource "aws_ecs_service" "payment_service" {
name = "payment-service"
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.payment_service.arn
desired_count = 4
launch_type = "FARGATE"
network_configuration {
subnets = ["subnet-0a1b2c3d4e", "subnet-0f1e2d3c4b"]
security_groups = [aws_security_group.ecs_tasks.id]
assign_public_ip = false
}
load_balancer {
target_group_arn = aws_lb_target_group.payment_tg.arn
container_name = "payment-api"
container_port = 8080
}
}
5.2 Cấu Hình Karpenter NodePool Trên AWS EKS Cho Graviton Spot
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: general-compute-spot
spec:
template:
spec:
requirements:
- key: kubernetes.io/arch
operator: In
values: ["arm64"] # Bắt buộc Graviton ARM64
- key: karpenter.sh/capacity-type
operator: In
values: ["spot", "on-demand"] # Ưu tiên Spot, fallback On-demand
- key: node.kubernetes.io/instance-type
operator: In
values: ["c7g.xlarge", "c7g.2xlarge", "m7g.xlarge", "m7g.2xlarge"]
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: default
expireAfter: 720h # Tự động thay thế node sau 30 ngày để cập nhật AMI
limits:
cpu: 1000
memory: 2000Gi
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 60s # Tự động gom gọn Pod và tắt Node dư thừa sau 60 giây
6. Trải Nghiệm Vận Hành Thực Chiến: Microservices Go Tại Vigo Retail
Tại Vigo Retail, chúng tôi xây dựng hệ sinh thái thương mại điện tử B2B phục vụ hàng chục nghìn tiệm tạp hóa trên khắp Việt Nam. Hệ thống backend gồm các dịch vụ viết bằng Go, chịu tải các đợt khuyến mãi cao điểm lên tới hàng triệu lượt requests/tháng.
Những bài học đắt giá khi lựa chọn EKS:
- Sức mạnh của Dapr Sidecar Injection:
Với hệ thống microservices phân tán, việc cấu hình thủ công Redis Pub/Sub, Kafka consumers và Secret management cho từng service là bất khả thi. Trên EKS, Dapr Operator tự động tiêm sidecar thông qua annotations
dapr.io/enabled: "true". Trên ECS, bạn buộc phải nhồi thủ công Dapr container vào từng Task Definition và rất nhanh chóng đụng trần giới hạn 10 containers của AWS. - KEDA Scale-To-Zero Cho Background Workers:
Nhiều dịch vụ Go chỉ phục vụ việc gửi thông báo Zalo ZNS hoặc đồng bộ kho hàng lúc nửa đêm. Với KEDA trên EKS, chúng tôi thiết lập
minReplicaCount: 0. Khi hàng đợi SQS rỗng, số Pod giảm về 0, Karpenter tự động tắt các worker node. Khi có lô tin nhắn tràn vào, KEDA lập tức kéo Pods dậy và Karpenter cấp node mới trong 45 giây, tiết kiệm hơn 65% chi phí hạ tầng ban đêm. - Cái giá phải trả cho EKS: Đội ngũ chúng tôi đã mất gần 2 tháng để tối ưu hóa mạng VPC CNI (Prefix Delegation để tránh cạn kiệt IP), cấu hình CoreDNS Auto-scaling và xây dựng bộ CI/CD đồng bộ ArgoCD. Đây là điều mà nếu chọn ECS Fargate, chúng tôi có thể đưa sản phẩm lên production ngay từ tuần thứ hai.
7. Khung Quyết Định Cuối Cùng: Chọn Gì Cho Dự Án Của Bạn?
flowchart TD
START["Khởi Tạo Hệ Thống Container Mới"] --> Q1{"Đội ngũ có sẵn kỹ năng K8s không?"}
Q1 -- "Không" --> Q2{"Có thời gian & ngân sách thuê Platform Engineer?"}
Q2 -- "Không" --> ECS_FARGATE["Lựa chọn: AWS ECS Fargate\n(Nhanh nhất, $0 phí quản lý, an toàn tuyệt đối)"]
Q2 -- "Có" --> EKS_CHOICE
Q1 -- "Có" --> Q3{"Hệ thống có yêu cầu nào dưới đây không?\n- GitOps ArgoCD\n- KEDA Event-driven\n- Dapr / Service Mesh phức tạp\n- Multi-cloud portability"}
Q3 -- "Có" --> EKS_CHOICE["Lựa chọn: AWS EKS\n(Đầu tư dài hạn vào hệ sinh thái chuẩn CNCF)"]
Q3 -- "Không" --> Q4{"Quy mô microservices dự kiến?"}
Q4 -- "< 15 services thuần HTTP" --> ECS_FARGATE
Q4 -- "> 20 services phân tán" --> EKS_CHOICE
8. Các Câu Hỏi Thường Gặp (FAQ)
EKS có thực sự vượt trội hơn ECS cho hệ thống microservices production không?
Không có giải pháp nào tốt hơn tuyệt đối. EKS mang lại sức mạnh của toàn bộ hệ sinh thái CNCF (ArgoCD, KEDA, Dapr, Istio, Karpenter) và khả năng di chuyển linh hoạt giữa các đám mây, nhưng đòi hỏi chi phí quản lý $73/tháng mỗi cluster và cần nhân sự chuyên trách Kubernetes.
Ngược lại, ECS mang lại sự đơn giản thuần túy của AWS với chi phí control plane bằng $0 và tích hợp sâu không ma sát với IAM/ALB. Hãy chọn EKS khi bạn cần hệ sinh thái Kubernetes tiêu chuẩn; chọn ECS khi bạn muốn tập trung 100% nguồn lực vào logic sản phẩm.
Chi phí vận hành giữa ECS Fargate và EKS Fargate khác nhau như thế nào?
Ở tầng tính toán (Compute Data Plane), mức giá Fargate giữa ECS và EKS là hoàn toàn giống nhau (cùng mức giá theo vCPU-giờ và GB-giờ của AWS).
Tuy nhiên, ECS Fargate không tốn bất kỳ khoản phí nào cho control plane ($0/tháng), trong khi EKS Fargate vẫn phải chi trả $73/tháng cho mỗi EKS cluster. Ngoài ra, EKS Fargate có một số hạn chế như không hỗ trợ DaemonSets và không thể can thiệp kernel cgroups sâu như khi chạy trên EC2 worker nodes.
Phí EKS Extended Support là gì và làm thế nào để tránh phải trả khoản tiền này?
EKS Extended Support là chính sách của AWS thu thêm $0.60/giờ (tương đương $438/tháng/cluster, đắt gấp 6 lần phí thông thường) đối với các cluster EKS chạy các phiên bản Kubernetes đã phát hành quá 14 tháng.
Để tránh khoản phí khổng lồ này, các đội ngũ vận hành bắt buộc phải duy trì quy trình nâng cấp phiên bản Kubernetes định kỳ ít nhất một lần mỗi năm để luôn nằm trong cửa sổ Standard Support (14 tháng đầu tiên). Với ECS, AWS tự động bảo trì nền tảng mà người dùng không bao giờ phải chịu phí tương tự.
Tại sao autoscaler Karpenter trên EKS lại nhanh hơn đáng kể so với ECS Capacity Providers?
Karpenter hoạt động trực tiếp với API Server của Kubernetes, phân tích chi tiết yêu cầu CPU/RAM của các Pods đang chờ và gọi thẳng API EC2 Fleet của AWS để tạo đúng loại máy ảo tối ưu nhất, bỏ qua toàn bộ tầng Auto Scaling Group (ASG). Nhờ đó, node mới có thể khởi động và gia nhập cluster chỉ trong 45–60 giây.
Trong khi đó, ECS Capacity Provider phụ thuộc vào cơ chế CloudWatch Alarms và ASG truyền thống, thường mất từ 3 đến 5 phút để phát hiện thiếu hụt và cấp phát instance mới.
Có thể áp dụng quy trình GitOps với ArgoCD trên AWS ECS được không?
Không. ArgoCD là một công cụ thuần Kubernetes — nó hoạt động như một Kubernetes Controller liên tục đối soát các manifests tài nguyên Kubernetes (CRDs, Deployments, Services) với Git repository. Do ECS không sử dụng mô hình Kubernetes API, bạn không thể sử dụng ArgoCD cho ECS.
Thay vào đó, các đội ngũ triển khai GitOps trên ECS thường sử dụng các công cụ chuyên dụng như ecspresso, Terraform GitHub Actions workflows hoặc AWS CodePipeline kết hợp AWS CodeDeploy.
🔗 Đọc thêm các chuyên đề & Series liên quan:
- Series Architectural Tradeoffs & Showdowns
- Kubernetes In-Place Pod Resizing: Hướng Dẫn Kỹ Thuật Chuyên Sâu
- GitOps Hàng Khủng (At Scale): Kubernetes & ArgoCD Phục Vụ Microservices
- Kiến Trúc Microservices Golang & DDD: Thiết Kế Nền Tảng 21 Dịch Vụ
- Multi-region Geo-distributed API Routing Architecture
