Kubernetes 1.23: SIG Storageの変更内容

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

# 新着情報 (What's New (Major Themes))

## Deprecation of FlexVolume

FlexVolumeが非推奨(Deprecation)になりました。Out-of-treeのCSIドライバがKubernetesでのvolume driverを作る推奨方法です。詳細については、[こちらのドキュメント](https://github.com/kubernetes/community/blob/master/sig-storage/volume-plugin-faq.md#kubernetes-volume-plugin-faq-for-storage-vendors)を参照してください。
FlexVolumeドライバのメンテナは、CSIドライバを実装し、FlexVolumeのユーザーをCSIへ移行させる必要があります。FlexVolumeのユーザーは自分のワークロードをCSIドライバへ移行する必要があります。

## Generic Ephemeral Volume feature graduates to GA

Generic Ephemeral Volumeが1.23にてGAとなりました。
この機能により、Dynamic Provisioningをサポートする既存のストレージドライバは、ボリュームのライフサイクルがPodにバインドされるEphemeral Volumeとして使用できます。
StorageClassのvolume provisioningのすべてのパラメータとPersistentVolumeClaimsでサポートされているすべての機能がサポートされています。

## Skip Volume Ownership change graduates to GA

Podのボリュームのパーミッションとオーナーチェンジのポリシーを設定する機能が1.23にてGAとなりました。
これにより、マウント時に再帰的なパーミッションの変更をスキップでき、Podの起動時間を短縮できます。

## Allow CSI drivers to opt-in to volume ownership and permission change graduates to GA

CSIドライバがfsGroupのパーミッションを宣言できる機能が1.23にてGAとなりました。

## CSI Migration updates

CSI Migrationは既存のin-treeのStorage Plugin(kubernetes.io/gce-pd or kubernetes.io/aws-ebsなど)を対応するCSIドライバへ置き換えるものです。
CSI Migrationが正しく動作していれば、Kubernetesのエンドユーザは、違いに気が付かないはずです。
移行後、Kubernetesのユーザは、既存のインターフェースを利用して、in-treeのStorage Pluginの全ての機能を継続し利用できます。
 
- CSI Migration機能がデフォルトでオンになりますが、1.23ではGCE PD, AWS EBS, Azure DiskはBetaのままです。
- 1.23ではCeph RBD, PortworxのCSI Migration機能はAlphaです。

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

SIG Storage関連はなし

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

- Feature gate `Volumesubpath`は非推奨になり無効にできません。これのFeature gateは1.25で完全に削除されます ([#105474](https://github.com/kubernetes/kubernetes/pull/105474), @mauriciop)
- 非推奨のメトリクス scheduler_volume_scheduling_duration_seconds は削除されました ([#104518](https://github.com/kubernetes/kubernetes/pull/104518), @dntosas)

### API周りの変更 (API Change)

- Feature Gate `StatefulSetAutoDeletePVC`を追加しました。これにより、StatefulSet Podのために自動的に作成されたPVCが自動的に削除されます ([#99728](https://github.com/kubernetes/kubernetes/pull/99728), @mattcary)
- ボリューム拡張の失敗時のリカバリーをサポートします ([#106154](https://github.com/kubernetes/kubernetes/pull/106154), @gnufied) [SIG API Machinery, Apps and Storage]
- StatefulSetの`minReadySeconds`がベータに昇格しました ([#104045](https://github.com/kubernetes/kubernetes/pull/104045), @ravisantoshgudimetla)
- "Generic Ephemeral Volume" のfeature graduateがGAになりました。無条件で有効になります ([#105609](https://github.com/kubernetes/kubernetes/pull/105609), @pohly)
- CSIDriver.Ppec.StorageCacityを変更できるようになりました ([#101789](https://github.com/kubernetes/kubernetes/pull/101789), @pohly)
- CSIVolumeFSGroupPolicyがベータからGAに昇格しました ([#105940](https://github.com/kubernetes/kubernetes/pull/105940), @dobsonj)

### 機能 (Feature)

- （ベータ機能）CSIドライバがNodeServiceCapabilityの`VOLUME_MOUNT_GROUP`をサポートしていて、`DelegateFSGroupToCSIDriver`のfeature gateが有効になっている場合、kubeletは、他のFSGroupポリシーが設定されているのかに関らず、NodeStageVolumeとNodePublishVolumeへ値を渡してFSGroupの適用をドライバへ委任します ([#106330](https://github.com/kubernetes/kubernetes/pull/106330), @verult) [SIG Storage]
- Portworxプラグインのサポートをcsi-translation-libに追加します。(アルファリリース)
  Migrationを有効にするには、Portworx CSIドライバが必要です。このPRは`CSIMigrationPortworx` feature gateのサポートを追加します。これは次の方法で有効にできます。
    1. kube-controller-managerに`--feature-gates=CSIMigrationPortworx=true`のfeatureフラグを追加します
    2. kubelet configのfeatureフラグに以下を追加します
   
```
featureGates: 
  CSIMigrationPortworx: true 
```

  ([#103447](https://github.com/kubernetes/kubernetes/pull/103447), @trierra) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Scheduling, Storage, Testing and Windows]

- Local volumeの拡張を許可します ([#102886](https://github.com/kubernetes/kubernetes/pull/102886), @gnufied)
- CSIMigrationAWSをデフォルトでオンに変更します。この機能はAWS EBS CSIドライバのインストールが必要です ([#106098](https://github.com/kubernetes/kubernetes/pull/106098), @wongma7)
- schedulerのVolumeBinding プラグインをエンハンスし、ロストしたPVCを`UnschedulableAndUnresolvable`として扱います ([#105245](https://github.com/kubernetes/kubernetes/pull/105245), @yibozhuang)
- PVの`ReclaimPolicy`が`Delete`に設定されている場合に、ユーザーがPVオブジェクトを手動で削除しようとすると、ストレージバックエンドからボリュームが削除されることを保証します ([#105773](https://github.com/kubernetes/kubernetes/pull/105773), @deepakkinni)
- Feature gate `StorageObjectInUseProtection`は非推奨になり無効にできません。このFeature gateは1.25で完全に削除されます ([#105495](https://github.com/kubernetes/kubernetes/pull/105495), @ikeeip)
- `ConfigurableFSGroupPolicy`がGAになり、メトリクス名が`volume_fsgroup_recursive_apply`から`volume_apply_access_control`へ変更しました ([#105885](https://github.com/kubernetes/kubernetes/pull/105885), @gnufied)
- `CSIMigrationGCE` featureフラグがデフォルトで有効になりました ([#104722](https://github.com/kubernetes/kubernetes/pull/104722), @leiyiz)
- `CSIMigrationAzureDisk`featureフラグが1.23でデフォルトで有効になりました ([#104670](https://github.com/kubernetes/kubernetes/pull/104670), @andyzhangx)

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

SIG-Storage 関連はなし

### 失敗しているテスト (Failing Test)

- SELinux が有効になった環境でのhostpath storageのE2Eテストを修正しました ([#104551](https://github.com/kubernetes/kubernetes/pull/104551), @Elbehery)

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

- raw block デバイスのGeneric Ephemeral Volumesを持つPodを作成できるようになりました ([#105682](https://github.com/kubernetes/kubernetes/pull/105682), @pohly)
- bindマウントの変更がない限り、コンテナの作成中にsubpathのbindマウントのunmountとmountを行わない ([#105512](https://github.com/kubernetes/kubernetes/pull/105512), @gnufied) [SIG Storage]
- vmssノードの削除中のディスクのdetachの問題を修正します ([#104572](https://github.com/kubernetes/kubernetes/pull/104572), @andyzhangx)
- PersistentVolumeClaimのUIDがローカルキャッシュには存在しないが、updatedからreleasedフェーズのetcdに存在する場合にPersistentVolumeの妨げになるバグを修正しました ([#105211](https://github.com/kubernetes/kubernetes/pull/105211), @xiaopingrubyist)
- 非常にビジーなシステム("error checking for SELinux support: could not get consistent content of /proc/self/mountinfo after 3 attempts"が発生)のCSIボリュームのSELinuxラベルの適用を修正しました ([#105934](https://github.com/kubernetes/kubernetes/pull/105934), @jsafrane) [SIG Storage]
- 小文字の`managed`のkindに起因するazure diskの変換の問題を修正しました ([#103439](https://github.com/kubernetes/kubernetes/pull/103439), @andyzhangx)
- Node制限のスケジューラのフィルターとkubeletのhostPathのチェックにてGeneric Ephemeral Volumesを適切にハンドルングできるようにしました ([#100482](https://github.com/kubernetes/kubernetes/pull/100482), @pohly)
- KubeletはGeneric Ephemeral Volumesの`kubelet_volume_stats_*` メトリクスをレポートしませんでした ([#105569](https://github.com/kubernetes/kubernetes/pull/105569), @pohly)
- メトリクス変更: `scheduler_volume_scheduling_duration_seconds_bucket` メトリクスを公開しました ([#100720](https://github.com/kubernetes/kubernetes/pull/100720), @dntosas)
- Windowsで100以上のディスクのマウントをサポートしました ([#105673](https://github.com/kubernetes/kubernetes/pull/105673), @andyzhangx)
- XFS-filesystemsはsuper-blockのmagicの検出によるフォーマット時の問題を回避するためにforce-formatted (option -f)するようになりました。これによりext3/4ファイルシステムのフォーマットの挙動と同じになります ([#104923](https://github.com/kubernetes/kubernetes/pull/104923), @davidkarlsen)

### その他 (Cleanup or Flake)

- pkg/scheduler/framework/plugins/volumebinding/assume_cache.go を構造化ロギング(structured logging)へ移行しました ([#105904](https://github.com/kubernetes/kubernetes/pull/105904), @mengjiao-liu) [SIG Instrumentation, Scheduling and Storage]
- CSINodeの`id`フィールドの最大長をCSIの仕様にあわせて256バイトへ増やしました ([#104160](https://github.com/kubernetes/kubernetes/pull/104160), @pacoxu)

# 所感

Kubernetes v1.23のストレージ関連は大きく3つのトピックが目立っていた印象です。

- FlexVolumeの非推奨化 (CSI Driverへの移行の促進)
- Generic Ephemeral VolumeのGA
- fsGroup関連のGA (chmod,chownの再帰実行のスキップとパーミッション変更をCSI Driverへ移譲)

この中で、機能的に新しいものとしてはGeneric Ephemeral Volumeではないでしょうか。
Generic Ephemeral Volumeがどのようなものかを知りたい方は、「[Kubernetes: CSI を使ったEphemeral Volumeの動作検証](https://qiita.com/ysakashita/items/17dd055484f4a878f1b7)」に記事を公開しているのでご参照ください。

Generic Ephemeral VolumeはPodが削除されると同時に削除されるボリュームのことで、Dynamic ProvisioningをサポートしているCSI Driverであれば利用できます。
これまで提供されているemptyDirとは異なり、PVC/PVを使ったボリュームという点が大きく異なります。
これにより、PVC/PVではサポートされていたが、emptyDirではサポートされていなかったSnapshotなどのストレージ機能が利用できるメリットがあります。
つまり、Kubernetes v1.23にて、Persistent Volume(永続ボリューム: Podを削除しても削除されないボリューム)とEpeheral Volume(短命ボリューム: Podを削除すると削除されるボリューム)の2つの異なるライフサイクルのボリュームがGAサポートになりました。
どちらが良い/悪いというものではないため、利用するアプリやユースケース次第でうまく使い分けるのがお勧めです。