Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 51

ĐẠI HỌC QUỐC GIA HÀ NỘI

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

Dương Đức Tùng

PHÁT TRIỂN CÁC GIẢI PHÁP TỰ MỞ RỘNG TÙY


BIẾN ĐỂ TỐI ƯU HÓA TÀI NGUYÊN TRONG MÔI
TRƯỜNG KUBERNETES

KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY


Ngành: Khoa học máy tính

Hà Nội – 2024
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

Dương Đức Tùng

PHÁT TRIỂN CÁC GIẢI PHÁP TỰ MỞ RỘNG TÙY


BIẾN ĐỂ TỐI ƯU HÓA TÀI NGUYÊN TRONG MÔI
TRƯỜNG KUBERNETES

KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY


Ngành: Khoa học máy tính

Cán bộ hướng dẫn: PGS. TS. Trương Ninh Thuận

Hà Nội – 2024
VIETNAM NATIONAL UNIVERSITY, HANOI
UNIVERSITY OF ENGINEERING AND TECHNOLOGY

Duong Duc Tung

DEVELOP CUSTOMIZABLE AUTO – SCALING


SOLUTIONS TO OPTIMIZE RESOURCES WITHIN A
KUBERNETES ENVIRONMENT

BACHELOR’S THESIS
Major: Computer science

Supervisor: Assoc. Prof., Dr. Truong Ninh Thuan

Ha Noi – 2024
LỜI CAM ĐOAN

Em xin cam đoan: Khóa luận tốt nghiệp với đề tài "PHÁT TRIỂN CÁC GIẢI
PHÁP TỰ MỞ RỘNG TÙY BIẾN ĐỂ TỐI ƯU HÓA TÀI NGUYÊN TRONG MÔI
TRƯỜNG KUBERNETES" trong báo cáo này là của em. Những gì em viết ra không
có sự sao chép từ các tài liệu, không sử dụng kết quả của người khác mà không trích
dẫn cụ thể. Đây là công trình nghiên cứu cá nhân em tự phát triển, không sao chép mã
nguồn của người khác. Nếu vi phạm những điều trên, em xin chấp nhận tất cả những
truy cứu về trách nhiệm theo quy định của Trường Đại học Công nghệ - ĐHQGHN.

Hà Nội, ngày … tháng … năm 2024


Sinh viên

Dương Đức Tùng

i
LỜI CẢM ƠN

Lời đầu tiên cho phép em được gửi lời cảm ơn tới Khoa Công Nghệ Thông Tin –
Trường Đại học Công nghệ - ĐHQG Hà Nội đã tạo điều kiện thuận lợi cho em được
học tập, nghiên cứu và thực hiện đề tài tốt nghiệp này.

Em cũng xin được bày tỏ lòng biết ơn sâu sắc tới thầy Trương Ninh Thuận đã tận
tình hướng dẫn, đóng góp những ý kiến xác đáng để em có thể hoàn thành khóa luận
một cách tốt nhất. Em cảm thấy may mắn khi được thầy hướng dẫn cũng như định
hướng mục tiêu trong quá trình học tập, nghiên cứu.

Em cũng vô cùng biết ơn những thầy cô trong trường đã tận tình giảng dạy, trang
bị cho em những kiến thức quan trọng để em có hành trang vững chắc cho con đường
học vấn của mình.

ii
TÓM TẮT
Tóm tắt: Trong lĩnh vực công nghệ thông tin, việc quản lý và tối ưu hóa tài nguyên trong môi
trường Kubernetes đóng vai trò quan trọng trong việc duy trì hiệu suất và độ tin cậy của các ứng
dụng container hóa. Các giải pháp tự động mở rộng như Horizontal Pod Autoscaler (HPA) và
Vertical Pod Autoscaler (VPA) đã cung cấp những công cụ quan trọng để thích ứng với tải hệ thống
biến đổi. Tuy nhiên, việc áp dụng một cách linh hoạt và hiệu quả những giải pháp này trong thực tế
vẫn còn gặp nhiều thách thức, bao gồm khả năng tùy biến và phản ứng với các điều kiện hệ thống đa
dạng. Đề tài này nhằm mục đích phát triển và tối ưu hóa các phương pháp auto-scaling trong
Kubernetes, thông qua việc tinh chỉnh và kết hợp các giải pháp tự động mở rộng hiện có với các
chiến lược mới được thiết kế để cải thiện sự tương tác và đáp ứng nhanh chóng với nhu cầu tài
nguyên của ứng dụng. Điều này bao gồm việc phát triển các cơ chế điều chỉnh quy mô dựa trên đánh
giá tổng hợp về tài nguyên hệ thống và tải ứng dụng, cũng như việc tích hợp các tín hiệu từ môi
trường vận hành để đạt được quản lý tài nguyên tối ưu. Nghiên cứu tập trung vào việc đánh giá hiệu
suất và độ tin cậy của các giải pháp tự động mở rộng được đề xuất, qua đó đóng góp vào việc nâng
cao hiệu quả vận hành của hệ thống Kubernetes trong môi trường sản xuất, giảm thiểu chi phí và tối
đa hóa sự hài lòng của người dùng cuối.

iii
ABSTRACT

Abstract: In the field of information technology, managing and optimizing resources within
Kubernetes environments plays a pivotal role in maintaining the performance and reliability of
containerized applications. Automated scaling solutions such as Horizontal Pod Autoscaler (HPA)
and Vertical Pod Autoscaler (VPA) have provided essential tools to adapt to fluctuating system
loads. However, the practical application of these solutions in a flexible and effective manner still
faces numerous challenges, including customization capabilities and responsiveness to diverse
system conditions. This project aims to develop and optimize auto-scaling methods in Kubernetes by
refining and combining existing automated scaling solutions with newly designed strategies to
improve interaction and quick response to application resource demands. This includes developing
mechanisms for adjusting scales based on a comprehensive assessment of system resources and
application loads, as well as integrating signals from the operational environment to achieve optimal
resource management. The study focuses on evaluating the performance and reliability of the
proposed automated scaling solutions, thereby contributing to enhancing the operational efficiency
of Kubernetes systems in production environments, minimizing costs, and maximizing end-user
satisfaction.

iv
Mục lục
Lời cam đoan i

Lời cảm ơn ii

Tóm tắt iii

Abstract iv

Danh sách hình vẽ vi

Danh sách bảng viii

Danh sách thuật toán ix

Danh sách đoạn mã x

Thuật ngữ xi

Chương 1 Kiến thức cơ sở 4

Chương 2 Xây dựng giải pháp mở rộng tuỳ biến cho ứng dụng 15

Chương 3 Cài đặt và Thực nghiệm 33

Kết luận 41

Tài liệu tham khảo 43

