Xây dựng và triển khai ứng dụng chăm sóc sức khỏe dùng AWS EKS và GitOps

Building and deploying a healthcare application using AWS EKS and GitOps

Ngày nay, với sự phát triển không ngừng của công nghệ, hàng loạt sản phẩm phần mềm liên tục xuất hiện trên thị trường. Các sản phẩm này ngày càng đa dạng và có quy mô lớn, kéo theo những thách thức đáng kể đối với các tổ chức và doanh nghiệp như: yêu cầu đưa sản phẩm ra thị trường nhanh chóng để chiếm ưu thế cạnh tranh, đảm bảo chất lượng phần mềm dịch vụ, quản lý và mở rộng hệ thống với nhiều service, cũng như tối ưu hoá việc sử dụng cơ sở hạ tầng.

Trước bối cảnh đó, DevOps đã ra đời như một giải pháp hiệu quả. DevOps không chỉ là một phương pháp mà còn là một văn hoá làm việc mới trong ngành phát triển phần mềm. Với việc kết hợp giữa phát triển (Development) và vận hành (Operations), DevOps mang lại quy trình tự động hoá toàn diện cho việc xây dựng, kiểm thử, triển khai và vận hành phần mềm được gọi là hệ thống CI/CD(Continuous Integration/Continuous Deployment). Việc áp dụng DevOps giúp tăng tốc độ phát triển, nâng cao chất lượng sản phẩm và tối ưu hóa tài nguyên hệ thống, từ đó đáp ứng tốt hơn nhu cầu ngày càng cao của thị trường công nghệ hiện đại.

TÁC GIẢ

Nguyễn Cao Tiến

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

NGÀNH

Năm:

TỔNG QUAN

Thông thường vòng đời của một sản phẩm phần mềm gồm 2 giai đoạn chính: giai đoạn phát triển và giai đoạn vận hành. Giai đoạn phát triển bao gồm phần việc của Business Analyst, UI/UX Designer, Developer, QA/QC Engineer, v.v… Giai đoạn vận hành có sự tham gia của System Engineer, System Administrator, Operation Executive, Release Engineer, Database Administrator, Network Engineer, Security Engineer, v.v… Ở mỗi giai đoạn đều có những đội nhóm và công việc tách biệt. Sự tách biệt này càng phân hóa rõ ràng ở những công ty có quy mô từ trung bình trở lên. Mục tiêu của nhóm phát triển là phát triển các tính năng mới liên quan đến những thay đổi đối với môi trường hiện có. Điều đó có nghĩa là những thay đổi mới được đưa vào một môi trường mà trên thực tế một môi trường có tính ổn định có thể bị mất ổn định do những thay đổi được đưa ra điều này mâu thuẫn trực tiếp với mục tiêu của các nhóm vận hành. Sự mâu thuẫn này hình thành nên khái niệm Wall of confusion – Bức tường của sự hiểu lầm. Nó sẽ là rào cản kìm hãm sự phát triển phần mềm khiến cho nỗ lực làm việc của nhân viên cũng như chất lượng phần mềm ngày càng giảm sút. 

Về mặt sản phẩm, với sự phát triển của công nghệ kéo theo sự bùng nổ về quy mô của các công ty cũng như sự đa dạng các sản phẩm công nghệ khiến cho quy mô của các hệ thống cũng mở rộng theo cấp số nhân. Từ một vài server, hệ thống có thể phát triển lên đến hàng chục, hàng trăm, hàng nghìn, hoặc thậm chí hàng triệu server (ví dụ như trường hợp của Google, Facebook). Đồng thời ngành phát triển phần mềm cũng dịch chuyển theo một hướng khác – microservices – một sản phẩm lớn được chia tách ra thành rất nhiều các service nhỏ, các service này liên kết với nhau tạo thành một sản phẩm hoàn chỉnh. Trước nhu cầu phát triển và cải tiến sản phẩm liên tục, những thách thức mới, những bài toán mới được đặt ra: 

Về mặt quy trình, hay là khía cạnh con người, làm thế nào để các bộ phận hợp tác thuận lợi hơn? Làm thế nào để quy trình làm việc được trơn tru, suôn sẻ hơn?

Về mặt sản phẩm, làm thế nào để các service kết nối và giao tiếp với nhau theo những nguyên tắc hiệu quả, cũng như đảm bảo việc mở rộng quy mô được dễ dàng và êm ái hơn? 

Khái niệm DevOps ra đời nhằm giải quyết những vấn đề này. DevOps giúp tối ưu hóa chu trình phát triển phần mềm, giúp sản phẩm phần mềm được cập nhật, phát hành nhanh và thường xuyên hơn. 

Lợi ích của chính DevOps đó là việc hoàn thiện, chuyển đổi quy trình phát triển và vận hành của phần mềm từ mô hình truyền thống Waterfall (thác nước) sang dạng mô hình CI/CD (phát triển liên tục) 

Ngoài ra, DevOps còn có một số lợi ích khác như: 

