跳至內容

如何解決 Amazon EKS 工作節點上的磁碟壓力?

1 分的閱讀內容
0

我想解決 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 工作者節點,以在磁碟使用率達到指定百分比時清理映像檔快取?

檢查並調整容器執行時期日誌輪換

容器化應用程式會將日誌寫入 stdoutstderr,日誌檔案由容器執行時期管理。最佳實務是調整工作節點上容器執行時期的日誌輪換設定。

若要設定 containerd 的日誌輪換,請使用組態檔案 /etc/cotainerd/config/toml 中的 containerd.runc.log 選項。設定 log_file_maxlog_file_max_size 選項來控制輪換日誌檔案的最大數量,以及每個日誌檔案的最大大小。

清理未使用的容器映像檔

如果 Kubelet 無法自動執行映像檔垃圾回收,請手動清理工作節點上未使用的容器映像。若要移除懸空或未使用的映像並釋放大量磁碟空間,請使用 crictl rmi --prune 命令。

管理您的暫時性儲存空間

為了應用程式的長期穩定性和平穩執行,最佳實務是正確管理暫時性儲存空間。如果您不對暫時性儲存空間設定限制,那麼 pod 可能會消耗其執行節點上的整個磁碟空間。

為了降低這種風險,請為您的 pod 設定適當的暫時性儲存空間請求和限制。採取下列措施來確定限制:

  • 若要確定 pod 儲存空間需求,請分析應用程式的儲存空間需求、暫存資料以及儲存在暫時性儲存空間中的任何其他檔案。然後,您可以估算每個 pod 的空間需求。
  • 若要設定暫時性儲存空間請求和限制,請定義 pod 正常運作所需的最小暫時性儲存空間量。然後,Kubernetes 排程器可以為您的 pod 分配具有足夠儲存空間資源的節點。
    範例:
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app:latest
        resources:
            requests:
                ephemeral-storage: "1Mi"
            limits:
                ephemeral-storage: "2Mi"
AWS 官方已更新 9 個月前