Kubernetes 1.31: SIG Storageの変更内容

# はじめに

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

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

- Kubeletフラグ --keep-terminated-pod-volumes が削除されました。このフラグは2017年に非推奨とされていました。 (#122082, @carlory) [SIG Apps, Node, Storage and Testing] 
-  ボリューム拡張に失敗したときの状態変更のノイズを減らしました。また、特定の失敗を実行不可能であるとマークしました。
  - ACTION REQUIRED: RecoverVolumeExpansionFailure アルファのfeature gateを使用している場合、このリリースにアップグレード後、一部のオブジェクトを更新する必要があります。status.allocatedResourceStatusが"ControllerResizeFailed"または"NodeResizeFailed"に設定されている既存のPersistentVolumeClaimsは、status.allocatedResourceStatusをクリアしてください。[#126108, @gnufied] [SIG Apps, Auth, Node, Storage and Testing]

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

- PersistentVolume (PV)をvolume.beta.kubernetes.io/mount-optionsの非推奨アノテーションで作成または更新するときの警告が追加されました。[#124819, @carlory]
- CephFS volume plugin (kubernetes.io/cephfs)がこのリリースで削除され、cephfs volume typeが機能しなくなりました。代替策として、CephFS CSIドライバ(https://github.com/ceph/ceph-csi/ )をKubernetesクラスタで使用してください。1.31+へのクラスターバージョンのアップグレード前にkubernetes.io/cephfsボリュームプラグインを使用していた場合は、新しいドライバを使用するためにアプリケーションの再デプロイが必要です。[#124544, @carlory] [SIG Node, Scalability, Storage and Testing]
- CephRBD volume plugin(kubernetes.io/rbd)がこのリリースで削除されました。また、そのCSIマイグレーションサポートも削除されたため、rbd volume typeは機能しなくなりました。代替策として、RBD CSIドライバ(https://github.com/ceph/ceph-csi/ )をKubernetesクラスターで使用してください。1.31+へのクラスターバージョンのアップグレード前にkubernetes.io/rbdボリュームプラグインを使用していた場合は、新しいドライバを使用するためにアプリケーションの再デプロイが必要です。[#124546, @carlory] [SIG Node, Scalability, Scheduling, Storage and Testing]
- Kube-schedulerはすべての非CSIボリューム制限プラグインを非推奨とし、デフォルトプラグインから削除しました。
  - AzureDiskLimits
  - CinderLimits
  - EBSLimits
  - GCEPDLimits
  これらのボリュームタイプはCSIに移行されたため、NodeVolumeLimitsプラグインが上記プラグインと同じ機能を処理できます。スケジューラの設定でこれらのプラグインを明示的に使用している場合は、それらを削除してNodeVolumeLimitsプラグインに置き換えてください。これらのプラグインは1.32リリースで削除されます。[#124500, @carlory] [SIG Scheduling and Storage]

### APIの変更 (API Change)

- PersistentVolumeLastPhaseTransitionTime機能がstableとなり、デフォルトで有効になっています。[#124969, @RomanBednar] [SIG API Machinery, Apps, Storage and Testing]
- LocalStorageCapacityIsolationがベータ版に昇格し、デフォルトで有効になりました。feature gateが有効であり、特定のPodがユーザネームスペースを使用している場合に、kubelet内でストレージ容量の隔離がアクティブになります。[#126014, @PannagaRao] [SIG Apps, Autoscaling, Node, Storage and Testing]
- feature-gate VolumeAttributesClassがベータ版に昇格しました（デフォルトでは無効）。この機能を使用するには、feature gateを有効にし、storage.k8s.io/v1beta1 のAPIグループを使用する必要があります。VolumeAttributesClass APIはベータ版に昇格しました。[#126145, @carlory] [SIG API Machinery, Apps, CLI, Etcd, Storage and Testing]
- kube-controller-managerから非推奨のコマンドフラグ --volume-host-cidr-denylist と --volume-host-allow-local-loopback が削除されました。[#124017, @carlory] [SIG API Machinery, Apps, Cloud Provider and Storage]

### 機能 (Feature)

- カスタムスケジューラプラグイン開発者向けのACTION REQUIRED: EnqueueExtensionsインターフェイスのEventsToRegisterはパラメータにctx,戻り値としてerrorが追加されました。プラグインの実装を適宜変更してください。[#126113, @googs1025] [SIG Node, Scheduling, Storage and Testing]
- pv_collector_bound_pvc_count と pv_collector_unbound_pvc_count メトリクスに storage_class および volume_attributes_class ラベルを追加しました。[#126166, @AndrewSirenko] [SIG Apps, Instrumentation, Storage and Testing]
- kubeletが --enable-controller-attach-detach=false で実行されている場合であっても、失敗したアタッチ操作についてPodのイベントに報告する機能を追加しました。[#124884, @carlory] [SIG Storage]
- KubernetesをGo 1.22.4でビルドしました。[#125363, @cpanato] [SIG Architecture, Cloud Provider, Release, Storage and Testing]
- feature-gateのVolumeAttributesClassが有効になっている場合、claim(PersistentVolumeClaim)に適したpersistent volumeを見つける際、kube-controller-managerはPVCとPVオブジェクトのvolumeAttributesClassNameフィールドを認識します。volumeAttributesClassNameフィールドはVolumeAttributesClassオブジェクトへの参照であり、そのオブジェクトはボリュームの変更可能な属性を表すキーと値のペアのセットを含みます。PVCがPVオブジェクトにバインドされるまで、PVCオブジェクトのvolumeAttributesClassNameフィールドを変更することは禁止されています。bindingのプロセス中にPVCにvolumeAttributesClassNameフィールドが設定されている場合、コントローラはPVCと同じvolumeAttributesClassNameを持つボリュームのみを考慮します。volumeAttributesClassNameフィールドが設定されていないか、空の文字列に設定されている場合は、空のvolumeAttributesClassNameを持つボリュームのみが考慮されます。[#121902, @carlory] [SIG Apps, Scheduling, Storage and Testing]
- kube-schedulerはCSILimitプラグインに対するスケジューリングヒントを実装しました。スケジューリングヒントは、CSILimitプラグインによって以前に拒否されたPodのスケジュールを、削除されたPodが同じドライバからPersistantVolumeClaim (PVC)を持っている場合にリトライできるようになります。[#121508, @utam0k] [SIG Scheduling and Storage]
- kube-schedulerはVolumeRestrictionプラグインに対するスケジューリングヒントを実装しました。スケジューリングヒントは、VolumeRestrictionプラグインによって以前に拒否されたPodのスケジュールを、Podが削除され、削除されたPodが現在のPodの既存のボリュームと競合している場合にリトライできるようにします。[#125279, @HirazawaUi] [SIG Scheduling and Storage]
-  kube-schedulerはVolumeRestrictionプラグインに対するスケジューリングヒントを実装しました。スケジューリングヒントは、新しいpvcが追加され、そのpvcがPodに属している場合、スケジューラがVolumeRestrictionプラグインによって以前に拒否されたPodのスケジューリングをリトライすることを可能にします。（#125280、@HirazawaUi）[SIG Scheduling and Storage]
- kube-schedulerはVolumeZoneプラグインのためのスケジューリングヒントを実装しました。スケジューリングヒントは、VolumeZoneプラグインによって以前に拒否されたPodのスケジュールを、ノード、PV、PVCの追加/更新、またはSCの追加がPodのトポロジー設定と一致したときにのみリトライできるようにします。[#124996, @Gekko0114] [SIG Scheduling and Storage]
- kube-scheduler は、VolumeZone プラグインのためのスケジューリングヒントを実装しました。スケジューリングヒントによって、スケジューラはVolumeZoneプラグインによって以前拒否された Pod を、ノードの追加／更新、PV の追加／更新、PVC の追加／更新、または Pod のトポロジ設定に合致する SC の追加があった場合にのみスケジューリングをリトライすることができます。（#125000、@Gekko0114）[SIG Scheduling and Storage]
- kube-scheduler は、VolumeZone プラグインのためのスケジューリングヒントを実装しました。このヒントに従うことで、スケジューラはPodのトポロジ設定に一致するノード・PV・PVCの追加または更新、またはSCの追加が行われた場合に限り、VolumeZoneプラグインによって以前拒否されたPodのスケジューリングをリトライできます。（#125001、@Gekko0114）[SIG Scheduling and Storage]
- HonorPVReclaimPolicy がベータ版に昇格となり、デフォルトでfeature-gateを有効化しました。（#124842、@carlory）[SIG Apps, Storage and Testing]
- CSIMigrationPortworxのfeature-gateは Kubernetes 1.25 でベータ版に昇格しましたが、デフォルトではオフにされていました。1.31 でデフォルトでオンになりました。1.31 にアップグレードする前に、Portworx を使用している場合は対応する portworx csi ドライバーがインストールされていることを確認してください。（#125016、@carlory）[SIG Storage]
- kube-scheduler は、VolumeBinding プラグイン内で CSIStorageCapacity リソースのためのスケジューリングヒントのサポートを追加しました。スケジューリングヒントによって、スケジューラはプラグインによって参照されている新しいリソースが作成された場合、または既存のリソースが更新された場合に限り、VolumeBinding プラグインによって以前拒否された Pod のスケジューリングをリトライすることができるようになりました。（#124961、@bells17）[SIG Scheduling and Storage]
- kube-scheduler は、VolumeBinding プラグイン内で PersistentVolumeClaim リソースのためのスケジューリングヒントのサポートを強化しました。スケジューリングヒントにより、スケジューラはプラグインが参照する新しいリソースが作成された場合、または既存のリソースが更新された場合に限り、以前にVolumeBindingプラグインによって拒否されたPodのスケジューリングをリトライすることができます。（#124959、@bells17）[SIG Scheduling and Storage]
- kube-scheduler は、VolumeBinding プラグイン内で StorageClass リソースのためのスケジューリングヒントのサポートを追加しました。スケジューリングヒントによって、スケジューラはプラグインによって参照されている新しいリソースが作成された場合、または既存のリソースが更新された場合に限り、VolumeBinding プラグインによって以前拒否されたPodのスケジューリングをリトライすることができるようになりました。（#124958、@bells17）[SIG Scheduling and Storage]
- スケジューラは、VolumeBindingプラグインの CSINode イベントに QueueingHint を実装し、スケジューリングのスループットを向上させました。（#125097、@YamasouA）[SIG Scheduling and Storage]

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

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

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

- "-kube-test-repo-list" e2e フラグが効果を発揮しない可能性があるという問題を修正しました。（＃123587, @huww98）[SIG API Machinery, Apps, Autoscaling, CLI, Network, Node, Scheduling, Storage, Testing and Windows]
- Windows上のkubeletにて、SecurityContextでRunAsUserを持つPodがある場合に失敗するという問題を修正しました。（＃125040, @carlory）[SIG Storage, Testing and Windows]
- 静的にプロビジョニングされたPVに関して、そのvolume sourceがCSIタイプであるか、移行されたアノテーションを持っている場合、削除されたときPersistentVolumeコントローラーはそのフェーズを"Failed"状態に変更しなくなりました。このパッチにより、external provisionerは次の調整ループでfinalizerを削除できるようになります。ただし残念ながら、既存のPVが"Failed"状態にある場合、このパッチは効果がありません。finalizerをユーザー自身で除去する必要があります。（＃125767, @carlory）[SIG Apps and Storage]
- Mount-utilsはsyscall.ENODEVを破損したマウントとして扱うようになりました。（＃126174, @dobsonj）
- PersistentVolumeLabelのadmissionプラグインを削除しました。類似の機能が必要な場合は代わりに https://github.com/kubernetes-sigs/cloud-pv-admission-labeler を使用してください。（＃124505, @jsafrane）[SIG API Machinery, Auth and Storage]
- client-genによって生成された"fake"クライアントは、エラー時に本物のクライアントと同じセマンティクスを持つようになりました。特に、失敗したGet()やCreate()などはnilを返さなくなりました（本物のクライアントがそうであるように、0値のオブジェクトへのポインタを返すようになりました）。 これにより、`err != nil` ではなく `result == nil` をテストしていたいくつかの下流のユニットテストが壊れ、場合によっては、間違ったユニットテストによって潜在的なバグが露見する可能性があります。（＃122892, @danwinship）[SIG API Machinery, Auth, Cloud Provider, Instrumentation and Storage]

### その他 (Cleanup or Flake)

- このリリースでは、Container Storage Interface (CSI)のスペックサポートがv1.9.0にアップデートされました。（＃125150, @humblec）[SIG Storage and Testing]
- GAとなったfeature gateの`CSINodeExpandSecret`を削除しました。(#124462, @carlory)
- GAとなったfeature gateの`ReadWriteOncePod`を削除しました。(#124462, @carlory)
- 次のfeature gatesを削除しました。
  - InTreePluginAWSUnregister
  - InTreePluginAzureDiskUnregister
  - InTreePluginAzureFileUnregister
  - InTreePluginGCEUnregister
  - InTreePluginOpenStackUnregister
  - InTreePluginvSphereUnregister (#124815, @carlory) [SIG Storage]
- 最後に残っていたGCP cloud provierとcredential providerを削除しました。代わりに、external cloud providerとcredential providerは https://github.com/kubernetes/cloud-provider-gcp を使用してください。（＃124519, @dims）[SIG API Machinery, Apps, Auth, Autoscaling, Cloud Provider, Instrumentation, Network, Node, Scheduling, Storage and Testing]

# 所感
Kubernetes v1.31ではIn-Treeでサポートされていた各社のストレージ対応の削除が進みました。
2018年にKubernetes v1.13にてCSIがGAとなり、2019年のv1.14にてIn-TreeからCSIへのMigrationのフレームワークがサポートされました。
計画の当初は2-3バージョンでIn-TreeからCSIへの移行が各社完了すると計画でしたが、振り返ってみると5年以上経過しようやくfeature gatesも含め削除が進んだ結果でした。
推察ですが、各社の開発が進まなかったというよりは、すでにPVにデータを格納しているユーザのデータ移行までも対応しつつの切り替えであったため、各社 In-Treeの
削除までには時間がかかってしまったのではないかと思います。

その他としては、本バージョンにてkubeletにてPV関連の各種プラグインにて一度スケジューリングを拒否されてしまったものをリトライするようなアップデートが実装されました。
これにより、ノードの追加やPVCの追加など環境や関連するリソースの状態が変化した際、PVC/PV付きのPodが正しく配置される確率が向上しています。

CSI関連もここ数バージョンは、目玉となる新しい機能追加はありませんが、安定性を向上させるようなアップデートが入っており、ユーザは気が付かないところで
安定性が向上しています。
古いKubernetesバージョンを利用されている方は、ぜひ新しいバージョンにアップデートし安定性を向上させることをお勧めします。