Kubernetes 1.21: SIG Storageの変更内容

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

# 新着情報 (What's New)

## Storage Capacity Tracking

これまで、Kubernetesスケジューラは、追加の永続ストレージがクラスタ内のいたるところで利用可能であり、無限の容量を持つという前提に基づいていました。
Topology constraints は最初の点に対応しましたが、現在のストレージ容量が新規Podを起動するのに十分ではない可能性があることを考慮していませんでした。
Storage capacity trackingは、ストレージ容量をレポートするCSIドライバのAPIを追加し、Podのノードを選択するときにKubernetesスケジューラでその情報を使用するようにします。
この機能は、ローカルボリュームやその他の容量の考慮が必要なボリュームタイプの動的プロビジョニングをサポートするための布石として提供されます。

## Generic Ephemeral Volumes

Generic ephemeral ボリュームにより、動的プロビジョニングをサポートする既存のストレージドライバにて、ボリュームのライフサイクルがPodに関連付けられたephemeralボリュームとして扱われます。
この機能は rootディスクとは異なるスクラッチストレージ(たとえば、Persistent memoryやノード上の別ローカルディスク)を提供するために使用できます。
ボリュームプロビジョニングで使われるStorageClassのパラメータがサポートされています。
Storage capacity tracking、スナップショット・リストアおよびボリュームサイズ変更など、PersistentVolumeClaimsでサポートされているすべての機能がサポートされています。

:memo: 英文の訳だとわかりにくいですが、ざっくり言うと、Podの削除と合わせて削除されるPVがEphemeral Volumeです。詳細な情報を知りたい方は[KEP](https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/1698-generic-ephemeral-volumes/README.md)をご参照ください。

## CSI Service Account Token

CSI Service Account トークン機能は1.21でベータに昇格します。
この機能により、Security Postureが改善され、CSIドライバがPodに紐づけられたService Accountのトークンを受け取れます。
さらに、この機能は、短寿命のボリュームをリフレッシュできるように、ボリュームを再発行する口も提供します。

:memo: 本機能は 1.20でアルファとして登場した機能です。詳細な情報を知りたい方は[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)をご参照ください。

## CSI Health Monitoring

CSI ヘルスモニタリング機能は、Kubernetes 1.21に2回目のアルファとしてリリースされました。
この機能により、CSIドライバは、kubernetesを使用して、基になるストレージシステムから異常なボリューム状態をKubernetesと共有することができます。
この機能は、Kubernetesによるボリュームの障害に対するプログラム的な検出と解決に向けた布石として機能します。