Tốc độ: hoạt động với tốc độ nhanh và tần suất cao giúp cải thiện khả năng phục vụ khách hàng, thích nghi linh hoạt với thị trường thay đổi liên tục và đạt được hiệu quả kinh doanh đáng kể. Và DevOps là công cụ hỗ trợ cho các nhà phát triển và nhóm nghiệp vụ để đạt được những mục tiêu này. 

Chuyển giao nhanh chóng: Việc tăng tần suất và nhịp độ release là cần thiết để cải thiện và nâng cấp sản phẩm một cách nhanh chóng. Khi các tính năng mới được release sẽ giúp khắc phục các sự cố kỹ thuật một cách nhanh chóng hơn, đáp ứng được các nhu cầu của khách hàng và tạo được lợi thế cạnh tranh. 

Độ tin cậy: Mặc dù tốc độ chuyển giao được đẩy nhanh nhưng DevOps vẫn sẽ giúp đảm bảo được độ tin cậy, chất lượng của sản phẩm và trải nghiệm của người dùng cuối thông qua việc áp dụng CI /CD, Monitoring và Logging. 

Khả năng mở rộng: Nhờ sự tự động hóa và tính nhất quán của DevOps sẽ giúp quản lý hiệu quả những hệ thống phức tạp hay những hệ thống thường xuyên thay đổi ở mức rủi ro thấp nhất. 

Cải thiện khả năng cộng tác: Việc xây dựng các nhóm làm việc hiệu quả hơn theo mô hình DevOps nhấn mạnh vào giá trị của sự tự chủ và trách nhiệm đối với công việc. Các nhà phát triển và nhóm nghiệp vụ cùng hợp tác chặt chẽ, chia sẻ trách nhiệm và phối hợp thực hiện các quy trình công việc. Điều này giúp giảm thiểu sự chậm trễ và tiết kiệm thời gian. 

Bảo mật: DevOps giúp quá trình được đẩy nhanh mà không ảnh hưởng đến tính bảo mật nhờ các chính sách tuân thủ tự động hóa, các công cụ kiểm soát và các kỹ thuật quản lý.

Phương pháp nghiên cứu 

Phương pháp phân tích – tổng hợp tài liệu: Tìm hiểu các kiến thức liên quan đến DevOps, CI/CD, GitOps và các công cụ như Jenkins, ArgoCD, Terraform, Docker, Prometheus, Grafana, … thông qua tài liệu học thuật, blog kỹ thuật, tài liệu chính thức từ nhà phát triển và cộng đồng mã nguồn mở. 

Phương pháp thực nghiệm: Triển khai hệ thống thật trên nền tảng AWS, từ đó kiểm chứng các lý thuyết đã nghiên cứu. Thực hiện các thử nghiệm với quy trình tích hợp, triển khai, giám sát để đánh giá hiệu quả và tính khả thi của mô hình DevOps hiện đại. 

Phương pháp mô hình hóa: Xây dựng sơ đồ kiến trúc hệ thống và pipeline CI/CD nhằm trực quan hóa các thành phần và luồng hoạt động. Việc mô hình hóa hỗ trợ việc triển khai thực tế một cách có hệ thống, logic. 

Phương pháp so sánh – đánh giá: So sánh giữa mô hình triển khai truyền thống và mô hình GitOps hiện đại để rút ra các ưu điểm nổi bật về tốc độ, độ tin cậy và khả năng mở rộng. 

Phương pháp lập trình và tự động hóa: Sử dụng kỹ thuật IaC (Infrastructure as Code) với Terraform, quản lý pipeline bằng Jenkinsfile, quản lý cấu hình bằng Kustomize, … để đảm bảo khả năng tái sử dụng, mở rộng và kiểm soát hệ thống.

TRIỂN KHAI HỆ THỐNG

Quy trình triển khai hệ thống được thiết kế theo kiến trúc GitOps, với sự tích hợp của nhiều công cụ DevOps và bảo mật (DevSecOps) như Jenkins, SonarQube, Trivy, Snyk, ArgoCD, Prometheus, Grafana,… Hệ thống bao gồm hai kho lưu trữ chính: 

− Application repository: Chứa mã nguồn ứng dụng. 

− GitOps repository: Chứa các manifest Kubernetes quản lý bằng Kustomize. 

image 38

Luồng triển khai bắt đầu từ khi lập trình viên đẩy mã nguồn lên GitHub, sau đó Jenkins kích hoạt các giai đoạn CI, kiểm thử bảo mật, build container image, đẩy lên Docker Hub và cập nhật vào GitOps repository. Cuối cùng, ArgoCD tự động đồng bộ với cụm EKS để triển khai ứng dụng, đồng thời Prometheus và Grafana thực hiện giám sát toàn hệ thống. 

Hệ thống được triển khai theo mô hình DevOps hiện đại, trong đó toàn bộ vòng đời phát triển phần mềm – từ viết mã, kiểm thử, bảo mật, build, triển khai, đến giám sát – đều được tự động hóa. Kiến trúc sử dụng các công nghệ sau: 

− Terraform: Quản lý hạ tầng dưới dạng mã (Infrastructure as Code), tạo EC2 để chạy Jenkins và khởi tạo cụm Kubernetes trên Amazon EKS. 

