Kubernetes 1.24: SIG Storageの変更内容

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

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

## Storage Capacity and Volume Expansion Are Generally Available

Storage Capacity trackingにより、CSIStorageCapacity オブジェクト経由で現在利用可能なストレージ容量を取得でき、CSI Volume(late binding)を利用するPodのスケジューリングもエンハンスされます。
また、Volume Expansionは既存の永続ボリュームのサイズ変更をサポートします。

:memo: リリースノートの`late binding`は口語的な表現ですが、StorageClassの`volumeBindingMode: WaitForFirstConsumer`の指定と推察します。`volumeBindingMode: WaitForFirstConsumer`については[Kubernetes Documentation: StorageClasses: Volume Binding Mode](https://kubernetes.io/docs/concepts/storage/storage-classes/#volume-binding-mode) をご参照ください。

## Storage Plugin Migration

in-treeのstorage pluginsの内部をオリジナルのAPIを維持したまま、CSI Plunginsを呼び出すマイグレーションが進行中です。Azure DiskとOpenStack Cinder pluginsは両方とも移行済みです。

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

- 非推奨フラグ `--experimental-check-node-capabilities-before-mount`を削除しました。CSIがGAになったことで、別の良い代替手段があります。kubeletのスクリプトまたはManifestsから`--experimental-check-node-capabilities-before-mount`を削除してください。(#104732, @mengjiao-liu)
- feature gateとして他のmigration pluginsと同様に`CSIMigrationRBD`とあるべきところを、`csiMigrationRBD`と記載されていました。このリリースでは、修正し`CSIMigrationRBD`として維持します。このfeature gateを`csiMigrationRBD`として設定していたユーザは、このリリースから`CSIMigrationRBD`へ再設定する必要があります。(#107554, @humblec)


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

- 7.0u2未満のvSphere リリースはv1.24で非推奨となりました。vSphere CSI Driverを利用する際はvSphere 7.0u2以上を利用してください。vSphere 6.7のGeneral サポートは2022/10/15に終了します。vSphere 6.7 Update3はKubernetes v1.24では非推奨です。
利用者は、vSphere(ESXiとvCenterの両方)を7.0u2以上にアップデートすることをお勧めします。vSphare CSI Driver 2.2.3以上は CSI Migrationをサポートします。
これらの非推奨項目のサポートは、2022/10/15までです。 (#109089, @deepakkinni)

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

- `CSIStorageCapacity.storage.k8s.io`: このAPIのv1beta1バージョンはv1に移行されるため非推奨となり、v1.27で削除予定です。CSI ドライバーにてstorage capacity trackingをサポートする際は、v1のAPIをサポートするexternal-provisionerをデプロイする必要があります。 (#108445, @pohly)
- ステートフルのワークロードのフェイルオーバのため、Non-graceful ノードシャットダウンの処理が有効になります (#108486, @sonasingh46)
- AnyVolumeDataSource機能がベータになり、feature gateがデフォルトで有効になります。data source付きのPVCsを使うユーザからのフィードバックのため、利用する場合は、VolumePopulators CRDとdata-source-validator controllerをインストールする必要があります。 (#108736, @bswartz)
- StatefulSetのMaxUnavailableは、一度に1つ以上のPodを停止させることでRollingUpdateを高速化します。RollingUpdate中に停止したいPodの数は`maxUnavailable`パラメータにより指定できます (#82162, @krmayankk) 

### 機能 (Feature)

- ボリュームのヘルスステータスのメトリクス(`kubelet_volume_stats_health_abnormal`)をkubeletに追加します (#105585, @fengzixu)
- end-to-endのボリュームのマウントのタイミングを計測するメトリクスを追加します  (#107006, @gnufied) 
- btrfsのリサイズをサポートします (#108561, @RomanBednar)
- HonorPVReclaimPolicy機能がベータとなりデフォルトで有効になります (#109035, @deepakkinni)

:memo: HonorPVReclaimPolicy機能については[KEP-2644](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/2644-honor-pv-reclaim-policy)にて提案されています。この機能について簡単に説明すると、従来まではPVC/PVの削除時に外部ストレージのボリュームの削除命令は発効されるものの、確実に削除されることは保証されていませんでした。この機能によりbindされたPVC/PVを削除する際、PVへfinalizerを追加し、外部ストレージのボリュームが削除された後にPVを削除するようになります。

- Kubelet: ボリュームのディスク使用量の算出の期間に関するメトリクス`kubelet_volume_metric_collection_duration_seconds`を追加しました (#107201, @pacoxu)
- AzureDiskのCSI migrationがGAになりました (#107681, @andyzhangx)
- OpenStack Cinder CSI migration がGAとなりデフォルトで有効になりました。Cinderボリュームを利用するには、OpenStack上のクラスタにCinder CSI driverをインストールする必要があります (#107462, @dims)
- ImmutableEphemeralVolumesのfeature gateが削除されました (#107152, @mengjiao-liu)
- in-treeのPVのdeleteion protectionのfinalizerがサポートされます  (#108400, @deepakkinni)

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

- ボリュームのヘルスステータスのメトリクス(`kubelet_volume_stats_health_abnormal`)をkubeletに追加します (#108758, @fengzixu)
- 動的プロビジョニングされたボリュームに対してPVのreclaimPolicyがDeleteの場合に限り、PVのdeleteion protectionのfinalizerが追加します (#109205, @deepakkinni)
- reported-in-useのボリュームをチェックする際、指数関数的なbackoffをスキップすることで、アタッチされたボリュームが素早くマウントできるようになりました (#106853, @gnufied) 
- RWXボリュームの場合、全てのノードでNodeExpandを呼び出すようになりました (#108693, @gnufied)
- CSI Driverの node staging pathをPV agnostic pathを使用するように変更しました。この変更によりkubeletをアップデートする前にノードをdrainする必要があります (#107065, @saikat-royc) 
- secretネームスペースが定義されていないInTreeのAzureFile PVsでは、CIS migrationを有効にすると、ネームスペースをClaimRefから取得し、適切に動作するようになりました  (#108000, @RomanBednar)
- fsGroupがCSI Inline ボリュームでも適用されるように修正しました (#108662, @dobsonj)
- アベイラビリティゾーンを持たないAzureリージョンで、トポロジーの要件を持つin-treeのAzure DiskのStorageClassのCSI migrationを修正しました (#109154, @jsafrane)
- azureDiskのパラメータの小文字変換の問題を修正しました (#107429, @andyzhangx)
- CSI migrationにおけるazureFileのvolumeIDが衝突する問題を修正しました (#107575, @andyzhangx) 
- attachdetachコントローラにて、kube-api-serverのエラーが正しく処理されずattachments/detachmentsがスタックするバグを修正しました (#108167, @jfremy)
- テスト中にvSphere clientのコネクションがクローズされないバグを修正しました。このバグは、自動化されたテスト中にvSphereクライアントのセッションがクローズされないことで、リソース枯渇を引き起こすことがあります (#107337, @derek-pryor)
- CSI dirverの名前のプリフィックスに"csi-"を含む場合、ノードからCSIボリュームがデタッチできるように修正しました (#107025, @jsafrane)
- ボリュームのattach/detach待ちのタイムアウトした際のログを改善しました (#108628, @RomanBednar)
- NodeRestriction admission: RecoverVolumeExpansionFailure機能が有効の時、PersistentVolumeClaimのstatusフィールドの`resizeStatus`と`allocatedResources`のアップデートを許可されるようになりました (#107686, @gnufied)
- in-treeのvSphereボリュームのTopologyについてvSphere CSIへ変換されるようになりました (#108611, @divyenpatel)

### その他 (Cleanup or Flake)

- volume/csi/csi-client.goのログを構造化されたログへ移行しました (#99441, @CKchen0726)
- statefulsetのファイルを構造化されたログへ移行しました (#106109, @h4ghhh)
- node-stageとnode-publishの間のnode-expansionのサポートを削除しました (#108614, @gnufied)
- e2e.test のバイナリは、デフォルトの/var/lib/kubeletのパスをオーバライドする新しいパラメータ`--kubelet-root`をサポートします。CSIストレージのテストではこれを使用します (#108253, @pohly)
- VolumeSnapshotContentsにSourceVolumeModeフィールドを追加しました。このアルファ機能のドキュメントについてはペンディング中です (#665, @RaunakShah)
- snapshotterモジュールをv6に、clientモジュールをv5へアップデートしました。このアルファ機能のドキュメントについてはペンディング中です。 ([#670],(kubernetes-csi/external-snapshotter#670), @RaunakShah)

# 所感

Kubernetes v1.24のSIG-Storage周りでは大きなエンハンスはなく、ベータ機能のGAやIn-treeからCSIへの移行に関するアップデートが入ったバージョンの印象です。
Kubernetes1.24で個人的に嬉しいものとしては、ボリュームのヘルスステータスの新しいメトリクス(`kubelet_volume_stats_health_abnormal`)です。
以前公開した[「Kubernetes: Volume Health Monitorの動作検証」](https://qiita.com/ysakashita/items/266b4fc03c0ebfc13e98)の記事にも関連しますが、マウントされているボリュームが正しい状態かをチェックする機能が着々と実装されてきており、今回追加されたメトリクスもその一環です。健全なボリュームかどうかを監視する上でも利用したいメトリクスの一つです。

また、本記事では触れていませんが、Kubernetes 1.24にて、いよいよDockershimがkubeletから削除されました。
これを機会にContainer RuntimeをDockerから変更される方も多いのではないでしょうか。
ストレージ周りでContainer RuntimeをDockerから別のものへ変更する際に、我々がハマった事例について[「[Kubernetes]Dockerからcontainerdへ変更後node-exporterのファイル関連のメトリクスが不正確になった事例紹介」](https://qiita.com/ysakashita/items/5417d67dfcc436d17789)にて公開しています。Dockerの場合、ルートディレクトリ(`/`)のマウントした場合のMount Propagationの指定にてスペシャルな実装がされているため、他のContainer Runtimeに載せ替えた際、同じようにルートディレクトリをマウントしたPodを動作させると挙動が異なる点がハマったポイントでした。詳細については、上記ドキュメントをご参照ください。