Trong bài viết “AWS phản hồi Anthos và Azure Arc với Amazon EKS Anywhere”, VTI Cloud đã đề cập tới những cập nhật mới đầy hứa hẹn của Amazon Web Services (AWS) liên quan đến container. Một trong những dịch vụ được AWS tập trung trong năm 2021 là dịch vụ Amazon Elastic Container Service (Amazon ECS).
Bài viết này là cái nhìn tổng thể cho người mới bắt đầu với Amazon Elastic Container Service (Amazon ECS). VTI Cloud sẽ đề cập đến các khái niệm, thuật ngữ cốt lõi, sơ đồ kiến trúc đơn giản và các ví dụ tóm tắt.
Trước hết, chúng ta phải tìm hiểu về Docker
Để hiểu về Amazon ECS, trước hết chúng ta phải hiểu rõ khái niệm về Docker.
Docker – một container run time là phần mềm – công cụ cho phép xây dựng, triển khai, đóng gói ứng dụng một cách dễ dàng và nhanh chóng so với kiến trúc ảo hóa trước đây. Container được chạy bởi Container Run Time như Docker là một dạng tiêu chuẩn phần mềm đã đóng gói đầy đủ thư viện, mã nguồn cần thiết để chạy ứng dụng với tính ổn định, sẵn sàng cao mà không cần quan tâm đến hạ tầng vật lý. Nhiều container khác nhau có thể được chạy trên một host, miễn là host đó có cài đặt phần mềm Docker.
So sánh Docker và Ảo hóa (Virtualization)
Như bạn có thể thấy trong sơ đồ trên, Docker khác hẳn Ảo hóa thông thường. Docker nằm giữa ứng dụng và hệ điều hành máy chủ (OS). Docker có thể chia sẻ hệ điều hành chủ trên nhiều “Container” thay vì yêu cầu mỗi người phải có và chạy hệ điều hành riêng biệt.
Mỗi container có đầy đủ những gì một ứng dụng cần – ví dụ, các phiên bản nhất định của một ngôn ngữ hoặc thư viện – và không nhiều hơn những gì nó cần. Nhiều container có thể được sử dụng cho các phần khác nhau của ứng dụng nếu bạn muốn và chúng có thể được thiết lập để giao tiếp với nhau khi cần.
Điều này cho phép đóng gói ứng dụng của mình thành một mô-đun có thể tái sử dụng, có thể chạy trên bất kì máy nào có sẵn. Điều này cho phép phân bổ tài nguyên chi tiết hơn và có thể giảm thiểu lượng CPU hoặc tài nguyên bộ nhớ bị lãng phí.
Bằng cách sử dụng các Docker container được chỉ định để chạy production code, nên chắc chắn rằng môi trường dev và production là như nhau.
Khi số lượng các container mở rộng quá nhanh
Khi ứng dụng của bạn phát triển, việc quản lý công đoạn triển khai, cấu trúc, lập lịch và mở rộng các container phục vụ ứng dụng nhanh chóng trở nên rất phức tạp. Đây là lúc dịch vụ quản lý container (container management service) ra đời. Nó nhằm mục đích cho phép các tùy chọn cấu hình đơn giản và xử lý các công việc không phải chuyên môn trong khi bạn tập trung cho việc lập trình ứng dụng.
Tìm hiểu về Amazon ECS
Amazon Elastic Container Service (Amazon ECS), theo định nghĩa của AWS là
Một dịch vụ quản lý container có khả năng mở rộng cao, dễ dàng run, stop, hay quản lý docker container ở trong một cluster. Bạn có thể host một serverless infrastructure bằng cách chạy service hay task sử dụng Fargate launch type hoặc sử dụng EC2 launch type để chạy các EC2 instance.
Amazon ECS được so sánh với Kubernetes, Docker Swarm và Azure Container Instances.
Amazon ECS chạy các containers trong cluster gồm nhiều Amazon EC2 instance được cài sẵn Docker. Dịch vụ này xử lý việc cài đặt container, mở rộng quy mô, giám sát và quản lý những instance này (launch/stop) thông qua cả API và AWS Management Console.
Amazon Elastic Container Service cho phép đơn giản hóa chế độ xem các EC2 instance thành một pool tài nguyên, chẳng hạn như CPU và bộ nhớ.
Bạn có thể sử dụng Amazon ECS để cài đặt container thông qua cluster và dựa vào nguồn tài nguyên mà bạn cần, chính sách độc lập hay khả năng thay đổi. Với Amazon ECS, bạn không phải vận hành hệ thống quản lý cấu hình và quản lý cụm của riêng mình hoặc lo lắng về việc mở rộng cơ sở hạ tầng quản lý của mình.
Amazon ECS là một dịch vụ theo region, nó đơn giản hoá việc chạy ứng dụng containers trên nhiều AZ trong cùng một Region. Bạn có thể tạo một ECS cluster bên trong một VPC mới hoặc cũ. Sau khi một cluster được khởi tạo và chạy, bạn có thể định nghĩa các task và services mà nó chỉ định Docker container image sẽ chạy thông qua clusters.
Thuật ngữ cốt lõi và sơ đồ kiến trúc của Amazon ECS
Ở đây chúng ta đến với hai nhóm thuật ngữ mới:
-
Task Definition, Task, và Service.
-
ECS Container Instance, ECS Container Agent, và Cluster.
Task Definition
Đây là một text file (json format). Nó sẽ mô tả 1 hoặc nhiều container (tối đa là 10) để hình thành nên ứng dụng của bạn. Task definition sẽ chỉ ra một vài parameter cho ứng dụng, ví dụ như container nào sẽ được dùng, image được sử dụng, launch type sử dụng, cấu hình của container (CPU và bộ nhớ)), port đang mở và data volume gì sẽ được tạo với container trong các task…
Parameter trong task definition phụ thuộc vào launch type nào đang được sử dụng. Ví dụ về task definition chứa một container dùng để chạy một NGINX web server sử dụng Fargate launch type.
{
"family": "webserver",
"containerDefinitions": [
{
"name": "web",
"image": "nginx",
"memory": "100",
"cpu": "99"
},
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"memory": "512",
"cpu": "256",
}
Task và Schedule
Một task là việc khởi tạo một task definition bên trong cluster. Nhiều Task khác nhau có thể được tạo bởi một Task Definition, tùy theo nhu cầu, nhưng chỉ định một số lượng task nhất định. Tuy nhiên, các task này có thể giống nhau.
Với mỗi một task sử dụng Fargate launch type có một ranh giới riêng biệt và không chia sẻ kernel, tài nguyên cpu, bộ nhớ, hay elastic network interface với task khác.
Amazon ECS task scheduler chịu trách nhiệm cho việc thay thế các task bên trong cluster. Có một vài cách khác nhau để lên schedule cho task
-
Service schedule
-
Manually running task
-
Running task on a cron-like schedule
-
Custom scheduler
Service
Xác định mức tối thiểu và tối đa của một hoặc nhiều Task từ một Task Definition chạy tại bất kỳ thời điểm nhất định nào. Đây là tính năng scale và cân bằng tải.
Bây giờ khi đã có Service, các Task của Service cần phải được chạy ở đâu đó để có thể truy cập được. Nó cần được đặt trên một Cluster và dịch vụ quản lý container sẽ xử lý nó khi chạy trên một hoặc nhiều ECS Container Instance(s).
Amazon ECS Container Instances and Amazon ECS Container Agents
Trong hình phía dưới là một EC2 instance đã được cài Docker Engine và một ECS Container Agent bên trong. Một ECS Container Instance có thể chạy nhiều Task giống hoặc khác nhau, từ cùng hoặc khác Services.
Agent được sử dụng để hỗ trợ kết nối trao đổi giữa ECS và các instance, cung cấp thông tin về các container đang chạy và quản lý các container mới tạo…
Cluster
Như đã thấy ở trên, Cluster là một nhóm các ECS Container Instance. Amazon ECS xử lý logic của việc lập lịch, duy trì và xử lý các yêu cầu mở rộng quy mô cho các instance này. Các task chạy trên ECS luôn nằm trong cluster.
Khi các Task được chạy trên Fargate, tài nguyên của cluster sẽ được quản lý bởi Fargate. Khi sử dụng EC2 launch type thì các cluster là những group ECS Container Instance (được chạy bằng các EC2 instance).
Xem thêm tại mục Cluster trong AWS Documentation:What is Amazon Elastic Container Service? – Amazon Elastic Container Service
Một Cluster có thể chạy nhiều Service. Nếu sản phẩm có nhiều ứng dụng, bạn có thể đặt một số ứng dụng này vào một Cluster. Điều này giúp sử dụng hiệu quả hơn các tài nguyên có sẵn và giảm thiểu thời gian thiết lập so với mô hình quản lý truyền thống.
Amazon ECS tải các container image của bạn từ registry mà bạn đã setting trước đó sau đó sẽ run những images này trong cluster của bạn:
-
Cluster là Region-specific.
-
Cluster có thể chứa nhiều tasks sử dụng cả Fargate launch type và EC2 launch type.
-
Khi các task sử dụng EC2 launch type , các clusters có thể chứa nhiều ECS Container Instance khác nhau. Tại cùng một thời điểm, một ECS Container Instance chỉ thuộc về duy nhất một cluster.
-
Bạn có thể tạo một custom IAM policy cho cluster cho phép hoặc giới hạn user access tới clusters.
Các trường hợp sử dụng EC2 launch type trong Amazon ECS
-
Workload lớn, nhưng vẫn muốn tiết kiệm chi phí
Khi ứng dụng cần nhu cầu cao về CPU và nhiều GB bộ nhớ cũng như mong muốn tối ưu về chi phí AWS, trường hợp này có thể sử dụng cluster của các reserved EC2 instance hoặc EC2 spot instance.
Bạn sẽ phải chịu trách nhiệm duy trì và tối cluster này, nhưng lợi thế của Amazon EC2 sẽ giúp tiết kiệm khá nhiều chi phí (khi sử dụng spot hoặc reserved instance)
Các trường hợp sử dụng Fargate launch type trong Amazon ECS
-
Môi trường test
Với các môi trường thử nghiệm không đòi hỏi quá nhiều workload, thì việc của dụng dịch vụ serverless AWS Fargate thay vì dịch vụ EC2 instance sẽ giúp bạn tận dụng tối đa tài nguyên.
-
Môi trường workload nhỏ, nhưng thỉnh thoảng có tăng đột ngột (burst)
Khi workload tuy nhỏ nhưng thỉnh toảng có tăng đột biến không thường xuyên, chẳng hạn như traffic hoặc request bất ngờ tăng trong ngày và thấp ban đêm thì sử dụng Fargate launch type sẽ là lợi thế hơn.
Do Fargate có thể scale up tài nguyên từ một tiny container ban đêm (chi phí cực thấp) cho việc đáp ứng tăng đột biến ban ngày mà chỉ cần trả tiền cho CPU core và GB bộ nhớ on-demand.
-
Workload lớn, nhưng không muốn tiêu hao nguồn lực cho vận hành (Overhead cost)
Việc vận hành một cluster gồm nhiều EC2 instance sẽ tốn khá nhiều công sức và thời gian, do bạn phải đảm bảo công đoạn vá lỗi, bảo mật và cập nhật phiên bản mới nhất của Docker và ECS Agent. Lúc này, Fargate sẽ là lựa chọn tốt nhất!
Lý do là dịch vụ serverless này sẽ tự động được bảo vệ bởi các kỹ sư của AWS phía sau và vá lỗi cũng như cập nhật từ hạ tầng của AWS mà không cần các doanh nghiệp phải bận tâm.
-
Workload định kỳ
Khi hệ thống luôn phải chạy các task định kỳ, ví dụ như cron job (theo giờ hoặc thỉnh thoảng) từ queue thì AWS Fargate sẽ hỗ trợ ổn định nhất cho hệ thống. Thay vì phải khởi động lại EC2 instance sau các task này khi chạy mà vẫn bị tính tiền khi EC2 instance đang tắt, thì Fargate chỉ bị tính phí khi đang trong chế độ chạy.
Kết luận
Chúng ta đã thấy cách một ứng dụng chạy trên Docker có thể được biểu diễn bằng Task Definition và có mối quan hệ 1:1 với một Service, từ đó sử dụng Task Definition để tạo nhiều Task instance khác nhau.
Service được triển khai cho một Cluster của các ECS Container Instance, cung cấp pool tài nguyên cần thiết để chạy và mở rộng ứng dụng. Các Service bổ sung có thể được triển khai cho cùng một Cluster.
Amazon ECS, hoặc bất kỳ dịch vụ quản lý container nào, sẽ có mục đích đơn giản hóa nhất có thể, loại bỏ nhiều phức tạp của việc vận hành cơ sở hạ tầng trên quy mô lớn.
Khi nhu cầu của hệ thống trở nên phức tạp hơn, dịch vụ quản lý container sẽ đảm bảo quản lý dễ dàng hệ thống. Bằng cách sử dụng API hoặc Management Console, bạn có thể đưa ra các Task definition để thêm các ECS Container Instance mới khi cần. Điều này đảm bảo rằng luôn có một số lượng Task chạy và phân bổ tài nguyên một cách thông minh trên các Service.
Bạn có thể đọc thêm về case study của công ty Deliveroo tại link sau: Deliveroo – Cắt giảm hơn 50% chi phí vận hành cùng AWS | VTI CLOUD
Nguồn:
-
A beginner’s guide to Amazon’s Elastic Container Service (freecodecamp.org)
-
What is Amazon Elastic Container Service? – Amazon Elastic Container Service
Về VTI Cloud
VTI Cloud là Đối tác cấp cao (Advanced Consulting Partner) của AWS, với đội ngũ hơn 50+ kỹ sư về giải pháp được chứng nhận bởi AWS. Với mong muốn hỗ trợ khách hàng trong hành trình chuyển đổi số và dịch chuyển lên đám mây AWS, VTI Cloud tự hào là đơn vị tiên phong trong việc tư vấn giải pháp, phát triển phần mềm và triển khai hạ tầng AWS cho khách hàng tại Việt Nam và Nhật Bản.
Xây dựng các kiến trúc an toàn, hiệu suất cao, linh hoạt, và tối ưu chi phí cho khách hàng là nhiệm vụ hàng đầu của VTI Cloud trong sứ mệnh công nghệ hóa doanh nghiệp.