:memo: 本機能に関する動作検証レポートを[「Kubernetes: Volume Health Monitorの動作検証」](https://qiita.com/ysakashita/items/266b4fc03c0ebfc13e98) にてまとめました。ご興味のある方は、ご参照下さい。

# 既知の問題点 (Known Issues)

SIG Storage関連はなし

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

- EBS pluginにより新規に作成されたPVは非推奨のラベル`failure-domain.beta.kubernetes.io/zone`と`failure-domain.beta.kubernetes.io/region`を使用しなくなります。代わりのラベルとして`topology.kubernetes.io/zone`と`topology.kubernetes.io/region`を使用します。 ([#99130](https://github.com/kubernetes/kubernetes/pull/99130), @ayberk) [SIG Cloud Provider, Storage and Testing]
- OpenStack Cinder pluginにより新規に作成されたPVは非推奨のラベル`failure-domain.beta.kubernetes.io/zone`と`failure-domain.beta.kubernetes.io/region`を使用しなくなります。代わりのラベルとして`topology.kubernetes.io/zone`と`topology.kubernetes.io/region`を使用します。 ([#99719](https://github.com/kubernetes/kubernetes/pull/99719), @jsafrane) [SIG Cloud Provider, Storage and Testing]
- gce-pdにより新規作成されたPVはベータのFailureDomainのラベルを使用しなくなります。gce-pdボリュームは代わりにGAのTopologyラベルを使い始めます。([#98700](https://github.com/kubernetes/kubernetes/pull/98700), @Jiawei0227) [SIG Cloud Provider, Storage and Testing]
- OpenStack Cinder CSI migrationがデフォルトで有効になります。Cinder CSIドライバは、Cinder Volumesが稼働するOpenStackのClusters上にインストールする必要があります。 ([#98538](https://github.com/kubernetes/kubernetes/pull/98538), @dims) [SIG Storage]
- AlphaのCSimigrationXXCompleteフラグを削除し、AlphaとしてIntreePlugInxxUnregisterフラグを追加します。CSimrationVSphereCompleteフラグは非推奨となり、V1.22で削除されます。 ([#98243](https://github.com/kubernetes/kubernetes/pull/98243), @Jiawei0227)
- ストレージのメトリクスとして`storage_operation_status_count`が存在するため、`storage_operation_errors_total`を削除します。`storage_operation_duration_seconds`の新しいフィールドを追加するので、すべてのストレージオペレーションのステータスとレイテンシについて知ることができます。([#98332](https://github.com/kubernetes/kubernetes/pull/98332), @JornShen) [SIG Instrumentation and Storage]
- メトリクス`storage_operation_errors_total`は削除されませんが、非推奨になります。`storage_operation_status_count`も非推奨になります。どちらの場合も、`storage_operation_duration_seconds`メトリックを使用し、同等のカウントができます。（`storage_operations_errors_total`の場合は`status=fail-unknown`を使用）([#99045](https://github.com/kubernetes/kubernetes/pull/99045), @mattcary)

:memo: #98332と#99045のリリースノートの記載がややこしいですが、まとめると`storage_operation_duration_seconds`のみが有効で、`storage_operation_errors_total`と`storage_operation_status_count`は非推奨になります。
Kubernetes v1.21.0の実装は[こちらを参照](https://github.com/kubernetes/kubernetes/blob/v1.21.0/pkg/volume/util/metrics.go#L47-L73)してください。

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

- vSphere volume pluginのStorageClassの`diskformat`パラメータは、V1.21で非推奨となりました。StorageClassの更新と`diskformat`パラメータの削除を検討してください。vSphere CSIドライバはStorageClassの`diskformat`パラメータをサポートしません。
67U3未満のvSphereは、V1.21で非推奨です。vSphereを67U3以上にアップグレードすることを検討してください。vSphere CSIドライバには最低でもvSphere 67U3が必要です。
VMハードウェアバージョンの15未満はv1.21で非推奨です。ノードのVMハードウェアバージョンを15以上へのアップグレードを検討してください。vSphere CSIドライバは、ノードのVMのハードウェアバージョンを少なくともvmx-15に設定します。
Multi vCenterのサポートは、V1.21で非推奨です。複数のvCenterサーバーに跨がりKubernetesが表示されている場合は、すべてのK8Sノードを単一のvCenterサーバーに移動することを検討してください。vSphere CSIドライバは、複数のvCenter Serverに跨ったKubernetesをサポートしません。
これらの非推奨の項目のサポートは、Kubernetes v1.24までです。([#98546](https://github.com/kubernetes/kubernetes/pull/98546), @divyenpatel)

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

- CSIServiceAccountTokenはベータに昇格し、デフォルトで有効になりました。([#99298](https://github.com/kubernetes/kubernetes/pull/99298), @zshihang)
- Generic ephemeral volumes がベータになりました。([#99643](https://github.com/kubernetes/kubernetes/pull/99643), @pohly) [SIG API Machinery, Apps, Auth, CLI, Node, Storage and Testing]
- Storage capacity tracking (= the CSIStorageCapacity feature) はベータに昇格し、デフォルトで有効になりました。`storage.k8s.io/v1alpha1/VolumeAttachment`と`storage.k8s.io/v1alpha1/CSIStorageCapacity`オブジェクトは非推奨になりました。([#99641](https://github.com/kubernetes/kubernetes/pull/99641), @pohly)

### 機能 (Feature)

- CSI オペレーションの期間とノードのCSI オペレーションのステータスを公開する`csi_operations_seconds`メトリックをkubeletに追加します。 ([#98979](https://github.com/kubernetes/kubernetes/pull/98979), @Jiawei0227) [SIG Instrumentation and Storage]
- `storage_operation_duration_seconds`メトリックに`migrated`フィールドを追加します ([#99050](https://github.com/kubernetes/kubernetes/pull/99050), @Jiawei0227) [SIG Apps, Instrumentation and Storage]
- Added `ephemeral_volume_controller_create[_failures]_total`カウンタを kube-controller-managerのメトリクスに追加します ([#99115](https://github.com/kubernetes/kubernetes/pull/99115), @pohly) [SIG API Machinery, Apps, Cluster Lifecycle, Instrumentation and Storage]
- 複数トポロジを跨がり静的にプロビジョニングされた PV の最適なサイズに基づいて、スケジューラがノードに優先順位を付けるアルファ機能の VolumeCapacityPriority を追加します。([#96347](https://github.com/kubernetes/kubernetes/pull/96347), @cofyc) [SIG Apps, Network, Scheduling, Storage and Testing]
- btrfsでフォーマットされた永続ボリュームは、拡張されたときに自動的にサイズ変更されます。 ([#99361](https://github.com/kubernetes/kubernetes/pull/99361), @Novex) [SIG Storage]

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

- Azureファイルの移行はベータに昇格し、AzureFile CSIドライバのインストールが必要となり、CSIMigrationAzureFileフラグがデフォルトでOffとなります。 ユーザーは、CSIMigration と CSIMigrationAzureFile 機能を有効にし、その時点で既存のPodとPVCオブジェクトの中断を回避するために、AzureFile CSI ドライバをインストールする必要があります。AzureFile CSI ドライバは、異なるfsgroupsで同じ永続ボリュームの使用をサポートしていません。AzureFile CSI ドライバのCSI Migrationが有効になっている場合、サポートされません。(ボリュームが0777にマウントされ誰でも読み取り/書き込みが可能な場合、サポートすることがあります) (([#96293](https://github.com/kubernetes/kubernetes/pull/96293), @andyzhangx)

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

- vSphere のWindows パスに存在する`[`, `]`のような特殊文字をエスケープします。([#98830](https://github.com/kubernetes/kubernetes/pull/98830), @liyanhui1228) [SIG Storage and Windows]

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

- CSIボリュームでのボリュームデータファイルの作成中に障害が検出されたときに、すべてのデータが自動的に削除されなくなりました。データファイルとボリュームパスのみが削除されます。([#96021](https://github.com/kubernetes/kubernetes/pull/96021), @huffmanca)
- DataSourceを使用してPVCを作成すると、CSI以外のプラグインの場合に失敗します。([#97086](https://github.com/kubernetes/kubernetes/pull/97086), @xing-yang) [SIG Apps and Storage]
- Volume attach-detach コントローラによってvSphereノードが追跡されていることを確認します。([#96689](https://github.com/kubernetes/kubernetes/pull/96689), @gnufied)
- CSIMigration が有効になっているときに、Azure FileのMigrationのe2eテストの失敗を修正します。 ([#97877](https://github.com/kubernetes/kubernetes/pull/97877), @andyzhangx)
- CSI-migrated inline EBS ボリュームがvolumeIDのプレフィックスに`aws://`が付与された場合にマウントに失敗する問題を修正します。([#96821](https://github.com/kubernetes/kubernetes/pull/96821), @wongma7) [SIG Storage]
- Gluster クライアントの接続のためCVE-2020-8555を修正しました。([#97922](https://github.com/kubernetes/kubernetes/pull/97922), @liggitt) [SIG Storage]
- WindowsのSMB mountのPermissionDenied問題を修正しました。([#99550](https://github.com/kubernetes/kubernetes/pull/99550), @andyzhangx)
- 関連付けられたVolumeAttachmentsからCSIボリュームを回復します。([#96617](https://github.com/kubernetes/kubernetes/pull/96617), @yuga711) [SIG Apps and Storage]

:memo: attach/detachの処理中にkube-controller-managerが落ちると、ボリュームが不要なノードに接続されたままになることがありました。本修正により、attach/detach controllerの初期化にてVolumeAttachmentオブジェクトの有無によりボリュームの接続を回復(もしくは切断)を行います。

- 重たいメタデータのワークロードにおけるAzure fileのレイテンシの問題を解決します。([#97082](https://github.com/kubernetes/kubernetes/pull/97082), @andyzhangx) [SIG Cloud Provider and Storage]

- マルチパスのボリュームのdetach時にファイルシステムが破損するFibreChannel volume pluginのバグを修正します。 ([#97013](https://github.com/kubernetes/kubernetes/pull/97013), @jsafrane) [SIG Storage]
- /var/lib/kubelet がシンボリックリンク時、ブロックデバイスのクリーンアップを修正しました ([#96889](https://github.com/kubernetes/kubernetes/pull/96889), @jsafrane) [SIG Storage]
- AllowedTopologiesのStorageClassが使用されたCSIに移行済みのCinderボリュームのプロビジョニングのバグを修正しました。([#98311](https://github.com/kubernetes/kubernetes/pull/98311), @jsafrane) [SIG Storage]
- `--volume-host-cidr-denylist` or `--volume-host-allow-local-loopback` を利用する際のコネクションエラーを修正しました。([#98436](https://github.com/kubernetes/kubernetes/pull/98436), @liggitt) [SIG Network and Storage]
- vSphereのPVのプロビジョニング速度を向上とAPIの呼び出し数を減らします ([#100054](https://github.com/kubernetes/kubernetes/pull/100054), @gnufied) [SIG Cloud Provider and Storage]
- Kube-apiserver: Podを作成してから機能が無効になったGeneric ephmeral ボリュームを持ったPodのアップデートをドロップします。 ([#99446](https://github.com/kubernetes/kubernetes/pull/99446), @pohly) [SIG Apps, Node and Storage]
- Kubelet は関連付けのないボリュームディレクトリを自動的にクリーンアップするようになりました。([#95301](https://github.com/kubernetes/kubernetes/pull/95301), @lorenz) [SIG Node and Storage]
- GCEのローカルループバックのフォーミュラーホストを防止することで、kube-upのためのCVE-2020-8555を軽減します。([#97934](https://github.com/kubernetes/kubernetes/pull/97934), @mattcary) [SIG Cloud Provider and Storage]
- WindowsのPod Log statsでメトリクスがレポートされるようになりました。([#99221](https://github.com/kubernetes/kubernetes/pull/99221), @jsturtevant) [SIG Node, Storage, Testing and Windows]
- CSI Topologyへの移行のためin-treeのGCEPDボリュームから削除しました ([#97823](https://github.com/kubernetes/kubernetes/pull/97823), @Jiawei0227) [SIG Cloud Provider and Storage]
- 1分のタイムアウト後に通常のマウントが失敗した場合、NFSボリュームを強制アンマウントします。([#96844](https://github.com/kubernetes/kubernetes/pull/96844), @gnufied) [SIG Storage]
- PremiumアカウントのAzure File ボリュームをダイナミックプロビジョニングする際、Azure Fileの要求に対応するため、リクエストサイズが初期値よりも小さい場合、100GBに設定されます。([#99122](https://github.com/kubernetes/kubernetes/pull/99122), @huffmanca) [SIG Cloud Provider and Storage]
- `VolumeBindingArgs`は`BindTimeoutSeconds`にゼロを設定できるようになりました。ゼロを指定した場合ボリュームバインディング操作のチェックをWaitingなしで実行します。 ([#99835](https://github.com/kubernetes/kubernetes/pull/99835), @chendave) [SIG Scheduling and Storage]

### その他 (Cleanup or Flake)
- `CSINodeIDMaxLength`が128バイトから192バイトに増加しました。([#98753](https://github.com/kubernetes/kubernetes/pull/98753), @Jiawei0227)
- `AttachVolumeLimit`(v1.17にてGA)のfeature gateを削除し無条件で有効になります。 ([#96539](https://github.com/kubernetes/kubernetes/pull/96539), @ialidzhikov)
- `CSINodeInfo`のfeature gateはv1.17以降GAtとなり無条件で有効になります。`--feature-gates`で指定することはできません。([#96561](https://github.com/kubernetes/kubernetes/pull/96561), @ialidzhikov) [SIG Apps, Auth, Scheduling, Storage and Testing]
- 廃止予定のfeature gates`CSIDriverRegistry`, `BlockVolume`, `CSIBlockVolume`は無条件で有効になり、コンポーネントの呼び出しで指定できません。([#98021](https://github.com/kubernetes/kubernetes/pull/98021), @gavinfish) [SIG Storage]
- 廃止予定のfeature gates`RotateKubeletClientCertificate`, `AttachVolumeLimit`, `VolumePVCDataSource`, `EvenPodsSpread`は無条件で有効になり、コンポーネントの呼び出しで指定できません。（[#97306、@ gavinfish）[SIG Node, Scheduling and Storage]

# 所感

Kubernetes v1.21では、PVC/PVを安心・安全に使うための機能であるStorage Capacity TrackingやCSI Health Monitoringが着々とアップデートされました。
特に、CSI Health Monitoring(Volume Health Monitor)では、ボリュームの健全性を担保するための枠組みが出来つつあります。ただし、Volume Health Monitorは、あくまでモニタリングの仕組みだけであり、CSIドライバの開発者や開発ベンダーが健全性のチェック項目を実装する必要があります。今後、これら安心・安全にPVC/PVを管理できる機能のサポートの良し悪しが、CSIドライバの優劣につながってくるかと思いますので、各社のCSIドライバの実装を注目したいと思います。
また、2020/11のKubeConで発表のあった[オブジェクトストレージ向けのインターフェースCOSI(Container Object Storage Interface)](https://qiita.com/ysakashita/items/9916f8ae922601e6fe6e)がKubernetes v1.21にアルファ機能として登場予定でしたが、残念がら次リリースへ延期になりました:cry:。SIG Storgeでは、ほぼ毎週COSIについてMeetingが開催されており、Bug Fixなど対応中の状況です。次リリースでブラッシュアップされたものが登場してくるのが楽しみです。