v
Danh sách hình vẽ

vi
Danh sách bảng

vii
Danh sách thuật toán

viii
Danh sách đoạn mã

ix
Thuật ngữ

Thuật ngữ
Ý nghĩa
Từ viết tắt Từ đầy đủ
AST Abstract Syntax Tree Cây cú pháp trừu tượng
CFG Control Flow Graph Đồ thị dòng điều khiển
SMT Satisfiability Modulo Theories Lý thuyết Mô-đun thỏa mãn
Concolic testing Kiểm thử tượng trưng động

x
Đặt vấn đề

11
Chương 1

Kiến thức cơ sở

1.1. Tổng quan về Container và Docker


Trong bối cảnh hiện nay, việc đảm bảo tính sẵn sàng và hiệu quả của các ứng
dụng trở nên cực kỳ quan trọng, đặc biệt là trong các môi trường phức tạp như
Kubernetes. Kubernetes cung cấp cơ sở hạ tầng cho việc triển khai, quản lý và mở
rộng các ứng dụng dựa trên container một cách linh hoạt và tự động. Tuy nhiên, việc
xây dựng một hệ thống đáp ứng nhu cầu biến đổi của tải công việc, mà không gây lãng
phí tài nguyên hoặc thiếu hụt tài nguyên, là một thách thức đáng kể.

Các doanh nghiệp và nhà phát triển cần phải đối mặt với nhu cầu không ngừng
thay đổi của ứng dụng và tải công việc, điều này đòi hỏi hệ thống phải có khả năng tự
động điều chỉnh quy mô của mình. Trong môi trường Kubernetes, việc mở rộng tự
động phụ thuộc vào việc cấu hình chính xác và hiểu biết sâu sắc về nhu cầu tài nguyên
thực tế của ứng dụng. Điều này bao gồm việc thiết lập các ngưỡng tài nguyên chính
xác cho CPU và bộ nhớ, cũng như khả năng phản ứng nhanh chóng và chính xác với
sự thay đổi trong lưu lượng truy cập và tải công việc.

Để làm được điều đó, chúng ta cần một hệ thống mở rộng tự động dựa trên các
quy tắc cụ thể và thông số đo lường chính xác từ hệ thống. Điều này bao gồm việc
thiết lập các ngưỡng cho CPU, bộ nhớ và các chỉ số tài nguyên khác, cũng như phản
ứng nhanh chóng với sự thay đổi của chúng.

12
Bài toán đặt ra là làm thế nào để thiết kế và triển khai một giải pháp tự mở rộng
tuỳ biến hiệu quả trong môi trường Kubernetes, giúp các doanh nghiệp có thể tự động
điều chỉnh tài nguyên dựa trên nhu cầu thực tế và các điều kiện kinh doanh cụ thể,
đồng thời giảm thiểu thời gian chậm trễ và tối ưu hóa chi phí.

Giải quyết thách thức này đòi hỏi việc sâu rộng về cách thức hoạt động của
Kubernetes, cũng như hiểu biết về các công cụ và chiến lược mở rộng tự động như
Horizontal Pod Autoscaler (HPA), Vertical Pod Autoscaler (VPA),... Mục tiêu cuối
cùng là xây dựng một hệ thống có khả năng tự động điều chỉnh tài nguyên dựa trên các
yêu cầu thực tế một cách chính xác và kịp thời, tối ưu hóa việc sử dụng tài nguyên và
cung cấp trải nghiệm người dùng không bị gián đoạn.

Phần còn lại của khóa luận có cấu trúc như sau.....

1.2. Tổng quan về Container và Docker


Trong thế giới phát triển phần mềm hiện đại, việc đảm bảo rằng ứng dụng chạy
một cách nhất quán và hiệu quả trong mọi môi trường từ phát triển đến sản xuất là cực
kỳ quan trọng. Để đạt được mục tiêu này, công nghệ Container đã thay đổi cách chúng
ta triển khai và quản lý ứng dụng.

Thông qua việc áp dụng công nghệ container các công cụ như Docker hay
Containerd, các tổ chức và doanh nghiệp có thể đạt được mức độ tự động hóa và linh
hoạt cao, giúp tăng tốc độ triển khai ứng dụng và cải thiện khả năng sẵn sàng của hệ
thống. Điều này không chỉ mang lại lợi ích cho đội ngũ phát triển và vận hành mà còn
cải thiện trải nghiệm người dùng cuối bằng cách đảm bảo rằng ứng dụng luôn có sẵn,
hiệu quả và an toàn.

1.2.1. Công nghệ Container & Containerization

Container là một môi trường ảo nhẹ, cung cấp cô lập cho mỗi ứng dụng hoặc
dịch vụ. Mỗi container chạy một ứng dụng và tất cả phụ thuộc của nó trong một không
gian người dùng riêng biệt. Các container chia sẻ cùng một hệ điều hành với hệ thống
máy chủ và các container khác, nhưng chúng được cô lập về mặt tài nguyên và quá

13
trình. Điều này giúp giảm đáng kể lượng tài nguyên cần thiết so với việc chạy các ứng
dụng trên máy ảo riêng biệt, vì không cần phải khởi động một hệ điều hành đầy đủ cho
mỗi ứng dụng.

Containerization là quá trình sử dụng container để đóng gói ứng dụng và mọi
thứ cần thiết để chạy ứng dụng đó (bao gồm mã, thư viện, công cụ, tệp cấu hình và
biến môi trường) vào một gói độc lập. Điều này giúp đảm bảo rằng ứng dụng chạy một
cách nhất quán và đáng tin cậy trên bất kỳ môi trường tính toán nào, từ máy phát triển
địa phương đến môi trường sản xuất trên đám mây. Quá trình containerization đã cách
mạng hóa cách chúng ta triển khai phần mềm, cho phép việc triển khai nhanh chóng,
dễ dàng và linh hoạt hơn nhiều so với trước đây.

Những lợi ích của Containerization:

 Nhất quán & Di động: Containers đảm bảo rằng ứng dụng chạy một cách nhất quán
trong mọi môi trường, từ máy phát triển địa phương đến máy chủ trong môi trường
sản xuất.

 Tối ưu hóa Tài nguyên: Do chia sẻ hệ điều hành máy chủ, containers sử dụng ít tài
nguyên hơn so với máy ảo, cho phép khả năng mở rộng và sử dụng hiệu quả tài
nguyên hệ thống.

 Cô Lập & An toàn: Mỗi container cô lập với nhau và với hệ thống máy chủ, giúp cải
thiện bảo mật và giảm nguy cơ xung đột giữa các ứng dụng.

 Phát triển & Triển khai Nhanh chóng: Containerization giúp đơn giản hóa quá
