Cloud & hạ tầng

Kubernetes v1.33 giới thiệu phản hồi danh sách dạng stream để giảm mức sử dụng bộ nhớ của API server

Kubernetes v1.33 bổ sung mã hóa dạng stream cho các phản hồi List, giúp giảm mức sử dụng bộ nhớ của kube-apiserver lên tới 20 lần khi truy xuất các tập dữ liệu lớn và cải thiện độ ổn định của cụm.

Hình minh họa luồng dữ liệu dạng stream so với bộ đệm bị chặn
Hình ảnh: Kubernetes Blog, giấy phép CC BY 4.0

Được dịch tự động từ bản gốc tiếng Anh.

Trong một bài đăng trên Kubernetes Blog vào tháng 5 năm 2025, các nhà duy trì Marek Siarkowicz và Wei Fu đã mô tả một thay đổi kiến trúc quan trọng trong Kubernetes v1.33. Bản cập nhật này giới thiệu tính năng mã hóa dạng stream cho các phản hồi List, được thiết kế để giảm đáng kể mức tiêu thụ bộ nhớ trong API server khi xử lý các tập dữ liệu lớn. Cải tiến này giải quyết các vấn đề ổn định lâu dài trong các cụm quy mô lớn, nơi việc truy xuất các danh sách tài nguyên mở rộng trước đây có nguy cơ gây ra lỗi hết bộ nhớ (out-of-memory).

Chuyện gì đã xảy ra

Việc vận hành các cụm Kubernetes lớn luôn đòi hỏi phải cân bằng giữa khả năng truy cập dữ liệu và mức tiêu thụ tài nguyên. Một trong những thách thức dai dẳng nhất là xử lý các yêu cầu List, vốn truy xuất các tập dữ liệu lớn từ trạng thái cụm. Trong các phiên bản trước, API server sẽ tuần tự hóa toàn bộ phản hồi thành một khối bộ nhớ liên tục trước khi gửi đến máy khách. Mặc dù HTTP/2 có thể chia nhỏ phản hồi thành các khung truyền tải nhỏ hơn, nhưng máy chủ nền tảng vẫn giữ toàn bộ bộ đệm dữ liệu trong bộ nhớ cho đến khi quá trình truyền hoàn tất. Điều này có nghĩa là nếu tắc nghẽn mạng làm chậm quá trình truyền, hàng trăm megabyte bộ nhớ sẽ bị khóa trong vài giây hoặc vài phút.

Sự kém hiệu quả này trở nên nghiêm trọng ở quy mô lớn. Khi nhiều yêu cầu List lớn xảy ra đồng thời, mức sử dụng bộ nhớ tích lũy có thể tăng vọt nhanh chóng, dẫn đến các tình huống Hết bộ nhớ (OOM) làm ảnh hưởng đến độ ổn định của cụm. Vấn đề càng trầm trọng hơn do cách gói encoding/json của Go quản lý bộ nhớ. Nó sử dụng sync.Pool để tái sử dụng các bộ đệm, điều này hiệu quả với khối lượng công việc ổn định nhưng lại gây vấn đề với các phản hồi lớn không thường xuyên. Một khi một phản hồi lớn làm mở rộng vùng chứa bộ nhớ, các bộ đệm quá khổ đó vẫn được dành riêng cho các yêu cầu nhỏ sau đó, ngăn cản quá trình thu gom rác và giữ mức sử dụng bộ nhớ ở mức cao nhân tạo ngay cả khi tải nặng đã qua đi.

Cách hoạt động

Bộ mã hóa dạng stream mới thay đổi cách API server xử lý các phản hồi List bằng cách tập trung vào trường Items, nơi chứa phần lớn dữ liệu trong các cấu trúc bộ sưu tập. Thay vì mã hóa toàn bộ mảng như một khối đơn lẻ, máy chủ giờ đây xử lý và truyền từng mục riêng biệt. Khi mỗi đoạn dữ liệu được gửi đến máy khách, bộ nhớ liên quan sẽ được giải phóng ngay lập tức. Cách tiếp cận theo từng bước này đảm bảo rằng dấu chân bộ nhớ của API server vẫn dự đoán được và dễ quản lý, bất kể tổng số đối tượng trong danh sách.

Figure from the original article: Kubernetes v1.33 giới thiệu phản hồi danh sách dạng stream để giảm mức sử dụng bộ nhớ của API server
Hình từ bài viết gốc · Kubernetes Blog · CC BY 4.0

