Cách khắc phục nhanh
Nếu Pod của bạn đang bị crash ngay lúc này, có thể bạn cần tăng giới hạn ephemeral-storage trong tệp manifest của deployment. Việc tăng nhanh từ 512Mi lên 1Gi hoặc 2Gi thường giúp bạn có đủ thời gian để tìm ra nguyên nhân gốc rễ.
spec:
containers:
- name: my-app
resources:
limits:
ephemeral-storage: "2Gi" # Gấp đôi giới hạn để dừng việc bị trục xuất ngay lập tức
requests:
ephemeral-storage: "1Gi"
Nguyên nhân gây ra lỗi này?
Hãy coi bộ nhớ đệm (ephemeral storage) như một không gian làm việc tạm thời trên ổ đĩa vật lý của node. Khác với Persistent Volumes, không gian này có tính chất tạm thời. Kubelet theo dõi ba khu vực cụ thể:
- Tệp Log: Mọi thứ ứng dụng của bạn gửi đến
stdoutvàstderr, thường được lưu trữ trong/var/log/pods. - Lớp Ghi (Writable Layer): Các thay đổi được thực hiện trực tiếp trên hệ thống tệp của container, ví dụ như một tệp tạm 200MB được tạo trong quá trình xuất tệp PDF.
- Volume EmptyDir: Dữ liệu cục bộ được lưu trữ trong các mount
emptyDirkhông được cấu hình cụ thể để sử dụng RAM.
Khi Kubelet nhận thấy một Pod vượt quá ranh giới limits.ephemeral-storage, nó sẽ kích hoạt quá trình Eviction (Trục xuất). Pod bị dừng ngay lập tức để bảo vệ ổ đĩa của node không bị đầy 100%, tránh làm treo toàn bộ hệ thống của node.
Dung lượng đã bị dùng vào đâu?
1. Log ứng dụng quá nhiều
Nếu một ứng dụng Java bị kẹt trong một vòng lặp hoặc đang chạy ở chế độ DEBUG, nó có thể tạo ra 500MB log chỉ trong vài phút. Kubernetes tính các log này vào hạn ngạch lưu trữ của bạn cho đến khi chúng được xoay vòng (rotated).
2. Cache ẩn và tệp tạm
pip của Python hoặc npm của Node thường tải xuống hàng trăm megabyte vào /root/.cache hoặc /tmp trong quá trình thực thi nếu bạn thực hiện các lệnh build động. Những tệp này nằm trong lớp ghi của container và được tính vào giới hạn của bạn.
3. Xử lý hình ảnh không nén
Xử lý một video 4K hoặc một loạt hình ảnh độ phân giải cao có thể dễ dàng làm tăng mức sử dụng /tmp lên vài gigabyte, vượt xa giới hạn mặc định 512Mi thông thường.
Cách khắc phục
Cách 1: Tăng giới hạn tài nguyên
Nếu công việc của bạn thực sự cần 2GB không gian tạm cho một tác vụ ETL, hãy cập nhật YAML. Áp dụng cập nhật bằng kubectl apply -f deployment.yaml để khởi động lại các Pod với dung lượng lưu trữ lớn hơn.
resources:
requests:
ephemeral-storage: "1Gi"
limits:
ephemeral-storage: "4Gi" # Cung cấp mức trần rộng rãi cho các trường hợp tăng đột biến
Cách 2: Sử dụng RAM cho các tệp tạm thời
Đối với các tệp tạm thời nhỏ và cần tốc độ cao, hãy sử dụng bộ nhớ (RAM) của node thay vì ổ đĩa. Cách này sẽ bỏ qua hoàn toàn giới hạn bộ nhớ đệm, mặc dù nó sẽ được tính vào giới hạn RAM của Pod.
volumes:
- name: cache-volume
emptyDir:
medium: Memory
sizeLimit: "512Mi"
Cách 3: Chuyển sang Persistent Volumes
Đừng sử dụng bộ nhớ đệm cho các tác vụ nặng như sao lưu cơ sở dữ liệu hoặc tải xuống các mô hình ML lớn. Thay vào đó, hãy gắn một PersistentVolumeClaim (PVC). Vì PVC có dung lượng lưu trữ chuyên dụng riêng, chúng sẽ không kích hoạt việc trục xuất của Kubelet ngay cả khi bị đầy.
Cách 4: Giảm mức độ chi tiết của log
Giảm áp lực lên ổ đĩa bằng cách thay đổi mức độ log của ứng dụng từ DEBUG sang INFO. Trong môi trường production, 90% log của bạn có thể là những thông tin dư thừa đang trực tiếp làm "chết" các Pod.
Xác minh: Đã thành công chưa?
Kiểm tra mức sử dụng đĩa hiện tại của các container bằng Metrics Server:
kubectl top pod <pod-name> --containers
Để xem tại sao một Pod bị dừng trước đó, hãy kiểm tra các sự kiện. Tìm thông báo Reason: Evicted có chứa văn bản "usage exceeds the total limit":
kubectl describe pod <pod-name> | grep -A 3 "Annotations:"
Nếu khắc phục thành công, Pod sẽ duy trì trạng thái Running và log kubectl get events sẽ ngừng hiển thị các cảnh báo liên quan đến lưu trữ.

