Kubernetes 1.22: SIG Storageの変更内容

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

# 新着情報 (What's New)

## Cluster Storage Interface graduations

WindowsノードのCSIサポートは、1.22リリースでGAになります。Kubernetes v1.22では、Windows特権コンテナはアルファ機能のみです。WindowsノードでCSIストレージを使用できるようにするには、[CSIProxy](https://github.com/kubernetes-csi/csi-proxy)の有効によりCSIノードプラグインが非特権Podとしてデプロイされ、このProxyを使うことで、ノード上の特権ストレージ操作を実行できます。

もう一つの、v1.22でGAする機能はCSI Service Account Tokenサポートです。この機能により、CSIドライバは、特権を持ったIDの代わりにPodの [bound service account tokens](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/#bound-service-account-token-volume)を使用できます。また、これらのボリュームを再発行するためのコントロールも提供しているため、短命のトークンを更新することができます。

# 既知の問題点 (Known Issues)

## `CSIMigrationvSphere` feature gate has not migrated to new CRD APIs

CSIMigrationvSphereのFeature Gateが有効になっている場合、ユーザーはKubernetes v1.22にアップグレードしてはいけません。
vSphere CSIドライバは、v1beta1のCRD APIを使用するため、まだKubernetes V1.22をサポートしていません。
v1.22のサポートは今後のリリースで追加されます。
サポートされているKubernetesリリースについては、[vSphere CSI Driver version](https://vsphere-csi-driver.sigs.k8s.io/compatiblity_matrix.html#compatibility-matrix-for-vsphere-csi-driver)のドキュメントを確認してください。

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

- AWS EBSボリュームのCSI Migrationでは、AWS EBS CSI driver ver. 1.0がサポートするStorageClassの`allowAutoIOPSPerGBIncrease`パラメータが必要です。 ([#101082](https://github.com/kubernetes/kubernetes/pull/101082), @jsafrane)
- IntreeのVolume plugin ScaleIOのサポートはKubernetesから完全に削除されました。 ([#101685](https://github.com/kubernetes/kubernetes/pull/101685), @Jiawei0227)
- Azure Diskによる新規プロビジョニングされたPVは、ベータの`FailureDomain`のラベルを持っていません。Azure Disk Volume Pluginは代わりにGAされたトポロジーラベルを持ちます。([#101534](https://github.com/kubernetes/kubernetes/pull/101534), @kassarl)
- `CSIMigrationVSphereComplete`のフラグは削除されました。今後`InTreePluginvSphereUnregister`が利用されます。 ([#101272](https://github.com/kubernetes/kubernetes/pull/101272), @Jiawei0227)

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

-  vSphere in-tree Pluginにより新規プロビジョニングされたPVは、ベータの`FailureDomain`ラベルを持っていません。vSphereボリュームプラグインはGAされたトポロジーラベルを持ちます。（[#102414](https://github.com/kubernetes/kubernetes/pull/102414)、@Divyenpatel）
- KubeletによるCSIの`NodePublish`パスの削除は推奨されていません。これはCSIの仕様に従ってCSI Pluginによって行われなければなりません。 (#101441, @dobsonj)
- storageos, quobyte flocker ストレージのvolume pluginは非推奨となり、将来のリリースで削除されます。 ([#101773](https://github.com/kubernetes/kubernetes/pull/101773), @Jiawei0227)

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

- PVCの仕様に`DataSourceRef`をAlphaフィールドとして追加します。これにより、PVCおよびVolumesnapshots以外のコンテンツがデータソースになることができます。 ([#103276](https://github.com/kubernetes/kubernetes/pull/103276), @bswartz)
- StatefulSetのAPIに`PersistentVolumeClaimDeletePoilcy`が追加されました。 ([#99378](https://github.com/kubernetes/kubernetes/pull/99378), @mattcary)

:memo:
本実装は、下部にある[#103747](https://github.com/kubernetes/kubernetes/pull/103747)で削除(Revert)され、残念ながらv1.22.0では入っていません。[#99378](https://github.com/kubernetes/kubernetes/pull/99378)はAPI関連のみの実装でv1.22.0に一旦は入ったのですが、StatefulSetのコントローラの実装([#99728](https://github.com/kubernetes/kubernetes/pull/99728))が間に合わなかったようです。
<details>
<summary>機能の概要</summary>
詳細は[KEP-1847](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/1847-autoremove-statefulset-pvcs)をご参照ください。
この機能は、StatefulSetの削除(or スケールダウン)時にPVCを削除するかどうかが指定できるようになります。また、Podのみを削除した場合やノードの停止などでは削除されません。
KEP記載のストーリによると、アプリケーションのライフタイムとボリュームのライフタイムを一致させたい場合や、スケールダウン時にボリュームのコストを下げたい場合に有効とのことです。
注意点としては、StatefulSetのvolumeClaimTemplateにより生成されるPVCの命名規則により識別されるため、ユーザが同じ命名規則で作成したPVCも削除対象となるとのことです。v1.23で本機能が登場するのを期待します。
</details>

- PersistentVolumesとPersistentVolumeCaimsに`ReadWriteOncePod`アクセスモードを追加します。単一ノード上の単一Podへのボリュームアクセスを制限します。([#102028](https://github.com/kubernetes/kubernetes/pull/102028), @chrishenzie)

:memo: これまでの`ReadWriteOnce`は、あくまで1つのノードからRead/Writeでマウントする仕様でした。今回追加された`ReadWriteOncePod`により、1 PodからのみRead/Write可能となります。

- スケジューリング中にReadWriteOncePod PVCアクセスモードを強制します([#103082](https://github.com/kubernetes/kubernetes/pull/103082), @chrishenzie)
- StatefulSetにminReadySeconds apiが追加されました。 ([#100842](https://github.com/kubernetes/kubernetes/pull/100842), @ravisantoshgudimetla)
- PersistentVolumeClaimDeletePoilcyがStatefulSetのAPIから削除されました(Revert). ([#103747](https://github.com/kubernetes/kubernetes/pull/103747), @mattcary)

:memo: 上述のように本PRによりPersistentVolumeClaimDeletePoilcyのAPIは削除されました。

- CSIServiceAccountToken はGAになり、無条件で有効になります。 ([#103001](https://github.com/kubernetes/kubernetes/pull/103001), @zshihang)

### 機能 (Feature)

- StatefulSetにminReadySecondsが実装されました。 ([#101316](https://github.com/kubernetes/kubernetes/pull/101316), @ravisantoshgudimetla)
- 幾つかのin-treeのストレージドライバでは MetricsProviderインターフェースでサポートを示しているものがありますが、BlockModeのボリュームに対してこれを設定することは出来ません。直前の修正では、KubeletはBlockModeのボリュームのGetMetrics()を呼び出すと、未サポートとなったin-treeのドライバはGo パニックを引き起こします。現在では、BlockModeのボリュームをサポートするin-treeのストレージドライバは、GetMetrics()を呼び出されるとボリュームの容量を返します。 ([#101587](https://github.com/kubernetes/kubernetes/pull/101587), @nixpanic)
- CSIドライバはNodeServiceCapabilityの`VOLUME_MOUNT_GROUP`をサポートします。アルファ機能である`DelegateFSGroupToCSIDriver` のfeature gate が有効の場合、kubelet は他のFSGroupが設定されているかどうかにかかわらず、`NodeStageVolume`と`NodePublishVolume`へ渡しFSGroupの適用をドライバに委ねます。 ([#103244](https://github.com/kubernetes/kubernetes/pull/103244), @verult)
- `BoundServiceAccountTokenVolume`はGAになり、無条件で有効になります。このfeature gateは1.23で削除される予定です。  ([#101992](https://github.com/kubernetes/kubernetes/pull/101992), @zshihang)
- EmptyDirでmemoryを使ったボリュームのサイズはホスト上のPodで割り当て可能なメモリの最小値とオプションでユーザが指定した明示的な値で設定されます。 ([#101048](https://github.com/kubernetes/kubernetes/pull/101048), @dims)
- `HugePageStorageMediumSize`機能がGAとなり無条件で有効になります。コンテナレベルで複数の巨大なページリソースを無条件で使用できるようになります。 ([#99144](https://github.com/kubernetes/kubernetes/pull/99144), @bart0sh)

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

SIG-Storage 関連はなし

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

- `OwnerReferencesPermissionEnforcement` admission pluginが有効になっているGeneric Ephemeralボリュームについて修正しました。 ([#101186](https://github.com/kubernetes/kubernetes/pull/101186), @jsafrane)

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

- CSI NodePublishVolumeのステージでPodの情報が欠落していたのを修正しました。 ([#99069](https://github.com/kubernetes/kubernetes/pull/99069), @phantooom)
- ボリュームのストレージサイズの要求の丸めを修正しました。 ([#100100](https://github.com/kubernetes/kubernetes/pull/100100), @maxlaverse)
- CSI Migrationの変換処理におけるAzure fileのinlineボリュームのNamespaceの問題を修正しました。 ([#101235](https://github.com/kubernetes/kubernetes/pull/101235), @andyzhangx)
- SMBサーバがダウンした場合、SMBマウントを使用しているPodを終了できずエラーが発生していました。そのため、"host is down"を破損したマウントに設定するように修正しました。 ([#101398](https://github.com/kubernetes/kubernetes/pull/101398), @andyzhangx)
- NVMeのAWS EBSボリュームのパーティションを使った場合の問題を修正しました。 ([#100500](https://github.com/kubernetes/kubernetes/pull/100500), @jsafrane)
- CSIドライバーが故障した後、CSIボリュームのSELinuxの再ラベリングを修正しました。 ([#103154](https://github.com/kubernetes/kubernetes/pull/103154), @jsafrane) [SIG Node and Storage]
- CSIへ移行したPersistentVolumeの宙ぶらりんとなったVolumeAttachmentsのガベージコレクションをkube-controller-managerの起動時に行うように修正しました。 ([#102176](https://github.com/kubernetes/kubernetes/pull/102176), @timebertt)
- false-positiveの不確かなvolume attachmentsを修正し、CSIへ移行されたボリュームが予期せぬ時にデタッチされるようになりました。 ([#101737](https://github.com/kubernetes/kubernetes/pull/101737), @Jiawei0227) [SIG Apps and Storage]
- サーバにてIPv6アドレスを利用している場合のNFSボリュームのマウントの問題を修正しました。 ([#101067](https://github.com/kubernetes/kubernetes/pull/101067), @Elbehery) [SIG Storage]
- 前のPodがボリュームのアンマウントにてタイムアウトした後に、新しいPodを起動するのを修正しました。 ([#100183](https://github.com/kubernetes/kubernetes/pull/100183), @jsafrane)
- kubeletがオフライン中にPodが削除されると非常に稀にボリュームが破損する問題を修正しました。 ([#102059](https://github.com/kubernetes/kubernetes/pull/102059), @jsafrane)
- vSphere: datastoreがstorage folder又はdatastore clusterの中にある場合、ディスクのアタッチ時のリグレッションを修正しました。 ([#102892](https://github.com/kubernetes/kubernetes/pull/102892), @gnufied)
- エラー時にFibreChannelデバイスのクリーンアップをリトライし、FiberChannelのデバイスが他のノードで使用される前に確実にデタッチされるようにしました。 ([#101862](https://github.com/kubernetes/kubernetes/pull/101862), @jsafrane)
- ボリューム削除の際、vSphereの"File (vmdk path here) was not found" のエラーを成功として扱うようになりました。 ([#92372](https://github.com/kubernetes/kubernetes/pull/92372), @breunigs) [SIG Cloud Provider and Storage]

### その他 (Cleanup or Flake)

- CSIドライバがオフラインでの拡張のテストを行えるようになりました。 ([#102665](https://github.com/kubernetes/kubernetes/pull/102665), @gnufied)
- `CSINodeIDMaxLength`が128バイトから192バイトに増えました。1.23のリリースで長さの制限を256バイトへ増やす準備です。 ([#101256](https://github.com/kubernetes/kubernetes/pull/101256), @Jiawei0227)
- v1.20以降、GAとなっている`VolumeSnapshotDataSource`のfeature gateが無条件で有効となり、`--feature-gates`の引数で指定できなくなりました。([#101531](https://github.com/kubernetes/kubernetes/pull/101531), @ialidzhikov) [SIG Storage]

# 所感

Kubernetes v1.22では、新しいAccessModeの`ReadWriteOncePod`が登場しました。
これまでの`ReadWriteOnce`は、ノードに対するものでした。つまり、同一のノード上にあるPodであれば、Read/Writeが許されていました。
特に、iSCSIなどのブロックストレージの場合、複数クライアントから同時に書き込みが行われるとデータが壊れるため、必ず1つのクライアントからのみ書き込みとなるように構成を組む必要があり、そのために`ReadWriteOnce`を利用していることも多いかと思います。
一方で、Podをデプロイするユーザから見たら、この仕様は非常にわかりにくかったというのが率直的な感想です。今回、`ReadWriteOncePod`が出来たことで、ユーザからみて直感的なAccessModeになったのではないかと思います。

また、もう一つ注目していたStatefulSetの削除/スケールダウンにあわせてvolumeClaimTemplateにて作成されたPVCが削除される機能である`PersistentVolumeClaimDeletePoilcy`が Kubernetes v1.22では間に合わずv1.23向けとなったのが残念です。v1.23を楽しみに待ちたいと思います。

さらに、今回のリリースノートでは触れていませんが、v1.22のアルファ機能としてリリースを目指していたオブジェクトストレージ向けの[COSI](https://qiita.com/ysakashita/items/9916f8ae922601e6fe6e)ですが、残念ながらv1.22には間に合わずv1.23にターゲットが変わっています。こちらも出てくるのが楽しみな機能の1つです。

![スクリーンショット 2021-08-24 15.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229880/50a520b9-cba8-0249-b1bb-3d3b63611805.png)