Vì các đối tượng Kubernetes thường bị giới hạn ở mức 1,5 MiB trong etcd, phương pháp stream giúp giữ các phân bổ bộ nhớ riêng lẻ ở mức nhỏ. Hệ thống duy trì tính tương thích ngược chặt chẽ bằng cách xác thực các thẻ struct Go trước khi kích hoạt, đảm bảo đầu ra giống hệt từng byte so với bộ mã hóa gốc. Việc mã hóa tiêu chuẩn vẫn xử lý tất cả các trường ngoại trừ Items, vì vậy máy khách không cần thay đổi mã nguồn hay thậm chí nhận biết rằng cơ chế nền tảng đã thay đổi. Sự tích hợp liền mạch này hỗ trợ tất cả các loại List của Kubernetes, bao gồm các danh sách tích hợp sẵn và Custom Resource UnstructuredLists.

Chi tiết chính

  • Phiên bản: Tính năng này được giới thiệu trong Kubernetes v1.33, công bố vào tháng 5 năm 2025.
  • Giảm bộ nhớ: Các bài kiểm tra chuẩn (benchmark) cho thấy mức sử dụng bộ nhớ cải thiện gấp 20 lần đối với các thao tác danh sách lớn, giảm từ 70-80GB xuống chỉ còn 3GB.
  • Cơ chế: Bộ mã hóa truyền từng mục riêng lẻ trong trường Items thay vì tuần tự hóa toàn bộ mảng cùng lúc.
  • Tính tương thích: Không cần thay đổi phía máy khách; đầu ra vẫn nhất quán từng byte với các phiên bản trước.
  • Điều kiện kích hoạt: Bộ mã hóa dạng stream chỉ hoạt động sau khi xác minh nghiêm ngặt các thẻ struct để đảm bảo an toàn.
  • Phạm vi: Áp dụng cho tất cả các loại List của Kubernetes, bao gồm cả tài nguyên tiêu chuẩn và tài nguyên tùy chỉnh.

Tại sao điều này quan trọng

Đối với các kỹ sư xây dựng và duy trì hạ tầng Kubernetes quy mô lớn, bản cập nhật này tác động trực tiếp đến độ tin cậy và hiệu quả chi phí. Mức sử dụng bộ nhớ cao trong kube-apiserver thường buộc các đội ngũ phải cấp phát dư thừa phần cứng để xử lý tải đỉnh, làm tăng chi phí vận hành. Bằng cách giảm dấu chân bộ nhớ của các yêu cầu List lớn với biên độ đáng kể như vậy, các tổ chức có thể vận hành các control plane gọn nhẹ hơn mà không đánh đổi hiệu suất. Nó cũng giảm rủi ro gặp phải các sự cố OOM kill bất ngờ, vốn có thể gây gián đoạn dịch vụ và làm phức tạp nỗ lực gỡ lỗi trong quá trình ứng phó sự cố.

Hơn nữa, thay đổi này cải thiện tính dự đoán được của hành vi cụm dưới tải. Trong các môi trường mà công cụ giám sát, controller hoặc pipeline CI/CD thường xuyên liệt kê số lượng lớn tài nguyên, các đợt tăng đột biến bộ nhớ trước đây có thể gây ra lỗi dây chuyền. Với mã hóa dạng stream, các thao tác này không còn giữ lại lượng bộ nhớ dư thừa trong thời gian chờ truyền. Điều này cho phép API server xử lý mượt mà hơn nhiều yêu cầu đồng thời và các tập dữ liệu lớn hơn, giúp dễ dàng mở rộng cụm để hỗ trợ hàng nghìn node và hàng chục nghìn pod.

Bạn có thể làm gì

  • Nâng cấp control plane của bạn lên Kubernetes v1.33 hoặc mới hơn để tận hưởng lợi ích từ bộ mã hóa dạng stream.
  • Giám sát mức sử dụng bộ nhớ của kube-apiserver trong các thao tác List lớn để quan sát sự giảm thiểu mức tiêu thụ đỉnh.
  • Xem xét bất kỳ custom controller hoặc operator nào thực hiện các lệnh gọi List lớn để đảm bảo chúng xử lý các phản hồi dạng stream một cách suôn sẻ, mặc dù về mặt kỹ thuật không bắt buộc phải thay đổi mã nguồn.
  • Kiểm tra cài đặt horizontal pod autoscaler của cụm, vì tải thấp hơn trên API server có thể cho phép thiết lập ngưỡng co giãn chặt chẽ hơn.
  • Xác minh rằng stack giám sát của bạn không phụ thuộc vào kích thước bộ đệm cố định để phân tích cú pháp phản hồi API, mặc dù tính tương thích từng byte sẽ ngăn ngừa các vấn đề.
  • Cân nhắc điều chỉnh resource requests và limits cho kube-apiserver nếu trước đây bạn đã cấp phát dư thừa bộ nhớ để giảm thiểu rủi ro OOM.

Công cụ từ cửa hàng Bytechap

Đọc tiếp

Tất cả bài viết