Kubernetes 1.37.0がリリースされました🎉
それでは、Kubernetes 1.37.0のCHANGELOGをベースにSIG Storageに関する変更について紹介します。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
過去 3 リリースの変更内容:
- Kubernetes 1.36: SIG Storageの変更内容
- Kubernetes 1.35: SIG Storageの変更内容
- Kubernetes 1.34: SIG Storageの変更内容
所感
SIG Storageの大きめの変更のとしては
- (Beta) kube-schedulerおよびCluster AutoscalerでCSINodeで定義されるVolume Attach Limitを考慮するように変更 (KEP-5030: Integrate CSI Volume attach limits with cluster autoscaler)
- (Alpha) Volume Health MonitorのAPI化対応 (KEP-1432: Volume Health Monitor)
- (Alpha) Memory Backed VolumeのIn-Place Pod Update対応 (KEP-6030: Dynamic Resize of Memory-Backed Volumes)
- (Alpha) Atomic Write Volume(ConfigMap, Secret, Downward API, Projectedボリューム)におけるファイルのowner userの指定 (KEP-5936: Add user fields to atomic write volumes)
- (Alpha) emptyDir ボリュームのディレクトリのモード指定対応 (KEP-5502: EmptyDir Volume Permission Mode)
といったところでしょうか。あとは機能の昇格や小さなバグフィックスになります。
下記にDeprecation/Alpha/Beta/GA/GA後のFeatureGate削除についてまとめます。
Deprecation
SIG Storage関連のものはありません
Alpha
| KEP | KEP-5936: Add user fields to atomic write volumes |
|---|---|
| Status | Alpha |
| Feature Gate | AtomicWriteVolumeUserFields(default=false) |
| Description | Atomic Write Volume(ConfigMap, Secret, Downward API, Projectedボリューム)におけるファイルのowner userの指定が可能に |
| KEP | KEP-6030: Dynamic Resize of Memory-Backed Volumes |
|---|---|
| Status | Alpha |
| Feature Gate | InPlacePodVerticalScalingMemoryBackedVolumes(default=false) |
| Description | Pod再スタート/再作成させずに medium: Memory な emptyDir ボリューム(tmpfs)を動的にリサイズ(emptyDir.sizeLimit)できる機能 |
| KEP | KEP-5502: EmptyDir Volume Permission Mode |
|---|---|
| Status | Alpha |
| Feature Gate | EmptyDirVolumeMode(default=false) |
| Description |
emptyDirボリュームのディレクトリ作成時にmodeフィールドでUnixパーミッションBits(0000-01777)を設定できる機能 |
| KEP | KEP-1432: Volume Health Monitor |
|---|---|
| Status | Alpha |
| Feature Gate | CSIVolumeHealth(default=false) |
| Description | これまでevent/metricsでしかexposeしていなかったVolume HealthをAPI(PVC, Pod, CSINode)としてもexposeするように追加実装 |
Beta
| KEP | KEP-5030: Integrate CSI Volume attach limits with cluster autoscaler |
|---|---|
| Status | Beta |
| Feature Gate | VolumeLimitScaling(default=true) |
| Description | kube-schedulerおよびCluster AutoscalerでCSINodeで定義されるVolume Attach Limitを考慮するように変更。Cluster AutoscalerでScale From Zeroする場合のスケジュール失敗の改善も期待できます |
| Comment | 自身の使っているCluster Providerの対応状況をウォッチすると良さそうです |
GA
| KEP | KEP-3257: Cluster Trust Bundles |
|---|---|
| Status | GA |
| Feature Gate | ClusterTrustBundle(default=true), ClusterTrustBundleProjection(default=true) |
GA済みFeature Gateの削除
| KEP | KEP-1495: Volume Populators |
|---|---|
| Feature Gate | AnyVolumeDataSource |
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
SIG Storage関連のものはありません
🔗 Dependency
- etcdクライアントライブラリが
v3.6.10にアップデートされました。(#138393, @humblec) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Etcd, Instrumentation, Network, Node, Scheduling and Storage]
Deprecation (非推奨になったAPI)
SIG Storage関連のものはありません
API Changes (API周りの変更)
-
AtomicWriteVolumeUserFieldsフィーチャーゲートによる、Atomic Write VolumeにおけるファイルのユーザID指定のアルファサポートを追加しました(disabled by default). (#139764, @gavinkflam) [SIG API Machinery, Apps, Auth, Storage and Testing]-
KEP-5936: Add user fields to atomic write volumes
-
Atomic Write Volume: ファイルの変更内容がPodからAtomicに見えるボリュームで、ConfigMap, Secret Downward API, Project ボリュームのこと -
これまでroot userがオーナーとして作られていたので、MongoDBやsshd用のhostkeyなど、特定のユーザ所有である必要がある場合は、initContainerを使って所有を変更する必要があったが、このfeatureでspecとして指定できるようになった
volumes: - name: volA configMap: defaultUser: 1000 name: cm1 items: - key: foo # Owner=defaultUser path: foo - key: bar # Owner=user path: bar user: 1001 - name: volB secret: # Owner=defaultUser defaultUser: 1000 secretName: secret1 - name: volC secret: secretName: secret2 items: - key: moo # Owner=root path: moo - key: baa # Owner=user path: baa user: 1000
-
-
workloadbuilderlibraryと Workload building block APIとの統合によって、JobコントローラにWorkload-aware scheduling(WAS)サポートを追加しました (#140188, @helayoty) [SIG API Machinery, Apps, Auth, Network, Node, Scheduling, Storage and Testing] -
InPlacePodVerticalScalingSchedulerPreemptionfeature gateが有効な場合に、高優先度なDeferredなin-place Pod resize向けに低優先度のPodをプリエンプションするschedulerのサポートを追加しました(#140000, @natasha41575) [SIG API Machinery, Apps, Node, Scheduling, Storage and Testing] - アルファ
InPlacePodVerticalScalingMemoryBackedVolumesフィーチャーゲートによる、memory-backedボリュームの動的リサイズのサポートを追加しました (#139425, @natasha41575) [SIG API Machinery, Apps, Autoscaling, CLI, Node, Scheduling, Storage and Testing]-
KEP-6030: Dynamic Resize of Memory-Backed Volumes
-
Podを再作成/再スタートせずに medium: MemoryなemptyDirボリューム(tmpfs)を動的にリサイズ(emptyDir.sizeLimit)できる機能 -
cgroup v2が必要, cgroup v1では未サポート(Infeasibleとしてreject) -
通常のIn-Place Pod Updateのresource-fit(Nodeに乗るかどうか?)のチェックではチェックされず、admission checkで失敗するので注意
-
-
emptyDirボリュームディレクトリ作成時にmodeフィールドによるUnixパーミッションBits(0000-01777)設定のサポートを追加しました。 (#140244, @nispriha) [SIG API Machinery, Apps, Node, Storage and Testing]-
KEP-5502: EmptyDir Volume Permission Mode
-
Feature Gate: EmptyDirVolumeModevolumes: - name: app-data emptyDir: mode: 0750 - name: tmp emptyDir: mode: 01777 # Sticky Bitも指定可能
-
- ボリュームヘルスの報告に必要なAPIの変更を追加しました (#140194, @gnufied) [SIG API Machinery, Apps, Architecture, Auth, Etcd, Instrumentation, Node, Storage and Testing]
-
KEP-1432: Volume Health Monitor
-
Release Blog: Kubernetes v1.37 Sneak Peek - Volume health monitor
-
v1.19(Alpha), v1.21(2nd Alpha)としてリリースしていたVolume Healthの再改修が行われています -
以前
- CSIの
NodeGetVolumeStats経由でVolumeCondition{Normal|Abnormal}イベント,kubelet_volume_stats_health_status_abnormalmetricsをexpose - 詳細はKubernetes: Volume Health Monitorの動作検証
kubernetes
を参照
- CSIの
-
課題
- eventとmetricsしかなかった
- 「今の状態」を知るAPIがなためremediationをするにもcontrollerが作りづらい
-
今回
- Feature Gate(変更無し):
CSIVolumeHealth - Controller
- CSIへのメソッドの追加:
ControllerListVolumeHealth, ControllerGetVolumeHealth - PVC APIの追加:
PVC.status.healthStatus
- CSIへのメソッドの追加:
- Node
- CSIへのメソッド追加:
NodeGetVolumeHealth, NodeGetStorageHealth - Pod APIの追加:
Pod.status.volumeHealth-
NodeGetVolumeHealthCSIから取得
-
- CSINode APIの追加:
CSINode.status.storageHealth-
NodeGetStorageHealthCSIから取得
-
- CSIへのメソッド追加:
- Feature Gate(変更無し):
-
-
SchedulerPreQueueingHintsFeature Gate(Alpha、デフォルト無効)を追加しました。これを有効にすると、スケジューラープラグインが PreQueueingHintFn を提供できるようになり、クラスタイベント時に評価される Pod のセットを絞り込むことで、スケジューリングのスループットが向上します。DRA プラグインでは、ResourceClaimTemplate をベースとしたワークロードを最適化するためにこれが実装されています。(#138916, @geetasg) [SIG API Machinery, Apps, Architecture, Auth, CLI, Cloud Provider, Instrumentation, Network, Node, Scheduling, Storage, Testing and Windows] -
kube-apiserverの CBOR エンコーダーを変更し、コレクションをまとめてではなく、アイテムごとにエンコードするようにしました。 (#138808, @chenk008) [SIG API Machinery, Apps, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Contributor Experience, Instrumentation, Network, Node, Release, Scalability, Scheduling, Storage, Testing and Windows] -
ClusterTrustBundleおよびClusterTrustBundleProjectionFeature Gateを GA に昇格させ、デフォルトで有効化しました。 (#139437, @stlaz) [SIG API Machinery, Apps, Architecture, Auth, Etcd, Node, Storage and Testing] - kubeletのボリュームメトリクス(
storage_operation_duration_seconds、volume_operation_total_seconds)をAlphaからBetaの安定性に昇格させ、メトリクスを利用するユーザーに対してより強力なAPIおよびラベルの安定性の保証を提供しました。(#136189, @bhope) [SIG Instrumentation and Storage] - DRA Device Taints and Tolerations機能をGAに昇格させ、
resource.k8s.io/v1APIを通じて利用できるようにしました。(#138676, @pohly) [SIG API Machinery, Apps, Architecture, Auth, Etcd, Node, Scheduling, Storage and Testing] - 必要な CSI ドライバーが存在しないノードへの Pod のスケジューリングを防ぐため、CSIDriver に
preventPodSchedulingIfMissingフィールドを追加するVolumeLimitScalingフィールドゲートをBetaに昇格させました。(#140612, @gnufied) [SIG API Machinery, Storage and Testing]-
KEP-5030: Integrate CSI Volume attach limits with cluster autoscaler
-
Feature Gate: VolumeLimitScaling (v1.35でAlpha) -
DriverごとにCSIDriver.Spec.PreventPodSchedulingIfMissingフィールドでCSINodeにdriver情報が登録されていない時にPodのスケジュールを抑制するかどうかを切り替えられるようになります - 機能詳細はKubernetes 1.35: SIG Storageの変更内容参照
-
-
v1.33以降ロックされて有効化されていたGAのFeature GateAnyVolumeDataSourceを削除しました。 (#135336, @carlory) [SIG API Machinery, Apps, Storage and Testing] - APIのGo言語の型定義において、インライン展開された
TypeMetaフィールドのJSONタグを",inline"から""に変更しました。inlineはJSONシリアライザで認識されるオプションではなく、JSONのシリアライズ(エンコード)やデシリアライズ(デコード)の動作に影響を与えませんでした。 (#138260, @liggitt) [SIG API Machinery, Apps, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Etcd, Instrumentation, Network, Node, Scheduling, Storage and Testing] -
client-go: 呼び出し元がコンテキストを渡すAPIを導入することにより、ほぼすべてのcontext.TODO呼び出しを削除しました。ログ出力には、利用可能な場合に呼び出し元から提供されたロガーを使用します。 (#129125, @pohly) [SIG API Machinery, Apps, Architecture, Auth, CLI, Cloud Provider, Instrumentation, Network, Node, Storage and Testing]
Features (機能追加)
-
EtcdRangeStreamBeta Feature Gateを追加しました。ウォッチキャッシュが、ページネーションを使用する従来のRangeリクエストではなく、単一のRangeStreamRPC を使用して etcd からオブジェクトをストリーミングすることで初期化されるようになります。 (#136915, @Jefftree) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Etcd, Instrumentation, Network, Node, Scheduling, Storage and Testing] - オブジェクト走査用に遅延評価とゼロアロケーションを実現したリフレクションベースのユーティリティを採用することで、CEL アドミッションポリシーの評価を最適化しました。これにより、リクエスト処理中の CPU 使用率とガベージコレクションのオーバーヘッドが大幅に削減されます。 (#138771, @lalitc375) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Network, Node, Scheduling and Storage]
- クラスターイベントリソースである「Pod」に、「AssignedPod」「UnscheduledPod」「TargetPod」という3つの異なるサブタイプを追加しました。パフォーマンス向上のため、プラグインは特定の Pod イベントに登録することが可能であり、またそれが期待されています。 (#135905, @iomarsayed) [SIG Node, Scheduling, Storage and Testing]
- ボリュームマウントのホストパターンの型不一致エラーにおいて、期待されるパスの型に加えて実際のパスの型もログに出力するように更新しました。 (#121873, @skitt) [SIG Storage]
-
volumes.hostPath.type: Directoryなのに指定されていたpathがファイルだった時のログの改善- 前:
hostPath type check failed: /var/lib/mydata is not a directory - 後:
hostPath type check failed: /var/lib/mydata is not a directory, it's a file
- 前:
-
📃 Documentation (ドキュメント)
SIG Storage関連のものはありません
Failing Test
SIG Storage関連のものはありません
Bug or Regression (バグ修正)
- SELinuxのメトリック発行時における、コストの高い比較処理を回避しました。(#138981, @gnufied) [SIG Apps and Storage]
-
同じVolumeを複数のContainerから異なるSELinux labelを指定してmountする(conflict)する際にWarningメトリクスを発砲しますが、これまではmetric を scrape するたびにVolumexPod の組み合わせを全部再計算していたのをキャッシュを導入して高速する変更です
-
- 初回のPVCバインディング時に、PVCプロテクションコントローラーとPVバインダーの間で発生していた409 Conflictエラーを修正しました。「Unused」条件は、PersistentVolumeClaimがバインドされた後にのみ評価されます。(#140833, @huww98) [SIG Apps and Storage]
-
KEP-5541: Report Last Used Time on a PVCの機能のバグ修正 -
PVC protection controllerとPV binderが PVC.status.conditions[.type=Unused]を同時に更新していたのを修正 → PVC protection controllerではBoundになるまでUnusedconditionの評価をスキップすることでconflictが発生しないように修正
-
- VolumeAttachmentのバリデーションを修正し、エラーメッセージ内で正しい最大メッセージサイズ(1024バイト)が報告されるようにしました。(#136436, @Okabe-Junya) [SIG Storage]
- 複数のStorageClassにdefaultのアノテーションが付与されている場合、
kubectl get storageclassが有効なデフォルトのStorageClassのみを「(default)」として表示するように修正しました。(#135964, @jaehanbyun) [SIG CLI and Storage]-
仕様的には「最も新しく作成された」ものが有効ですが複数のStorage Classに(default)がついてしまっていたのを修正
-
- FUSEまたはGlusterFSのネットワークファイルシステムの障害発生後、
subPathマウントを持つPodがエラーの無限ループに陥る可能性があったkubeletの問題を修正しました。(#139275, @yuehaii) [SIG Node, Storage and Testing] - Server-Side Applyにおけるリグレッションを修正しました。コンテナ型(
listまたはmap)のパッチ適用時に、以前は成功していたアプライリクエストに対して422 requiredエラーが返される問題を修正しています。(#140294, @jpbetz) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Scheduling, Storage and Testing] - 定期的な
NodePublishVolume呼び出し(CSIDriver.spec.requiresRepublishを true に設定することでトリガーされる)がエラーを返した際に、kubeletがCSIマウントディレクトリを削除してしまい、Podに古いボリュームコンテンツが残った結果、その後の再パブリッシュ成功でも修復できなくなる問題を修正しました。(#139045, @aramase) [SIG Storage]-
再マウントの際にエラーになった時にマウントポイントを消してしまっていたバグ。既存のPodには古い内容が見えたままになっていた。CSI Mounterに再マウントかどうかを渡すようにしして修正
-
-
MakeMountArgsSensitiveWithMountFlagsからのログ文字列出力に含まれていた、重複したマウント引数を修正しました。(#138098, @jeffbearer) [SIG Storage] - Podが
CreateContainerConfigErrorの状態でスタックしたままにするのではなく、コンテナの再起動時に(古いNFSファイルハンドルなどの)破損したサブパスマウントポイントからkubeletが回復できるように修正しました。(#138856, @RomanBednar) [SIG Storage]-
NFSでsubPathマウントしているディレクトリを一旦消して同名で作り直したりするときになる"Stale file handle"になった場合に、subPath mountを再作成するようにして復帰するように修正
-
Others (その他修正)
SIG Storage関連のものはありません