trình CI/CD, cho phép phát triển và triển khai ứng dụng nhanh chóng và dễ dàng.

14
1.2.2. Tổng quan về Docker
Docker là một công cụ phần mềm mã nguồn mở dùng để tự động hóa việc triển
khai ứng dụng dưới dạng Containerized, cho phép chúng chạy trên bất kỳ hệ thống
Linux nào cũng như cung cấp hỗ trợ cho Windows. Docker sử dụng tính năng cô lập
tài nguyên của hạt nhân Linux, như cgroups và không gian tên, để tạo và quản lý
container.

Các khái niệm liên quan:

 Docker Engine: Là một ứng dụng server - client bao gồm một dịch vụ máy chủ là
một tiến trình daemon; một API xác định cách ứng dụng và dịch vụ nói chuyện
với nhau; và một client CLI (Docker CLI).

 Docker Images: Là một bản mẫu chỉ đọc dùng để tạo ra Docker container. Một
image chứa tất cả cần thiết để chạy một ứng dụng, bao gồm mã ứng dụng, một
runtime, thư viện, biến môi trường, và file cấu hình.

 Docker Containers: Là thực thể chạy của một Docker image. Container là nơi
ứng dụng thực sự chạy và thực hiện. Chúng có thể được bắt đầu, dừng, di chuyển,
và xóa.

 Docker CLI: cung cấp một loạt các lệnh cho phép người dùng tạo, chạy, và quản
lý Docker containers và images.

 Dockerfile: là một file văn bản không định dạng chứa tất cả các lệnh mà người
dùng có thể gọi từ dòng lệnh để tạo một image. Bằng cách sử dụng Dockerfile,
người dùng có thể tự động hóa quá trình tạo Docker image.

 Docker Compose là một công cụ giúp định nghĩa và chạy các ứng dụng Docker
đa-container. Với Docker Compose, bạn sử dụng một file YAML để cấu hình dịch
vụ của mình. Sau đó, với một lệnh đơn giản, bạn tạo và bắt đầu tất cả các dịch vụ
từ cấu hình của mình.

 Docker Hub: là một dịch vụ registry cung cấp cho người dùng khả năng chia sẻ
và quản lý Docker images công cộng hoặc riêng tư. Nó giống như GitHub nhưng
dành cho Docker images.
15
 Docker Registry: là một ứng dụng máy chủ lưu trữ và phân phối Docker images.
Người dùng có thể lưu trữ images trên registry riêng của họ hoặc sử dụng Docker
Hub.

Quy trình của một hệ thống sử dụng Docker:

Hình 1. Quy trình của hệ thống sử dụng Docker

 Build: Đầu tiên tạo một Dockerfile, là một hướng dẫn tuần tự dành cho Docker
chứa các bước đóng gói & khởi tạo ứng dụng từ source code. Dockerfile này sẽ
được build tại một máy tính đã cài đặt Docker Engine. Sau khi build, một Docker
Image sẽ được tạo ra. Docker Image này chứa ứng dụng kèm bộ thư viện.

 Push: Sau khi có được Docker Image, thực hiện push Docker Image này lên một
Docker Registry và lưu tại đó.

 Pull & Run: Nếu một máy tính khác đã cài Docker Engine muốn sử dụng Docker
Image thì bắt buộc máy phải thực hiện việc pull Docker Image. Sau đó thực hiện
Run Container từ Image đó.

16
1.3. Khái niệm Container Ochestration & Kubernetes
Trong khi Docker đã cách mạng hóa việc đóng gói và triển khai ứng dụng thông
qua container, nó bắt đầu gặp hạn chế khi xử lý các ứng dụng lớn và phức tạp cần
được triển khai trên quy mô lớn. Docker tập trung vào việc container hóa và chạy
container một cách hiệu quả, nhưng không giải quyết vấn đề về việc tự động quản lý,
mở rộng, và điều phối các container trong môi trường sản xuất đa dạng và phân tán.

Kubernetes xuất hiện như một giải pháp cho những hạn chế này, cung cấp một
nền tảng mạnh mẽ cho việc tự động hóa việc triển khai, mở rộng và quản lý ứng dụng
containerized. Với khả năng quản lý cụm container, tự động phục hồi, và mở rộng dựa
trên tải, Kubernetes không chỉ giải quyết những hạn chế của Docker mà còn mở ra cơ
hội mới cho việc triển khai ứng dụng quy mô lớn một cách linh hoạt và hiệu quả.

1.3.1. Khái niệm Container Orchestration

Container Orchestration là quá trình tự động hóa việc triển khai, quản lý, mở
rộng, và điều phối hoạt động của các container. Khi ứng dụng dựa trên container trở
nên phức tạp và phải được triển khai trên nhiều máy chủ, việc quản lý chúng một cách
thủ công trở nên không khả thi. Container orchestration giúp giải quyết vấn đề này
bằng cách cung cấp các công cụ để quản lý cuộc sống của container ở quy mô lớn.

Tại sao cần Container Orchestration?

 Quản lý quy mô: Khi ứng dụng của bạn cần phải chạy trên hàng trăm hoặc hàng
ngàn container, việc quản lý chúng một cách thủ công là không thể.

 Tối ưu hóa tài nguyên: Orchestration giúp đảm bảo rằng container được lập kế
hoạch (scheduled) trên các máy chủ với sự tối ưu hóa tài nguyên, giảm thiểu lãng
phí.

 Tự động hóa triển khai: Tự động hóa việc triển khai và cập nhật ứng dụng mà
không gây gián đoạn dịch vụ.

17
 Tự phục hồi: Tự động phục hồi các container thất bại, đảm bảo ứng dụng luôn
online và hoạt động.

 Mở rộng dễ dàng: Cho phép tự động mở rộng (scale out/in) ứng dụng dựa trên
nhu cầu sử dụng tài nguyên hoặc lưu lượng truy cập.

Container Orchestration giúp quản lý vòng đời của Container, bao gồm việc triển
khai, cập nhật, mở rộng quy mô, và loại bỏ các Container. Nó cũng đảm bảo rằng các
Container có sự cô lập tài nguyên cần thiết, được kết nối mạng đúng cách và có khả
năng chịu lỗi cao bằng cách tự động hóa việc lập lịch chạy Container, cân bằng tải, và
quản lý tài nguyên, container orchestration giúp giảm thiểu thời gian downtime và tối
ưu hóa việc sử dụng tài nguyên.

Những công cụ orchestration như Kubernetes, Docker Swarm, và Apache Mesos


đã trở nên phổ biến, mỗi công cụ có những đặc điểm và lợi ích riêng, phù hợp với nhu
cầu và môi trường triển khai khác nhau. Kubernetes, đặc biệt, đã trở thành giải pháp
hàng đầu trong việc quản lý container trên quy mô lớn, cung cấp một hệ thống đầy đủ
tính năng và linh hoạt, cho phép các doanh nghiệp triển khai ứng dụng một cách nhanh
chóng và dễ dàng mở rộng quy mô theo nhu cầu.

