Bài viết này tập trung vào việc đóng gói ứng dụng bằng vùng chứa trong phát triển phần mềm hiện đại cùng điều phối vùng chứa của nhà cung cấp đám mây, cho phép chúng ta triển khai và mở rộng ứng dụng động theo mọi nhu cầu tải công việc với khả năng lặp lại, dễ bảo trì, quan sát được, độ sẵn sàng cao, đồng thời tối ưu chi phí và hỗ trợ khôi phục thảm họa.
Tóm lược
- Vùng chứa cho phép đóng gói ứng dụng độc lập với nền tảng thành các ảnh nhẹ, có hiệu năng cao để khởi chạy và nhân bản.
- Các công cụ điều phối vùng chứa cho phép quản lý động những khối lượng công việc phân tán lớn và khó dự đoán.
- AWS EKS là một trong những hệ thống điều phối vùng chứa phổ biến nhất và tích hợp chặt chẽ với nhiều dịch vụ AWS.
- Sử dụng biểu đồ Helm để triển khai các ứng dụng Kubernetes phức tạp cho học máy hoặc khoa học dữ liệu chỉ với một lệnh.
Vì sao dùng vùng chứa?
Gần như không thể trả lời câu hỏi “vì sao” nếu không nói về “là gì”, vì vậy hãy bắt đầu với những vấn đề mà vùng chứa hướng đến giải quyết và vùng chứa là gì để trả lời cho “vì sao”.
Mô hình kỹ thuật phần mềm cũ khiến lập trình viên viết mã trên máy cá nhân, sau đó triển khai lên môi trường thử nghiệm, rồi phát hành sang môi trường sản xuất. Vấn đề của mô hình này là sự không nhất quán giữa các môi trường và các phụ thuộc, thư viện chạy trên các máy chủ khác nhau.
Vì thế, một ứng dụng “chạy trên máy tôi” (mượn một câu nói kinh điển của lập trình viên) có thể phụ thuộc vào các thư viện thời gian chạy với phiên bản rất khác so với môi trường đích, dẫn tới những hành vi bất ngờ khi triển khai.
Vùng chứa giải quyết điều này bằng cách trừu tượng hóa hoàn toàn lớp ứng dụng, đóng gói mã biên dịch, thư viện, phụ thuộc và runtime vào một “ảnh”.
Ảnh vùng chứa sau đó có thể dùng như một mẫu để công cụ vùng chứa, như Docker, nhanh chóng triển khai và chạy thành một thể hiện vùng chứa với hành vi có thể dự đoán trên mọi môi trường.
Những vấn đề tiếp theo mà vùng chứa giải quyết là khả năng mở rộng, khả năng bảo trì và hiệu quả chi phí. Trước đây, môi trường sản xuất bao gồm lượng lớn tài nguyên phần cứng (đắt tiền) được “rào” riêng và bảo vệ để dùng độc quyền cho các ứng dụng lưu lượng cao hoặc trọng yếu với doanh nghiệp. Những môi trường tốn kém này cần quản trị, bảo trì và vá lỗi liên tục.
Lượng phần cứng cấp phát cho các ứng dụng như vậy phải đạt mức tối đa để đáp ứng tải đỉnh, trong khi các ứng dụng không phải lúc nào cũng có mẫu sử dụng ổn định, có thể dự đoán. Điều này dẫn đến nhiều phần cứng bị “nằm im” vào giờ thấp điểm.
Giải pháp chính là điều phối vùng chứa.
Vì ảnh vùng chứa độc lập với nền tảng, tài nguyên tính toán cho vùng chứa có thể tăng giảm theo nhu cầu bằng bất kỳ máy chủ sẵn có nào đủ khả năng chạy công cụ vùng chứa, tách biệt việc bảo trì hệ điều hành máy chủ bên dưới khỏi ứng dụng.
Điều này tác động rõ rệt đến hiệu quả chi phí: nếu chúng ta quản lý và điều phối vùng chứa theo cách đáp ứng động nhu cầu hiện tại, chúng ta tận dụng tối đa “bare metal”.
Giải thích trên ở mức “rất cao”, chúng ta sẽ đi sâu hơn ở các phần sau, nhưng trước hết, hãy nói về một số ứng dụng thực tiễn của vùng chứa.
Vùng chứa cho khoa học dữ liệu và học máy
Các ứng dụng cho khoa học dữ liệu và học máy thường tiêu tốn rất nhiều tài nguyên tính toán
với mẫu sử dụng đôi khi khó dự đoán và xử lý lượng dữ liệu khổng lồ.
Những ứng dụng như vậy thường hưởng lợi từ việc song song hóa để “chia để trị” trước khi lưu kết quả vào kho dữ liệu. Đây là một đơn giản hóa lớn, nhưng có thể thấy ngay rằng các ứng dụng này rất phù hợp với vùng chứa và điều phối vùng chứa!
Vậy, với tất cả kiến thức đó, hãy đi vào “làm thế nào”. Ở cuối bài, chúng ta sẽ quay lại mối liên hệ giữa ứng dụng khoa học dữ liệu và học máy khi nói về Helm và cách chạy các ứng dụng phức tạp được triển khai dưới dạng vùng chứa trong một công cụ điều phối vùng chứa với nỗ lực và cấu hình tối thiểu.
Có nhiều công cụ vùng chứa ngoài kia, nhưng trong bài này chúng ta sẽ dùng công cụ phổ biến nhất, Docker. Bạn có thể làm quen với nền tảng qua hướng dẫn Giới thiệu về Docker của chúng tôi.
Máy ảo (VM) so với vùng chứa
Máy ảo trừu tượng hóa phần cứng vật lý, biến một máy chủ thành nhiều máy thông qua hypervisor, cho phép nhiều VM dùng chung cùng máy chủ. Mỗi VM có một hệ điều hành (OS) khách.
Vùng chứa là lớp trừu tượng ở tầng ứng dụng. Một máy chủ có cài công cụ vùng chứa có thể chạy đồng thời nhiều vùng chứa cùng dùng chung hệ điều hành bên dưới. Bạn có thể tìm hiểu thêm về Vùng chứa trong hướng dẫn về container hóa của chúng tôi.
Khác biệt cốt lõi là vùng chứa dùng OS của máy chủ và không đi kèm OS riêng như VM. Điều này khiến chúng nhẹ hơn nhiều và nhanh để nhân bản, chạy và hủy, trong khi vẫn đảm bảo cách ly bảo mật và chịu lỗi giữa các vùng chứa (nếu một vùng chứa gặp sự cố, nó không ảnh hưởng đến vùng chứa khác đang chạy).
Nó cũng đồng nghĩa sử dụng tài nguyên tốt hơn, nên nhiều vùng chứa có thể chạy trên một engine Docker hơn số VM có thể chạy trên một hypervisor với cấu hình phần cứng tương đương.
Ảnh Docker và vùng chứa
Ảnh Docker đóng gói cấu hình, mã, phụ thuộc và runtime. Ảnh hoạt động như mẫu để nhân bản và chạy các thể hiện vùng chứa trong Docker. Một vùng chứa có thể chạy trên bất kỳ nền tảng nào hỗ trợ Docker.
Điều phối vùng chứa
Giờ chúng ta đã hiểu về vùng chứa, chúng ta cần cách quản lý chúng. Có vài công cụ điều phối, nhưng trong bài này chúng ta tập trung vào Kubernetes chạy trên đám mây AWS thông qua Elastic Kubernetes Service (EKS).
Một số tác vụ chính do EKS quản lý gồm:
- Triển khai
- Mở rộng
- Cân bằng tải
- Giám sát
- Khám phá dịch vụ
- Tự phục hồi
Dịch vụ AWS
Trước khi giải thích EKS, chúng ta cần hiểu một số dịch vụ đám mây AWS làm nền tảng cho EKS.
CloudWatch
Dịch vụ giám sát và quan sát thu thập dữ liệu dưới dạng nhật ký, số liệu và sự kiện.
VPC
Đám mây riêng ảo là một mạng lôgic tách biệt, được bảo vệ an toàn và quản lý theo từng tài khoản AWS.
ELB
Bộ cân bằng tải đàn hồi là thành phần mạng có độ sẵn sàng cao có thể phân phối lưu lượng đến nhiều mục tiêu.
IAM
Quản lý danh tính và truy cập cung cấp kiểm soát truy cập chi tiết cho các tài khoản AWS.
ECR
Elastic Container Registry là kho lưu trữ ảnh Docker được quản lý toàn phần.
EC2
Elastic Cloud Compute (viết tắt do có 2 chữ C) là dịch vụ cốt lõi của AWS làm nền cho nhiều dịch vụ khác. Nó cho phép thuê máy chủ ảo để khách hàng chạy ứng dụng của mình.
Region
Vị trí địa lý nơi các trung tâm dữ liệu được gom cụm, ví dụ EU-WEST-1 (Ireland) và EU-WEST-2 (London).
AZ
Vùng sẵn sàng gồm một hoặc nhiều trung tâm dữ liệu riêng biệt với nguồn điện, mạng và kết nối dự phòng. Một khu vực (region) gồm nhiều AZ.
Route53
Dịch vụ DNS có độ sẵn sàng cao.
WAF
Tường lửa ứng dụng web giúp bảo vệ ứng dụng trước các khai thác và bot phổ biến có thể ảnh hưởng đến tính sẵn sàng, làm lộ bảo mật hoặc tiêu tốn quá mức tài nguyên.
Những điều căn bản về Kubernetes
Kubernetes đôi khi được gọi là K8s. Lý do là có tám chữ cái giữa chữ K và chữ S trong từ Kubernetes.
Cụm (Cluster)
EKS sẽ cấp một cụm K8s được quản lý. Đây là thành phần cấp cao nhất và là “vùng chứa” cho tất cả dịch vụ, node và pod.
EKS tích hợp chặt chẽ với CloudWatch, Elastic Container Repository (ECR), IAM, API Gateway, Elastic Load Balancer (ELB), CodePipeline, Secrets Manager, và nhiều dịch vụ khác.
Ở ví dụ cơ bản nhất, chúng ta có thể lưu ảnh vùng chứa trong ECR và để EKS quản lý, chạy ứng dụng của mình; EKS được triển khai vào một VPC băng qua nhiều vùng sẵn sàng, với toàn bộ nhật ký hệ thống và ứng dụng được xuất lên CloudWatch.

