Quản Lý Thu Gọn Rác Trong Kubernetes

Giới Thiệu Về GC Trong Kubernetes

GC (Garbage Collector) là cơ chế thu gom và làm sạch các tài nguyên không sử dụng trong hệ thống. Trong một cụm Kubernetes, chức năng GC của kubelet sẽ dọn dẹp các image và container không dùng đến. Kubelet thực hiện GC cho container mỗi phút một lần và cho image mỗi 5 phút một lần. Điều này giúp đảm bảo sự ổn định của các node trong cụm Kubernetes khi nguồn lực trở nên khan hiếm.

Cơ Chế Đuổi Theo Tài Nguyên Của Kubernetes

Kubelet có khả năng tự động phát hiện và ngăn chặn tình trạng thiếu hụt tài nguyên tính toán. Trong trường hợp này, kubelet có thể chủ động kết thúc một hoặc nhiều pod để giải phóng tài nguyên cần thiết. Nếu Pod bị đuổi bởi Deployment, Deployment sẽ tạo ra một Pod mới để Kubernetes điều phối.

Các Tín Hiệu Đuổi Theo Trong Kubernetes

Kubelet hỗ trợ các tín hiệu đuổi theo được mô tả trong bảng dưới đây:

Tín Hiệu Đuổi Theo Mô Tả
memory.available memory.available := node.status.capacity[memory] - node.stats.memory.workingSet
nodefs.available nodefs.available := node.stats.fs.available
nodefs.inodesFree nodefs.inodesFree := node.stats.fs.inodesFree
imagefs.available imagefs.available := node.stats.runtime.imagefs.available
imagefs.inodesFree imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree

Các giá trị của tín hiệu có thể là số tuyệt đối hoặc phần trăm, dựa trên tổng dung lượng tương ứng với từng tín hiệu.

  • memory.available Giá trị của memory.available lấy từ cgroupfs, không phải từ công cụ như free -m vì công cụ này không hoạt động trong môi trường container.

Kubelet hỗ trợ hai phân vùng hệ thống tập tin:

  • nodefs Hệ thống tập tin nodefs, kubelet sử dụng nó cho các volume và nhật ký daemon.
  • imagefs Hệ thống tập tin imagefs, runtime container sử dụng để lưu trữ images và lớp viết của container.

Ngưỡng Đuổi Theo

Kubelet hỗ trợ chỉ định ngưỡng đuổi theo để kích hoạt việc tái lập tài nguyên. Dạng cấu hình ngưỡng như sau:

[signal][toán tử][số lượng]

  • signal: Tín hiệu đuổi theo
  • toán tử: Toán tử quan hệ cần thiết, ví dụ <
  • số lượng: Giá trị ngưỡng đuổi theo, ví dụ 1Gi, cũng có thể sử dụng % để biểu thị tỷ lệ phần trăm

Ví dụ: Nếu một node có 10Gi bộ nhớ, muốn kích hoạt hành động đuổi khi bộ nhớ còn trống giảm xuống dưới 1Gi, ngưỡng đuổi có thể được chỉ định bằng cách:

  • memory.available<10% hoặc
  • memory.available<1Gi

Ngưỡng Đuổi Theo Mềm

Ngưỡng đuổi theo mềm sử dụng cặp cấu hình bao gồm ngưỡng đuổi và thời gian chờ mà quản trị viên phải chỉ định. Trước khi hết thời gian chờ, kubelet sẽ không thực hiện hành động nào để thu hồi tài nguyên liên quan. Nếu không cung cấp thời gian chờ, kubelet sẽ báo lỗi khi khởi động. Hơn nữa, nếu đạt đến ngưỡng đuổi mềm, người vận hành có thể chỉ định số lượng tối đa của pod có thể bị kết thúc trong thời gian chờ. Nếu đã chỉ định giá trị pod.Spec.TerminationGracePeriodSeconds, kubelet sẽ sử dụng giá trị nhỏ hơn giữa giá trị này và thời gian chờ. Nếu không chỉ định, kubelet sẽ kết thúc pod ngay lập tức mà không kết thúc một cách lịch sự.

Ngưỡng Đuổi Theo Cứng

Ngưỡng đuổi theo cứng không có thời gian chờ, khi phát hiện, kubelet sẽ ngay lập tức thực hiện hành động thu hồi tài nguyên liên quan. Nếu đạt đến ngưỡng đuổi theo cứng, kubelet sẽ kết thúc pod ngay lập tức thay vì kết thúc một cách lịch sự.

Thu Gọn Tối Thiểu Trong Kubernetes

Trong một số trường hợp, việc đuổi pod có thể dẫn đến việc thu hồi một lượng tài nguyên nhỏ, gây ra việc kubelet lặp đi lặp lại việc chạm vào ngưỡng đuổi. Ngoài ra, việc đuổi tài nguyên như đĩa thường tốn thời gian. Để giảm thiểu vấn đề này, kubelet có thể chỉ định một mức thu gọn tối thiểu cho từng tài nguyên. Khi kubelet phát hiện áp lực tài nguyên, nó sẽ cố gắng thu hồi ít nhất lượng tài nguyên tối thiểu dưới ngưỡng đuổi.

Ví dụ với cấu hình sau:

--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"

Nếu ngưỡng đuổi memory.available được kích hoạt, kubelet sẽ đảm bảo rằng memory.available ít nhất là 500Mi. Đối với nodefs.available, kubelet sẽ đảm bảo rằng nodefs.available ít nhất là 1.5Gi. Đối với imagefs.available, kubelet sẽ đảm bảo rằng imagefs.available ít nhất là 102Gi, cho đến khi không còn báo cáo áp lực tài nguyên liên quan.

Bảng so sánh các dấu hiệu cũ và mới:

Dấu Hiệu Hiện Tại Dấu Hiệu Mới
--image-gc-high-threshold --eviction-hard or eviction-soft
--image-gc-low-threshold --eviction-minimum-reclaim
--maximum-dead-containers đã bỏ
--maximum-dead-containers-per-container đã bỏ
--minimum-container-ttl-duration đã bỏ
--low-diskspace-threshold-mb --eviction-hard or eviction-soft
--outofdisk-transition-frequency --eviction-pressure-transition-period

Tham khảo thêm tại: https://kubernetes.io/zh/docs/tasks/administer-cluster/out-of-resource/

Thẻ: Kubernetes GarbageCollection EvacuationPolicy SystemResources

Đăng vào ngày 20 tháng 6 lúc 22:41