Kubernetes 1.20: SIG Storageの変更内容

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

# 新着情報 (What's New)

## CSI Volume Snapshot graduates to General Availability

Volume Snapshotが1.20でGAになりました。この機能は、KubernetesでVolume Snapshotのオペレーションをトリガーする標準的な方法を提供し、Kubernetesのユーザーは、サポートしているストレージプロバイダによらず、あらゆるKubernetes環境上で同じようにVolume Snapshotの操作を組み込むことができます。さらに、これらKubernetesのスナップショットのプリミティブなアクションは、アプリケーションやクラスタレベルのバックアップソリューションなど、Kubernetesのエンタープライズグレードのストレージ管理機能の開発に利用できる基本的なビルディングブロックとして機能します。
スナップショットのサポートするには、KubernetesのディストリビュータがSnapshot controller、Snapshot CRD、およびvalidation webhookをバンドルする必要があることに注意してください。
さらに、スナップショット機能をサポートするCSI driverもクラスタにデプロイする必要があります。

:memo: GAにあわせCSIの[external-snapshotter](https://github.com/kubernetes-csi/external-snapshotter)もv4.0.0がリリースされ、API versionがv1となりました。ただし、利用されるストレージがexternal-snapshotter v4.0.0に対応しているかは不明ですので、ストレージ側も確認するのが良いでしょう。

## Non-recursive Volume Ownership (FSGroup) graduates to Beta

デフォルトでは、fsgroup 設定が指定されている場合、マウントのたびにボリューム内のすべてのファイルのパーミッションが再帰的に更新されます。このため、ボリュームに多数のファイルがある場合、マウントやPodの起動が非常に遅くなることがあります。この設定により、ルートディレクトリのパーミッションとオーナーシップがボリューム上の期待するパーミッションと一致しない場合にのみ、ボリュームのオーナーシップとパーミッションが変更されることを示す PodFSGroupChangePolicy をPodで指定できるようになります。

:memo: PodFSGroupChangePolicyは`OnRootMismatch`と`Always`(デフォルト)を指定することができます。

## CSIDriver policy for FSGroup graduates to Beta

FSGroupのCSIDriver Policyが1.20でベータになりました。これにより、CSIDriverは、Kubernetesにボリュームのパーミッションとオーナーシップをfsgroup経由で管理させたいかどうかを明示的に示すことができるようになりました。

:memo: kubernetes/kubernetesのCSIのe2eにも[#96247](https://github.com/kubernetes/kubernetes/pull/96247)のテストが追加されています。CSIを開発される方はチェックされると良いかと思います。

## Security Improvements for CSI Drivers (Alpha)

1.20では、新しいアルファ機能としてCSIServiceAccountTokenを導入しました。この機能により、CSI DriversがボリュームをマウントするPodになりすますことができます。これにより、CSI Driverのservice acountに不必要なパーミッションを渡すことなく、ボリュームがPodのservice account上でACLをコントロールするマウントプロセスにおけるセキュリティが改善されます。この機能は、secrets-store-csi-driver のような秘密扱いの CSI Driverにとって特に重要です。これらのトークンはローテートさせて短命にすることができるので、この機能はCSI Driverが新しいトークンで定期的にNodePublishVolume RPCコールを受信するためのノブを提供します。このノブは、ボリュームが証明書のように短命の場合にも有用です。

:memo: 詳細な情報を知りたい方は[KEP: Service Account Token for CSI Driver](https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/1855-csi-driver-service-account-token/README.md)を参照すると良いでしょう。

# 既知の問題点 (Known Issues)

SIG Storage関連はなし

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

- CSI ドライバの場合、kubelet は CSI スペックに従って NodePublishVolume の target_path を作成しなくなりました。また、Kubelet は、stagingとtarget のパスがマウントされているか、もしくは破損しているかをチェックしなくなりました。CSI Driverは、べき等である必要があり必要なマウントの検証を行う必要があります。([#88759](https://github.com/kubernetes/kubernetes/pull/88759), @andyzhangx) [SIG Storage] 

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

SIG Storage関連はなし

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

- Kube-controller-manager: volume pluginsは --volume-host-allow-local-loopback=false を設定することでローカルアドレスやループバックアドレスへの接続を制限したり、 --volume-host-cidr-denylist を設定することで特定の CIDR の範囲への接続を制限したりすることができます (例えば --volume-host-cidr-denylist=127.0.0.0.1/28,feed::/16) ([#91785](https://github.com/kubernetes/kubernetes/pull/91785), [@mattcary](https://github.com/mattcary)) [SIG API Machinery, Apps, Auth, CLI, Network, Node, Storage and Testing]
- Podのfsgroup 変更ポリシーの設定をベータへ移行しました。  ([#96376](https://github.com/kubernetes/kubernetes/pull/96376), [@gnufied](https://github.com/gnufied)) [SIG Apps and Storage]
- リマインダー: "failure-domain.beta.kubernetes.io/zone"と"failure-domain.beta.kubernetes.io/region"というラベルは、それぞれ"topology.kubernetes.io/zone"と"topology.kubernetes.io/region"に変更となり、非推奨となります。"failure-domain.beta... "ラベルを使っているのユーザは、"topology... "に相当するものに変更してください。 ([#96033](https://github.com/kubernetes/kubernetes/pull/96033), [@thockin](https://github.com/thockin)) [SIG API Machinery, Apps, CLI, Cloud Provider, Network, Node, Scheduling, Storage and Testing]
- このPRでは、CSIDriverSpecにfeature gate のCSIServiceAccountTokenの2つのフィールドを追加します。 ([#93130](https://github.com/kubernetes/kubernetes/pull/93130), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Apps, Auth, CLI, Network, Node, Storage and Testing]

### 機能 (Feature)

- 再帰的なパーミッション変更の実行にかかった時間のメトリックを追加します。 ([#95866](https://github.com/kubernetes/kubernetes/pull/95866), [@JornShen](https://github.com/JornShen)) [SIG Instrumentation and Storage]
- メモリバックアップされたボリュームのサイズを調整する機能を追加します。 ([#94444](https://github.com/kubernetes/kubernetes/pull/94444), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Storage and Testing]

:memo: メモリバックアップされた(メモリにマッピングされた)emptyDirボリュームのサイズを、`emptyDir.sizeLimit`で利用可能なメモリのリミットを指定できるようになったようです。KEPは[こちら](https://github.com/kubernetes/enhancements/pull/1968)をご参照。

- PodFsGroupChangePolicyのためのe2eテストを追加します。 ([#96247](https://github.com/kubernetes/kubernetes/pull/96247), [@saikat-royc](https://github.com/saikat-royc)) [SIG Storage and Testing]
- volume plugin名とvolume modeで persistent volumeをカウントする新しいメトリクス pv_collector_total_pv_count が追加されました。 ([#95719](https://github.com/kubernetes/kubernetes/pull/95719), [@tsmetana](https://github.com/tsmetana)) [SIG Apps, Instrumentation, Storage and Testing]
- Volume snapshot のe2e テストにPVCとVolumeSnapshotContentのfinalizerの検証が追加されました。 ([#95863](https://github.com/kubernetes/kubernetes/pull/95863), [@RaunakShah](https://github.com/RaunakShah)) [SIG Cloud Provider, Storage and Testing]

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

SIG Storage関連はなし

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

SIG Storage関連はなし

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

- PVCのStorageClassが既にout-of-treeのprovisionerに更新されている場合に、Volume expand controllerがvolume.kubernetes.io/storage-resizerでPVCにannotateを付けることができない問題が修正されました。 ([#94489](https://github.com/kubernetes/kubernetes/pull/94489), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG API Machinery, Apps and Storage] 
- CSIDriverオブジェクトは、ボリュームのアタッチ時にデプロイできます。 ([#93710](https://github.com/kubernetes/kubernetes/pull/93710), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Apps, Node, Storage and Testing]
- ceph.confが提供されていない場合でもCeph RBDボリュームの拡張が動作するようになりました。 ([#92027](https://github.com/kubernetes/kubernetes/pull/92027), [@juliantaylor](https://github.com/juliantaylor))
- csiとflexvolumeのfsgroupapplymetricsのプラグイン名を変更し、異なるドライバとして区別するようにしました。  ([#95892](https://github.com/kubernetes/kubernetes/pull/95892), [@JornShen](https://github.com/JornShen)) [SIG Instrumentation, Storage and Testing]
-  cephとglusterfsのintree-volume以外のマウント方法をsystemdから通常のマウントに変更しました。 ([#94916](https://github.com/kubernetes/kubernetes/pull/94916), [@smileusd](https://github.com/smileusd)) [SIG Apps, Cloud Provider, Network, Node, Storage and Testing]
- Quobyte clientのコネクションの CVE-2020-8555 を修正しました。 ([#95206](https://github.com/kubernetes/kubernetes/pull/95206), [@misterikkit](https://github.com/misterikkit)) [SIG Storage]
- ディスクをアンマウントするときにWindows上のazure diskのデータロスに関する問題を修正しました。  ([#95456](https://github.com/kubernetes/kubernetes/pull/95456), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
- azure fileのマイグレーションでのパニックを修正しました。 ([#94853](https://github.com/kubernetes/kubernetes/pull/94853), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider] 
- 同時にcsinodeを更新する際に、node上で欠落していたcsi アノテーションを修正しました。　([#94389](https://github.com/kubernetes/kubernetes/pull/94389), [@pacoxu](https://github.com/pacoxu)) [SIG Storage]
- vSphere volumesが間違ったNodeに誤って接続される可能性を修正sしました。 ([#96224](https://github.com/kubernetes/kubernetes/pull/96224), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage]
- vSphereがstaticなPVsのdetachに失敗する問題を修正しました。 ([#95447](https://github.com/kubernetes/kubernetes/pull/95447), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage]
- sourceが存在しない時に、azure diskのリサイズがエラーになる問題を修正しました。 ([#93011](https://github.com/kubernetes/kubernetes/pull/93011), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
- Azure Stack上の壊れたazure diskをデタッチするように修正しました。 ([#94885](https://github.com/kubernetes/kubernetes/pull/94885), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
- アタッチされた状態でのAzure diskサイズ変更の問題を修正しました。 ([#96705](https://github.com/kubernetes/kubernetes/pull/96705), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
- smbのパスの検証エラーを修正しました。 ([#95583](https://github.com/kubernetes/kubernetes/pull/95583), [@andyzhangx](https://github.com/andyzhangx)) [SIG Storage]
- Windows マウントで sensitiveOptions を使用するように修正しました。 ([#94126](https://github.com/kubernetes/kubernetes/pull/94126), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
- AWS EBS io1のボリュームの最大IOPSを現在の最大値(64,000)に引き上げました。 ([#90014](https://github.com/kubernetes/kubernetes/pull/90014), [@jacobmarble](https://github.com/jacobmarble))
- vsphere ボリュームのボリューム名の長さを減らしました。　 ([#96533](https://github.com/kubernetes/kubernetes/pull/96533), [@gnufied](https://github.com/gnufied)) [SIG Storage]
- emptyDirボリュームのTearDown時に、既存ファイルとそのディレクトリ(ボリュームのSetUp時に作成されたもの)を削除します。 ([#95770](https://github.com/kubernetes/kubernetes/pull/95770), [@jingxu97](https://github.com/jingxu97)) [SIG Storage]
- e2eテスト[k8s.io/kubernetes@v1.19.0/test/e2e/storage/testsuites/base.go:162]でazure-disk ドライバがサポートしていない DynamicSnapshotタイプのsnapshotをスキップするようにしました。
- e2eテスト[k8s.io/kubernetes@v1.19.0/test/e2e/storage/testsuites/base.go:185]でazure-disk ドライバがサポートしていない ntfsをスキップするようにしました。([#96144](https://github.com/kubernetes/kubernetes/pull/96144), [@qinpingli](https://github.com/qinpingli)) [SIG Storage and Testing]
- StatefulSet Controllerは、Podを作成する前にPersistentVolumeClaimの削除を待つようになりました。  ([#93457](https://github.com/kubernetes/kubernetes/pull/93457), [@ymmt2005](https://github.com/ymmt2005))
-  azure data disk countマップの最大値をアップデートしました。 ([#96308](https://github.com/kubernetes/kubernetes/pull/96308), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
- Volume binding：バインドされた PV が見つからない場合、エラーではなく UnschedululableAndUnresolvable ステータスをレポートするようにしました。 ([#95541](https://github.com/kubernetes/kubernetes/pull/95541), [@cofyc](https://github.com/cofyc)) [SIG Apps, Scheduling and Storage]
- volume.beta.kubernetes.io/storage-provisionerアノテーションが既に設定されている状態でPVCを作成した場合、タイミングやシステム負荷によってはPVコントローラがPVをPVCにバインドするのではなく、新しくプロビジョニングされたPVを誤って削除してしまった可能性があったバグを修正しました。 ([#95909](https://github.com/kubernetes/kubernetes/pull/95909), [@pohly](https://github.com/pohly)) [SIG Apps and Storage]

### その他 (Cleanup or Flake)
- Schedulerフレームワークのインターフェイスを pkg/scheduler/framework/v1alpha から pkg/scheduler/framework に移動しました。 ([#95069](https://github.com/kubernetes/kubernetes/pull/95069), [@farah](https://github.com/farah)) [SIG Scheduling, Storage and Testing]
- V1helpers.MatchNodeSelectorTermsは、単にNodeとTermsのリストを受け付けるようになりました。 ([#95871](https://github.com/kubernetes/kubernetes/pull/95871), [@damemi](https://github.com/damemi)) [SIG Apps, Scheduling and Storage]
- MatchNodeSelectorTerms は k8s.io/component-helpers に移動しました。 ([#95531](https://github.com/kubernetes/kubernetes/pull/95531), [@damemi](https://github.com/damemi)) [SIG Apps, Scheduling and Storage]

# 所感

ついに、Volume SnapshotがGAとなりました :tada:
Volume Snapshotは、アルファからベータに移行する際、大きく仕様の変更がありました。
そのためベータとなっても、まだ大きく変更されるのではと思っていた人もいるのではないのでしょうか。
ようやくGAとなったことで、安心して利用できるかと思います。
そのほか、Non-recursive Volume Ownership (FSGroup)ということで、fsGroupでのパーミッションやオーナーの更新時間の改善など、地味に嬉しい機能が着々とKubernetes v1.20でサポートされた印象です。