Master/control plane
Master node là “trái tim” của K8s và giúp quản lý, giám sát, lập lịch và hoạch định các node. Nó có một số tiểu thành phần.
ETCD
Đây là kho khóa-giá trị lưu bền mọi dữ liệu quan trọng của cụm
Kube scheduler
Bộ lập lịch triển khai vùng chứa vào các node
Kube controller manager
Đảm bảo trạng thái đúng đắn của các thành phần cụm, chắc chắn rằng tải công việc mong muốn bằng với tải công việc thực tế.
API
Mọi tương tác từ bên ngoài cụm đều đi qua API của K8s.

Node (node công nhân)
Một worker node của EKS là một phiên bản EC2. Mỗi node cài docker runtime để chạy vùng chứa, tác tử Kubelet xử lý mọi liên lạc tới và từ master, và K-proxy cho phép giao tiếp giữa các node.
Để node tích hợp với CloudWatch, vai trò IAM của node cần bao gồm chính sách CloudWatchLogsFullAccess.

Pod
Pod là đơn vị có thể triển khai nhỏ nhất. Nó chạy một vùng chứa ứng dụng cùng bất kỳ vùng chứa sidecar cần thiết nào. Mỗi pod là nhất thời và có địa chỉ IP riêng.

Triển khai (Deployments) và Replica set

