Kubernetes 1.26: SIG Storageの変更内容

# はじめに

本ドキュメントでは、Kubernetes 1.26.0の[CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.26.md#changelog-since-v1250)をベースにSIG Storageに関する機能について紹介します。
:memo: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

# アップグレード前に絶対に確認が必要な変更点 (Urgent Upgrade Notes)

SIG-Storageに関連するものはなし

## Changes by Kind
### 非推奨 (Deprecation)

SIG-Storageに関連するものはなし

### APIの変更 (API Change)

- ResourceClaim API(resource.k8s.io/v1alpha1グループで、DynamicResourceAllocationのfeature gateで使われる)が追加されました。この新しいAPIは、Kubernetesの既存のDevice Plugins よりも柔軟で、Podが特別な種類(kind)のリソースの要求(claim)を行うことができ、ノードレベルやクラスタレベル、その他の実装されたモデルで利用することができます。([#111023](https://github.com/kubernetes/kubernetes/pull/111023), @pohly) 
- PersistentVolumeClaim APIのDataSourceRefフィールドに namespaceフィールドをアルファとして追加しました。 ([#113186](https://github.com/kubernetes/kubernetes/pull/113186), @ttakahashi21)

:memo: 本APIにより、VolumeSnapshotからリストアする際のnamespaceが選べるようになりました。この機能のユースケースなどの詳細について2022/11に開催されたCNDT2022の[「Kubernetesのnamespaceを越えて: namespace跨ぎのsnapshotからのvolumeの作成の今と未来」](https://event.cloudnativedays.jp/cndt2022/talks/1521)にて発表されています。

### 機能 (Feature)

- CSIMigrationvSphere は GA に昇格し、trueに固定されました。WindowsやXFSまたは rawブロックが必要な場合は、vSphere CSI ドライバがv2.7.x以降のバージョンでこれらのサポートが追加されるまで、K8S v1.26へアップグレードしないでください。 ([#113336](https://github.com/kubernetes/kubernetes/pull/113336), @divyenpatel) 
- DelegateFSGroupToCSIDriverがGAになりました。([#113225](https://github.com/kubernetes/kubernetes/pull/113225), @bertinatto)

:memo: DelegateFSGroupToCSIDriverがGAとなったことで、CSIドライバにてボリュームのアクセス権限を制御できるようになりました。これまではkubeletにてPodのfsGroupで指定されたポリシーに従いファイルの所有権と権限を変更していました。

- NodeOutOfServiceVolumeDetachがベータになりました。 ([#113511](https://github.com/kubernetes/kubernetes/pull/113511), @xing-yang)
- RetroactiveDefaultStorageClassがベータになりました。([#113329](https://github.com/kubernetes/kubernetes/pull/113329), @RomanBednar) 
- 新しく`pod_status_sync_duration_seconds` ヒストグラムがアルファのメトリクスとして追加され、Podの状態変化を検知すると、Kubeletがそれを書き込むのにかかる時間を推定します。([#107896](https://github.com/kubernetes/kubernetes/pull/107896), @smarterclayton) 
- API Serverのopentelemetryのためのroot span nameのトレーシングを Kubernetes API からHTTP GETへ変更しました。 ([#112545](https://github.com/kubernetes/kubernetes/pull/112545), @dims) 
- kubeletのリスタート後に SELinuxのマウントコンテキストの再構築を追加しました。SELinuxMountReadWriteOncePod機能が完全に実行され、kubeletプロセスのリスタート後に、SELinuxのコンテキストのキャッシュを失わないようになりました。 ([#113596](https://github.com/kubernetes/kubernetes/pull/113596), @jsafrane)
- 複数のStorageClassがデフォルトとして指定されている場合(`storageclass.kubernetes.io/is-default-class`アノテーションの指定)、エラーを投げずに最も新しいものを選択するようになりました。 ([#110559](https://github.com/kubernetes/kubernetes/pull/110559), @danishprakash)

### ドキュメンテーション (Documentation)

SIG-Storageに関連するものはなし

### バグまたはリグレッション (Bug or Regression)

- vSphere e2e cloud providerの設定でラベルセレクションが許可されました。([#112427](https://github.com/kubernetes/kubernetes/pull/112427), @gnufied)
- GCEの、kubeletのコンテナ化されたマウンターのセットアップ間のレースコンディションを修正しました。([#112195](https://github.com/kubernetes/kubernetes/pull/112195), @mattcary)
- Kubernetesのrawブロック CSI ボリュームについて、kubeletはノードに既にアタッチされているボリュームに対して 1回の"map"操作毎に CSI NodeStageVolumeを不正に呼び出していました。今回の修正により、ノード毎のボリューム毎に1回だけ呼び出されるように変更されました。([#112403](https://github.com/kubernetes/kubernetes/pull/112403), @akankshakumari393)
- `LocalStorageCapacityIsolationFSQuotaMonitoring`がアルファにもどされました。([#112076](https://github.com/kubernetes/kubernetes/pull/112076), @rphillips)
- ネストされたマウントポイントは、全てのケースで正しくグループ化されるようになりました。([#112571](https://github.com/kubernetes/kubernetes/pull/112571), @claudiubelu)
- ボリュームマウントのクリーンアップにて、kubeletのroot全体ではなく、pluginディレクトリのみ対象にするようになりました。([#112607](https://github.com/kubernetes/kubernetes/pull/112607), @mattcary)

### その他 (Cleanup or Flake)

- E2E: テストは、フレームワークのインスタンスを作成した後、直接 `ginkgo.BeforeEach`, `ginkgo.AfterEach` または `ginkgo.DeferCleanup`でコールバックを登録でき、そのコードがフレームワークの初期化後、クリーンアップ前に呼ばれることが保証されるようになりました。フレームワークの簡素化のため削除された`f.AddAfterEach`と`AddCleanupAction`は`ginkgo.DeferCleanup`に置き換えられました。([#111998](https://github.com/kubernetes/kubernetes/pull/111998), @pohly) 
- test/e2e/frameworkをリファクタリングし、コアフレームワークをより小さくしました。リソース監視、ログサイズ監視、メトリクス収集、デバック情報のダンプなどのオプション機能は特定のe2eテストスイートで、インポートする必要があります。Initパッケージが提供されており、これをインポートすることで、従来のコアフレームワークにあった機能を有効化することができます。このPRによりコンパイル出来なくなったコードがある場合、コミットメッセージのスクリプトを使用して、コードをアップデートすることができます。([#112043](https://github.com/kubernetes/kubernetes/pull/112043), @pohly) 
- GlusterFS in-tree ストレージドライバは、Kubernetes v1.25で非推奨となり、1.26で完全に削除されました。([#112015](https://github.com/kubernetes/kubernetes/pull/112015), @humblec)

# 所感

本バージョンにて、まだアルファですが、PVCのDataSourceRefにNamespaceを指定できるようになりました。
本フィールドの利用は、まだ VolumeSnapshotのリストア時の指定にユースケースが限られていますが、今後 Cloneでの利用など別のNamespaceにPVの複製を作るようなユースでも利用できる可能性をもったフィールドです。
ステートフルアプリのテストなどでは、本番と同じデータを使ったボリュームを使いたい場合などもあるかと思います。
また、ステートフルアプリを本番運用するネームスペースとテストを行うネームスペースを分けて運用している組織も多いかと思います。
このような場合、これまでは異なるネームスペースに同じデータを持ったPVCを作成しようとすると、一度外部のオブジェクトストレージなどにデータをバックアップした後、新たなネームスペースに空っぽのPVCを新規作成しデータをリストアする必要がありました。
それが今回DataSourceRefにNamespaceが追加されたことで、VolumeSnapshotにて異なるネームスペースにリストアのPVCを作成できるようになり、外部のオブジェクトストレージなどを利用する必要がなくなりました。
このようにインフラ環境を簡素化できるような機能が増えてくると、アプリのテストケースも作成しやすくなります。
その他色々とメリットが生まれる可能性のある本機能がGAとなり、広く利用できるようになることを期待しています。