3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kubernetes 1.32: SIG Storageの変更内容

Last updated at Posted at 2025-01-07

はじめに

Kubernetes 1.32.0がリリースされました🎉

それでは、Kubernetes 1.32.0のCHANGELOGをベースにSIG Storageに関する変更について紹介します。

:pencil: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

過去 3 リリースの変更内容:

:pencil: 所感

新機能としてはSELinuxChangePolicyフィーチャーゲートの導入が挙げられますが、それ以外はほぼBugFix, Scalability改善が主だと感じました。Scheduler系の変更も多く挙げられていますが、主に性能改善を目的としたものです。

:warning: Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)

v1.32リリースではUrgent Upgrade Notesはありません。

:wastebasket: Deprecation (非推奨になったAPI)

:pencil: SIG Storage関連のものはありません

:earth_asia: API Changes (API周りの変更)

  • Access ModeがReadWriteOncePodなvolumeに対してもfsGroup policyが適用されます(#128244, @gnufied)
    • :pencil: CSI Volumeに対する変更です。Bug扱いでも良い程度の変更と思われます。API Changesのカテゴリに含まれてしまっているのは、APIを定義するファイルのコメント修正が含まれているためです。これまではReadWriteOnce access modeのCSI volumeにしか fsGroup が適用されていませんでした
  • PodレベルのsecurityContext内に、新しくseLinuxChangePolicyフィールドがalphaレベル(フィーチャーゲート: SELinuxChangePolicy)で実装されました。 このフィールドは、SELinuxMountフィーチャーゲート(現在はアルファ版で、デフォルトでは無効)が有効になっている場合に、SELinuxラベル付きのPodボリュームのマウントをオプトアウトするためのものです。 SELinuxの動作がどのように変更になるか、どのようにオプトアウトするか、については、KEPを参照してください。 このフィールドと機能ゲートはSELinuxが有効なクラスタでのみ有効であることに注意してください。 SELinuxが有効でないクラスタでは何もする必要はありません
    • :pencil: KEP-1710: Speed up recursive SELinux label change
      これまでのSELinuxMountフィーチャーゲートの機能は-o context=<SELinux lagel>というマウントオプションを利用してボリュームをマウントすることで高速なrelabelingが実現されていました。しかし、この方法だと、Pod内にprivilegedコンテナとunprivilegedコンテナが共存すること(正確には、コンテナ間で異なるSELinuxラベルを持つボリュームマウント)は実現できません。そのためこのフィーチャーでは、seLinuxChangePolicy: Recursive | MonuntOptions (これまでの挙動)を導入し、Recursiveを指定した場合にはマウント後にRecursiveに全ファイルをrelabelすることで共存を可能にしています
  • kube-schedulerからAzureDiskLimits ,CinderLimits,EBSLimits,GCEPDLimitsプラグインが削除されました。それぞれに対応するCSIドライバはNodeGetInfoResponse経由でノードが処理できるボリューム数を報告することで、kubeletがこの制約をCSINodeに格納します。スケジューラはCSINodeから、そのノード上のドライバの制約を把握します。 AzureDiskLimits, CinderLimits, EBSLimits, GCEPDLimits プラグインをスケジューラー設定で明示的に有効にしている場合は削除する必要があります。(#124003, @carlory)
    • :pencil: KEP-625 In-tree storage plugin to CSI Driver Migrationの残作業のようです
    • :pencil: ChangeLogに記載の通り、これらのプラグインを明示的に有効にしている場合には設定からの削除が必要です。既にNodeVolumeLimitsプラグインで同等の機能が提供されています
  • NodeRestrictionアドミッションは、kubeletが、Pod Spec Volumeに定義されるServiceAccountトークンを要求する際にaudienceの値をvalidateするようになります。 kube-apiserverのServiceAccountNodeAudienceRestrictionフィーチャーゲートで有効化されます(デフォルト有効です) (#128077, @aramase)
    • :pencil: KEP-4412: Projected service account tokens for Kubelet image credential providersの一環です(KEP-4412自体はv1.33でAlphaを予定)
    • KEP-4412に記載の通り、ServiceAccountNodeAudienceRestrictionフィーチャーゲート自体は
      • 最初からBetaレベルでの導入
      • このvalidation追加は既存の機能を壊すようなものではないはず
    • KEP-4412の概要
      • モチベ:
        • LongLivedなImage Pull Secretをできるだけなくしていきたい
      • 変更概要:
        • Kubelet Credential Provider ConfigにtokenAttributesという新しいfieldが追加
        • このフィールドが定義されていると、Service Accountトークンが別途発行されCredential Providerに渡される
          • つまり、Service AccountトークンからImage Pull Secretを生成するような細かく権限制御されたCredential Providerが開発可能になって良さそう👍
        • 発行時にService Accountトークン発行時にAudienceがvalidateしたいのでServiceAccountNodeAudienceRestrictionを事前にリリース
        • Credential Provider Configに定義されるaudienceはapiserverは知ることができないので--allowed-kubelet-audiencesというFlagが追加される

:sparkle: Features (機能追加)

  • kube-controller-managerにvolumeattributesclass-protection-controllerが新しく追加されました。この新しいコントローラはVolumeAttributesClassオブジェクトを保護するfinalizerを管理します。(#123549, @carlory)
  • CSILimitプラグインでPersistentVolumeClaim/Addイベントに対するQueueing Hintを実装しました(#124703, @utam0k)
    • :pencil: kube-schedulerの変更です
  • RecoverVolumeExpansionFailureフィーチャーゲートがBetaに昇格しました(#128342, @gnufied)
  • SizeMemoryBackedVolumesがStableに昇格しました(#126981, @kannon92)
  • kubelet起動時に、次のvolume typeに対応するCSI driverがインストールされている場合、nodeのattachable volume limitsを削除します:
    • awsElasticBlockStore for ebs.csi.aws.com
    • azureDisk for disk.csi.azure.com
    • gcePersistentDisk for pd.csi.storage.googleapis.com
    • cinder for cinder.csi.openstack.org
    • csi
      ただし、これらの制約はすでにCSINode オブジェクトによって強制されています (#126924, @carlory)
  • schedulerのVolumeBindingプラグインでCSIDriverイベントに対するQueueingHintを実装しました。これによってスケジューリングのスループットが改善されます(#125171, @YamasouA)
  • SchedulerQueueingHintが有効な場合、schedulerのin-treeプラグインは、Podをいつrequeueするかを判断するために、複数のNodeイベント(taints, tolerations, allocatableの更新)をsubscribeするようになります。これによってschedulerはCluster Eventをより速く省メモリで処理できるようになります。またIn-treeプラグインはこれらのフィールドが変更されない更新は無視するようになります(#127220, @sanposhiho)

📃 Documentation (ドキュメント)

:pencil: SIG Storage関連のものはありません

:fire: Failing Test (失敗しているテスト)

  • Windowsでkubelet pluginが15ms未満でre-registrationを行う場合でも適切にre-registerされるようになります(#114136, @claudiubelu)
    • :pencil: go 1.16で入ったRegressionの影響でWindowsのtime.Now()の解像度が15ms程度になってしまっていたバグに対する修正。ただしこのバグはgo 1.23で修正済み(golang/go#44343)

:bug: Bug or Regression (バグ修正)

    1. kubeletがimage volume source typeを参照するCRIのMountを生成する際、これまで渡されていなかったreadOnly, propagation, and recursiveReadOnly等のattributeを渡すようになります。もし、volumeMountreadOnlyフィールドが明示的にfalseにセットされている場合でも、image volume pluginはマウントがread-onlyでなければならないため、kubeletはreadOnlyをtrueとしてCRI実装に渡します
    2. image volume source typeボリュームが、意図せずコンテナの/etc/hostsにマウントできてしまうバグを修正しました(#126806, @carlory)
  • Node名とhostnameラベルが異なる場合に、nodeAffinityhostnameを使っているPersistentVolumeが間違ったNodeにスケジュールされたり、スケジュール失敗したりするバグを修正(#125398, @AxeZhan)
  • kubeletの再起動中にflex volume pluginのunmountエラーの原因になるrace conditionを修正しました(#127669, @olyazavr)
  • kubeletの再起動中にflex volume pluginのunmountエラーの原因になるrace conditionを修正しました(#128495, @olyazavr)
    • :pencil: 直前のPRのfollowupです
  • kubelet/volumemanagerのdata raceを修正しました (#127919, @carlory)
  • PVC Protection Controllerで、PVCをnamespace毎にBatch-Processingし、live podのリスティングをlazyにすることで、scalabilityを改善しました(#125372, @hungnguyen243)
  • PVC Protection Controllerで、PVCをnamespace毎にBatch-Processingし、live podのリスティングをlazyにすることで、scalabilityを改善しました(#126745, @hungnguyen243)
    • :pencil: PVCがdeleteされた時、PVC protection controllerは、最終チェックとしてLive Podをリストして確認を行います(pod informerからの結果が空のときだけ実行されます)。この処理はPVCやPodが大量に存在する場合は大きな負荷となるため、この修正では、namespace単位でPVCをバッチ処理すると同時に、Live Pod Listを非同期に取得しメモリにキャッシュすることでスケーラビリティを改善しています。PRでは10k Pods/PVCの場合で、PVC削除にかかる時間が>120m22mに改善しています(PRではより詳細なベンチマーク結果が掲載されています)
  • Node shutdown controllerは、pod priority group毎にCSI Driverがvolumeのteardown処理を完了するのをbest effortで待つようになります(#125070, @torredil)
    • :pencil: node shutdown managerはpod priority group事に(non-critical→critical)停止を行いますが、pod停止処理内で行われるvolume teardown処理は並行で処理されるため、CSI Driver Pod(criticalな想定)が実際のvolumeのtear downよりも前に停止されてしまい、結果としてteardownが不完全なCSI Volumeが残ってしまうバグがありました。このPRではnode shutdown managerで、次のpod priority groupの停止処理に移る前に、volumeが全てumountされていることを確認(gracePeriod付き)してから進むように変更しています。ただしこの確認はbest effortでもし確認取れない場合はerror logが出力されるにとどまります。尚、このgracePeriodはkubeletのshutdownGracePeriod/shutdownGracePeriodCriticalPods/shutdownGracePeriodByPodPriorityで設定できます
  • volume attachmentを待つ際のメモリ利用/アロケーションを削減(#126575, @Lucaber)
  • system:controller:persistent-volume-bindersystem:controller:expand-controller clusterroleから不要なpermissionを削除 (#125995, @carlory)
  • kubeletのCSI Volume Pluginは、volumeのattachを待っている間、VolumeAttachmentオブジェクトが見つからないか、Volumeがアタッチされていない場合、VolumeAttachmentオブジェクトをwatchしなくなりました。 以前は、パーミッション不足で失敗していました。 (#126961, @carlory)
  • Usage, VolumeConditionは共にoptionalであり、CSIVolumeHealthフィーチャーゲートが有効な時は、kubeletはこれらのフィールドのどちらかがセットされているときだけメトリクスを返す必要があります(#127021, @Madhu-1)
    • :pencil: Volume Health Monitorの修正ですが、修正内容とChangeLogの文言に乖離があるようです。これまでVolumeConditionをSupportしているVolumeでも、usage==nilが許容されておらず、metricsが出力されていませんでしたが(volume healthがabnormalで、かつusageがreportされてない場合)、VolumeConditionをサポートしているvolumeについては、usageが空を許容するように変更されています
  • Pod statusのqosClassフィールドのvalidationを強化しました。このフィールドはimmutableですが、statusサブリソースを使って更新する際に、newStatusが空の場合にはoldStatusの値をmutableします。(#127744, @carlory)
    • :pencil: statusサブリソースを使って更新する際にqosClassがmutableにってしまっていたようです

:microscope: Others (その他修正)

:pencil: SIG Storage関連のものはありません

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?