Đặt các yêu cầu và giới hạn phù hợp trong Kubernetes
Trong Kubernetes, việc xác định rõ các yêu cầu và giới hạn là điều vô cùng cần thiết. Hãy cùng Bizfly Cloud theo dõi việc đặt các yêu cầu và giới hạn phù hợp trong Kubernetes qua bài viết dưới đây.
Yêu cầu xác định số lượng tài nguyên tối thiểu vùng chứa cần
Nếu bạn cho rằng ứng dụng của mình yêu cầu ít nhất phải có 256MB bộ nhớ để hoạt động, thì đây chính là giá trị yêu cầu. Tuy nhiên, ứng dụng có thể sử dụng hơn 256MB và Kubernetes đảm bảo tối thiểu 256MB cho vùng chứa.
Mặt khác, các giới hạn xác định số lượng tài nguyên tối đa mà vùng chứa có thể sử dụng.
Ứng dụng của bạn có thể yêu cầu ít nhất 256MB bộ nhớ, nhưng bạn có thể muốn đảm bảo rằng nó không tiêu tốn quá 1GB bộ nhớ. Đây chính là giới hạn của bạn.
Lưu ý rằng ứng dụng của bạn có 256MB bộ nhớ được đảm bảo như thế nào, nhưng nó có thể tăng lên đến 1GB bộ nhớ. Sau đó, nó bị chặn lại hoặc điều chỉnh bởi Kubernetes.
Đặt giới hạn rất hữu ích để ngăn tài nguyên cam kết quá mức và bảo vệ các triển khai khác khỏi tình trạng thiếu tài nguyên.
Bạn có thể muốn ngăn một ứng dụng giả mạo sử dụng tất cả các tài nguyên có sẵn và chỉ để lại breadcrumbs cho phần còn lại của cụm.
Nếu các giới hạn được sử dụng để ngăn chặn các vùng chứa tham lam của bạn, thì yêu cầu là gì?
Các yêu cầu ảnh hưởng đến cách lập lịch nhóm trong Kubernetes
Khi một Pod được tạo, bộ lập lịch sẽ tìm các nút có thể chứa Pod đó.
Tuy nhiên, làm thế nào nó biết được cần bao nhiêu CPU và bộ nhớ? Khi ứng dụng vẫn chưa bắt đầu và trình lập lịch không thể kiểm tra việc sử dụng bộ nhớ và CPU tại thời điểm này.
Vậy các yêu cầu đến lúc này chính là bộ lập lịch đọc các yêu cầu cho từng vùng chứa trong Pod của bạn, tổng hợp chúng và tìm nút tốt nhất có thể phù hợp với Pod đó.
Hiểu CPU và bộ nhớ
Hãy tưởng tượng rằng bạn có một máy tính với một CPU duy nhất và muốn chạy ba thùng chứa trong đó.
Bạn có thể chỉ định một phần ba CPU cho mỗi - hoặc 33,33%.
Trong Kubernetes, CPU không được chỉ định theo phần trăm mà là hàng nghìn (còn được gọi là millicore hoặc millicpu).
Một CPU tương đương với 1000 millicore.
Nếu bạn muốn gán một phần ba CPU, bạn nên gán 333Mi (millicore) cho vùng chứa của mình.
Bộ nhớ đơn giản hơn một chút và nó được đo bằng byte.
Kubernetes chấp nhận cả ký hiệu SI (K, M, G, T, P, E) và ký hiệu nhị phân (Ki, Mi, Gi, Ti, Pi, Ei) để định nghĩa bộ nhớ.
Để giới hạn bộ nhớ ở 256MB, bạn có thể gán 268,4M (ký hiệu SI) hoặc 256Mi (ký hiệu nhị phân).
Kiểm tra và thu thập số liệu bằng máy chủ số liệu
Kubernetes có một số thành phần được thiết kế để thu thập các số liệu và có hai thành phần rất cần thiết không thể bỏ qua:
1. Các thu thập số liệu kubelet như CPU và bộ nhớ từ Pods.
2. Máy chủ số liệu thu thập và tổng hợp các số liệu từ tất cả các kubelet.
Khi bạn muốn biết mức sử dụng bộ nhớ và CPU cho nhóm của mình, bạn nên truy xuất dữ liệu từ máy chủ số liệu.
Ví dụ kiểm tra việc sử dụng CPU và bộ nhớ thực tế với máy chủ số liệu:
Hãy lấp đầy bộ nhớ bằng:
dd if=/dev/zero of=/dev/shm/fill bs=1k count=1024k
Và chúng ta hãy tăng CPU với một vòng lặp vô hạn:
while true; do true; done
Trong một thiết bị đầu cuối khác, hãy chạy lệnh sau để kiểm tra các tài nguyên được nhóm sử dụng:
kubectl top pods
NAME CPU(cores) MEMORY(bytes)
busybox 462m 64Mi
Từ đầu ra, bạn có thể thấy rằng bộ nhớ được sử dụng là 64Mi và tổng CPU được sử dụng là 462m.
Các kubectl top lệnh tiêu thụ các số liệu tiếp xúc bởi máy chủ metric.
Hãy lưu ý cách các giá trị hiện tại cho CPU và bộ nhớ lớn hơn các yêu cầu mà bạn đã xác định trước đó ( cpu=50m,memory=50Mi).
Giới hạn bộ nhớ và CPU
Giới hạn xác định giới hạn cứng cho vùng chứa và đảm bảo quá trình không tiêu tốn tất cả tài nguyên trong Node.
Ví dụ bạn có một ứng dụng có bộ nhớ giới hạn 250Mi.
Khi ứng dụng sử dụng nhiều hơn giới hạn, Kubernetes sẽ giết quá trình bằng một thông báo OOMKilling (Out of Memory Killing). Hiểu theo cách khác thì quá trình này không có giới hạn bộ nhớ trên và nó có thể vượt qua ngưỡng 250Mi. Tuy nhiên, ngay sau khi điều đó xảy ra, quá trình này sẽ chết.
Vậy bạn đã biết điều gì xảy ra với giới hạn bộ nhớ, chúng ta hãy xem xét giới hạn CPU.
Trong thực tế, CPU được đo lường như một hàm của thời gian. Khi bạn nói giới hạn 1 CPU, ý bạn thực sự là ứng dụng chạy tối đa 1 giây CPU, mỗi giây.
Nếu ứng dụng của bạn có một luồng duy nhất, bạn sẽ tiêu thụ nhiều nhất 1 CPU mỗi giây. Tuy nhiên, nếu ứng dụng của bạn sử dụng hai luồng, nó sẽ nhanh hơn gấp đôi và nó có thể hoàn thành công việc trong một nửa thời gian.
Ngoài ra, hạn ngạch CPU được sử dụng trong một nửa thời gian.
- Nếu bạn có hai luồng, bạn có thể tiêu thụ 1 giây CPU trong 0,5 giây.
- Tám luồng có thể tiêu thụ 1 giây CPU trong 0,125 giây.
Làm sao để biết được các yêu cầu và giới hạn phù hợp?
Yêu cầu và giới hạn phụ thuộc vào dung lượng bộ nhớ và CPU mà ứng dụng sử dụng. Những giá trị đó cũng bị ảnh hưởng bởi cách ứng dụng được sử dụng.
Một ứng dụng cung cấp các trang tĩnh có thể có bộ nhớ và CPU chủ yếu là tĩnh. Tuy nhiên, một ứng dụng lưu trữ tài liệu trong cơ sở dữ liệu có thể hoạt động khác khi có nhiều lưu lượng truy cập hơn.
Cách tốt nhất để quyết định các yêu cầu và giới hạn cho một ứng dụng là quan sát hành vi của nó trong thời gian chạy.
Vì vậy, bạn cần:
- Một cơ chế để tạo lưu lượng truy cập theo chương trình cho ứng dụng của bạn.
- Một cơ chế để thu thập các số liệu và quyết định cách lấy các yêu cầu và giới hạn cho CPU và bộ nhớ.
Hãy bắt đầu với việc tạo ra lưu lượng truy cập.
Tiếp tục theo dõi Bizfly Cloud để cập nhật những công nghệ mới nhất mỗi ngày nhé.
>> Có thể bạn quan tâm: Mở rộng quy mô dịch vụ nhỏ với Message Queues, Spring Boot and Kubernetes