概要
ResourceSliceのデバイス属性文字列値(ResourceSlice.spec.devices[*].attributes[*].strings[*])に対するバイト長バリデーションを、手書きGoコードから宣言的バリデーション(validation-gen)へ移行したPRです。Kubernetes v1.37向けで、+k8s:eachValタグがKubernetesのAPI面で初めて使用された実例となります。
背景・前提知識
ResourceSliceとは: Dynamic Resource Allocation (DRA) というKubernetesの機能で使われるAPIオブジェクトです。GPU等のアクセラレータなど、Podに割り当てるデバイスリソースをクラスター内で宣言するために使います。
validation-gen (KEP-5073) とは: APIフィールドのバリデーションルールを、Goの構造体タグ(アノテーション)として直接コードに記述し、そこから自動的にバリデーションコードを生成する仕組みです。従来は各APIバージョンごとに手書きのバリデーション関数が必要でしたが、この仕組みにより:
- バリデーションルールがフィールド定義と同じ場所に記述される
- 全APIバージョン間で一貫したバリデーションが保証される
- APIサーバーのパフォーマンスが長期的に向上する
詳細
このPRが追加したタグ:
// +k8s:alpha(since: "1.37")=+k8s:eachVal=+k8s:maxBytes=64このタグは「リストの各要素(eachVal)に対して最大64バイト(maxBytes)」という制約を宣言します。v1、v1beta1、v1beta2 の3つのAPIバージョンすべてに追加されています。
maxBytes vs maxLength: 文字列長を制限する方法として maxLength(文字数)と maxBytes(バイト数)があります。既存の手書きバリデーションがGoの len(string)(バイト数を返す)を使っていたため、意味的に一致する maxBytes が選ばれました。テストでは é(2バイトのUTF-8文字)を使って、文字数ではなくバイト数でカウントされることを確認しています。
現時点では手書きバリデーションが権威として残り、宣言的バリデーションは「ソーク期間」として動作します。この期間は +k8s:eachVal タグを Beta に昇格させるために必要なテスト期間です。
変更量: 追加63行、削除2行(サイズM)
使用例
Kubernetes API利用者としては直接影響はありません(release-note NONE)。ただし、将来的に validation-gen が普及することで APIサーバーのバリデーションがより一貫して高速になるという恩恵を受けます。
Kubernetesコントリビューターとしては、新しいAPIフィールドのバリデーションを実装する際のリファレンスとなります。