Kubernetes 1.28: SIG Storageの変更内容


# はじめに

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

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

- CephFS volume plugin (kubernetes.io/cephfs) は本リリースで非推奨となり、今後のリリースで削除される予定です。代替手段としては、CephFS CSI driver (https://github.com/ceph/ceph-csi/) を利用してください。([#118143](https://github.com/kubernetes/kubernetes/pull/118143), @humblec)

- Ceph RBD ボリュームのCSIマイグレーションのサポートが非推奨になりました。Kubernetesの out-of-tree(CSIドライバ)への移行機能に依存していたユーザは、サポートが削除される前までに、移行してください ([#118303](https://github.com/kubernetes/kubernetes/pull/118303), @carlory)

- RBDボリュームプラグイン(kubernetes.io/rbd)はこのリリースで非推奨となり、以降のリリースで削除される予定です。代替手段としては、KubernetesクラスタでRBD CSIドライバ(https://github.com/ceph/ceph-csi/)を使用することです。([#118552](https://github.com/kubernetes/kubernetes/pull/118552), @humblec)  

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

- Kube-controller-managerは--volume-host-cidr-denylistと--volume-host-allow-local-loopbackフラグを非推奨としました。([#118128](https://github.com/kubernetes/kubernetes/pull/118128), @carlory)

### APIの変更 (API Change)

- PersistentVolumes に新しい`LastPhaseTransitionTime` フィールドが追加され、ボリュームが最後にフェーズを遷移したタイムスタンプが保持されるようになりました。([#116469](https://github.com/kubernetes/kubernetes/pull/116469), @RomanBednar) 

- `pvc.Status`から`resizeStatus`列挙型を削除し、`AllocatedResourceStatus`に置き換えました。([#116335](https://github.com/kubernetes/kubernetes/pull/116335),@gnufied)

### 機能 (Feature)

- RetroactiveDefaultStorageClass 機能が安定版となりデフォルトで有効になりました。([#118102](https://github.com/kubernetes/kubernetes/pull/118102), @RomanBednar)

:memo: `RetroactiveDefaultStorageClass`は、PVCにてstorageClassNameを省略した際に利用されるデフォルトのStorageClassに関する機能です。
従来は、デフォルトのStorageClassを事前に設定し、その後にPVCを作成する必要がありました。つまり、後からデフォルトのStorageClassを設定しても、PVCはPendingのままでした。
この機能により、PVC作成時にstorageClassNameが未指定であっても、後からStorageClassのデフォルトを設定することでPVが作成されPVCとバインドされるようになりました。
なお、デフォルトのStorageClassの指定は、アノテーションに`storageclass.kubernetes.io/is-default-class: true` を指定することで設定できます。

- Added reason to metric attachdetach_controller_forced_detaches in the attach detach controller. (#119185, @xing-yang) [sig/storage,sig/apps]
- attach detach controller のメトリクス`attachdetach_controller_forced_detaches`に理由を追加しました。([#119185](https://github.com/kubernetes/kubernetes/pull/119185), @xing-yang)
- non-graceful ノードシャットダウンがGAになりました。 ([#118228](https://github.com/kubernetes/kubernetes/pull/118228), @carlory)

:memo: non-graceful ノードシャットダウンがGAとなったことで、シャットダウンが正しく行われずにノードが立ち上がらなかった場合にVolumeのデタッチが出来なくなってしますケースを救う機能になります。特にブロックストレージでは複数ノード/Podから同時書き込みによりボリュームが壊れることを防ぐためMulti Attachを抑止しているものがあります。そのため、古いノードからデタッチされないと、
新しいノードでいつまでもアタッチできない状態が続くことがありました。
non-graceful ノードシャットダウンでは、このような場合、taint `node.kubernetes.io/out-of-service=nodeshutdown:NoExecute` もしくは`node.kubernetes.io/out-of-service=nodeshutdown:NoSchedule`を付与することで、強制的にデタッチされ新しいノードでアタッチできるようになります。

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

- ボリューム作成の際の待機時のエラーメッセージをより明確にしました。 ([#118262](https://github.com/kubernetes/kubernetes/pull/118262), @torredil)

### 失敗するテスト (Failing Test)

- Azure Disk e2e がノードから利用できる場合、新しいトポロジーラベルを使用できるように許可しました。([#117216](https://github.com/kubernetes/kubernetes/pull/117216), @gnufied)
- サイドカーのリリースのためのAfterEach volumeperf.goテストのnilポインタを修正しました。 ([#117368](https://github.com/kubernetes/kubernetes/pull/117368), @sunnylovestiramisu)

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

- ノードがダウンして復旧に時間がかかると、追い出されたPodのマウントポイントを正常にクリーンアップできない問題を修正しました([#111933](https://github.com/kubernetes/kubernetes/pull/111933))。 一方、Kubeletは2秒ごとに、 `Orphaned pod "xxx" found, but error not a directory occurred when trying to remove the volumes dir` というログを出力します。([#105536](https://github.com/kubernetes/kubernetes/pull/105536))([#116134](https://github.com/kubernetes/kubernetes/pull/116134), @cvvz)
- PodとPVCのオブジェクトが削除された後、ボリュームがデタッチできない問題を修正しました。([#116138](https://github.com/kubernetes/kubernetes/pull/116138), @cvvz)
- rmコマンドでARG_MAX制限に引っかかり、ディレクトリ内のファイル数が多すぎるボリュームをpv recyclerがスクラビングできなかったバグを修正しました。([#117283](https://github.com/kubernetes/kubernetes/pull/117283), @defo89)
- NewVolumeManagerReconstruction 機能が有効で、/var/lib/kubelet/pods に CSI ボリュームが存在する場合に、kubelet のスタートアップがスタックする問題を修正しました。([#117804](https://github.com/kubernetes/kubernetes/pull/117804), @jsafrane)
- emptyDirのメトリクス `storage_operation_duration_seconds_count` に報告されるエラーの数は、以前はprojected volumeが作成されるたびに1つエラーが報告されていましたが、大幅に減少しました。 ([#117022](https://github.com/kubernetes/kubernetes/pull/117022), @mpatlasov)
- `NewVolumeManagerReconstruction`と`SELinuxMountReadWriteOncePod`のfeature gatesをデフォルトで無効に戻し、kubelet/ノード再起動時のボリューム再構築のリグレッションを解決しました。([#117751](https://github.com/kubernetes/kubernetes/pull/117751), @liggitt)
- pvまたはpvcでvolume.beta.kubernetes.io/storage-classアノテーションが使用されている場合に警告を表示するようになりました。([#117036](https://github.com/kubernetes/kubernetes/pull/117036), @haoruan)

### その他 (Cleanup or Flake)

- GAされたfeature gate `DelegateFSGroupToCSIDriver` を削除しました。([#117655](https://github.com/kubernetes/kubernetes/pull/117655), @carlory)
- 非推奨であった azureFile の in-treeのストレージプラグインを削除しました。([#118236](https://github.com/kubernetes/kubernetes/pull/118236), @andyzhangx) 
- feature gate `CSIStorageCapacity`は削除されました。`--feature-gates`フラグの参照を行わないでください。([#118018](https://github.com/kubernetes/kubernetes/pull/118018), @humblec)
- feature gate `CSIMigrationGCE`はGAとなり、デフォルトで有効になっていた機能はv1.25で削除され、gcepdパッケージ全体も削除されました。([#117055](https://github.com/kubernetes/kubernetes/pull/117055), @cyclinder)
- feature gate `DisableAcceleratorUsageMetrics`と`PodSecurity`はGAとなり、デフォルトで有効となっていた機能はv1.28で削除されました。([#114068](https://github.com/kubernetes/kubernetes/pull/114068), @cyclinder) 

# 所感

Kubernetes v1.28のSIG Stoargeでは `RetroactiveDefaultStorageClass`とnon-graceful ノードシャットダウンがGAとなりました。
1つ目の`RetroactiveDefaultStorageClass`は、PVCにてstorageClassNameを省略した際に利用されるデフォルトのStorageClassに関する機能です。
Helmなどでセットアップされるステートフルアプリケーションでは、ユーザがどのStorageClassを利用するのか不明なため、storageClassNameが指定されていないことが多くあります。
そのため、values.yamlなどでstorageClassNameを指定してあげる必要がありました。
この指定を忘れると、`RetroactiveDefaultStorageClass`が有効でないKubernetes(v1.27以前)の場合、ステートフルアプリケーションを一度削除した後、再度セットアップする必要がありました(PVCを一度削除する必要がありました)。
今回Kubernetes v1.28で`RetroactiveDefaultStorageClass`が有効になったため、このPVCの削除が不要となり、後からStorageClassのデフォルト設定を行えば、PVが作成されPVCとバインドされるようになります。

2つ目のnon-graceful ノードシャットダウンは、異常状態となったノードから強制にボリュームをデタッチする機能です。
これまで、異常状態になったノードからボリュームを外すのは、ノードの状態次第ではノードにログインし強制的にデタッチするなど非常に手間のかかる作業でした。
今回Kubernetes v1.28のnon-graceful ノードシャットダウンにより、この復旧作業が少し楽に行えるようになりました。

Kubernetes v1.28 SIG Storage関連では大きな機能追加はありませんが、上記紹介した2つの機能のようにユーザビリティとメンテナンス性が向上しています。
目立つような機能ではありませんが、いざという時に役に立つ機能らだと思いますので、いざという時にこれらの機能を思い出してもらえれば幸いです。