1.3.2. Giới thiệu về Kubernetes


Kubernetes, còn được gọi là K8s, là một công cụ Container Orchestration mã
nguồn mở, được thiết kế để tự động hóa việc triển khai, mở rộng, và quản lý các ứng
dụng containerized. Phát triển bởi Google và sau đó được Cloud Native Computing
Foundation (CNCF) quản lý, Kubernetes đã trở thành tiêu chuẩn ngành cho việc quản
lý container trên quy mô lớn, cung cấp một cách linh hoạt và mạnh mẽ để quản lý các
tải công việc và dịch vụ trong môi trường đám mây hoặc on - premise.

Những điểm nổi bật của Kubernetes:

 Khả năng tự động hóa và tự phục hồi: Kubernetes tự động triển khai và mở
rộng ứng dụng dựa trên các yêu cầu tài nguyên và sử dụng các chính sách để khắc
phục sự cố, đảm bảo ứng dụng luôn ổn định và khả dụng.

18
 Khả năng mở rộng: Hỗ trợ mở rộng quy mô ứng dụng một cách linh hoạt, cho
phép tự động tăng hoặc giảm số lượng replicas của ứng dụng dựa trên lưu lượng
sử dụng thực tế, giúp tối ưu hóa chi phí và hiệu suất.

 Quản lý tài nguyên đa dạng: Kubernetes cho phép quản lý một loạt tài nguyên
container, từ microservices đơn lẻ đến nhóm ứng dụng phức tạp, trên một cơ sở hạ
tầng chung, giúp tối ưu hóa sử dụng tài nguyên và đơn giản hóa quy trình vận
hành.

 Tính di động và độc lập với cơ sở hạ tầng: Kubernetes giúp container hoạt động
độc lập với cơ sở hạ tầng, hỗ trợ triển khai ứng dụng trên mọi môi trường đám
mây công cộng, riêng tư, hoặc hybrid, cũng như trên máy chủ vật lý, đảm bảo tính
di động cao cho ứng dụng.

 Cộng đồng mạnh mẽ và hỗ trợ rộng rãi: Kubernetes được hỗ trợ bởi một cộng
đồng người dùng và nhà phát triển đông đảo, cung cấp một lượng lớn tài liệu
hướng dẫn, công cụ, và plugins để tăng cường khả năng và tính năng của hệ
thống.

1.3.3. Kiến trúc của Kubernetes

Kiến trúc Kubernetes được thiết kế để quản lý các ứng dụng Containerized trong
môi trường phân tán. Về cốt lõi, Kubernetes tuân theo kiến trúc phi tập trung giúp điều
phối hiệu quả cơ sở hạ tầng điện toán, mạng và lưu trữ thay cho khối lượng công việc
của người dùng. Kiến trúc này được tạo thành từ một số thành phần chính được tổ
chức trên các Master node và Worker node, đảm bảo thực thi liền mạch các ứng dụng
Containerized.

Kiến trúc của một cụm máy chủ Kubernetes (Kubernetes Cluster):

19
Hình 2. Kiến trúc của cụm máy chủ Kubernetes (Kubernetes Cluster)

Master Node: Đóng vai trò là bộ não điều khiển trung tâm của Kubernetes Cluster,
quản lý trạng thái và hoạt động của cụm.

 API Server: Là cổng giao tiếp chính với cụm Kubernetes, xử lý tất cả các yêu cầu
API và quản lý các đối tượng Kubernetes như Pods, Services, v.v.

 etcd: Là cơ sở dữ liệu dạng key-value lưu trữ tất cả dữ liệu cấu hình của cụm, bao
gồm trạng thái và thông tin metadata.

 Scheduler: Chịu trách nhiệm lên lịch các pods để chúng chạy trên các nút Worker
dựa trên tài nguyên có sẵn và các yêu cầu của pods.

 Controller - Manager: Điều khiển các bộ điều khiển nền, đảm bảo các đối tượng
trong cụm phản ánh đúng trạng thái mong muốn.

Worker Node: Là nơi các ứng dụng thực sự được chạy dưới dạng Container.

 Kubelet: Là một agent chạy trên mỗi nút Worker, quản lý các pods và containers
mà nó được giao.

20
 Kube-proxy: Quản lý mạng cho containers bằng cách duy trì các quy tắc mạng
trên nút và thực hiện việc chuyển tiếp lưu lượng.

 Container Runtime: Phần mềm chạy containers, Docker là một trong những
runtime phổ biến nhưng Kubernetes cũng hỗ trợ các runtime khác như containerd
và CRI-O.

1.3.4. Một số khái niệm chính trong Kubernetes

Kubernetes là một hệ thống phức tạp với nhiều khái niệm cốt lõi quan trọng. Dưới
đây là một số khái niệm chính trong Kubernetes mà bạn cần biết để hiểu rõ hơn về
cách thức hoạt động của nó:

 Pods: Là đơn vị cơ bản nhất của Kubernetes, chứa một hoặc nhiều containers chạy
cùng nhau. Mỗi Pod có một địa chỉ IP chung và các container trong Pod có thể
chia sẻ tài nguyên mạng và lưu trữ.

 Services: Là một cách để các ứng dụng chạy trên các Pods có thể tiếp xúc với thế
giới bên ngoài hoặc các ứng dụng khác trong cụm Kubernetes. Services định nghĩa
một bộ quy tắc để truy cập các Pods.

 Workloads: Tham chiếu đến các nhiệm vụ hoặc tác vụ mà hệ thống cần thực hiện,
thường là chạy các ứng dụng Containerized. Có một số những Workloads rất phổ
biến trong Kubernetes như Deployments, StatefulSets, và DaemonSets.

 Network: Điều khiển việc truy cập mạng vào các pods từ mạng ngoại vi hoặc các
nodes khác trong cluster. Trong Kubernetes có Kube-Proxy để thực hiện điều phối
mạng.

 Storage: Xử lý việc lưu trữ cho các tài nguyên ứng dụng trong Kubernetes, bao
gồm Volumes, Persistent Volumes (PVs) và Persistent Volumes Claims (PVCs).

21
1.4. Quản lý tài nguyên trong Kubernetes
Kubernetes quản lý tài nguyên thông qua một hệ thống phức tạp nhưng linh hoạt,
cho phép cấp phát và sử dụng tài nguyên một cách hiệu quả. Trong môi trường
Kubernetes, việc quản lý tài nguyên chủ yếu tập trung vào CPU và bộ nhớ (RAM),
đồng thời cung cấp khả năng lên lịch, giới hạn và yêu cầu (limits và requests) cho các
container.

