Pipeline CI/CD cho Java Microservices trên AWS EKS sử dụng GitHub Actions & Argo CD

CI/CD Pipeline for Java Microservices on AWS EKS using GitHub Actions & Argo CD

Trong đồ án này, nhóm chúng em xây dựng một pipeline CI/CD tự động, kết hợp với một hệ thống giám sát ứng dụng microservice, sử dụng GitHub Actions cho quy trình triển khai và Prometheus cùng Grafana cho việc giám sát. Mục tiêu của đồ án là thiết kế một mô hình triển khai, vận hành và theo dõi ứng dụng một cách hiệu quả, phù hợp với thực tiễn sản xuất phần mềm hiện đại. 

TÁC GIẢ

Phạm Nguyễn Tất Đạt

GIẢNG VIÊN HƯỚNG DẪN

NGÀNH

Năm:

TỔNG QUAN

Hiện nay, các sản phẩm phần mềm ngày càng trở nên hiện đại và phức tạp, kéo theo khối lượng công việc của lập trình viên cũng tăng lên đáng kể. Trong bối cảnh đó, việc phát triển và triển khai phần mềm một cách liên tục, nhanh chóng và ổn định trở thành yếu tố then chốt. DevOps và CI/CD chính là hai thành phần cốt lõi giúp giải quyết nhu cầu này. 

DevOps là một phương pháp tiếp cận tích hợp giữa hai quy trình chính: phát triển phần mềm (Development) và vận hành hệ thống (Operations). Một trong những công cụ tiêu biểu cho DevOps là CI/CD (Continuous Integration/Continuous Deployment), với mục tiêu rút ngắn chu kỳ phát triển và triển khai ứng dụng thông qua tự động hóa. Việc áp dụng CI/CD không chỉ giúp tăng tính hiệu quả, mà còn giảm tải áp lực cho các nhóm phát triển – đặc biệt trong bối cảnh các hệ thống hiện đại thường triển khai theo kiến trúc microservice. 

Bên cạnh triển khai tự động, giám sát hệ thống cũng là một nhu cầu thiết yếu trong DevOps. Một hệ thống giám sát tốt không chỉ hỗ trợ phát hiện sớm các sự cố tiềm ẩn, mà còn cung cấp cái nhìn tổng thể về hiệu suất và mức độ ổn định của ứng dụng, từ đó giúp đội ngũ vận hành đưa ra các quyết định kịp thời và chính xác. 

Trong đồ án này, nhóm chúng em xây dựng một pipeline CI/CD tự động, kết hợp với một hệ thống giám sát ứng dụng microservice, sử dụng GitHub Actions cho quy trình triển khai và Prometheus cùng Grafana cho việc giám sát. Mục tiêu của đồ án là thiết kế một mô hình triển khai, vận hành và theo dõi ứng dụng một cách hiệu quả, phù hợp với thực tiễn sản xuất phần mềm hiện đại. 

HIỆN THỰC ĐỀ TÀI

Mô tả ứng dụng

Ứng dụng mà chúng em xây dựng để triển khai là một website viết blog. Người dùng có thể đăng tải và quản lý blog cá nhân, đồng thời tương tác với các bài viết thông qua cơ chế like bài viết. 

image 31
image 32


Luồng hoạt động Trong quá trình làm việc và phát triển ứng dụng, luồng hoạt động của các lập trình viên diễn ra như sau:

1. Tạo nhánh tính năng: Khi bắt đầu làm việc với một tính năng mới, lập trình viên tạo một nhánh mới từ nhánh dev. Tên nhánh thường mô tả tính năng được phát triển, ví dụ: feature/new-header.

2. Phát triển và commit code: Trên nhánh tính năng, lập trình viên thực hiện các thay đổi, viết code, và thường xuyên commit các thay đổi này.

3. Đẩy code lên remote: Sau mỗi commit, lập trình viên đẩy code của mình lên remote repository trên Github tại nhánh tương ứng để chia sẻ với các thành viên khác. Code đẩy lên sẽ được dò quét và kiểm tra tự động bởi CI pipeline và phản hồi cho lập trình viên.

4. Tạo pull request: Khi tính năng hoàn thành, lập trình viên tạo một pull request để đề xuất merge nhánh tính năng vào nhánh test. Mã nguồn được kiểm tra lần nữa bởi CI pipeline và được phê duyệt, xem xét bởi các lập trình viên khác.

