為何 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 嘗試同時拉取大型容器影像時:

  1. 每次影像拉取作業都會消耗磁碟 I/O 頻寬
  2. 合併的頻寬需求會很快達到 49 MB/秒的限制飽和
  3. 一旦達到限制,影像拉動作業會顯著減緩
  4. Kubernetes 由於會對操作進行流量限制,因此可能會回報「pull QPS exceeded」錯誤

若要判斷您是否觸及 VPC 工作者節點頻寬限制,請使用 IBM Cloud 監控功能。

檢查磁碟 I/O 頻寬

  1. 在群集的 OpenShift 主控台中導航至 Observe → Metrics

  2. 使用下列 Prometheus 查詢監控磁碟讀寫速率:

    irate(node_disk_read_bytes_total[2m]) + irate(node_disk_written_bytes_total[2m])
    
  3. 解釋結果:

    • 如果任何裝置顯示的值接近或達到 49M (49 MB/秒),則表示您已達到頻寬限制。
    • 在影像拉取作業期間,持續達到或接近此極限值可確認頻寬飽和。
    • 多次達到此上限表示頻寬一再受限。

檢查影像拉取時間

您也可以直接檢查影像拉取時間:

oc get events -A | grep -E "Successfully pulled image"

此指令會顯示每次影像拉取所花的時間,協助您識別緩慢的拉取。

解決問題

主要解決方案:使用具有輔助儲存的工作人員池

建議的解決方案是使用附加次要儲存的工作人員池。 使用 10iops-tier 的次要儲存空間可提供專用的 I/O 頻寬,不會與開機磁碟競爭,因此可大幅提升並行影像拉取的吞吐量,並加快 Pod 的啟動時間。

  1. 使用次要儲存空間 建立新的工作人員池

    • 建立新工作人員池時,請選擇具有輔助儲存的味道。
    • 使用 10iops-tier 儲存選項之一,以獲得最佳效能。
  2. 將工作負載遷移至 新池。

  3. 遷移完成後,排空並移除舊的工作人員池

其他考量

雖然升級至輔助儲存是主要的解決方案,但您也可以:

縮小影像尺寸
使用多階段建置,並盡量減少層次
使用影像快取
預先將常用的影像拉取至工作節點
優化 imagePullPolicy
配置您的 pod 規格,以減少不必要的拉扯:
  • 只有在節點上不存在圖片時,才使用 imagePullPolicy: IfNotPresent 來拉取圖片。
  • 避免 imagePullPolicy: Always,除非您特別需要每次都拉取最新版本。
  • 對於生產工作負載,請使用特定的影像標籤,而非 latest,並結合 IfNotPresent,以盡量減少拉取。
設定監控與警示
針對接近 49 MB/秒的持續高磁碟 I/O 率設定警示。
  • 監控影像拉取時間,作為部署指標的一部分。
  • 追蹤 pod 的啟動時間,以找出效能下降的情況。