Khi triển khai một Container trong Kubernetes, người dùng có thể chỉ định
"requests" (yêu cầu) và "limits" (giới hạn) tài nguyên cho CPU và bộ nhớ:

 Requests: Là lượng tài nguyên tối thiểu mà Kubernetes đảm bảo cung cấp cho
container. Nó được sử dụng bởi Kubernetes khi lên lịch (scheduling) containers
trên một node. Nếu một container cần nhiều tài nguyên hơn mức "request", nó có
thể sử dụng nhiều hơn miễn là các tài nguyên đó không được container khác yêu
cầu.

 Limits: Định nghĩa lượng tài nguyên tối đa mà một container có thể sử dụng. Nếu
một container sử dụng nhiều tài nguyên hơn "limit", nó có thể bị Kubernetes giết
chết và khởi động lại tùy thuộc vào chính sách của cụm.

Trong Kubernetes, đơn vị của CPU được tính bằng "millicores". Một core CPU
trong Kubernetes tương đương với một vCPU/Core trên hầu hết các nhà cung cấp dịch
vụ đám mây và một core CPU vật lý hoặc luồng trên phần cứng máy chủ. Dưới đây là
một ví dụ về chỉ định "request" và "limit" dành cho CPU:

 Requests: Đặt requests CPU cho container là quyết định số millicores tối thiểu
mà container đó cần có. Ví dụ, nếu đặt requests: 250m, điều này nghĩa là
container cần 0.25 cores để chạy.

 Limits: Đặt limits CPU là cách để xác định số millicores tối đa mà container có
thể sử dụng. Nếu container cố gắng sử dụng nhiều hơn, nó sẽ bị hạn chế. Ví dụ,
nếu đặt limits: 1000m, container không thể sử dụng quá 1 core.

22
Bộ nhớ trong Kubernetes được tính bằng bytes nhưng thường được chỉ định bằng
các đơn vị như MiB (Mebibytes), GiB (Gibibytes). Dưới đây là một ví dụ về chỉ định
"request" và "limit" dành cho bộ nhớ:

 Requests: Đặt requests bộ nhớ cho container là quyết định lượng bộ nhớ tối thiểu
cần thiết cho container. Điều này đảm bảo Kubernetes sẽ lên lịch container trên
một node với ít nhất lượng bộ nhớ này có sẵn. Ví dụ: requests: 256Mi chỉ định
rằng container cần 256 Mebibytes bộ nhớ.

 Limits: Đặt limits bộ nhớ là cách để xác định lượng bộ nhớ tối đa mà container có
thể sử dụng. Nếu container cố gắng sử dụng nhiều hơn lượng này, nó có thể bị
Kubernetes kết thúc. Ví dụ: limits: 1Gi chỉ định rằng container không được sử
dụng quá 1 Gibibyte bộ nhớ.

Kubernetes sử dụng Kube-scheduler để quyết định nút (node) nào trong cụm sẽ
chạy một pod mới. Scheduler quyết định dựa trên nhiều yếu tố, bao gồm yêu cầu tài
nguyên của pod, yêu cầu về tương thích phần cứng/phần mềm, chính sách cụm
(Cluster Policy), workload trên các nodes, v.v...

Kubelet trên mỗi node giám sát "limits" và "requests" của tài nguyên để đảm bảo
containers không tiêu thụ quá nhiều tài nguyên. Nó kiểm soát containers để chúng
không vượt quá giới hạn đã đặt và quản lý tài nguyên sao cho phù hợp với yêu cầu đã
khai báo.

Quản lý tài nguyên chặt chẽ thông qua "requests" và "limits" giúp tối ưu hóa việc
sử dụng tài nguyên trong cụm, bảo đảm rằng các ứng dụng và dịch vụ có đủ tài nguyên
cần thiết để hoạt động mà không làm ảnh hưởng đến các ứng dụng khác. Điều này tạo
điều kiện cho việc chia sẻ tài nguyên một cách hiệu quả giữa các ứng dụng, cải thiện
độ ổn định và hiệu suất của hệ thống.

Qua việc đặt "requests" và "limits", Kubernetes cung cấp khả năng điều chỉnh
linh hoạt, cho phép các nhà phát triển và quản trị viên tối ưu hóa sử dụng tài nguyên
dựa trên nhu cầu thực tế của ứng dụng và môi trường vận hành, từ đó tăng cường hiệu
suất và tính sẵn sàng của ứng dụng.

23
1.5. Cơ chế tự mở rộng trong Kubernetes
"Tự mở rộng" (Auto-scaling) trong Kubernetes là khả năng tự động điều chỉnh quy mô
của ứng dụng dựa trên nhu cầu thực tế của hệ thống. Điều này bao gồm cả việc tăng số lượng
bản sao của ứng dụng (pods) để xử lý tải công việc tăng lên và giảm số lượng bản sao khi nhu
cầu giảm đi , nhằm đảm bảo hiệu quả và tối ưu hoá chi phí sử dụng tài nguyên cho các nhà phát
triển. Tự mở rộng là một cơ chế thông minh mà thông qua đó, Kubernetes có thể tự động phát
hiện khi ứng dụng của bạn cần thêm tài nguyên (ví dụ: CPU hoặc bộ nhớ) hoặc có thể hoạt
động hiệu quả với ít tài nguyên hơn. Điều này giúp ứng dụng luôn chạy mượt mà dù cho lưu
lượng truy cập có biến đổi.

Tự mở rộng giúp đảm bảo rằng ứng dụng luôn có đủ tài nguyên để hoạt động ổn
định, đồng thời giúp quản trị viên cụm không phải thường xuyên can thiệp vào quá
trình cấp phát tài nguyên. Qua đó, Kubernetes giúp cải thiện độ tin cậy và khả năng
sẵn sàng của ứng dụng, đồng thời tối ưu hóa chi phí vận hành bằng cách sử dụng tài
nguyên một cách thông minh.

Kubernetes cung cấp sẵn hai cơ chế tự động mở rộng quan trọng là Horizontal
Pod Autoscaler (HPA) và Vertical Pod Autoscaler (VPA). Mỗi cơ chế này có phương
thức tiếp cận riêng trong việc điều chỉnh quy mô ứng dụng để đáp ứng nhu cầu tài
nguyên thay đổi.

24
1.6. Các kỹ thuật tối ưu hoá tài nguyên

25
26
Chương 2

Xây dựng giải pháp mở rộng tuỳ


