Kubernetes 1.33.0がリリースされました🎉
それでは、Kubernetes 1.33.0のCHANGELOGをベースにSIG Storageに関する変更について紹介します。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
過去 3 リリースの変更内容:
- Kubernetes 1.32: SIG Storageの変更内容
- Kubernetes 1.31: SIG Storageの変更内容
- Kubernetes 1.30: SIG Storageの変更内容
所感
SIG Storageは、v1.33では、多くの機能がGAへ昇格し、大分安定してきている印象を受けます。
v1.33の注目機能(Alpha)としては下記です(詳細は本文の を参照ください)。
-
StorageCapacityScoring
: Dynamic provisioningなvolumeを持つPodをスケジュールする際に空き容量を考慮してノードのスコアリングできる機能 -
MutableCSINodeAllocatableCount
:CSINode.Spec.Drivers[*].Allocatable.Count
がmutableにできる機能
Feature昇格は下記の通りです:
- Beta昇格
-
SELinuxChangePolicy
,SELinuxMount(disabled by default)
-
- GA昇格
AnyVolumeDataSource
CSIMigrationPortworx
HonorPVReclaimPolicy
- GA後のfeature gate削除
PersistentVolumeLastPhaseTransitionTime
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
- [Action Required]
IsLikelyNotMountPoint
を呼んでいるCSI driverはfalse
が返ってきても、そのパスがマウントポイントだと想定するべきではありません。 渡されたファイルがイレギュラーなファイルで実際はマウントポイントでない場合には許容されてしまうので、CSI Driverは返り値を適切に利用する必要があります(#129370, @andyzhangx)
Windowsでのみインパクトのある修正です。go 1.23で入ったWindowsにおけるマウントポイントのパース処理の変更による影響です。
Deprecation (非推奨になったAPI)
-
StorageCapacityScoring
feature gateが追加され、ストレージの空き容量でノードをスコアするようになりました。これはAlphaステージであり、デフォルトでdisabledです。これに伴ってVolumeCapacityPriority
Alpha feature gateはこのfeature gateで置き換えられます。デフォルトの挙動も変更になります。VolumeCapacityPriority
は空き容量が少ないノードを優先していましたが、StorageCapacityScoring
は空き容量が多いノードを優先します。詳しくはKEP-4049を参照してください(#128184, @cupnes)
古いAlpha feature gateが置き換えられているのでDeprecationのセクションに記載されていますが、
StorageCapacityScoring
は新機能です。
ブログタイトルにもあるようにこのスコアリングはDynamic Provisioningのボリュームのみを持つPodのスケジューリング時に機能します。
また、デフォルトで空き容量が多いノードを優先する仕様にしているのは、スケジュール後にPVを拡張するユースケースを重視しているからのようです。リソース/費用効率からビンパッキングしたいこともあるため、
スコアロジックはVolumeBinding
プラグインの設定(.args
)に.shape
というフィールド(RequestedToCapacityRatio
プラグインで使えるものと同じ)が追加されており、このフィールドで変更できます。
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
...
pluginConfig:
- name: VolumeBinding
args:
...
# スプレッド:
# (StorageCapacityScoring feature gateのdefault)
# utilizationが低い=空き容量が多い方を優先
shape:
- utilization: 0
score: 10
- utilization: 100
score: 0
# ビンパッキング:
# utilizationが高い=空き容量が少ない方を優先
shape:
- utilization: 0
score: 0
- utilization: 100
score: 10
API Changes (API周りの変更)
- 新しいAlpha feature gate
MutableCSINodeAllocatableCount
が導入されました。このfeature gateが有効になると、CSINode.Spec.Drivers[*].Allocatable.Count
フィールドがmutableになります。また、新しいフィールドNodeAllocatableUpdatePeriodSeconds
がCSIDriver
オブジェクトで利用可能になります。このフィールドはnodeによって報告されたvolume capacityを定期的に更新させることで、stateful podが、kube-schedulerが古い情報を参照してしまうことでスタックすることを防ぎます(#130007, @torredil)
KEP-4876: Mutable CSINode Allocatable Property
Kubernetes Blog - Kubernetes v1.33: Mutable CSI Node Allocatable Count
クラウドなどではVMにアタッチできるボリューム数上限があり、CSI以外のボリューム操作や、複数CSIドライバが稼働している場合には、ドライバ毎のアタッチ上限は動的に変化します。
また、誤ったAllocatable.CountでスケジュールされてしまったPodは、ContainerCreatingでスタックしてしまうため、効率的なStatefulワークロードのスケジューリングにおいては重要な機能と言えます。
-
AnyVolumeDataSource
feature gateをGAに昇格させました。(#129770, @sunnylovestiramisu) -
ClusterTrustBundle
APIはv1beta1
に移行します。ClusterTrustBundleProjection
featureをkubeletで対応するためには、ClusterTrustBundle
APIのv1beta1
バージョンが利用可能な状態で、かつ、ClusterTrustBundleProjection
feature gateが有効でなくてはなりません。kubelet起動後にこのAPIが有効になった場合は、機能を有効にするためにkubeletをリスタートしてください。(#128499, @stlaz)
Features (機能追加)
- volume group snapshotのe2eテストを追加しました(#128972, @manishym)
- kube-controller-managerがコンテナで実行されている際の
SELinuxWarningController
のデフォルト値を修正しました(#130037, @jsafrane) - kube-apiserver:
StorageObjectInUseProtection
アドミッションプラグインは、VolumeAttributeClass
が有効かつstorage.k8s.io/v1beta1
も有効な場合、kubernetes.io/vac-protection
ファイナライザをVolumeAttributesClass
作成時に追加するようになりました(#130553, @Phaow) -
CSIMigrationPortworx
feature gateをGAに昇格させました。アプリケーションがPortworxボリュームを利用している場合、1.31以降にアップグレードする前に、対応するPortworx CSIドライバがインストールされてていることを確認してください。このfeature gateが有効な場合、すべてのin-treeportworxVolume
はpxd.portworx.com CSIドライバにリダイレクトされるためです(#129297, @gohilankit) -
HonorPVReclaimPolicy
feature gateをGAに昇格させました(#129583, @carlory) -
SELinuxChangePolicy
,SELinuxMount
がBetaに昇格しました。SELinuxMount
はデフォルトoffのままです。(#130544, @jsafrane) -
StorageCapacityScoring
feature gateが追加され、ストレージの空き容量でノードをスコアするようになりました。これはAlphaステージであり、デフォルトでdisabledです。これに伴ってVolumeCapacityPriority
Alpha feature gateはこのfeature gateで置き換えられます。デフォルトの挙動も変更になります。VolumeCapacityPriority
は空き容量が少ないノードを優先していましたが、StorageCapacityScoring
は空き容量が多いノードを優先します。詳しくはKEP-4049を参照してください(#128184, @cupnes)
📃 Documentation (ドキュメント)
SIG Storage関連のものはありません
Bug or Regression (バグ修正)
ボリュームのpermisison/ownershipの大規模な変更を抑制するために
fsGroupChangePolicy: onRootMismatch
(ルートでだけチェック)がありますが、fsGroupChangePolicy: Always
な場合に、下記のように進捗イベントが発砲されるようになります。
Warning VolumePermissionChangeInProgress 2m50s kubelet Setting volume ownership for /var/lib/kubelet/
pods/29928e79-9a46-4ab9-8aab-c612e82ec0d9/volumes/kubernetes.io~csi/biginode/mount is taking longer than
expected, consider using OnRootMismatch - https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
#configure-volume-permission-and-ownership-change-policy-for-pods
Warning VolumePermissionChangeInProgress 110s kubelet Setting volume ownership for /var/lib/kubelet/
pods/29928e79-9a46-4ab9-8aab-c612e82ec0d9/volumes/kubernetes.io~csi/biginode/mount, processed 2654670 files.
Warning VolumePermissionChangeInProgress 50s kubelet Setting volume ownership for /var/lib/kubelet/
pods/29928e79-9a46-4ab9-8aab-c612e82ec0d9/volumes/kubernetes.io~csi/biginode/mount, processed 5121525 files.
- Fix: go1.23におけるWindowsでのmount pointパース処理の変更を適用しました(#129368, @andyzhangx)
- マルチパスに関するストレージバグを修正しました。iSCSIやFibre Channelデバイスがmultipathでアタッチされている場合、デバイスパーティションを正しく解決します(#128086, @RomanBednar)
-
volume_linux_test.go
におけるTestSetVolumeOwnershipOwner
のfsGroup=3000
の場合とsymlinkケースの場合のテスト失敗を修正しました。このテストは所有権の不完全な検証によるもので、所有権変更処理の調整、rootで動作する時の挙動の修正を行うことで解決しました(#130616, @gnufied) - 参照しているPVCがユーザによって削除されている最中にkubeletが再起動すると実行中のpodのvolumeをunmountする問題を修正しました(#130335, @carlory)
- クラスタでPortworx security feature(Kubernetesの機能ではなくPortworxの機能)が有効な場合に、Portworxボリュームのin-tree CSI migrationを修正しました。in-tree Storage Classで参照されているSecretの認証データがCSIリクエストに渡されるべきですが、この修正前は行われていませんでした。(#129630, @gohilankit)
- Nominated nodeが変化した時の処理を正しく扱うようにスケジューリングの挙動を見直しました。Nominated node名が消されたり別のノードにnominateされたりした際にpodの再スケジューリングをトリガします(#129058, @dom4ha)