本記事は、Kubernetes 変更内容共有会(v1.30) の SIG-Node(kubelet)に関する資料として準備されました。
Kubernetes 1.30の CHANGELOG から、SIG-Nodeに関するところを抜粋して紹介します。
は筆者(@y1r96)による補足です。
所感
今回の Kubernetes 1.30 の SIG-Node (kubelet) に関しては、以下の2つの変更が大きなものでした:
- Dynamic Resource Allocation における構造化されたパラメータの導入 (KEP-4381)
- 再帰的な Read-only マウントのサポート (KEP-3857)
Dynamic Resource Allocation は、従来の device plugin をより柔軟にすべく提案・実装されている Pod とデバイスを紐付ける機能です。Kubernetes 1.30 では、構造化されたパラメータを導入しました。このパラメータを使うことで、ユーザがデバイスの初期化に必要なパラメータを設定することで、DRA driver がもつ特権を使ってデバイスを安全に初期化することができます。また、デバイス側も ResourceSlice リソースを使ってデバイスに対応する構造化されたパラメータを広報することで、ユーザ指定のパラメータと CEL ベースのマッチングを行い、スケジューラにデバイスを絞り込ませてから Pod のスケジュールを検討できるようになりました。
再帰的な Read-only マウントは、従来の Read-only マウントの挙動を改善するものです。従来の Read-only マウントでは、親ディレクトリを Read-only にするものの、サブディレクトリが書き込み可能であれば書き込めてしまいました。再帰的な Read-only マウントを使用することで、サブディレクトリを再帰的かつ確実に Read-only にすることができるようになり、より安全にマウントできるようになりました。
Changes by Kind
API Change
- CRI Container message に
image_id
フィールドを追加することで、コンテナランタイムがイメージのガベージコレクションのバグを修正できるようにしました。(#123508, @saschagrunert) [sig/node]-
- CRI Container message には、
image_ref
というフィールドがあり、イメージの参照としてダイジェストが格納されていました。kubelet が行う image GC ではimage_ref
の値を使っていましたが、ダイジェストが格納されている場合はうまく機能しませんでした。そこで、image_id
というフィールドを追加し、ノード上の一意なイメージ識別子を格納できるようにしました。
- CRI Container message には、
-
- Dynamic Resource Allocation: DRA ドライバは、構造化されたパラメータを使用して、スケジューラがクレームの割り当てを処理できるようになりました。 (#123516, @pohly) [sig/scheduling,sig/storage,sig/node,sig/api-machinery,sig/cluster-lifecycle,sig/auth,sig/apps,sig/cli,sig/instrumentation,sig/testing,sig/release]
-
- KEPはこちらです。これまでの device plugin を使った方法では、デバイスの初期化に使用するパラメータを device plugin に渡す方法が、 pod の annotation に記述する hacky な方法しかありませんでした。この DRA with structured parameters を使う方法を使うことで、DRA driver に構造化されたパラメータを渡すことができるようになります。
- また、ユーザ側だけではなく、ノード側でも ResourceSlice リソースを使って構造化されたパラメータを広報することで、構造化されたパラメータ同士のマッチングを CEL として記述するコントローラを介在させることで、スケジューラに利用したいデバイスを絞り込んでマッチングをとらせることが可能になります。
-
- cgroupv1 なノードで、NodeSwap を LimitedSwap で利用すると Kubelet が失敗する。 (#123738, @kannon92) [sig/node,sig/api-machinery,sig/testing]
-
readOnly
volumes が kernel バージョンが 5.12 以上の場合に再帰的な読み取り専用マウントをサポートするようになりました。(#123180, @AkihiroSuda) [sig/node,sig/api-machinery,sig/apps,sig/testing]-
- これまでは、
/mnt
を readonly としてマウントするとき、/mnt
以下のサブディレクトリである/mnt/usbstorage
が readonly になっている保証はありませんでした。この変更で、/mnt
以下のサブディレクトリも再帰的に readonly になります。
- これまでは、
-
- cri-api: KEP-3857: 再帰的な read-only (RRO) マウントを実装しました。(#123272, @AkihiroSuda) [sig/node]
-
- ↑ の 実装の CRI API 部分です。
-
- kubelet が デフォルトの /var/log/pods ではないカスタムのルートディレクトリを
podLogsDir
kubelet configuration を利用して pod logs に指定できるようになりました。(#112957, @mxpv) [sig/scalability,sig/node,sig/api-machinery,sig/testing] - アルファ機能である
RelaxedEnvironmentValiableValidation
フィーチャーゲートを追加しました。このゲートを有効にすることで、Kubernetes はほぼすべての印刷可能な ASCII 文字を、Pod 内のコンテナの環境変数の名前に使用できるようになります。(#123385, @HirazawaUi) [sig/node,sig/apps,sig/testing] - AppArmor プロファイルを
PodSecurityContext
や containerSecurityContext
フィールドを使って設定できるようになりました。ベータ版の AppArmor アノテーションは非推奨となり、AppArmor ステータスはノードの ready condition に含まれなくなりました。(#123435, @tallclair) [sig/node,sig/api-machinery,sig/auth,sig/apps,sig/testing] - kubelet で log rotation が並行に行われるようになりました。
containerLogMaxWorkers
設定で、並行する rotation の数を設定でき、containerLogMonitorInterval
で監視する間隔を調整できます。 (#114301, @harshanarayana) [sig/node,sig/api-machinery,sig/testing] - kubelet の設定において、
.memorySwap.swapBehavior
フィールドがNoSwap
という値を取れるようになりました。未指定の場合のデフォルトはNoSwap
で、以前利用できたUnlimitedSwap
は削除されました。(#122745, @kannon92) [sig/node,sig/api-machinery,sig/testing] -
ResourceClaims
を使っている Pod と、使っていない Pod を混在させてスケジュールするとき、ResourceClaims
を使っている Pod のスケジュールの遅延が小さくなりました。 (#121876, @pohly) [sig/scheduling,sig/node,sig/api-machinery,sig/testing]
Feature
- cAdvisor を
v0.49.0
に更新しました。(#123599, @bobbypage) [sig/node] - kubelet における
ImageGCMaxAge
の振る舞いを変更して、kubelet が再起動した後にMaxAge
の時間待ってからガベージコレクションを行うようにしました。(#123343, @haircommander) [sig/node,sig/testing] -
NewVolumeManagerReconstruction
機能が GA しました。 (#123442, @jsafrane) [sig/node]-
- これは、Kubelet 起動時に、マウントされたボリューム情報の探索を改善する機能です。コードがかなりリファクタリングされたので、Kubernetes 1.25 ~ 1.29 ではこの機能を無効化することができました。1.30 からは GA となり、この機能を無効化することはできなくなります。
-
- kubectl の
port-forward
を WebSocket (SPDY トンネル) 上で行う機能を、Alpha
フィーチャーゲート環境変数KUBECTL_PORT_FORWARD_WEBSOCKETS=true
を使って有効にできるようにしました。通信先の API Server でもPortForwardWebsockets
というAlpha
フィーチャーゲートが有効になっている必要があります。(#123413, @seans3) [sig/node,sig/api-machinery,sig/cli,sig/testing] - kubelet の新しいメトリクス
image_pull_duration_seconds
が追加されました。このメトリクスは、待機キューでの時間も含めてイメージを pull するのにかかる時間を秒単位で計測します。このメトリクスは、イメージサイズによりバケット化されています。(#121719, @ruiwen-zhao) [sig/node,sig/instrumentation] - Kubelet の新しいメトリクス
lifecycle_handler_sleep_terminated_total
が追加されました。このメトリクスは、LifecycleHandler の sleep が予期せず終了した回数を記録します。 (#122456, @AxeZhan) [sig/node,sig/testing] -
image_garbage_collected_total
メトリクスにreason
フィールドを追加して、管理者がイメージが削除された理由がage
なのかspace
によるものかを区別できるようにしました。 (#123345, @haircommander) [sig/node] - Kubelet の新しいメトリクス
memory_manager_pinning_requests_total
,memory_manager_pinning_errors_total
が追加されました。このメトリクスは、memory manager の割当とpinningを追跡します。 (#121778, @Tal-or) [sig/node,sig/testing] -
volume_manager_selinux_*
メトリクスにaccess_mode
ラベルを追加しました。(#123667, @jsafrane) [sig/storage,sig/node,sig/testing] - Forensic Container Checkpointing (KEP 2008) が Beta に昇格しました。 (#123215, @adrianreber) [sig/node,sig/testing]
-
- Kubernetes Blog による解説記事はこちらです。コンテナの状況を診断目的であとから解析できるようにする機能で、メモリダンプやrootfsの差分など、必要なデータが一通り揃っています。
- コンテナランタイムによるサポートも必要で、CRI-O や containerd がこの機能をサポートしています。Kubernetes の外ではありますが、この checkpoint からコンテナを再開することも可能だそうです。
-
- cloud provider を使用する場合に、
kubelet --node-ip
にデュアルスタックの値を渡すことがサポートされました。この機能は GA となり、CloudDualStackNodeIPs
フィーチャーゲートは常に有効です。(#123134, @danwinship) [sig/node,sig/api-machinery,sig/cloud-provider] -
SELinuxMount
というフィーチャーゲートが Alpha で追加されました。これを有効にすることで、SELinux のリラベリングを高速化できます。(#123157, @jsafrane) [sig/storage,sig/node]-
- この機能は、ReadWriteOncePod では既にサポートされていましたが、今回すべてのアクセスモードでサポートされるようになりました。
- SELinux のリラベリングとは、ファイルのアクセス権などをラベルとして管理する SELinux において、ファイルのラベルを再設定することです。これまではファイルを1つずつ更新する必要がありましたが、この機能ではマウント単位で一括でリラベリングが行えるようになります。
-
- Kubelet は user namespace を作成する際に使用する ID を設定できるようになりました。 (#123593, @giuseppe) [sig/node]
- Node podresources API が、
SidecarContainers
フィーチャーゲートが有効になっていて、containerRestartPolicy
が Always になっているとき(サイドカーコンテナを利用しているとき)、init container を含むようになりました。 (#120718, @gjkim42) [sig/node,sig/testing] -
ImageMaximumGCAge
フィーチャーゲートが Beta に昇格しました。(#123424, @haircommander) [sig/node,sig/testing]-
- この機能は、Image がガベージコレクトされるまでの最大時間を設定するものです。
-
- Pod における
status.hostIPs
フィールドが GA しました。PodHostIPs
フィーチャーゲートは効果がなく、Pod API を通じていつでもstatus.hostIPs
を利用することができます。 (#122870, @wzshiming) [sig/network,sig/node,sig/apps,sig/testing] -
NodeLogQuery
フィーチャーが Beta に昇格しました。Alpha バージョンから機能に変更はありません。(#123205, @aravindhp) [sig/node,sig/windows]-
- この機能は、ノードのログ(たとえば、/var/log 以下のファイルや systemd のログ)を kubelet から取得する機能です。
-
- drop-in kubelet configuration directory 機能が Beta に昇格しました。(#122907, @sohankunkerkar) [sig/node,sig/testing]
- CRI ランタイムが user namespace をサポートしていない場合、
hostUserns=false
で Pod を作成しようとすると、kubelet が Pod の作成を拒否するようになりました。(#123216, @giuseppe) [sig/node]
Documentation
- kubelet の新しい内部メトリクス
kubelet_first_network_pod_start_sli_duration_second
が追加され、開発者がノード起動時のレイテンシ問題の原因を特定できるようになりました。(#121720, @aojea) [sig/network,sig/node,sig/instrumentation]
Failing Test
なし
Bug or Regression
- デフォルトの
EvictionHard
設定にimagefs.inodesfree
を追加しました。(#121834, @vaibhav2107) [sig/node] - Windows ノードにおいて、
PodAndContainerStatsFromCRI
フィーチャーが有効になっているときに、AvailableBytes
が正しく報告されない問題を修正しました。(#122846, @marosset) [sig/node,sig/windows] - ノード再起動後に、
NodePublishVolume
が呼び出されずにマウントポイントがローカルになる問題を修正しました。(#119923, @cvvz) [sig/storage,sig/node] - ファイルがサブパスとして使用されているときに、Pod ボリュームマウントのクリーンアップが修正されました。(#123052, @jsafrane) [sig/node]
-
EventedPLEG
フィーチャー(ベータだが、デフォルト無効)が、既知の問題により Alpha に戻されました。(#122697, @pacoxu) [sig/node]-
- https://github.com/kubernetes/kubernetes/issues/121349 で、static pod 絡みの CI falling が発生し、解析の結果 EventedPLEG 機能が原因であることが判明したようです。
-
- DRA: ResourceClaim と PodSchedulingContext の status の更新により、object の metadata が更新されてしまうバグが修正されました。(#123730, @pohly) [sig/node]
-
- 新しい status の更新時に、前の object により metadata を上書きしないといけなかったのですが、それが漏れてしまっていて、metadata を RBAC 回避しつつ更新できてしまったようです。
-
- ノード再起動時に raw block volumes を使用している Pod を削除できるようになりました。(#122211, @gnufied) [sig/storage,sig/node]
-
- ノードが再起動などでしばらくダウンしていて、pod が evict された場合に、raw block volume を使っていると pod が terminating で stuck してしまっていたようです。
-
- init container を containerRestartPolicy
Always
で利用しているとき(サイドカーコンテナを利用しているとき)、restartPolicyNever
かOnFailure
で利用している Pod に対して、init container の state が terminated から non-terminated に更新できないバグを修正しました。(#123323, @gjkim42) [sig/node,sig/apps]-
- これまでは、pod の restartPolicy が尊重されずに、init container の state が terminated から non-terminated に更新されてしまっていたようです。
-
- DRA において、実際の問題はないが data race が発生する可能性がある問題を修正しました。(#123222, @pohly) [sig/node]
- node expansion を必要としないボリュームを拡張しようとするとエラーが発生する問題を修正しました。(#123055, @gnufied) [sig/storage,sig/node]
- Windows ノードにおいて、トータルの CPU 使用率が正しく計算されない問題を修正しました。(#122999, @marosset) [sig/node,sig/windows]
- node lifecycle controller が conditionType ready を 誤って
nil
でパッチすると panic する問題を修正しました。(#122874, @fusida) [sig/network,sig/node,sig/apps] - kubelet 起動時の
EventedPLEG
の panic が修正されました。(#122475, @pacoxu) [sig/node] -
InPlacePodVerticalScaling
が有効なときに、quota 計算エラーによりリソース削除が失敗する問題を修正しました。(#122701, @carlory) [sig/node,sig/api-machinery,sig/testing] - google.golang.org/protobuf が
CVE-2024-24786
を修正するためにv1.33.0
に更新されました。(#123758, @liggitt) [sig/network,sig/storage,sig/node,sig/api-machinery,sig/cluster-lifecycle,sig/auth,sig/cli,sig/instrumentation,sig/architecture,sig/cloud-provider]
Other (Cleanup or Flake)
-
ConsistentHTTPGetHandlers
フィーチャーゲートが有効にロックされました。(#122578, @carlory) [sig/node] - GAした
KubeletPodResourcesGetAllocatable
フィーチャーゲートが削除されました。 (#122138, @ii2day) [sig/node] - GAした
KubeletPodResources
フィーチャーゲートが削除されました。 (#122139, @bzsuni) [sig/node] - GAした
ExperimentalHostUserNamespaceDefaultingGate
フィーチャーゲートが削除されました。 (#122088, @bzsuni) [sig/node] - cni-plugins が
v1.4.0
に更新されました。 (#122178, @saschagrunert) [sig/node,sig/testing,sig/cloud-provider]