biến cho ứng dụng
2.1. Tổng quan về phương pháp đề xuất
Chương này của khoá luận trình bày việc đề xuất và triển khai giải pháp sử dụng
Horizontal Pod Autoscaler (HPA) cho một ứng dụng mẫu trên Kubernetes, đã được cài
đặt trên ba máy ảo của Google Cloud. Bắt đầu bằng việc thiết lập cluster Kubernetes và
sau đó triển khai ứng dụng mẫu, đồng thời đóng gói và quản lý các images của ứng dụng
trên Docker Hub.

Để giám sát và tối ưu hóa hiệu suất của ứng dụng, chúng tôi đã triển khai
Prometheus và Grafana. Prometheus được sử dụng để thu thập dữ liệu hiệu suất và sử
dụng tài nguyên, trong khi Grafana cho phép chúng tôi tạo các dashboard trực quan để
theo dõi các metrics quan trọng. Sự kết hợp này không chỉ cung cấp cái nhìn sâu sắc về
tình trạng hoạt động của ứng dụng mà còn là nền tảng để cấu hình HPA một cách chính
xác.

HPA được thiết lập để tự động điều chỉnh số lượng pod dựa trên tải hệ thống hiện
tại, giúp ứng dụng có thể mở rộng lên hoặc thu nhỏ lại tùy thuộc vào nhu cầu thực tế.
Bằng cách này, ứng dụng luôn có đủ nguồn lực để xử lý yêu cầu mà không gây lãng phí.
Qua giải pháp này, chúng tôi nhằm mục tiêu đạt được hiệu quả cao trong việc vận hành
và duy trì sự ổn định cho ứng dụng, đồng thời tối ưu hóa chi phí sử dụng tài nguyên.

27
2.2. Kiến trúc tổng quan
Sau đây là kiến trúc tổng quan của giải pháp tự động mở rộng trong Kubernetes
được xây dựng để đáp ứng linh hoạt với các yêu cầu tài nguyên thay đổi của ứng dụng.
Trung tâm của giải pháp này là Horizontal Pod Autoscaler (HPA), một thành phần
quan trọng cho phép tự động điều chỉnh số lượng Pods dựa trên các chỉ số hiệu suất
như CPU và bộ nhớ.

Hình 3. Kiến trúc tổng quan của giải pháp

Các Thành Phần Chính

1. Horizontal Pod Autoscaler (HPA)

 Được kết nối với API Server của Kubernetes, HPA theo dõi và điều chỉnh
số lượng replicas trong ReplicaSet dựa trên các metrics định trước.

2. Deployment

 Các Deployments trong Kubernetes quản lý việc triển khai các ứng dụng
container hóa và đảm bảo rằng ứng dụng chạy với số lượng replicas xác
định.

3. ReplicaSet

 Là nhóm của các Pods giống hệt nhau, ReplicaSet đảm bảo rằng số lượng
Pods cần thiết luôn được duy trì trong cluster.

28
4. Pods

 Là đơn vị cơ bản nhất của Kubernetes, Pods chứa một hoặc nhiều
containers chạy ứng dụng của bạn.

5. Metrics Server

 Thu thập thông tin về tài nguyên từ mỗi Pod thông qua Kubelet và cung
cấp thông tin này cho HPA.

6. Prometheus Adapter

 Là một cầu nối giữa Prometheus và Metrics Server, Adapter này cho phép
HPA sử dụng dữ liệu từ Prometheus để thực hiện các quyết định tự động
mở rộng.

7. Prometheus

 Hệ thống giám sát và cảnh báo mạnh mẽ, thu thập và lưu trữ metrics theo
thời gian thực từ ứng dụng và cơ sở hạ tầng của bạn.

8. Grafana

 Công cụ để hiển thị dữ liệu từ Prometheus, cho phép người dùng tạo bảng
điều khiển và biểu đồ để trực quan hóa và phân tích các metrics.

29
2.3. Quy trình tự động mở rộng của hệ thống

2.3.1. Thu thập Metrics

Quy trình thu thập Metrics trong Kubernetes bắt đầu với Kubelet - Agent quản lý
tại mỗi node, thu thập thông tin về sử dụng tài nguyên từ các pods. Kubelet sử dụng
cAdvisor, một công cụ phân tích tài nguyên container được tích hợp sẵn, để thu thập
thông tin về sử dụng CPU, bộ nhớ, cũng như các chỉ số tài nguyên khác như lưu lượng
mạng và sử dụng đĩa.

Metrics Server, chạy ở cấp độ cluster, nhận dữ liệu từ Kubelet và là nơi tập trung
metrics tài nguyên. Nó không giữ dữ liệu lâu dài mà chỉ lưu giữ các thông tin cần thiết
để cung cấp cho các quyết định tự động mở rộng qua HPA. Metrics Server cung cấp
cái nhìn tổng quan về sử dụng tài nguyên hiện tại của cụm, nhưng bản thân nó không
thể thực hiện quyết định tự mở rộng.

Đối với các dữ liệu tài nguyên cụ thể hơn hoặc khi cần metrics tùy chỉnh,
Prometheus thường được sử dụng như một lớp giám sát bổ sung. Prometheus có khả
năng thu thập và lưu trữ dữ liệu metrics lịch sử và thời gian thực từ các pods và dịch
vụ trong cluster. Để tích hợp dữ liệu từ Prometheus vào quy trình tự động mở rộng,
Prometheus Adapter được sử dụng để chuyển đổi metrics từ Prometheus sang định
dạng có thể được Kubernetes sử dụng qua Custom Metrics API. Điều này mở rộng khả
năng của HPA, cho phép nó sử dụng nhiều dữ liệu phức tạp hơn như lưu lượng mạng
chi tiết và số lượng yêu cầu trên giây (RPS) để đưa ra quyết định tự mở rộng quy mô
một cách chính xác.

Quy trình này đảm bảo rằng HPA có đủ thông tin để xử lý một cách linh hoạt các
biến động về nhu cầu tài nguyên, giúp ứng dụng duy trì hiệu suất ổn định và chi phí
được tối ưu hóa.

30
Hình 4. Quy trình thu thập Metrics của HPA

Đánh giá và thực hiện việc điều chỉnh (Mở rộng/Thu hẹp)

Đây là bước nơi Horizontal Pod Autoscaler (HPA) phân tích dữ liệu thu thập
được và đưa ra quyết định về việc cần phải tăng hay giảm số lượng pods dựa trên
Metrics đã định nghĩa.

31
Sau khi Metrics Server và Prometheus Adapter cung cấp dữ liệu metrics, HPA
tiến hành đánh giá nhu cầu tài nguyên bằng cách so sánh sử dụng tài nguyên hiện tại
với ngưỡng được đặt ra. Đối với CPU, việc này thường dựa trên tỷ lệ phần trăm sử
dụng so với số lượng CPU được yêu cầu cho pod. Nếu metrics hiện tại vượt qua
ngưỡng đã định, HPA sẽ xác định rằng có nhu cầu mở rộng.

