我想解決 Amazon Elastic Kubernetes Service (Amazon EKS) 工作節點上磁碟壓力過大的問題。
簡短描述
當可用磁碟空間下降到較低水準時,Kubernetes 工作節點上就會出現磁碟壓力。若要緩解磁碟壓力,請增加 EBS 磁碟區大小,或在節點群組中新增新的工作節點,以提供更多磁碟容量。您還可以調整 Kubelet 映像檔垃圾回收閾值,設定容器執行時期日誌輪換,並手動清理未使用的映像檔,以有效管理磁碟使用情況。
務必要監控和管理暫時性儲存空間,以防止磁碟壓力問題並確保 Kubernetes 叢集正確執行。
如果磁碟壓力過大,那麼您可能會收到錯誤訊息。
對於該節點,您可能會收到類似以下內容的錯誤訊息:
"Warning DiskPressure ... kubelet, worker-node DiskPressure on node"
對於 Kubelet,您可能會收到類似以下內容的錯誤訊息:
"Disk usage on image filesystem is over the high threshold, trying to free bytes down to the low threshold"
若要確認問題,請執行 df -h 命令,檢查工作節點上的磁碟使用量。
輸出範例:
/dev/nvme0n1p1 20G 18G 2.2G 90% /
........
**注意:**在上述範例中,根檔案系統 /dev/nvme0n1p1 的使用率為 90%。過高的使用率會導致磁碟壓力及映像檔垃圾回收失敗的問題。
解決方法
增加 EBS 磁碟區大小
若要增加可用磁碟空間,請擴大附加至工作節點的 EBS 磁碟區大小。如需詳細資訊,請參閱如何增加或減少 EBS 磁碟區的大小?
**注意:**最佳實務是為新執行個體佈建所需的磁碟大小,而不是調整暫時性磁碟區的大小。使用新執行個體取代舊執行個體。如此一來,新的執行個體就具備正確的磁碟大小,並符合不可變基礎結構的概念。
向節點群組新增新的工作節點
在節點群組或集區中新增節點,為叢集新增更多磁碟容量,從而將工作負載分配到多個節點上。這樣可以減輕單一節點的磁碟壓力。
為 Kubelet 垃圾回收器設定自訂閾值
設定 Kubelet,讓其在不同的磁碟使用率閾值下啟動映像檔垃圾回收。若要這樣做,請設定 --image-gc-high-threshold 和 --image-gc-low-threshold 參數以提供更多緩衝區。例如,將高閾值設為 70%,將低閾值設為 60%,以維持較大的可用磁碟空間緩衝區。此組態可讓 Kubelet 在磁碟空間接近滿載前,先執行映像垃圾回收。
如需如何在工作者節點上設定這些參數的更多資訊,請參閱如何設定 Amazon EKS 工作者節點,以在磁碟使用率達到指定百分比時清理映像檔快取?
檢查並調整容器執行時期日誌輪換
容器化應用程式會將日誌寫入 stdout 和 stderr,日誌檔案由容器執行時期管理。最佳實務是調整工作節點上容器執行時期的日誌輪換設定。
若要設定 containerd 的日誌輪換,請使用組態檔案 /etc/cotainerd/config/toml 中的 containerd.runc.log 選項。設定 log_file_max 和 log_file_max_size 選項來控制輪換日誌檔案的最大數量,以及每個日誌檔案的最大大小。
清理未使用的容器映像檔
如果 Kubelet 無法自動執行映像檔垃圾回收,請手動清理工作節點上未使用的容器映像。若要移除懸空或未使用的映像並釋放大量磁碟空間,請使用 crictl rmi --prune 命令。
管理您的暫時性儲存空間
為了應用程式的長期穩定性和平穩執行,最佳實務是正確管理暫時性儲存空間。如果您不對暫時性儲存空間設定限制,那麼 pod 可能會消耗其執行節點上的整個磁碟空間。
為了降低這種風險,請為您的 pod 設定適當的暫時性儲存空間請求和限制。採取下列措施來確定限制: