Resource Requirement trong Kubernetes

Trong bài viết, hãy cùng mình tìm hiểu về cách Kubernetes quản lý và phân bổ tài nguyên (CPU và bộ nhớ) cho các pod. 

Xem thêm:

Taints và Tolerations trong Kuberbetes

Labels and Selectors trong Kubernetes

1. Resource requirement

Khi bạn chạy một ứng dụng trên Kubernetes, bạn cần cho nó biết là: “Ê, tui cần ít nhất nhiêu CPU và RAM để chạy cho mượt nha!”. Resource requirement là lượng CPU và bộ nhớ tối thiểu mà một pod cần để hoạt động.

Khi đặt resource requirement, Kubernetes đảm bảo pod sẽ luôn có ít nhất lượng tài nguyên cần thiết để pod hoạt động ổn định.

Ví dụ: Bạn khai báo memory: 5Mi thì Kubernetes sẽ chắc chắn dành ra ít nhất 5Mi RAM cho pod đó, không thiếu một byte!

2. Giới hạn tài nguyên (Resource Limits):

Resource Limits là lượng CPU và bộ nhớ tối đa mà một pod trong kubernetes được phép sử dụng.

Resource Limits giúp tránh tình trạng một pod chiếm quá nhiều tài nguyên gây ảnh hưởng đến các pod khác, đảm bảo sự cân bằng và ổn định cho toàn bộ cụm. Nếu như một Pod cố gắng vượt qua giới hạn tài nguyên thì nó sẽ bị Out Of Memory

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: elephant
  name: elephant
spec:
  containers:
  - image: polinux/stress
    name: elephant
    resources:
      limits:
        memory: 20Mi
      requests:
        memory: 5Mi
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

3. Các trường hợp sử dụng

No Requests, No Limits: Dùng bao nhiêu tùy thích → dễ giành giật tài nguyên. Pod có thể sử dụng bất kỳ lượng tài nguyên nào, tiềm ẩn nguy cơ thiếu hụt tài nguyên cho các pod khác.

No Request, Limits: Kubernetes sẽ “auto” gán request bằng limit. Kubernetes sẽ tự động đặt resource request bằng với giới hạn.

Request và Limits: Pod được đảm bảo lượng tài nguyên yêu cầu và có thể sử dụng tối đa giới hạn đã đặt. Có vẻ đây là trường hợp lý tưởng Nhưng khi một Pod cần thêm CPU và một Pod không tiêu tốn hết CPU. Thì tại sao mình lại không nhường cái CPU đó cho Pod đang thiếu. Vì vậy trường hợp tiếp theo nó là lý tưởng nhất

Request, No Limits: Pod được đảm bảo lượng tài nguyên cần thiết và có thể sử dụng thêm tài nguyên nếu có sẵn.

Resource Requirement

4. Limit Ranges

Limit Ranges cho phép bạn đặt giá trị mặc định cho yêu cầu và giới hạn tài nguyên cho các pod được tạo mới trong một namespace.

Cách sử dụng: Tạo một file định nghĩa Limit Range với các giá trị mặc định, tối đa và tối thiểu cho CPU và bộ nhớ.

6. Resource Quotas

Resource Quotas cho phép bạn đặt giới hạn cứng về lượng tài nguyên (CPU và bộ nhớ) có thể được sử dụng bởi tất cả các pod trong một namespace. Giúp quản lý và kiểm soát lượng tài nguyên được sử dụng trong một namespace, tránh tình trạng quá tải tài nguyên.

Ví dụ: Chỉ cho 10 CPU và 16Gi RAM trong 1 namespace. Vượt quá là không deploy thêm được nữa.

Kubernetes giống như một quản lý chợ – vừa đảm bảo mỗi quán có đủ mặt bằng (resource request), vừa không cho quán nào lấn chiếm hết phần của người khác (resource limit). Việc quản lý tài nguyên hợp lý sẽ giúp cả cluster chạy mượt mà, tránh crash bất ngờ.

Trên đây là một số kiến thức cơ bản về cách Kubernetes quản lý tài nguyên cho các pod. Cảm ơn bạn đã tham khảo kubernetes cơ bản trên ttnguyen.net.

Bài viết liên quan:

Manual Scheduling trong K8s

Kubenetes Deployments là gì ?

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em