Quá trình thực hiện tự mở rộng được chia làm 3 bước như sau:

 Bước 1: Thu thập Metrics

Hình 5 Cách HPA thu thập Metrics

32
Đầu tiên, cAdvisor (một component thuộc Kubelet tại mỗi Worker Node) sẽ thu
thập thông số của các pods trong Worker Node và của chính Node đó. Sau đó, Kubelet
sẽ gửi những thông số đó về Metrics Server. Horizontal Controller sau đó sẽ lấy những
thông số đó từ Metrics Server.

 Bước 2: Tính toán số lượng Pod cần thiết

Sau khi có đầy đủ thông số, Horizontal Controller sẽ tính toán số lượng Replicas
cần thiết từ những thông số trên theo một công thức nhất định có dạng như sau:

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

Trong đó, desiredReplicas là lượng Replicas cần thiết, currentMetricValue là giá trị
thông số hiện tại, desiredMetricValue là giá trị thông số mong muốn.

Khi HPA chỉ cấu hình theo một thông số nhất định, việc tính toán desiredReplicas sẽ
chỉ sử dụng công thức như trên. Ví dụ giá trị currentMetricValue hiện tại là 200Mi,
desiredMetricValue là 100Mi, currentReplicas là 2, ta có:

desiredReplicas = ceil [2 * (200/100)] = 4

Khi HPA cấu hình cho nhiều thông số khác nhau, Horizontal Controller sẽ áp dụng
công thức trên cho từng thông số riêng lẻ rồi lấy desiredReplicas mới nhất:

finalReplicas = max(desriedReplicas1, desiredReplicas2,...)

Ví dụ, desiredReplicas của thông số CPU là 4, của Queries-Per-Second là 3, thì số


lượng Replicas được chọn là 4.

33
Hình 6 Cách tính số lượng Replicas

 Bước 3: Cập nhật lại giá trị Replicas

Lúc này, Horizontal Controller sẽ cập nhật lại giá trị Replicas trong cấu hình của
Workload. Workload đó sẽ tự động tăng hoặc giảm số lượng Replicas hiện tại theo giá
trị mới cập nhật.

Quyết định mở rộng/thu hẹp quy mô không chỉ dựa trên sự vượt ngưỡng của một
Metric cụ thể mà còn dựa trên hành vi trong một khoảng thời gian, tránh việc phản ứng
quá mức đối với các biến động nhất thời. HPA cũng tính đến 'cooldown period' sau
mỗi hành động điều chỉnh để tránh việc mở rộng và thu hẹp liên tục gây ảnh hưởng
đến ổn định của hệ thống.

Khi quyết định mở rộng quy mô được đưa ra, Kubernetes tiến hành tạo thêm
pods theo số lượng HPA chỉ định. Quá trình này bao gồm việc tạo ra các yêu cầu mới
đến ReplicaSet hiện tại, nơi điều khiển việc tạo ra các pods mới. Các pods mới sẽ được
lên lịch trên các nodes trong cluster có đủ tài nguyên để chạy chúng, và được cân nhắc
dựa trên các chính sách về tải công việc và affinity/anti-affinity nếu có.

Một khi các pods mới đã được tạo ra và bắt đầu hoạt động, chúng sẽ bắt đầu phục
vụ các yêu cầu và tăng khả năng xử lý của hệ thống. HPA sẽ tiếp tục theo dõi metrics
và thực hiện các điều chỉnh cần thiết, nếu cần, dựa trên lưu lượng công việc và sử dụng
tài nguyên hiện tại.

34
HPA tự động điều chỉnh số lượng pods trong một workload có khả năng mở rộng
như Deployment, ReplicaSet, hoặc StatefulSet dựa trên việc quan sát các chỉ số hiệu
suất, thường là CPU hoặc lưu lượng mạng. HPA giúp ứng dụng duy trì hiệu suất ổn
định bằng cách tăng số lượng pods khi nhu cầu tài nguyên tăng lên và giảm số lượng
khi nhu cầu giảm xuống, qua đó tối ưu hóa chi phí vận hành.

2.3.2. Giám sát hiệu suất và sử dụng tài nguyên


Sau khi HPA điều chỉnh số lượng pods, việc theo dõi hiệu suất của ứng dụng và sử
dụng tài nguyên trở nên quan trọng. Điều này giúp xác nhận rằng các điều chỉnh đã
đem lại hiệu quả mong muốn và ứng dụng đang hoạt động trong tham số tài nguyên
được đặt ra. Các metrics như sử dụng CPU, bộ nhớ, lưu lượng mạng, và thời gian phản
hồi của ứng dụng được thu thập qua Prometheus và được trực quan hóa bằng Grafana.
Các bảng điều khiển Grafana cho phép các quản trị viên nhanh chóng nhận diện bất kỳ
vấn đề nào liên quan đến hiệu suất hoặc cấu hình tài nguyên không phù hợp.

Để đánh giá hiệu quả của các hoạt động tự động mở rộng, cần phải phân tích liệu
các thay đổi quy mô có giúp đáp ứng nhu cầu tài nguyên dự kiến hay không. Nếu hiệu
suất và sự ổn định của ứng dụng không được cải thiện, hoặc nếu chi phí tài nguyên trở
nên quá cao, có thể cần phải điều chỉnh các ngưỡng hoặc chính sách của HPA. Các kết
quả từ việc giám sát và đánh giá có thể dẫn đến việc tối ưu hóa thêm dựa vào các tiêu
chí sau:

 Điều Chỉnh Ngưỡng HPA: Dựa trên dữ liệu, ngưỡng cho HPA có thể cần được
điều chỉnh để cải thiện quyết định tự động mở rộng.

 Cân Nhắc Cooldown Period: Khoảng thời gian giữa các hành động mở rộng
cũng có thể cần được điều chỉnh để tránh việc mở rộng liên tục không cần thiết.

Quá trình giám sát không chỉ là một phần của bảo trì sau mở rộng mà còn là một
chu kỳ liên tục của việc tối ưu hóa và cải tiến. Dữ liệu từ quá trình giám sát cung cấp
thông tin cần thiết để liên tục cải thiện cách thức và hiệu quả của tự động mở rộng.
Điều này đòi hỏi sự tham gia chủ động từ các nhóm phát triển và vận hành để phân
tích, diễn giải dữ liệu và triển khai các chiến lược cải tiến.
35
Qua từng bước này, tự động mở rộng trở thành một phần không thể thiếu của quản
lý hiệu suất và chi phí trong môi trường Kubernetes, đảm bảo rằng ứng dụng có thể
phản ứng nhanh chóng và hiệu quả với mọi thay đổi trong nhu cầu sử dụng.

