Kubernetes 1.27: SIG Storageの変更内容


# はじめに

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

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

SIG-Storageに関連するものはなし

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

SIG-Storageに関連するものはなし

### APIの変更 (API Change)

- seccomp profile defaulting がGAになりました。

kubeletの`--seccomp-default`フラグ又はkubeletのコンフィグの`seccompDefault`をtrueに設定することで、`RuntimeDefault` seccomp profileがノード上のPodでデフォルト設定されます。
seccompをワークロードで有効にすると、使用しているカーネルやコンテナランタイムのバージョンなどによっては性能が悪くなることがあります。
これらの問題については、軽減するためのガイダンスがKubernetesの[seccomp チュートリアル](https://kubernetes.io/docs/tutorials/security/seccomp/)に解説されています。 (#115719, @saschagrunert) 

- volume expansionがGAとなったことで、次のfeature gatesは削除されており、--feature-gatesフラグで参照することはできません。
`ExpandCSIVolumes`, `ExpandInUsePersistentVolumes`, `ExpandPersistentVolumes`  (#113942, @mengjiao-liu)
- control planeのコンポーネントで `/metrics/slis`が利用できるようになり、ヘルスチェックのメトリクスをスクレイピングできるようになりました。(#114997, @Richabanker) 
- `SELinuxMountReadWriteOncePod`のfeature gate がベータになりました。(#116425, @jsafrane) 
- `StatefulSetAutoDeletePVC`のfeature gateがベータになりました。(#116501, @mattcary) 
- inline PVC template 又は PVCの作成・アップデート時に、`volumes`: `resource.claims` は影響がないため、クリアされるようになりました。(#115928, @pohly)

### 機能 (Feature)

- `NewVolumeManagerReconstruction` feature gateが追加されデフォルトで有効になり、kubelet起動時にマウントされたボリュームの更新を検出するようになりました。kubeletが起動時にスタックしたり、削除されたPodからボリュームがアンマウントされなかったりするなど問題があれば報告してください。(#115268, @jsafrane)
- secret付きのボリュームを拡張するe2eテストが追加されました。(#115451, @zhucan) 
- kubeletの起動中のボリューム再構築のメトリクスが追加されました。 (#115965, @jsafrane)
- `ReadWriteOncePod`のPVCを利用したPodのプリエンプションをschedulerを追加しました。(#114051, @chrishenzie) 
- kubeletの`UserNamespacesStatelessPodsSupport`のfeature gateを有効にすることで、ステートレスなPodを別のuser namespaceで実行することができるようになりました。(#116377, @giuseppe) 
- `CSINodeExpandSecret`機能がベータになりました。この機能は、CSIオペレーションのノード拡張の一部として、CSIドライバにsecretを渡すことを円滑にします。 (#115621, @humblec)
- `CSIMigrationvSphere` のfeature gateをロックしました。(#116610, @xing-yang) 
- volume attach/detach controller(kube-controller-managerに含む)をcontextual loggingを使用するように変更しました。同じくPersistentVolumeClaim protection cotroller(kube-controller-managerに含む)もcontextual loggingを使用するように変更しました。
同様にPersistentVolume protection controller(kube-controller-managerに含む)もcontextual loggingを使用するように変更しました。(#113584, @yangjunmyfm192085)
- klog のパフォーマンスを向上しました。(#115277, @pohly) 
- Schedulerの `volumebinding:` `PreFilterResult`を利用し、ローカルのPersistentVolume(s)にバインドされたClaimを持つPod向けに適切なノードのみに絞り込みます。(#109877, @yibozhuang)
- `ReadWriteOncePod`のfeature gate がベータになりました。(#114494, @chrishenzie) 
- CSIMigrationvSphereのfeature gateのロックを解除しました。この変更により、ユーザーは、Windows、XFS、および raw ブロックアクセスを GA でサポートする vSphere CSI ドライバのリリースまで、in-treeの vSphere ドライバを使用し続けることができます。(#116342, @msau42) 

:memo: #116610 と矛盾するリリースノートですが、v1.27.0では#116610が有効であり`LockToDefault: true`となっています。
https://github.com/kubernetes/kubernetes/blob/v1.27.0/pkg/features/kube_features.go#LL963C1-L964C1

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

SIG-Storageに関連するものはなし

### 失敗するテスト (Failing Test)

- vSphere e2e テストにおけるパニックを修正しました。(#115863, @jsafrane) 

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

- CSI PersistentVolumesが63文字以上のSecrets名を許可するように修正しました。(#114776, @jsafrane)
- host path provisionerによって作成された host path volumeのSELinux ラベルを修正しました。(#112021, @mrunalp) 
- `OwnerReferencesPermissionEnforcement` admission pluginが有効な場合のStatefulSetAutoDeletePVC機能を修正しました。 (#114116, @jsafrane)
- 非推奨のアノテーション`volume.beta.kubernetes.io/storage-class`が設定されている場合でも、Kubernetes が PersistentVolumeClaim にデフォルトの StorageClass を適用してしまうバグを修正しました。(#116089, @cvvz)
- schedulerでvolume bindingが完了したかのように表示されるログを修正しました。(#116018, @TommyStarK) 
- ノード上でCSI ドライバが稼働していない場合に、CSI に移行されたボリュームが早期にdetachされる場合がある問題を修正しました。ノード上で CSI migrationが有効になっている場合、csi-driverが立ち上がってる・いないに関わらず、このボリュームをDSWに追加したままにします。(#115464, @sunnylovestiramisu)
- fsGroupを使用する際、Secret/ConfigMap/projected volume のアップデート中に発生したファイルパーミッションの問題を修正しました。この問題は、正しいパーミッションが適用される前に、更新されたばかりのファイルを読み込むと、アプリケーションが断続的にpermission denied のエラーを起こすというレースコンディションを引き起こしていました。(#114464, @tsaarni) 
- 実際にマウントされていないディレクトリをumountしようとした時にPodが固まり終了する問題を修正しました。(#115769, @mochizuki875) 
- Kubelet: fsquotaのモニタリングが有効な時に、ConfigMapのレンダリングを停止するkubeletのバグを修正しました。(#112624, @pacoxu)
- pending中のPodに対しPVCが欠落している場合、PVCが自動的に再作成されるようになります。(#113270, @rrangith)
- OS, architecture, zone, region, instance typeにてベータ版のKubernetesのラベルを使いNodeAffinitiesを設定していたPersistentVolume API オブジェクトは、stableのKubernetesのラベルを使用するように修正されました。(#115391, @haoruan) 
- マウント時に拡張可能な場合、node_stage_path が設定されるようになりました。 (#115346, @gnufied) 
- tryUnmount にて mounter.withSafeNotMountedBehavior を優先するようになりました。(#114736, @andyzhangx) 

### その他 (Cleanup or Flake)

- AWS kubelet credential providerを削除しました。代わりに、ecr-credential-providerというバイナリ名の外部のkubelet credential providerを使用してください。(#116329, @dims)
- in-treeのAzure diskのpluginが削除されました。(#116301, @andyzhangx)
- APIバージョンがstorage.k8s.io/v1beta1 のCSIStorageCapacityはサービス終了となります。(#116523, @pacoxu)
- `CSIMigrationAzureFile`のfeature gate(v1.26でGAを卒業した機能)は、無条件で有効になりv1.28で削除される予定です。(#114953, @enj)
- v1.25でGAとなり、無条件で有効になっていたfeature gatesの`CSIInlineVolume`、`CSIMigration`、`DaemonSetUpdateSurge`、`EphemeralContainers`、 `IdentifyPodOS`、 `LocalStorageCapacityIsolation`、 `NetworkPolicyEndPort`、 `StatefulSetMinReadySeconds`はv1.27で削除されました。

# 所感

Kubernetes v1.27は、ノードからボリュームのdetach/attachする際の処理が改善されるなどの修正はあったものの、特に大きな変更や機能追加はありませんでした。そのなかで挙げるとすれば、`ReadWriteOncePod`のAccessModeがベータに昇格したことでしょうか。feature gateがデフォルトでtrueとなり、利用するユーザも増えてくるかと推察します。
これまで`ReadWriteOnce`を利用していたPVC/PVの多くは`ReadWriteOncePod`に置き換えた方が安全性が向上しますので、是非試してみてください。
なお、`ReadWriteOnce`と`ReadWriteOncePod`の挙動の違いは、[「Kubernetes: ReadWriteOnceとReadWriteOncePodの動作検証」](https://qiita.com/ysakashita/items/ad1f13e2af99969c8e9e)に記事を公開していますので、ご興味のある方はご参照ください。