ECS (Elastic Container Service) là gì và tại sao nên sử dụng nó? Bài viết này sẽ giải thích các khái niệm cốt lõi để giúp bạn bắt đầu triển khai ứng dụng Ruby on Rails trên Amazon ECS.
Mục Lục
ECS là gì và tại sao nên sử dụng?
Amazon ECS (Elastic Container Service) là một dịch vụ điều phối container hiệu suất cao, hỗ trợ Docker, cho phép bạn dễ dàng chạy và quản lý các ứng dụng đóng gói (containerized) trên AWS. ECS cạnh tranh trực tiếp với Kubernetes của Google, nhưng nhờ tích hợp sâu với hệ sinh thái AWS, nó trở thành lựa chọn ưu tiên cho nhiều dự án trên nền tảng này.
Tại sao cần một dịch vụ điều phối container?
Việc quản lý các ứng dụng đóng gói đơn giản (chỉ một container) khá dễ dàng. Nhưng trong môi trường production thực tế, mọi thứ phức tạp hơn nhiều. Một ứng dụng có quy mô vừa phải có thể cần ít nhất năm container hoạt động liên tục. Các container này có thể không nằm trên cùng một instance, mà trải rộng trên nhiều instance khác nhau. Việc triển khai (deploy) thủ công trong trường hợp này trở nên rất khó khăn: bạn phải thao tác trên từng instance, chạy nhiều bản sao của phiên bản mới và kiểm tra thủ công.
Triển khai dự án Ruby on Rails trên Amazon ECS – Phần 1: Ý tưởng
Hơn nữa, việc quản lý nhiều container trên cùng một instance cũng là một thách thức. Với cách triển khai truyền thống, bạn có một application server trên một instance, trỏ server đó đến port 80 và ứng dụng có thể truy cập qua HTTP. Nhưng khi có hai container trở lên trên nhiều instance, bạn không thể trỏ trực tiếp tất cả chúng đến cùng một port 80. Giải pháp là sử dụng một server để cân bằng tải (load balancing) giữa các container. Tuy nhiên, bạn vẫn phải đăng ký và hủy đăng ký thủ công từng container với server cân bằng tải.
Cách tiếp cận này đòi hỏi công sức bảo trì rất lớn, đến mức có thể bạn sẽ muốn quay lại phương pháp triển khai truyền thống thay vì sử dụng Docker.
ECS giải quyết những vấn đề này bằng cách tự động hóa nhiều tác vụ phức tạp:
- Quản lý EC2 instances: ECS giúp bạn quản lý các EC2 instances, chỉ cần chỉ định số lượng và loại instance cần thiết.
- Triển khai container: ECS tự động triển khai các container trên các EC2 instances.
- Tích hợp cân bằng tải: ECS tích hợp với bộ cân bằng tải (load balancer) của AWS, giúp bạn không cần lo lắng về việc quản lý cân bằng tải. Các instance “khỏe mạnh” sẽ được đăng ký với bộ cân bằng tải để nhận lưu lượng truy cập, còn các instance “không khỏe mạnh” sẽ bị hủy đăng ký để tránh chuyển lưu lượng đến các container bị lỗi.
- Hỗ trợ triển khai liên tục: ECS hỗ trợ triển khai liên tục (continuous deployment) và đảm bảo phiên bản mới trải qua các kiểm thử trước khi lưu lượng truy cập được chuyển sang.
- Chi phí: ECS hoàn toàn miễn phí. Bạn chỉ trả tiền cho các tài nguyên mà ứng dụng của bạn sử dụng.
Các khái niệm chính trong ECS
Docker Registry
Bước đầu tiên là tải Docker image của bạn lên một Docker registry. Docker registry tương tự như GitHub, nhưng nó lưu trữ các Docker image thay vì mã nguồn. Bạn có thể push, pull và gắn tag (tagging) các image. Tag là tên được gán cho các phiên bản khác nhau của image. Bạn có thể tải lên nhiều phiên bản khác nhau, miễn là chúng có các tag khác nhau (ví dụ: v1.0, v1.1, latest). Nếu bạn tải lên một image với cùng một tag, phiên bản mới sẽ ghi đè lên phiên bản cũ.
Docker Hub là Docker registry phổ biến nhất. AWS cũng cung cấp một kho lưu trữ image riêng tư (private), gọi là ECR (Elastic Container Registry), với chi phí khoảng $0.1/GB/tháng. Amazon cũng tính phí cho lưu lượng đi ra khỏi ECR vào các instances. Trong bài viết này, chúng ta sẽ sử dụng ECR.
Docker Registry
Task Definition
Task definition là một file JSON định nghĩa các task và các container. Task là một nhóm logic của các container (ví dụ: một “task xử lý ảnh” có thể bao gồm một container Sidekiq, một container web và một container Redis). Các container trong một task phải chạy cùng nhau. Trong ví dụ về “task xử lý ảnh”, việc mở rộng (scale) container web cũng yêu cầu mở rộng container Sidekiq và Redis.
Một best practice là chỉ nên có một container tương ứng với một task, để có thể mở rộng từng phần của hệ thống một cách độc lập.
Task definition bao gồm các thông tin sau:
- Tài nguyên: Số lượng CPU và bộ nhớ cần thiết cho một task.
- Định nghĩa container:
- Mỗi container tiêu thụ bao nhiêu CPU và bộ nhớ? (Không được vượt quá tổng số tài nguyên được phân bổ cho task).
- Cách quản lý log?
- Docker image nào sẽ được sử dụng?
- Các biến môi trường nào sẽ khả dụng cho container?
- Câu lệnh nào sẽ được sử dụng để khởi động container?
Vì cấu hình này thay đổi trong suốt vòng đời của ứng dụng, task definitions có thể có nhiều phiên bản, được gọi là revision.
ECS Service
Một service đảm bảo rằng luôn có một số lượng task nhất định chạy tại một thời điểm. Khi một container bị lỗi, service sẽ tự động tạo một bản sao mới để thay thế. Service cũng chịu trách nhiệm triển khai (deploy) task lên các instance.
Khi tạo một container, ECS service sẽ đảm bảo container đó được đăng ký với ALB (Application Load Balancer) liên kết với nó. ALB thực hiện việc điều hướng lưu lượng truy cập đến các container trong hệ thống. Khi container được đăng ký với ALB, lưu lượng có thể được chuyển đến container đó.
Có hai loại service: ECS-EC2 và ECS-Fargate.
- ECS-EC2: Triển khai các container trên các EC2 instances mà bạn có quyền truy cập.
- ECS-Fargate: Chạy các container trên các EC2 instances được quản lý bởi AWS, bạn sẽ không có quyền truy cập vào các instances này.
ECS Cluster
Một cluster là một tập hợp các service và task. Khi chạy service ECS-EC2, một cluster cũng có thể được hiểu là một nhóm các EC2 instances. Bạn có thể thiết lập số lượng và loại EC2 instance mà bạn muốn sử dụng. Tổng số đơn vị CPU và bộ nhớ của từng instance này xác định số lượng container có thể thiết lập trong một cluster.
Ví dụ: Bạn tạo một cluster cho ứng dụng xử lý ảnh. Nó có hai service ECS-EC2: một web service để hiển thị website và một service xử lý ảnh để resize ảnh. Cluster này bao gồm ba instance c5.large, mỗi instance có 2 vCPU (2.048 đơn vị CPU) và 4 GiB bộ nhớ. Như vậy, cluster có tổng cộng 6.144 đơn vị CPU và 12 GiB bộ nhớ. Dung lượng này được chia sẻ giữa tất cả các service ECS-EC2 trong cluster.
Giả sử web service cần 1.024 đơn vị CPU và 2GB RAM cho một task, và service xử lý ảnh cần 2.048 đơn vị CPU và 4GB RAM cho một task. Trong trường hợp này, bạn có thể chạy hai task xử lý ảnh và hai task web service trên ba instance c5.large này. Nếu bạn muốn thêm một web service task nữa, điều này là không thể vì toàn bộ tài nguyên của ba instance c5.large đã được phân bổ cho bốn task trước đó.
Phần tiếp theo của loạt bài này sẽ hướng dẫn bạn cách thiết lập tài khoản AWS và push image lên AWS’s image registry (ECR).