36
37
Chương 3

Cài đặt và thực nghiệm

3.1. Cài đặt môi trường


Giải pháp tự mở rộng tuỳ biến trên môi trường Kubernetes được triển khai trên
một cụm Kubernetes được cấp bởi Google Cloud Platform và được tài trợ bởi Google
Cloud Platform dành cho sinh viên thuộc Đại học Công Nghệ - ĐQGHN. Cụm máy
chủ bao gồm ba Node, mỗi node được cài đặt trên một máy ảo Ubuntu riêng biệt. Cụm
này được thiết kế để tối ưu hóa tính sẵn sàng và phân tán tải, giúp đảm bảo hoạt động
ổn định và hiệu suất cao cho các ứng dụng được triển khai. Google Cloud Platform
cung cấp cơ sở hạ tầng đám mây mạnh mẽ, bảo mật và linh hoạt, khả năng mở rộng dễ
dàng và quản lý tài nguyên hiệu quả, phù hợp cho mọi nhu cầu từ phát triển đến sản
xuất.

38
3.1.1. Cài đặt Kubernetes

Để có Kubernetes Cluster, người dùng cần cài đặt Kubernetes trên từng Node rồi
kết nối giữa các Node với nhau. Trong đó có 1 Node Master và 2 Node Worker. Sau
đây là cách cài đặt cho từng loại Node:

Cách cài đặt Kubernetes cho các Node:

 Bước 1: Cập nhật hệ thống và cài đặt các gói cần thiết

sudo apt update

sudo apt upgrade -y

sudo apt install -y apt-transport-https curl

 Bước 2: Thêm Kubernetes GPG Key và Repository

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee


/etc/apt/sources.list.d/kubernetes.list

 Bước 3: Cài đặt Containerd

sudo apt install -y containerd

 Bước 4: Cấu hình Containerd

# Tạo một cấu hình mặc định cho Containerd

sudo mkdir -p /etc/containerd

sudo containerd config default | sudo tee /etc/containerd/config.toml

# Sau đó, chỉnh sửa file cấu hình /etc/containerd/config.toml để kích hoạt plugin
CRI nếu nó chưa được kích hoạt:

sudo nano /etc/containerd/config.toml


39
# Đảm bảo rằng disabled_plugins = [] không chứa "cri", và dòng sau đó được
uncomment:

[plugins."io.containerd.grpc.v1.cri"]

# Khởi động lại Containerd để áp dụng cấu hình

sudo systemctl restart containerd

 Bước 5: Cài đặt Kubelet, Kubeadm và Kubectl

sudo apt update

sudo apt install -y kubelet kubeadm kubectl

sudo apt-mark hold kubelet kubeadm kubectl

 Bước 6: Khởi tạo và tham gia Cluster

# (Dành cho Master Node) Khởi tạo Kubernetes Cluster bằng kubeadm

sudo kubeadm init --kubernetes-version=v1.28.0 --pod-network-cidr=10.244.0.0/16

# (Dành cho Worker Node) Tham gia Kubernetes Cluster bằng kubeadm (Lệnh join
sẽ có sẵn khi tạo Kubernetes Cluster cho Master Node thành công

sudo kubeadm join 10.148.0.6:6443 --token 6hhzri.rl2bjymxbvigq3gp --discovery-


token-ca-cert-hash
sha256:6a054915012fcdbd962ef3170ae124b2c6f5ca4cb25d3116073677ce798e9e86

 Bước 7: Cấu hình kubectl cho người dùng không phải root

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

 Bước 8: Cài đặt hệ thống mạng để giao tiếp giữa các Pods (Calico)
40
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

 Bước 8: Cài đặt hệ thống mạng để giao tiếp giữa các Pods (Flannel)

kubectl apply -f
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-
flannel.yml

 Bước 9: Kiểm tra trạng thái của Kubectl trên từng Node

kubectl get pods

3.1.2. Cài đặt Metrics server

Dưới đây là cách cài đặt Metrics Server cho Kubernetes Cluster

 Bước 1: Kiểm tra trạng thái của Kubectl trên từng Node

kubectl get pods

 Bước 2: Tải và cài đặt Metrics Server từ Github Repository của Kubernetes

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/


download/components.yaml

 Bước 3: Xác minh cài đặt

kubectl get deployment metrics-server -n kube-system

 Bước 4: Xác minh cài đặt

kubectl get deployment metrics-server -n kube-system

 Bước 5: Kiểm tra trạng thái của Metrics Server

kubectl top nodes

41
42
3.1.3. Cài đặt Prometheus

Dưới đây là cách cài đặt Prometheus cho Kubernetes Cluster

 Bước 1: Kiểm tra trạng thái của Kubectl trên từng Node

kubectl get pods

 Bước 2: Tải và cài đặt Helm

# Tải Helm bằng lệnh sau:

curl -fsSL -o get_helm.sh


https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

# Cấp quyền cho file thực thi:

chmod 700 get_helm.sh

# Cài đặt helm thông qua file thực thi:

./get_helm.sh

# Kiểm tra tình trạng cài đặt

helm version

 Bước 3: Thêm Helm Repository cho Prometheus

helm repo add prometheus-community https://prometheus-community.github.io/helm-


charts

helm repo update

 Bước 4: Triển khai và cài đặt Prometheus

# Tạo namespace tên là monitoring dành cho Prometheus:

kubectl create namespace monitoring


43
# Cài đặt Prometheus trong namespace monitoring:

helm install prometheus prometheus-community/prometheus --namespace monitoring

 Bước 5: Kiểm tra trạng thái cài đặt của Prometheus

kubectl get svc - n monitoring

3.1.4. Cài đặt Prometheus Adapter

Dưới đây là cách cài đặt Prometheus Adapter cho Kubernetes Cluster

 Bước 1: Kiểm tra trạng thái của Kubectl trên từng Node

kubectl get pods

 Bước 2: Cài đặt Prometheus Adapter

helm install prometheus-adapter prometheus-community/prometheus-adapter \

--namespace monitoring \

--set prometheus.url=http://prometheus-server.prometheus.svc \

--set prometheus.port=9090

 Bước 5: Kiểm tra trạng thái cài đặt của Prometheus Adapter

kubectl get pods - n monitoring

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .

44
3.1.5. Cài đặt Grafana Dashboard

Chưa xong

3.1.6. Triển khai ứng dụng thử nghiệm

Chưa xong

3.1.7. Xây dựng kịch bản thử nghiệm

Chưa xong

45
3.2. Kết quả thực nghiệm
Chưa xong

3.3. Đánh giá

46
Kết luận

Khóa luận đã giới thiệu một...

47
Tài liệu tham khảo

Tiếng Việt

Tiếng Anh

48

You might also like