Replica set quản lý một tập pod theo nhãn và đảm bảo luôn có một tập pod chạy ổn định cho tải công việc xác định. Nếu một pod ngừng hoạt động, replica set sẽ khôi phục pod đó.
Triển khai quản lý các replica set. Nếu một replica set ngừng hoạt động, triển khai sẽ khôi phục nó. Triển khai có thể được cấu hình theo kiểu cuốn chiếu, tăng dần, tạo lại, hoặc canary (chi tiết về các kiểu triển khai nằm ngoài phạm vi bài viết này).
Dịch vụ (Services)
Trong phạm vi bài viết này, chúng ta có thể xem một service ánh xạ trực tiếp tới Application Load Balancer (ALB) của AWS, một loại ELB. Thực tế còn nhiều chi tiết hơn, nhưng điều quan trọng là hiểu một số lợi ích mà ALB mang lại:
- Gắn tên miền (DNS)
- Kiểm tra tình trạng
- Độ sẵn sàng cao trên nhiều AZ
- WAF
- Nhật ký truy cập
Chức năng chính của service là phân phối lưu lượng giữa các node/pod.
Mở rộng vùng chứa
ASG và EC2
Thành phần cốt lõi của EC2 là Auto Scaling Group (ASG). Thành phần AWS này sẽ duy trì một cụm phiên bản EC2 ở mức tải mong muốn trên nhiều AZ trong một region, thường phía sau một bộ cân bằng tải.
Chỉ số CloudWatch cung cấp các kích hoạt để mở rộng vào/ra.
Kiểu mở rộng này gọi là mở rộng ngang vì cụm máy chủ ứng dụng có thể giãn nở và co lại “theo chiều ngang” để đáp ứng nhu cầu lưu lượng. Một chính sách mở rộng ví dụ là giữ tất cả phiên bản dưới 50% mức sử dụng CPU. Ở mức này, ASG thường được cấu hình để quản lý số phiên bản EC2 bằng nhau trên mỗi AZ, nhưng còn nhiều cấu hình khác nằm ngoài phạm vi bài viết.
HPA
Cần phân biệt rõ giữa mở rộng ở mức EC2 và ở mức pod. Horizontal Pod Autoscaler chịu trách nhiệm mở rộng pod trong mỗi node. HPA sử dụng chỉ số K8s thu thập qua Metrics Server (cần cài trong cụm, không nằm trong triển khai mặc định của EKS) và mở rộng pod dựa trên chỉ số của node. Một chính sách ví dụ là đặt mục tiêu sử dụng vCPU ở mức 50%.
Trình tự động mở rộng cụm EKS
Tự động mở rộng cụm yêu cầu cài đặt công cụ mã nguồn mở EKS cluster autoscaler, chịu trách nhiệm mở rộng dịch vụ K8s song song với AWS ASG, vốn quản lý việc mở rộng các phiên bản vật lý được cấp cho cụm.
Khi một node đạt công suất tối đa theo chính sách HPA, cluster autoscaler sẽ tạo thêm một phiên bản EC2 và thêm nó vào ASG.
Bức tranh tổng thể

