為何 Pod 在拉取映像檔時會顯示「pull QPS exceeded」錯誤?
當 Pod 正在啟動時,您可能會看到錯誤訊息,指出映像檔拉取操作遭到限流,例如:pull QPS exceeded。
當您部署需要拉取容器影像的 Pod 時,您可能會觀察到下列症狀:
- 在 pod 啟動過程中出現包含「
pull QPS exceeded」的錯誤訊息 - 影像擷取時間較慢,尤其是擷取多張大型影像時
- Pods 達到
Running狀態的時間比預期長 - 影像拉動作業似乎受到節流或速率限制
出現「pull QPS exceeded」錯誤且影像載入緩慢的最可能原因,是您的 VPC 工作節點已達到磁碟 I/O 頻寬上限。
VPC 工作節點有不同的頻寬限制,視其組態而定:
- 標準工作節點(無輔助儲存):磁碟 I/O 作業限制為 393 Mbps (49 MB/秒)
- 具有次要儲存空間的工作節點:頻寬限制較高,視所選的儲存層而定
當多個 Pod 嘗試同時拉取大型容器影像時:
- 每次影像拉取作業都會消耗磁碟 I/O 頻寬
- 合併的頻寬需求會很快達到 49 MB/秒的限制飽和
- 一旦達到限制,影像拉動作業會顯著減緩
- Kubernetes 由於會對操作進行流量限制,因此可能會回報「
pull QPS exceeded」錯誤
若要判斷您是否觸及 VPC 工作者節點頻寬限制,請使用 IBM Cloud 監控功能。
檢查磁碟 I/O 頻寬
-
在群集的 OpenShift 主控台中導航至 Observe → Metrics。
-
使用下列 Prometheus 查詢監控磁碟讀寫速率:
irate(node_disk_read_bytes_total[2m]) + irate(node_disk_written_bytes_total[2m]) -
解釋結果:
- 如果任何裝置顯示的值接近或達到 49M (49 MB/秒),則表示您已達到頻寬限制。
- 在影像拉取作業期間,持續達到或接近此極限值可確認頻寬飽和。
- 多次達到此上限表示頻寬一再受限。
檢查影像拉取時間
您也可以直接檢查影像拉取時間:
oc get events -A | grep -E "Successfully pulled image"
此指令會顯示每次影像拉取所花的時間,協助您識別緩慢的拉取。
解決問題
主要解決方案:使用具有輔助儲存的工作人員池
建議的解決方案是使用附加次要儲存的工作人員池。 使用 10iops-tier 的次要儲存空間可提供專用的 I/O 頻寬,不會與開機磁碟競爭,因此可大幅提升並行影像拉取的吞吐量,並加快 Pod 的啟動時間。
-
使用次要儲存空間 建立新的工作人員池。
- 建立新工作人員池時,請選擇具有輔助儲存的味道。
- 使用
10iops-tier儲存選項之一,以獲得最佳效能。
-
將工作負載遷移至 新池。
-
遷移完成後,排空並移除舊的工作人員池。
其他考量
雖然升級至輔助儲存是主要的解決方案,但您也可以:
- 縮小影像尺寸
- 使用多階段建置,並盡量減少層次
- 使用影像快取
- 預先將常用的影像拉取至工作節點
- 優化 imagePullPolicy
- 配置您的 pod 規格,以減少不必要的拉扯:
- 只有在節點上不存在圖片時,才使用
imagePullPolicy: IfNotPresent來拉取圖片。 - 避免
imagePullPolicy: Always,除非您特別需要每次都拉取最新版本。 - 對於生產工作負載,請使用特定的影像標籤,而非
latest,並結合IfNotPresent,以盡量減少拉取。
- 只有在節點上不存在圖片時,才使用
- 設定監控與警示
- 針對接近 49 MB/秒的持續高磁碟 I/O 率設定警示。
- 監控影像拉取時間,作為部署指標的一部分。
- 追蹤 pod 的啟動時間,以找出效能下降的情況。