イメージの取得中に、Podで pull QPS exceeded エラーが発生するのはなぜですか?

ポッドの起動時に、 pull QPS exceeded といったメッセージが表示され、イメージのプル操作がスロットリングされていることを示すエラーが発生する場合があります。

コンテナ・イメージをプルする必要があるポッドをデプロイすると、次のような症状が見られることがある:

  • Podの起動中に「 pull QPS exceeded 」を含むエラーメッセージが表示される
  • 画像の取り出しに時間がかかる(特に複数の大きな画像を取り出した場合
  • ポッドが Running の状態に到達するのに予想以上に時間がかかる
  • 画像のプルオペレーションがスロットルまたはレート制限されているように見える

pull QPS exceeded エラーが発生し、画像の取得が遅くなる最も可能性の高い原因は、VPCワーカーノードのディスクI/O帯域幅の上限に達していることです。

VPCワーカーノードの帯域幅制限は、設定によって異なります:

  • 標準ワーカーノード(セカンダリストレージなし) :ディスクI/Oオペレーションは 393 Mbps (49 MB/秒) に制限されます
  • セカンダリストレージを持つワーカーノード :選択したストレージ階層に応じて帯域幅の上限が高くなる

複数のポッドが同時に大きなコンテナイメージを取り出そうとした場合:

  1. 各画像プル操作でディスクI/O帯域幅が消費される
  2. 帯域幅の需要を合わせると、49MB/秒の制限がすぐに飽和します
  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帯域幅を提供するため、同時イメージプルのスループットが大幅に向上し、ポッドの起動時間が短縮されます。

  1. セカンダリストレージで 新しいワーカープールを作成する

    • 新しいワーカープールを作成するときは、セカンダリストレージを持つフレーバーを選択します。
    • 最適なパフォーマンスを得るには、 10iops-tier ストレージオプションのいずれかを使用します。
  2. ワークロードの移行 を新しいプールに移す。

  3. マイグレーション完了後、 古いワーカープールを排水し、削除する

その他の考慮事項

セカンダリー・ストレージへのアップグレードが第一の解決策だが、それ以外にも方法はある:

画像サイズを小さくする
多段階ビルドを使用し、レイヤーを最小限に抑える
画像キャッシュの使用
ワーカーノードによく使われる画像を事前にプル
最適化 imagePullPolicy
不要なプルを減らすためにポッドの仕様を設定します:
  • imagePullPolicy: IfNotPresent を使って、ノードにまだ画像が存在しない場合のみ画像を取り出します。
  • 特に毎回最新バージョンを引っ張り出す必要がない限り、 imagePullPolicy: Always
  • 本番ワークロードでは、 latest ではなく、特定の画像タグを使用し、 IfNotPresent と組み合わせることで、プルを最小限に抑えることができます。
モニタリングとアラートの設定
49MB/秒に近づく高いディスクI/Oレートが持続した場合のアラートを設定する。
  • デプロイメントメトリクスの一環として、イメージのプル時間を監視します。
  • ポッドの起動時間を追跡し、パフォーマンスの低下を特定する。