Thursday , 4 June 2026

Cấu Hình ulimit Linux Cho Docker Và Kubernetes trong 5 phút

Cấu hình ulimit Linux là bước thường bị bỏ qua sau khi cài OS mới — cho đến khi Docker container báo lỗi kết nối, nginx crash không rõ lý do, hoặc Kubernetes pod bị OOMKilled dù RAM còn đủ. Bài viết giải thích cơ chế, hướng dẫn cấu hình đúng cho Docker và Kubernetes, kèm script tự động hóa toàn bộ quá trình.

cau_hinh_ulimit_linux_docker_k8s


ulimit Là Gì Và Tại Sao Cần Cấu Hình ulimit Linux?

ulimit là cơ chế Linux giới hạn tài nguyên mà một tiến trình người dùng có thể sử dụng. Các tham số quan trọng nhất:

  • nofile — số lượng file descriptor tối đa (bao gồm socket, file, pipe). Mỗi kết nối mạng tiêu tốn một file descriptor
  • nproc — số lượng tiến trình con tối đa có thể tạo
  • memlock — dung lượng bộ nhớ có thể lock trong RAM
  • stack — kích thước stack tối đa của tiến trình

Giá trị mặc định trên nhiều bản Linux là nofile=1024 — quá thấp cho các ứng dụng production. Một nginx xử lý 1000 kết nối đồng thời đã cần ít nhất 1000 file descriptor, cộng thêm các file log và socket nội bộ.

Kiểm tra giá trị hiện tại:


Cấu Hình ulimit Linux Ảnh Hưởng Docker Như Thế Nào?

Docker daemon và toàn bộ container chạy dưới nó đều kế thừa giới hạn ulimit từ OS. Nghĩa là nếu OS đặt nofile=1024, mọi container — dù bạn không cấu hình gì trong Docker — cũng chỉ được dùng tối đa 1024 file descriptor.

Hậu quả thực tế:

  • Container nginx, Redis, MongoDB báo lỗi too many open files khi tải cao
  • Container không tạo được kết nối mạng mới dù còn RAM và CPU
  • Lỗi xuất hiện không nhất quán, khó reproduce vì chỉ xảy ra khi đạt giới hạn

Cấu Hình ulimit Cho Toàn Hệ Thống

Thêm vào /etc/security/limits.conf:

File này áp dụng cho các session login qua PAM. Với systemd, cần cấu hình thêm ở /etc/systemd/system.conf:

Cấu Hình ulimit Riêng Cho Docker Daemon

Tạo file override cho Docker service:

Tạo file /etc/systemd/system/docker.service.d/override.conf:

Áp dụng:


Cấu Hình ulimit Linux Cho Kubernetes

Kubernetes không expose ulimit trực tiếp trong Pod spec. Thay vào đó, kubelet và container runtime (containerd, CRI-O) kế thừa giới hạn từ OS. Nếu nofile thấp ở mức OS, toàn bộ node sẽ bị ảnh hưởng:

  • Node lỗi khi số pod tăng cao vì mỗi pod tạo nhiều file descriptor và process
  • Pod bị OOMKilled không phải do hết RAM mà do hết nproc — khó phân biệt với OOM thực
  • containerd hoặc kubelet crash khi số lượng socket internal vượt nofile

Cấu Hình ulimit Cho kubelet

Tạo file /etc/systemd/system/kubelet.service.d/10-ulimit.conf:

Áp dụng:


Script Tự Động Cấu Hình ulimit Cho Docker Và Kubernetes

Script bên dưới tự động phát hiện Docker và kubelet có đang chạy không, áp dụng cấu hình tương ứng:

Chạy script:


Tổng Kết

Cấu hình ulimit Linux đúng cách ngay sau khi cài OS là bước không thể thiếu trước khi triển khai Docker hoặc Kubernetes. Giá trị an toàn cho môi trường production là nofile=65535nproc=65535 — đủ cho hầu hết workload mà không gây rủi ro cho hệ thống. Bỏ qua bước này sẽ dẫn đến các lỗi không nhất quán, khó reproduce và khó chẩn đoán khi hệ thống đạt tải cao.

Tham khảo thêm tài liệu chính thức về resource limit trong Linux tại kernel.org.

Xem thêm các bài viết về hệ thống tại tungle.blog và chuyên mục Hệ thống, hoặc bài cài đặt APISIX cluster HA trên Linux để tham khảo thêm về cấu hình môi trường production.

Bạn đang dùng giá trị ulimit bao nhiêu trên hệ thống production? Gặp lỗi gì liên quan đến ulimit chưa? Để lại bình luận bên dưới.

About Tung Le

Cài win 10000 lần

Check Also

counldnt-download

Couldn’t Download Virus Detected — Fix Nhanh Trên Windows Trong 2 Phút

Lỗi Couldn’t download Virus detected xuất hiện khi tải file bằng Google Chrome hoặc Microsoft …

Leave a Reply