5. Merge vào nhánh test: Sau khi pull request được phê duyệt, nhánh tính năng sẽ được merge vào nhánh develop. CD pipeline được kích hoạt để triển khai phiên bản mới của ứng dụng lên môi trường test.

6. Kiểm thử kĩ lưỡng: Trong môi trường test, các QA/Tester thực hiện các bài kiểm tra tính năng, độ bảo mật, khả năng tương thích để đảm bảo không có bất cứ vấn đề nào phát sinh trong môi trường thực tế.

7. Tạo pull request: Khi quá trình kiểm thử hoàn thành, một pull request mới được tạo để merge code từ nhánh staging vào nhánh main.

8. Merge vào nhánh main: Sau khi được xem xét và phê duyệt bởi các lập trình viên khác, code cho tính năng mới được chính thức merge vào nhánh main.

9. Triển khai lên môi trường production: Khi code được merge vào nhánh main, CD pipeline được kích hoạt để triển khai phiên bản mới lên môi trường production. 

Thiết kế CI/CD Pipeline

image 33

Cụ thể hơn, luồng hoạt động của pipeline gồm các bước: 

1. Checkout code: CI server tải về những thay đổi mới nhất trong mã nguồn trên

2. Static code analysis: Code được phân tích và dò quét bằng SonarQube để báo cáo các lỗi, sai sót hay các vấn đề về cấu trúc, kiểu dữ liệu. 

3. Unit test: Maven được sử dụng để biên dịch mã nguồn Java và chạy thử ứng dụng trong môi trường ảo. Các bài kiểm thử đơn vị (unit test) cũng được thực thi thông qua Maven để kiểm tra các thành phần riêng lẻ của ứng dụng. 

4. Xây dựng và đóng gói: Ứng dụng được đóng gói thành các Docker image. Image sẽ được đẩy lên Docker Hub.

5. Triển khai lên môi trường test: CI server cập nhật phiên bản mới cho ứng dụng bên trong các file cấu hình của Kubernetes (file YAML) cho môi trường test tại infrastructure repository. Argo CD sẽ dựa trên file cấu hình đã được cập nhật đó để triển khai phiên bản mới lên cụm EKS của môi trường test. 

6. Kiểm tra và đánh giá: Các QA/Tester tạo ra các test case để tiến hành kiểm thử ứng dụng.

7. Triển khai lên môi trường production: Sau khi đảm bảo ứng dụng hoạt động ổn định, kích hoạt workflow theo quy trình thủ công để cập nhật phiên bản mới lên môi trường production

Kết luận

Đồ án “CI/CD Pipeline for Java Microservices on AWS EKS using GitHub Actions & ArgoCD” đã giúp nhóm em hiểu rõ hơn về quy trình triển khai một hệ thống microservices hiện đại trên nền tảng Kubernetes với AWS EKS. Các thành phần backend đã giao tiếp với nhau thông qua DNS nội bộ (service name), góp phần đảm bảo tính an toàn và cô lập trong mạng nội bộ của cụm. Quy trình CI/CD được xây dựng bằng GitHub Actions và ArgoCD đã hoạt động ổn định, hỗ trợ tốt cho việc tích hợp và triển khai liên tục. Bên cạnh đó, hệ thống giám sát (monitoring) giúp nhóm dễ dàng theo dõi trạng thái và hiệu năng của các dịch vụ backend. Tuy nhiên, mô hình hiện tại vẫn còn một số điểm có thể cải thiện để đạt tính bảo mật và chuẩn hóa cao hơn. Cụ thể:

● Các EC2 worker node nên được đặt trong private subnet, chỉ truy cập thông qua Bastion Host nhằm hạn chế truy cập trực tiếp từ internet. ● Cơ sở dữ liệu nên triển khai bằng dịch vụ Amazon RDS và đặt trong private subnet để tăng cường bảo mật, kết hợp truy cập qua Bastion Host.

● Về mặt bảo mật ứng dụng, hệ thống có thể tích hợp Spring Security ở backend để kiểm soát quyền truy cập và tăng cường khả năng xác thực – phân quyền.

Những cải tiến này sẽ giúp hệ thống đạt chuẩn cao hơn về cả bảo mật, tính mở rộng và độ tin cậy.