Sửa lỗi Kubernetes Eviction: 'Pod ephemeral local storage usage exceeds the total limit'

intermediate☸️ Kubernetes2026-05-01| Cụm Kubernetes (EKS, GKE, AKS hoặc On-prem) chạy trên các node dựa trên Linux.

Error Message

Pod ephemeral local storage usage exceeds the total limit of containers 512Mi
#kubernetes#lưu trữ#ephemeral-storage#trục xuất

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 stdoutstderr, 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 emptyDir khô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ữ.

Related Error Notes