Đặt vấn đề Với sự bùng nỗ mạnh mẽ của các nền tảng ứng dụng nhằm đáp ứng nhu cầu người dùng tăng cao, các công nghệ phục vụ cho việc phát triển ứng dụng ở quy mô lớn với tốc độ ra mắt nhanh chóng trở nên cần thiết hơn bao giờ hết. Bằng cách sử dụng docker, ngày càng nhiều các ứng dụng trong môi trường production đã thực hiện container hoá. Di kèm với điều đó thì việc quản lý hệ thống chạy bằng container chỉ sử dụng docker là rất khó khăn. Một số khó khăn người quản trị hệ thống không thể không chú ý đến như: - Quản lý nhiều host có cài đặt docker cùng lúc -_ Điều phối các container - Rolling update - Scaling/Auto Scaling - Giám sat tinh trang của container dé xem còn hoạt động hay không - Khi có lỗi xảy ra thì có thé tự phát hiện va sửa lỗi - Service discovery - Load balancing - Quan ly data, workload, log - Infrastructure as Code - Liên kết và mở rộng với các hệ thống khác Với những ưu điểm như tự động hóa, co giãn linh hoạt, giảm thiểu các sai sót, giúp người quan trị tiết kiệm rất nhiều thời gian và công sức.
Kubernetes nổi lên như là một ứng cử viên giúp thay đổi công cuộc phát triển và triển khai ứng dụng vốn đã cũ kỹ và khó khăn từ lâu. Nó là một nền tảng mã nguồn mở giúp tự động hóa việc quản lý, mở rộng và triển khai ứng dụng dưới dạng container. Với Kubernetes, các khó khăn trong việc phát triển, triển khai cũng như mở rộng các ứng dụng có sử dụng công nghệ container hoá đã giảm đi rất nhiều. Đối với những khó khăn mà ta đã nói đến ở trên, Kubernetes đều có thể giải quyết được.
Một số điểm nổi bật của Kubernetes mà ta không thể không nhắc đến như xây dựng các ứng dụng với nhiều container, lên lịch, mở rộng và quản lý trình trạng của các container. Mục tiêu - Nang cao bảo mật cho hệ thống sử dụng Kubernetes sử dụng kiến trúc Microservices một cách tự động và đơn giản, không yêu cầu hiểu biết nhiều về những kiến thức bảo mật. - Dựa vào chuẩn benchmark của tổ chức dé đảm bảo cho hệ thống được an toàn về mặt cấu hình, cho phép người quản trị viên lựa chọn những tiêu chuẩn họ muốn cấu hình. - Cung cấp cho người dùng một giao diện Web dé họ không phải tương tác thông qua command line.
Phạm vi - Ap dụng cho hệ thống sử dụng Minikube va Azure Kubernetes Service. Đối tượng nghiên cứu - Nén tảng Kubernetes thông qua công cụ Minikube, Azure Kubernetes Service. - _ Công cụ tự động hoá cấu hình Ansible. Đối tượng sử dụng - Các quản trị viên mang cần nâng cao tính bảo mật của hệ thống.
Phương pháp thực hiện - Tim hiéu, nghiên cứu các tài liệu về Kubernetes, Azure Kubernetes Service. - Tim hiểu và sử dụng công cụ Ansible cho việc tự động hoá cấu hình các máy trong hệ thống. - Tìm hiểu về cấu trúc cũng như cách dé viết file Yaml, từ đó tạo nên các Playbook dùng cho triển khai việc tự động hoá cấu hình bằng Ansible. Tìm kiếm và nghiên cứu các tài liệu liên quan đến các tiêu chuẩn bảo mật của CIS benchmark dành cho Kubernetes, phân tích và xếp loại các tiêu chuẩn dựa theo mức độ nghiêm trọng đối với hệ thống sử dụng Kubernetes, từ đó chon ra các van đề bảo mật cần ưu tiên giải quyết trước.
Kết quả mong đợi Xây dựng thành công sản phẩm có khả năng tự động hoá với giao diện trực quan, tăng tối đa tính bảo mật cho hệ thông nhưng vẫn không làm ảnh hưởng đến ứng dụng Microservices chạy trên hệ thống. Sản phẩm được xây dựng có khả năng cập nhật các cấu hình, triển khai các cấu hình đó một cách nhanh chóng cho nhiều máy tính đồng thời. Bồ sung thêm kiến thức cho bản thân, đồng thời giúp người dùng, người quản trị viên tăng thêm hiểu biết dé đề phòng những ảnh hưởng do lỗ héng bảo mật gây nên. Chỉ với một vài bước đơn giản, người quản trị viên có thể triển khai và sử dụng sản phẩm.
Giới thiệu Kubernetes Kubernetes [1] (viết tắt là k8s) là một hệ thống phần mềm dé tự động hóa việc triển khai và quản lý, điều phối hệ thống các ứng dụng một cách quy mô lớn, phức tạp bao gồm nhiều process chạy trong các container. Kubernetes cho phép các lập trình viên triển khai và quản lý các ứng dụng mà không cần quan tâm về cơ sở hạ tầng cốt lõi bên dưới. Nó cung cấp một framework để tự động triển khai, mở rộng quy mô và quản lý các ứng dụng container bên trong các cluster máy chủ. Sử dụng Kubernetes, người dùng có thể dễ dàng triển khai và quản lý các ứng dụng trên nhiều môi trường khác nhau như là trên các thiết bị hạ tầng cứng, data centers hoặc các public cloud như là Amazon Web Services, Microsoft Azure, Google Cloud Platform.
Một số tính năng chính của Kubernetes bao gồm tự động cân bằng tải, tự phục hôi nếu có sự cố, tự động thay đổi quy mô - scaling, và tự động cập nhật một cách luân phiên. Kubernetes cung cấp khả năng mạnh mẽ dé quản lý các container như là hệ thống mạng, hệ thống lưu trữ, bảo mật và hệ thống ghi log. Kubernetes được thiết kế để hoạt động với nhiều loại công nghệ container, bao gồm Docker, CRI-O, containerd và các công nghệ khác. Nó cũng có một hệ sinh thái lớn và vẫn đang phát triển một cách mạnh mẽ gồm các công cụ và tiện ích bồ sung có thể mở rộng khả năng của Kubernetes, chẳng hạn như Istio cho service mesh và Prometheus để giám sát.
Kubernetes sử dụng cách tiếp cận kiểu khai báo, trong đó người dùng sẽ mô tả trạng thái mong muốn của ứng dụng trong tệp YAML và Kubernetes sẽ sử dụng các khai báo này để triển khai hệ thống, ứng dụng theo ý người ding. Kiến trúc của Kubernetes Kiến trúc Kubernetes là một hệ thống phức tap bao gồm một số thành phan hoạt động cùng nhau để quản lý các ứng dụng container. Dưới đây là các thành phần chính của Kubernetes: = |= c= (se )( == ][==>~ Hình 2.1: Kiến trúc Kubernetes - Master Node: đây là máy chính với nhiệm vụ là điều khiển cả cụm máy trong cluster. - Worker Node: là nơi các ứng dụng container chạy.
Nó chịu trách nhiệm thực thi các ứng dụng container và cung cấp các tài nguyên cần thiết để chúng chạy, chẳng hạn như CPU, bộ nhớ và network. -_ etcd: là thành phần chạy trên node master, lưu trữ các các cấu hình chung cho cả cluster Kubernetes dưới dạng cặp key/value. - Kubernetes API Server (kube-apiserver): Tương tự etcd, kube-apiserver cũng chạy trên node master, cung cấp các API Restful để Kubernetes có thé tương tác với các client (như kubectl). - Kubernetes Scheduler (kube-scheduler): nằm trên node master, kube- scheduler có nhiệm vụ là dựa vào các tài nguyên và các thông tin về tài nguyên của các thành phan trong hệ thống dé cai đặt, chạy các ứng dụng trên node thích hợp, đảm bao tính ổn định của hệ thống.
- Kubernetes Controller Manager (kube-controller): dựa vào các trạng thái đã được người dùng khai báo, tiến trình này sẽ xử lý, điều khiển các task chạy nền trong cluster. Tiến trình này cũng nằm trên node master. - kubelet: đây là service luôn hiện hữu trên tất cả các worker node với nhiệm vụ là quản lý các container cụ thể như là: giám sát, chạy hoặc dừng, duy trì các ứng dụng chạy trên node để đảm bảo sự ổn định của container. Ngoài ra, nó cũng đảm bảo việc giao tiếp với node master nhằm đảm bảo rằng các container chạy như mong đợi.
- Kubernetes Proxy (kube-proxy): Kubernetes proxy chịu trách nhiệm quan lý traffic mạng giữa các dịch vụ khác nhau đang chạy trên cluster. Nó định tuyến các traffic đến các dịch vụ thích hợp và thực hiện load balance dé đảm bao rằng traffic được phân phối đồng đều trên các node hiện có. Minikube Để deploy ứng dụng Microservices lên Kubernetes, nhóm tác giả có sử dụng công cụ Minikube [2] để triển khai một cluster Kubernetes đơn giản với một node master và một node worker. Công cụ Minikube này hỗ trợ người dùng nghiên cứu, học tập và phát triển các ứng dụng, công cụ liên quan tới Kubernetes mà không cần phải tốn nhiều chỉ phí đầu tư như là triển khai một hệ thống có sử dụng Kubernetes thật.
Mô hình Microservices Kiến trúc microservices là một phương pháp tiếp cận dé xây dựng các ứng dụng phức tạp như một tập hợp các dịch vụ nhỏ, độc lập hoạt động cùng nhau từ đó tạo thành một ứng dụng lớn hơn. Mỗi dịch vụ trong kiến trúc microservice được thiết kế để thực hiện một chức năng hoặc tập hợp các chức năng cụ thể và giao tiếp với các dịch vụ khác bằng các giao thức liên lạc linh hoạt, thường là qua network, API. Kiến trúc microservices khác với kiến trúc monolithic (nguyên khối), đây là cách tiếp cận truyền thống đề xây dựng phần mềm trong đó toàn bộ ứng dụng được xây dựng dưới dạng một code base lớn và duy nhất. Trong kiến trúc monolithic, các thay đổi đối với một phần của ứng dụng có thẻ có tác động lên các phần khác của ứng dụng, gây khó khăn cho việc mở rộng quy mô, triển khai và bảo trì.
Ngược lại, kiến trúc microservices cho phép triển khai độc lập và mở rộng quy mô các dịch vụ riêng lẻ, giúp việc xây dựng và bảo trì các hệ thống lớn, phức tạp trở nên dé dang hơn. Một số tính năng chính của kiến trúc microservice bao gồm: - Tinh độc lập, tự chủ của service: Mỗi service trong kiến trúc Microservice được thiết kế để độc lập và khép kín, với code, cơ sở dữ liệu và data schema riêng biệt. Điều này cho phép linh hoạt hơn trong việc phát triển và triển khai, vì các dịch vụ có thể được cập nhật, thay đổi và triển khai độc lập với nhau. Quản lý phi tập trung: Không giống như kiến trúc monolithic, trong đó một team tập trung chịu trách nhiệm cho toàn bộ ứng dụng, trong kiến trúc microservice, mỗi dịch vụ được phát triển và quản lý bởi các team riêng biệt.
Điều này cho phép sự linh hoạt và đổi mới nhanh chóng, vì các nhóm có thé làm việc độc lập dé phát triển và triển khai các tính năng, chức năng mới. Tính linh hoạt và khả năng mở rộng: Kiến trúc microservices cho phép tính linh hoạt và khả năng mở rộng cao hơn, vì mỗi dịch vụ có thể được triển khai và mở rộng độc lập với các dịch vụ khác.