Chính sách mở rộng rất linh hoạt, có thể tùy chỉnh và cấu hình, nhưng thường có khoảng thời gian “hạ nhiệt” trước khi thu nhỏ/giảm bớt để tránh mở rộng không cần thiết do lưu lượng dao động thất thường.
Lưu ý quan trọng: nếu một pod vượt quá giới hạn vCPU, Kubernetes sẽ “throttle” ứng dụng chạy trong pod đó; nhưng nếu một pod vượt quá giới hạn bộ nhớ, Kubernetes sẽ khởi động lại vùng chứa.
Tối ưu chi phí
Ví dụ cách hạn chế số pod trong phiên bản dùng loại m5.large:
2 * vCPU = 2000m (millicore)
8 GiB bộ nhớ
Giới hạn tài nguyên pod:
- Lượng vCPU dành trước, ví dụ 500m
- Giới hạn vCPU, ví dụ 1000m
- Lượng bộ nhớ dành trước, ví dụ 256Mi
- Giới hạn bộ nhớ, ví dụ 512Mi
Khả năng quan sát
EKS Resource View
Hiển thị tất cả tài nguyên đang chạy trên cụm.

CloudWatch Container Insights
- Giám sát
- Cảnh báo
- Kích hoạt hàm Lambda
- Bảng điều khiển và chỉ số dựng sẵn
- Cài đặt một lần nhấp

Helm
Helm là trình quản lý gói cho Kubernetes, tự động hóa việc đóng gói, cấu hình và triển khai ứng dụng. Biểu đồ Helm cho phép bạn tạo, chia sẻ, quản lý phiên bản và phát hành các ứng dụng Kubernetes phức tạp.
Một số ví dụ biểu đồ thú vị trong lĩnh vực khoa học dữ liệu và học máy:
- Ml-workspace
- Mlflow
- Tensorflow
- Hive
- Spark
Những ứng dụng K8s này có thể được triển khai lên cụm EKS của bạn qua Helm chỉ với một lệnh!
Kết luận
Trong hướng dẫn toàn diện này, chúng ta đã khám phá những điều căn bản về điều phối vùng chứa với AWS Elastic Kubernetes Service (EKS). Từ việc hiểu nền tảng của vùng chứa và các ứng dụng thực tiễn trong khoa học dữ liệu và học máy, đến đào sâu vào các dịch vụ AWS và các thành phần của Kubernetes, chúng ta đã đi qua nhiều nội dung. Thế giới điều phối vùng chứa phức tạp nhưng vô cùng đáng giá, mang lại khả năng mở rộng, dễ bảo trì và hiệu quả chi phí.
Dù bạn là nhà phát triển, nhà khoa học dữ liệu hay chuyên gia IT, thành thạo điều phối vùng chứa chắc chắn sẽ là kỹ năng giá trị trong bộ công cụ của bạn. Khi doanh nghiệp tiếp tục chuyển dịch sang giải pháp đám mây và áp dụng kiến trúc microservices, nhu cầu về các chuyên gia có chuyên môn trong những lĩnh vực này sẽ chỉ tăng lên.
Sẵn sàng áp dụng kiến thức vào thực hành? DataCamp cung cấp nhiều khóa học giúp bạn đào sâu hiểu biết về Kubernetes, Docker và điện toán đám mây. Từ cấp độ nhập môn đến nâng cao, bạn sẽ tìm thấy các bài học tương tác, thử thách thực tế và hướng dẫn từ chuyên gia để nâng tầm kỹ năng.
- Giới thiệu về Docker
- Hướng dẫn về Học máy, Pipeline, Triển khai và MLOps
- Khóa học Khái niệm về AWS Cloud
Liên kết hữu ích
- Kubectl cheat sheet với các lệnh thường dùng nhất
- Hướng dẫn HPA giải thích HPA và hướng dẫn bạn qua một ứng dụng với khả năng mở rộng được quản lý
- Hướng dẫn Cluster autoscaler để thiết lập và chạy một ứng dụng đơn giản với tự động mở rộng cụm
- Biểu đồ Helm
- Công cụ tính giá AWS
Tôi là Kỹ sư Phần mềm Full Stack kiêm Kiến trúc sư Giải pháp, đam mê học hỏi và dữ liệu!
