はじめに
本ドキュメントでは、Kubernetes 1.22.0のCHANGELOGをベースにSIG Storageに関する機能について紹介します。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
新着情報 (What's New)
Cluster Storage Interface graduations
WindowsノードのCSIサポートは、1.22リリースでGAになります。Kubernetes v1.22では、Windows特権コンテナはアルファ機能のみです。WindowsノードでCSIストレージを使用できるようにするには、CSIProxyの有効によりCSIノードプラグインが非特権Podとしてデプロイされ、このProxyを使うことで、ノード上の特権ストレージ操作を実行できます。
もう一つの、v1.22でGAする機能はCSI Service Account Tokenサポートです。この機能により、CSIドライバは、特権を持ったIDの代わりにPodの bound service account tokensを使用できます。また、これらのボリュームを再発行するためのコントロールも提供しているため、短命のトークンを更新することができます。
既知の問題点 (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のドキュメントを確認してください。
アップグレード前に絶対に確認が必要な変更点 (Urgent Upgrade Notes)
- AWS EBSボリュームのCSI Migrationでは、AWS EBS CSI driver ver. 1.0がサポートするStorageClassの
allowAutoIOPSPerGBIncrease
パラメータが必要です。 (#101082, @jsafrane) - IntreeのVolume plugin ScaleIOのサポートはKubernetesから完全に削除されました。 (#101685, @Jiawei0227)
- Azure Diskによる新規プロビジョニングされたPVは、ベータの
FailureDomain
のラベルを持っていません。Azure Disk Volume Pluginは代わりにGAされたトポロジーラベルを持ちます。(#101534, @kassarl) -
CSIMigrationVSphereComplete
のフラグは削除されました。今後InTreePluginvSphereUnregister
が利用されます。 (#101272, @Jiawei0227)
Changes by Kind
非推奨 (Deprecation)
- vSphere in-tree Pluginにより新規プロビジョニングされたPVは、ベータの
FailureDomain
ラベルを持っていません。vSphereボリュームプラグインはGAされたトポロジーラベルを持ちます。(#102414、@Divyenpatel) - KubeletによるCSIの
NodePublish
パスの削除は推奨されていません。これはCSIの仕様に従ってCSI Pluginによって行われなければなりません。 (#101441, @dobsonj) - storageos, quobyte flocker ストレージのvolume pluginは非推奨となり、将来のリリースで削除されます。 (#101773, @Jiawei0227)
API周りの変更 (API Change)
- PVCの仕様に
DataSourceRef
をAlphaフィールドとして追加します。これにより、PVCおよびVolumesnapshots以外のコンテンツがデータソースになることができます。 (#103276, @bswartz) - StatefulSetのAPIに
PersistentVolumeClaimDeletePoilcy
が追加されました。 (#99378, @mattcary)
本実装は、下部にある#103747で削除(Revert)され、残念ながらv1.22.0では入っていません。#99378はAPI関連のみの実装でv1.22.0に一旦は入ったのですが、StatefulSetのコントローラの実装(#99728)が間に合わなかったようです。
機能の概要
詳細は[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で本機能が登場するのを期待します。- PersistentVolumesとPersistentVolumeCaimsに
ReadWriteOncePod
アクセスモードを追加します。単一ノード上の単一Podへのボリュームアクセスを制限します。(#102028, @chrishenzie)
これまでのReadWriteOnce
は、あくまで1つのノードからRead/Writeでマウントする仕様でした。今回追加されたReadWriteOncePod
により、1 PodからのみRead/Write可能となります。
- スケジューリング中にReadWriteOncePod PVCアクセスモードを強制します(#103082, @chrishenzie)
- StatefulSetにminReadySeconds apiが追加されました。 (#100842, @ravisantoshgudimetla)
- PersistentVolumeClaimDeletePoilcyがStatefulSetのAPIから削除されました(Revert). (#103747, @mattcary)
上述のように本PRによりPersistentVolumeClaimDeletePoilcyのAPIは削除されました。
機能 (Feature)
- StatefulSetにminReadySecondsが実装されました。 (#101316, @ravisantoshgudimetla)
- 幾つかのin-treeのストレージドライバでは MetricsProviderインターフェースでサポートを示しているものがありますが、BlockModeのボリュームに対してこれを設定することは出来ません。直前の修正では、KubeletはBlockModeのボリュームのGetMetrics()を呼び出すと、未サポートとなったin-treeのドライバはGo パニックを引き起こします。現在では、BlockModeのボリュームをサポートするin-treeのストレージドライバは、GetMetrics()を呼び出されるとボリュームの容量を返します。 (#101587, @nixpanic)
- CSIドライバはNodeServiceCapabilityの
VOLUME_MOUNT_GROUP
をサポートします。アルファ機能であるDelegateFSGroupToCSIDriver
のfeature gate が有効の場合、kubelet は他のFSGroupが設定されているかどうかにかかわらず、NodeStageVolume
とNodePublishVolume
へ渡しFSGroupの適用をドライバに委ねます。 (#103244, @verult) -
BoundServiceAccountTokenVolume
はGAになり、無条件で有効になります。このfeature gateは1.23で削除される予定です。 (#101992, @zshihang) - EmptyDirでmemoryを使ったボリュームのサイズはホスト上のPodで割り当て可能なメモリの最小値とオプションでユーザが指定した明示的な値で設定されます。 (#101048, @dims)
-
HugePageStorageMediumSize
機能がGAとなり無条件で有効になります。コンテナレベルで複数の巨大なページリソースを無条件で使用できるようになります。 (#99144, @bart0sh)
ドキュメンテーション (Documentation)
SIG-Storage 関連はなし
失敗しているテスト (Failing Test)
-
OwnerReferencesPermissionEnforcement
admission pluginが有効になっているGeneric Ephemeralボリュームについて修正しました。 (#101186, @jsafrane)
バグまたはリグレッション (Bug or Regression)
- CSI NodePublishVolumeのステージでPodの情報が欠落していたのを修正しました。 (#99069, @phantooom)
- ボリュームのストレージサイズの要求の丸めを修正しました。 (#100100, @maxlaverse)
- CSI Migrationの変換処理におけるAzure fileのinlineボリュームのNamespaceの問題を修正しました。 (#101235, @andyzhangx)
- SMBサーバがダウンした場合、SMBマウントを使用しているPodを終了できずエラーが発生していました。そのため、"host is down"を破損したマウントに設定するように修正しました。 (#101398, @andyzhangx)
- NVMeのAWS EBSボリュームのパーティションを使った場合の問題を修正しました。 (#100500, @jsafrane)
- CSIドライバーが故障した後、CSIボリュームのSELinuxの再ラベリングを修正しました。 (#103154, @jsafrane) [SIG Node and Storage]
- CSIへ移行したPersistentVolumeの宙ぶらりんとなったVolumeAttachmentsのガベージコレクションをkube-controller-managerの起動時に行うように修正しました。 (#102176, @timebertt)
- false-positiveの不確かなvolume attachmentsを修正し、CSIへ移行されたボリュームが予期せぬ時にデタッチされるようになりました。 (#101737, @Jiawei0227) [SIG Apps and Storage]
- サーバにてIPv6アドレスを利用している場合のNFSボリュームのマウントの問題を修正しました。 (#101067, @Elbehery) [SIG Storage]
- 前のPodがボリュームのアンマウントにてタイムアウトした後に、新しいPodを起動するのを修正しました。 (#100183, @jsafrane)
- kubeletがオフライン中にPodが削除されると非常に稀にボリュームが破損する問題を修正しました。 (#102059, @jsafrane)
- vSphere: datastoreがstorage folder又はdatastore clusterの中にある場合、ディスクのアタッチ時のリグレッションを修正しました。 (#102892, @gnufied)
- エラー時にFibreChannelデバイスのクリーンアップをリトライし、FiberChannelのデバイスが他のノードで使用される前に確実にデタッチされるようにしました。 (#101862, @jsafrane)
- ボリューム削除の際、vSphereの"File (vmdk path here) was not found" のエラーを成功として扱うようになりました。 (#92372, @breunigs) [SIG Cloud Provider and Storage]
その他 (Cleanup or Flake)
- CSIドライバがオフラインでの拡張のテストを行えるようになりました。 (#102665, @gnufied)
-
CSINodeIDMaxLength
が128バイトから192バイトに増えました。1.23のリリースで長さの制限を256バイトへ増やす準備です。 (#101256, @Jiawei0227) - v1.20以降、GAとなっている
VolumeSnapshotDataSource
のfeature gateが無条件で有効となり、--feature-gates
の引数で指定できなくなりました。(#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ですが、残念ながらv1.22には間に合わずv1.23にターゲットが変わっています。こちらも出てくるのが楽しみな機能の1つです。