− Jenkins: Là công cụ CI chủ lực, thực thi các pipeline build – test – security scan – build Docker – cập nhật GitOps. 

− ArgoCD: Thực hiện GitOps triển khai ứng dụng từ Git vào cụm EKS. 

− Kustomize: Quản lý manifest Kubernetes theo nhiều môi trường (dev/staging/prod). 

− Trivy, Snyk, SonarQube: Kiểm thử bảo mật. −Prometheus & Grafana: Giám sát và cảnh báo hệ thống.

Giới thiệu về khai ứng dụng bán hàng 

Ứng dụng bán hàng được triển khai trong đồ án là một hệ thống web-based hoạt động theo kiến trúc microservices, phục vụ mục tiêu mô phỏng quy trình bán hàng trực tuyến. Ứng dụng bao gồm ba thành phần chính: giao diện người dùng (client), dịch vụ xử lý nghiệp vụ backend, và máy chủ reverse proxy (nginx) để điều phối các request.

image 39

Cấu trúc dự án ứng dụng bao gồm: 

− client/: Thành phần giao diện người dùng (frontend), được phát triển bằng ReactJS. Giao diện hỗ trợ người dùng xem sản phẩm, thêm vào giỏ hàng và thực hiện mua hàng. 

− javaapi/: Microservice backend viết bằng Java/Spring Boot, phụ trách xử lý nghiệp vụ chính như đơn hàng (order), thanh toán, quản lý hóa đơn,… 

− nodeapi/: Microservice viết bằng Node.js, dùng cho các chức năng phụ như xác thực, xử lý thông báo hoặc định danh người dùng. 

− nginx/: Cấu hình reverse proxy cho toàn hệ thống. Nginx chịu trách nhiệm phân phối các request đến đúng backend tương ứng và phục vụ frontend tĩnh. 

− kkartchart/: Chứa biểu đồ Helm/Kustomize phục vụ triển khai trên Kubernetes, tách biệt cấu hình theo môi trường. 

− docker-compose.yaml: Dùng để chạy toàn bộ hệ thống trong môi trường local hoặc kiểm thử nhanh trên một máy. 

− Jenkinsfile: Định nghĩa CI/CD pipeline cho Jenkins. 

− Dockerfile: Được dùng để build image frontend hoặc backend (tùy vị trí đặt). 

− package-lock.json: File khóa phiên bản dependencies của frontend hoặc NodeJS backend. 

− README.md: Tài liệu hướng dẫn cách chạy hệ thống. 

Ứng dụng được chia thành các service riêng biệt giúp dễ dàng triển khai, mở rộng và bảo trì. Việc tách riêng frontend và các backend cho phép các thành phần phát triển độc lập, áp dụng CI/CD riêng, và triển khai từng phần mà không ảnh hưởng đến hệ thống chung. 

KẾT LUẬN

DevOps và hệ thống CI/CD không chỉ cải thiện quy trình làm việc, rút ngắn vòng đời phát triển phần mềm, nâng cao chất lượng phần mềm bằng việc liên tục cập nhật và thay đổi mà còn giảm sự khó khăn, gỡ rối sự mâu thuẫn giữa các đội nhóm, giúp cho các đội nhóm tập trung phát triển và sáng tạo trên lĩnh vực của mình. Không chỉ vậy, nhờ khả năng cải thiện chất lượng sản phẩm dịch vụ liên tục còn tạo lợi thế cạnh tranh và nâng cao độ tin cậy cho doanh nghiệp. 

Trong đồ án này, em đã xây dựng thành công hệ thống triển khai ứng dụng bán hàng theo mô hình DevOps hiện đại, kết hợp sử dụng AWS EKS và GitOps. Em đã thực hiện tự động hóa hạ tầng bằng Terraform, thiết lập quy trình CI với Jenkins để kiểm thử, kiểm tra bảo mật và build Docker image, đồng thời triển khai tự động qua CD pipeline sử dụng ArgoCD và quản lý manifest bằng Kustomize. Hệ thống cũng được giám sát hiệu quả bằng Prometheus và Grafana. 

Qua thời gian thực hiện đồ án, em đã được củng cố thêm kiến thức về DevOps và hệ thống CI/CD cũng như có thêm kinh nghiệm trong việc thiết kế kiến trúc hệ thống CI/CD và cài đặt hệ thống. Đặc biệt đồ án đã nghiên cứu và giới thiệu những công nghệ mạnh mẽ, tính ứng dụng cao cho thấy đây là những vấn đề hay và cần được nghiên cứu thêm nữa. 

Mặc dù đã rất cố gắng trong việc nghiên cứu và thực hiện đồ án nhưng do cơ sở vật chất, thời gian thực hiện đồ án và hiểu biết của em còn hạn chế nên đồ án chỉ dừng lại ở mức ứng dụng đơn giản mà chưa kịp thực hiện triển khai một cách toàn diện và hoàn chỉnh đề tài DevOps và hệ thống CI/CD. Đồng thời, đồ án chắn chắn cũng không tránh khỏi những thiếu sót nên em rất mong nhận được ý kiến đóng góp từ thầy cô.