概要

Dynamic Resource Allocation (DRA) においてCELセレクターが存在しないデバイス属性にアクセスした場合のエラーメッセージを改善しました。従来の「no such key」という不親切なエラーに加えて、orValue()has() を使ったオプションフィールドの安全な扱い方へのガイダンスとドキュメントリンクが表示されるようになります。

背景・前提知識

Dynamic Resource Allocation (DRA): GPU等のアクセラレータをPodに動的に割り当てるKubernetesの機能。どのデバイスを使うかをCEL式で宣言的に選択できます。

CELセレクターとは: Common Expression Language (CEL) を使ったデバイス選択式。例えば「NVIDIAのGPUでsharing-strategyがrunai-fractionsのもの」のような条件を書けます。

問題: デバイスの属性は全デバイスが同じ属性を持つとは限りません。例えば device.attributes["gpu.nvidia.com"].sharingStrategy という属性を持たないデバイスに対してこの式を評価すると、no such key: sharingStrategy というエラーが出ますが、「じゃあどう直せばいいか」の手がかりがありませんでした。

詳細

エラー検出は strings.HasPrefix(err.Error(), "no such key:") を使ったstring matchingで行われています。cel-goの内部エラー型 resolutionError がエクスポートされていないため、errors.Is() が使えないという制約があります。これはKubernetes自体が他の箇所でも採用しているパターンです。

変更は3つのDRAアロケーターファイルに適用されています:

  • structured/internal/stable/allocator_stable.go
  • structured/internal/incubating/allocator_incubating.go
  • structured/internal/experimental/allocator_experimental.go

これらは成熟度レベル(実験的→インキュベーション→安定)を表す3段階のDRAアロケーター実装で、機能の成熟に伴って移行されるため、常に同期を保つ必要があります。

また、CELDeviceSelector のドキュメントに orValue()has()? オペレーターを使ったコンクリートな使用例が追加されました。

変更量: 追加287行、削除42行(サイズL)

使用例

修正前:

no such key: sharingStrategy

修正後(イメージ):

no such key: sharingStrategy - device attributes may not contain the key you are
accessing. Consider using orValue() or has() to handle optional fields.
See: https://pkg.go.dev/k8s.io/api/resource/v1#CELDeviceSelector

CELセレクターを安全に書く例:

// has() でフィールドの存在を確認
has(device.attributes["gpu.nvidia.com"].sharingStrategy) &&
device.attributes["gpu.nvidia.com"].sharingStrategy == "runai-fractions"
 
// orValue() でデフォルト値を指定
device.attributes["gpu.nvidia.com"].sharingStrategy.orValue("") == "runai-fractions"

参考リンク