代表的な面接トピック

システムデザイン面接:KubernetesはCSIノードのボリューム容量をどのように動的に更新すべきか?

システム設計難しい
Offer.cc 編集チーム公開日 更新日

質問

CSIドライバのボリュームアタッチ容量は、クラウドアタッチクォータやヘルス状態によって変化します。Kubernetesは、過剰スケジューリング、永続的なPending Pod、またはコントロールプレーンの負荷増大を招くことなく、どのようにして新しい容量を認識できるでしょうか?

プロンプトとコンテキスト

CSIドライバのボリュームアタッチ容量は、クラウドのクォータやヘルス状態に応じて変化します。KubernetesのMutable CSINode Allocatable向けに、容量レポート、スケジューラの整合性、障害保護、およびアップグレードを設計してください。CSIドライバ、ノードオブジェクト、スケジューラ、およびアタッチ障害の間の責任境界を説明してください。

面接官が評価するポイント

  • CSINode.spec.drivers[].allocatable.countがリアルタイムロックではなく、スケジューリングのヒントであることを理解しているか。
  • CSIドライバが定期的またはエラー発生後にどのように容量を更新するかを説明できるか。
  • 古い値、同時更新、スケジューラキャッシュ、およびアタッチ障害の処理。
  • アラート、バックオフ、互換性アップグレード、および容量回復の設計。

尋ねるべき明確化のための質問

  1. 容量の変更は、クラウドクォータ、ドライバの健全性、それともローカルノードのリソースに起因するものですか?
  2. どの程度の更新遅延やエラーが許容され、保守的なPending動作は許容されますか?
  3. クラスタとCSIドライバのバージョンは、変更可能なallocatableの値をサポートしていますか?
  4. アタッチ失敗後、システムは再試行すべきですか、Podを移動すべきですか、それともまずノードを凍結すべきですか?

30秒の回答フレームワーク

オブジェクトから始めます:CSIドライバが使用可能なボリューム容量をCSINodeに書き込み、スケジューラがそれを用いてフィルタリングします。値には遅延が生じる可能性があるため、アタッチ処理が最終チェックを実行します。ドライバは定期的に、または明確な容量エラー発生時に更新を行い、コントローラとスケジューラはwatchを介して収束します。更新レートを制限し、順序性を保護し、不確実な状況下では容量を保守的に削減して、誤った過大値がクラスタ全体に拡散しないようにします。

ステップバイステップの詳細解説

1. 責任チェーンとデータモデル

各ノードとドライバのペアにはCSINode.spec.drivers[].allocatable.countが存在します。CSIドライバはストレージバックエンドのアタッチ制限を把握しており、使用可能な容量を報告します。スケジューラはこれを事前フィルタ情報として扱います。このフィールドは分散ロックではなく、スケジューリング決定間の競合を防ぐことはできません。ドライバとコントローラは、ボリュームが実際に作成またはアタッチされる際に、容量を再度検証する必要があります。

2. 更新トリガーと整合性

ドライバは、CSIDriverを介して設定された周期で、または明確な容量枯渇エラーの直後に更新を実行できます。リソースバージョンの前提条件(resource-version preconditions)を使用して、古いドライバが新しい値を上書きできないようにします。最小間隔とジッターを追加して、クラウドAPIのノイズがコントロールプレーンの書き込み増幅につながらないようにします。スケジューラはwatchを通じてキャッシュを更新し、短時間の不整合ウィンドウの間は保守的な決定を下す必要があります。

3. 障害保護と回復

ドライバがクォータやヘルス状態を取得できない場合、無限の容量を報告してはなりません。有効期限付きで最後に確認された正常値を保持するか、容量をゼロに減らして新しいPodがPending状態を維持するようにします。アタッチの失敗を、容量、権限、トポロジ、または一時的なネットワークエラーに分類します。allocatableを更新すべきなのは容量エラーのみです。回復後は、アタッチの成功を監視しながら徐々に容量を増やします。

4. アップグレード、監視、および検証

Kubernetes v1.36でMutable CSINode Allocatableが安定版(stable)になります。アップグレード前に、API Server、スケジューラ、kubelet、およびCSIドライバのバージョンマトリックスを検証し、少数のカナリアノードで定期更新を有効にします。オブジェクトの更新遅延、容量変更の頻度、Pendingの理由、アタッチ障害の分類、コントロールプレーンの書き込みQPS、および実際のノード使用状況を監視します。シグナルが悪化した場合は、更新を一時停止し、互換性のある設定を復元し、最後に信頼された容量を維持します。

模範回答

変更可能なallocatableは、リアルタイムロックではなくスケジューリングのヒントとして扱います。CSIドライバはノードとドライバのアタッチ容量をCSINode.spec.drivers[].allocatable.countに報告し、定期的に、または明確な容量枯渇エラーの後に更新します。スケジューラはオブジェクトをwatchしますが、アタッチ時の最終チェックは引き続きドライバが実行します。

更新にはレート制限、リソースバージョンの条件、およびジッターが必要です。クォータが信頼できない場合は、任意に大きな値を書き込むのではなく、保守的に容量を減らします。アタッチの失敗を容量、権限、トポロジ、ネットワークごとに分類し、容量の失敗のみが更新をトリガーするようにします。v1.36で機能が安定した後は、カナリアノードを運用し、更新遅延、Pendingの理由、アタッチの失敗、書き込みQPS、および実際の使用率を監視します。シグナルが悪化した場合は更新を一時停止し、最後に信頼された値を復元します。

よくある間違い

  • allocatableを競合のないリアルタイムロックとして扱うこと。
  • すべてのアタッチ失敗に対して容量をゼロにしてしまい、無関係なPodまでPendingにさせてしまうこと。
  • ドライバが高頻度でCSINodeへの書き込みを行い、コントロールプレーンの負荷を増大させること。
  • クォータの参照に失敗した際に過大な容量を報告すること。
  • CSIドライバ、スケジューラ、kubeletの互換性を無視して、APIバージョンのみをアップグレードすること。

フォローアップの質問と回答

フォローアップ1:スケジューラが十分な容量を確認した後にアタッチが失敗するのはなぜですか?

このフィールドには伝播遅延があり、同時に実行されているコンシューマが同じクォータを消費する可能性があるためです。スケジューリングフィルタは失敗の確率を下げる役割を果たします。CSIドライバはアタッチ時に再度検証を行い、分類されたエラーを返す必要があります。

フォローアップ2:容量はどのくらいの頻度で更新すべきですか?

クォータの変更頻度、コントロールプレーンの書き込みバジェット、およびPending Podに対するビジネス上の許容度によって異なります。最初は保守的に開始し、更新遅延、障害率、書き込みQPSに基づいて調整し、エラー発生後はバックオフを伴うトリガー更新を使用します。

フォローアップ3:古いドライバが新しい容量を上書きするのを防ぐにはどうすればよいですか?

リソースバージョン条件付き更新とドライババージョンのゲートを使用し、アップグレード中に古いドライバからの書き込みを制限します。書き込み元の識別情報、タイムスタンプ、リグレッションを監視し、ロールバックが検出された場合は自動拡張を一時停止します。

公開情報ソース

関連する質問

関連面接ツール

システム設計の回答には「回答する」を使用

まず要件を明確にし、スケール、アーキテクチャ、コンポーネント選定、トレードオフの順に進めます。

ツールを見る