Kubernetes 1.15: SIG-Storageの変更内容

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

# 新着情報 (What's New)

## CSIの継続的改善

Kubernetes v1.15において、SIG Storageは [in-tree volume plugins](https://github.com/kubernetes/enhancements/issues/625)をContainer Storage Interface(CSI)への移行作業を継続しました。
SIG Storageはリサイジング、inline volumeなどの機能をCSIへ取り込みました。さらに、Kubernetesのstorage機能で存在していないvolume cloningのような新しいaplha機能をCSIに導入しました。
Volume cloningでは新しいボリュームのプロビジョニングを行うときに、別のPVCを"DataSource"として指定することができます。これにより、ストレージ装置が、ボリュームのクローニングをサポートし、CSIドライバで"CLONE_VOLUME"機能を実装している場合、新しいボリュームはソースボリュームのクローンになります。
これらの変更は、以下のKubernetesの機能に関連しています。
([#625](https://github.com/kubernetes/enhancements/issues/625))

:memo: CSIにてVolume Cloningがサポートされました。使い方は[こちら](https://kubernetes.io/blog/2019/06/21/introducing-volume-cloning-alpha-for-kubernetes/)を参照。
KubernetesではAlpha機能のため、APIServerに`--feature-gates=VolumePVCDataSource=true`の指定が必要になります。
ただし、残念ながら2019/7時点では[CSI Driverのサポートページ](https://kubernetes-csi.github.io/docs/drivers.html)の情報ではサポートしているCSIは不明な状況です。

# 既知の問題点 (Known Issues)

Storageに関するものはなし

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

- CSI Volumeでは`Node.Status.Volumes.Attached.DevicePath`フィールドの設定がなくなりました。このフィールドに依存する外部コントローラは修正が必要です。
([#75799](https://github.com/kubernetes/kubernetes/pull/75799), [@msau42](https://github.com/msau42))
- CSIに関するaplha版のCRDsが削除されました。([#75747](https://github.com/kubernetes/kubernetes/pull/75747), [@msau42](https://github.com/msau42))
- `StorageObjectInUseProtection` admission plugin がデフォルトで有効になりました。これにより、デフォルトで有効になっているadmission pluginは
`NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,StorageObjectInUseProtection`です。
以前に`--admission-control`フラグを設定していなかった場合、クラスタの動作が標準的な動作に変わるかもしれませんので気をつけてください。([#74610](https://github.com/kubernetes/kubernetes/pull/74610), [@oomichi](https://github.com/oomichi))

# 非推奨or廃止される機能 (Deprecations and Removals)
- 次の機能がGAになりました。これに関連するFeature gatesがDeprecationになりv1.17で削除される予定です。
  - `GCERegionalPersistentDisk`

# メトリックスの変更 (Metrics Changes)

## 追加されたメトリックス (Added metrics )

- CSI volumeの状態がkubelet volumeメトリックス経由で取得できるようになりました。 ([#76188](https://github.com/kubernetes/kubernetes/pull/76188), [@humblec](https://github.com/humblec))
- kube-controller-managerとkubeletに、成功とエラーのステータスをカウントする新しいメトリック`storage_operation_status_count`が追加されました。 ([#75750](https://github.com/kubernetes/kubernetes/pull/75750), [@msau42](https://github.com/msau42))

##  非推奨/変更されたメトリックス (Deprecated/changed metrics)

- Volume 割当/解除のEnd to End のレイテンシーのための`volume_operation_total_seconds`メトリックの新しいセマンティックを紹介します。 
  従来の`storage_operation_duration_seconds`メトリックは変更されませんが、以下のような潜在的な問題がありました。
  1. 外部のprovisioner/deleterを使ってボリュームの割当/削除を行なった際、`storage_operation_duration_seconds`では、外部の操作の完了を待たずにレイテンシーのメトリックスを返します(実際には0に近い値となります)。これは`volume_operation_total_seconds`を代わりに使うことで解決します。
  2. ボリュームの割当/削除中に一時的なエラーが発生した場合(例えば、ボリュームが deleteVolumeの呼び出し中にまだ使用中の場合)、オリジナルの`storage_operation_duration_seconds`は、ボリュームが最終的に削除されるまで待たないため、間違ったレイテンシーのメトリックをレポートします。しかしながら、新しい実装の`volume_operation_total_seconds`は、ボリュームの割当/削除が完全に実行されるのを待ちます。
 
 潜在的なインパクト:  SLO/alertが`volume_operaion_total_seconds`をベースに定義されている場合、 より正確なメトリックとなったため以前のレポートの値よりも大きな値となるため、違反扱いになるかもしれません。このメトリックをヒストグラムとして定義していた場合、新しい値は分布を変えます。 ([#78061](https://github.com/kubernetes/kubernetes/pull/78061), [@yuxiangqian](https://github.com/yuxiangqian))

# 注目機能 (Notable Features)
## Beta

- オンラインボリュームの拡張(ExpandInUsePersistentVolumes)がベータになりました。これはデフォルトで有効に設定されています。 ([#77755](https://github.com/kubernetes/kubernetes/pull/77755), [@gnufied](https://github.com/gnufied)) 

## Alpha

- kubeletはエフェメラルストレージ(一時利用のためのストレージ)のストレージ消費量を監視するため、(XFSおよび適切に構築されているext4ファイルシステムの)XFS quotaが利用できるようになりました。現在、`emptyDir`ボリュームのみ利用可能なこの消費量のモニタリング方法は、従来のファイルシステムのツリーをなめる方法よりも早くて正確です。注釈として、これはQuotaの容量制限を強制するのではなく、単に消費量を監視するだけです。この機能を利用するにはfeature gateに`LocalStorageCapacityIsolationFSQuotaMonitoring=true`を設定します。 ext4ファイルシステムの場合、`mkfs.ext4 -O project <block_device>`でファイルシステムを作成し、`tune2fs -Q prjquota <block_device>`を実行します。XFS ファイルシステムでは追加の準備作業は不要です。なお、このファイルシステムは`/etc/fstab`内で`project`オプションでマウント設定しておく必要があります。また、プライマリパーティションがrootファイルシステムである場合、GRUBのconfigファイルに`rootflags=pquota`を追加してください。([#66928](https://github.com/kubernetes/kubernetes/pull/66928), [@RobertKrawitz](https://github.com/RobertKrawitz))

:memo: 原文では`ext4fs filesystems`と記載されていますが、ext4ファイルシステムの呼び名が一般的なため、上記はext4ファイルシステムと訳しています。

- アルファ機能の`CSIINlineVolume`が有効になっている場合、Inline CSI ephemeral volumeがPodSecurityPolicyでコントロールできるようになりました。
([#76915](https://github.com/kubernetes/kubernetes/pull/76915), [@vladimirvivien](https://github.com/vladimirvivien))

### Staging Repositories
- Azure File pluginのサポートに`csi-translation-lib` (CSIMigrationAzureFile)が追加されました。 ([#78356](https://github.com/kubernetes/kubernetes/pull/78356), [@andyzhangx](https://github.com/andyzhangx))
- Azure Disk pluginのサポートに`csi-translation-lib` (CSIMigrationAzureDisk)が追加されました。 ([#78330](https://github.com/kubernetes/kubernetes/pull/78330), [@andyzhangx](https://github.com/andyzhangx))

# その他注目すべき変更 (Other notable changes)

- AWSで無効なデバイスパスを待っているkubeletの問題を修正しました。([#78595](https://github.com/kubernetes/kubernetes/pull/78595), [@gnufied](https://github.com/gnufied))
- StorageOSのボリュームは、StorageOSの管理用CLIとUIに正しい情報(ノードとマウント時間)を表示するようになりました。([#78522](https://github.com/kubernetes/kubernetes/pull/78522), [@croomes](https://github.com/croomes))
- Portworxのボリュームドライバーにてコントローラマネージャがクラッシュする問題を修正しました。 ([#76341](https://github.com/kubernetes/kubernetes/pull/76341), [@harsh-px](https://github.com/harsh-px))
- 空の通常ファイルの場合、`stat --printf %F`の実行結果が`regular file`の代わりに`regular empty file`を表示するようになりました。([#62159](https://github.com/kubernetes/kubernetes/pull/62159), [@dixudx](https://github.com/dixudx))
- 異なるストレージオペレーションに異なるオペレーション名をつけることができるようになりました。これは、同じボリュームに2つのオペレーションが発生することを抑止しますが、もしオペレーションが変更された場合、指数関数的にリセットされます。([#75213](https://github.com/kubernetes/kubernetes/pull/75213), [@gnufied](https://github.com/gnufied))
- `AttachVolume`のストレージオペレーションのイベントのスパムを削減しました。([#75986](https://github.com/kubernetes/kubernetes/pull/75986), [@mucahitkurt](https://github.com/mucahitkurt))
- このリリースまで、iSCSI pluginはデバイスリスト内にパスが現れるまで10秒間待っていました。しかしながら、このタイムアウトは短い過ぎるか、もしくは多くのシステムのデバイス検出の時間よりも短いため、特定のデバイスを検出出来ませんでした。そこで、タイムアウトの時間を30秒に引き上げられました。これにより、デバイス検出によるマウントの問題を回避します。 ([#78475](https://github.com/kubernetes/kubernetes/pull/78475), [@humblec](https://github.com/humblec))
- CSIのボリューム拡張にsecretを保持するフィールドを追加しました。([#77516](https://github.com/kubernetes/kubernetes/pull/77516), [@gnufied](https://github.com/gnufied))
- Blockボリューム拡張のバグを修正しました。([#77317](https://github.com/kubernetes/kubernetes/pull/77317), [@gnufied](https://github.com/gnufied)) 

:memo: ボリューム拡張の際、PVCのVolumeModeが`filesystem`であるかをチェックするようになりました。

- 接続制限に向け、BoundされていないPVCをカウントするようになりました。 ([#73863](https://github.com/kubernetes/kubernetes/pull/73863), [@gnufied](https://github.com/gnufied))