本記事は、Kubernetes 変更内容共有会(v1.36) の SIG-Node(kubelet)に関する資料として準備されました。
Kubernetes 1.36の CHANGELOG から、SIG-Nodeに関するところを抜粋して紹介します。
は筆者(@y1r96)による補足です。
所感
今回の Kubernetes 1.36 の SIG-Node (kubelet) の変更内容で、印象に残ったいくつかの機能を紹介します。
GA / Stable: KubeletPSI
PSI (Pressure Stall Information) は、CPU・メモリ・IO のリソース圧迫の度合いを表す Linux カーネルの機能です。
PSI は CPU・メモリ・IO のそれぞれについて、 タスクがそのリソース待ちで停止していた時間の割合を avg10 / avg60 / avg300 として報告します。
これに加えて累積の停止時間が total (μs) として報告され、 サンプリング間隔に依存しない長期的な競合の累積量を確認できます。
1 つ以上のタスクが停止していた割合 (some) と、 非 idle タスクがすべて同時に停止していた割合 (full) の 2 タイプがあり、後者ほど深刻な競合を示します。
https://kubernetes.io/docs/reference/instrumentation/understand-psi-metrics/ にわかりやすい PSI の説明があります。
KubeletPSI は、kubelet が Node の PSI メトリクスを収集して Kubernetes API や メトリクス経由で提供する機能です。
NodeDeclaredFeatures とそれを利用する機能群
1.35 で alpha 導入された NodeDeclaredFeatures が beta に昇格しました。
この機能は、kubelet が 有効になっている feature gate や コンテナランタイムの情報などのノードの情報を、Node.Status.DeclaredFeatures に書き出すという機能です。
このプロパティを読むことで、scheduler、API server、admission plugin などが挙動を分岐することができます。
1.36 ではこの仕組みを利用する機能が複数追加されています:
-
ExtendWebSocketsToKubelet(beta、デフォルト有効):- API server が WebSocket の
exec/attach/portforwardを変換せず、 kubelet に直接プロキシするようになりました。 kubelet が対応を広告した場合のみ直接プロキシされます。
- API server が WebSocket の
-
UserNamespacesHostNetwork(alpha):- hostNetwork Pod での user namespace 利用について、 コンテナランタイムの対応状況を広告し、対応 Node にのみその Pod がスケジュールできるようにする仕組みです。
Alpha: Pod Level Resource Managers
Topology Manager / CPU Manager / Memory Manager は kubelet のリソース管理コンポーネントで、 Guaranteed Pod に対して以下のような制御を行います:
- CPU Manager (
staticpolicy): Pod に対して CPU コアを排他的に割り当て - Memory Manager: NUMA トポロジを考慮したメモリ確保
- Topology Manager: CPU / メモリ / デバイスを同じ NUMA ドメインに揃える
これまでこれらのマネージャは コンテナ単位のリソース要求 (container.resources) しか認識しておらず、 1.32 alpha で導入された Pod-level resources (pod.spec.resources) は対応範囲外でした。
1.36 では PodLevelResourceManagers feature gate を有効化することで pod.spec.resources も認識するようになります。
kubelet の topology-manager-scope で 2 つのモードを選択できます:
-
containerscope- 従来の振る舞い。コンテナごとに resource manager が動作します。
-
podscope- 新規の振る舞い。Topology Manager が pod と container 両方のリソースを基に全体で 1 つの NUMA aligned なリソースプールを確保します。
Alpha: MemoryQoS / MemoryReservationPolicy
MemoryQoS は cgroup v2 の memory.min / memory.low を活用して Pod / コンテナのメモリを OS のメモリ回収から保護する機能です。
feature gate は MemoryQoS です。
1.35 以前は MemoryQoS feature gate を有効化すると一律で memory.min が設定されていましたが、1.36 では KubeletConfiguration の memoryReservationPolicy でこの挙動をカスタマイズできるようになりました:
-
None(デフォルト):memory.minによる保護を行いません。 -
TieredReservation: Guaranteed Pod にはmemory.min、 Burstable Pod にはmemory.lowを設定します。-
memory.min: cgroup の利用メモリがmemory.min以下のとき、 そのメモリは原則回収されません。回収対象が他に存在しなくなった場合は OOM Killer が起動します。 -
memory.low: cgroup の利用メモリがmemory.low以下のとき、memory.lowを持たない他の cgroup に回収できるメモリがある限りは回収されません。
-
Beta: PLEGOnDemandRelist
kubelet の PLEG (Pod Lifecycle Event Generator) は CRI から定期的に Pod / コンテナの状態を取得しています。 これまでは kubelet が SyncPod で CRI を同期呼び出ししたあとも、 次の定期 relist (2 秒間隔) を待たないとその Pod の状態変化が PLEG に反映されない、 という待ち時間がありました。
1.36 では、 同期 CRI 呼び出しの完了直後に対象 Pod だけを即座に relist する最適化が入りました。 これにより Pod 作成 / resize のレイテンシが改善され、 PR では resize で約 10 倍の改善が報告されています。
リリースサイクル後半にテストで flake を引き起こしたため一度デフォルト無効化されましたが、 flake の原因は kubelet の挙動ではなく runc 側の限定的な挙動でユーザに悪影響がないと判明したため、テスト側で許容するように修正のうえ #137946 で revert され、 v1.36.0 リリース時点では beta で デフォルト有効 に戻っています。
Dynamic Resource Allocation (DRA) 関連の更新まとめ
DRA (Dynamic Resource Allocation) は、これまでの device plugin よりも柔軟にデバイスを管理できる仕組みとして継続的に開発が行われています。
- GA に昇格:
- Beta に昇格:
- DRA Device Binding Conditions (KEP-5007): スケジュール後にデバイスのバインド完了を待ってから Pod 起動を進める。デフォルト有効 (#137795)
- DRA Device Taints and Tolerations (KEP-5055): デバイスへの taint / toleration。 ResourceSlice 内の taint はデフォルト有効、
DeviceTaintRulesは別 feature gate (#137170) - DRA Extended Resource: 既存の extended resource (
resources.requests) 経由で DRA デバイスを要求 (#135048) -
DRAPartitionableDevices: 1 物理デバイスを複数論理デバイスに分割 (NVIDIA MIG など) (#137350) -
DRAResourceClaimGranularStatusAuthorization: driver / scheduler が ResourceClaim ステータスを更新する際の粒度の細かい RBAC (#134947)
- デフォルト有効化:
-
DRAConsumableCapacity: 1 デバイスの容量を分割して複数 Pod / claim から共有 (#136611)
-
- Alpha 追加:
-
DRAListTypeAttributes(KEP-5491): ResourceSlice の属性に list 型サポート。複数 PCIe root / NUMA をまたぐデバイスのトポロジ表現に有用 (#137190) - DRA driver discoverable metadata (KEP-5304): driver がデバイス属性を Pod の CDI マウント経由で公開し、コンテナから読み取り可能に (#137086)
-
DRAResourcePoolStatus(KEP-5677): プール内の利用可能デバイス数を問い合わせるResourcePoolStatusRequestAPI (#137028) -
DRANodeAllocatableResources: DRA デバイスが消費する CPU / メモリを Node のallocatableに反映 (#136725) - DRA PodGroup
spec.resourceClaims(KEP-5729): PodGroup 単位で ResourceClaim を予約し、 256 件の reserved-for 制限を回避 (#136989)
-
以下は Kubernetes 1.36 の CHANGELOG の和訳です。
Urgent Upgrade Notes
(No, really, you MUST read this before you upgrade)
SIG-Node 関連の項目はなし。
Changes by Kind
Dependency
- Pod 終了時に Pod のライフサイクルフックがタイムアウト時間いっぱい実行され得る不具合を修正した。 (#136598、@dgrisonnet) [sig/api-machinery,sig/auth,sig/cloud-provider,sig/node,sig/scheduling]
Deprecation
SIG-Node 関連の項目はなし。
API Change
- 必須対応事項:
DRAResourceClaimGranularStatusAuthorizationfeature gate(1.36 で beta)が有効化されているとき、DRA(Dynamic Resource Allocation)の driver および controller は ResourceClaim のステータス更新に粒度の細かい RBAC 権限を要求するようになった。スケジューラとコントローラはresourceclaims/bindingに対するupdate/patchを許可される必要がある。DRA driver はresourceclaims/driverに対してassociated-node:updateまたはarbitrary-node:update(あるいは対応する patch 権限)を、resourceNamesで driver 固有の名前に制限したうえで付与される必要がある。(#134947、@aojea) [sig/api-machinery,sig/apps,sig/auth,sig/instrumentation,sig/node,sig/scheduling,sig/testing]-
ResourceClaim のステータス更新は driver と scheduler/controller の両方が行うため、それぞれに最小権限を付与する仕組みが整備されました。 associated-nodeは driver が自分の動作しているノード上の claim のみ更新できる、arbitrary-nodeは任意のノード上の claim を更新できるという違いがあります。
-
- コンテナステータスにイメージボリュームのダイジェストを含める
ImageVolumeWithDigestを追加した。 (#132807、@iholder101) [sig/api-machinery,sig/apps,sig/node,sig/testing]-
イメージのダイジェスト(コンテンツアドレス)を ContainerStatus.VolumeMounts[*].VolumeStatus.Image.ImageRefから参照できるようになりました。これにより、コンテナでマウントされたイメージボリュームのバージョンを正確に追跡できます。
-
- KubeletConfiguration に cgroup v2 の MemoryQoS 向けの
MemoryReservationPolicyを追加した。memory.minによる保護をサポートする。 (#137584、@QiWang19) [sig/node,sig/storage]-
KEP-2570 MemoryQoS のメモリ保護の挙動を KubeletConfiguration から設定できるようになりました。指定可能な値は次の 2 つです。
-
None(デフォルト): kubelet はmemory.minによる保護を行いません。 -
TieredReservation: Guaranteed Pod にはmemory.min、 Burstable Pod にはmemory.lowを設定し、 OS のメモリ回収から保護します。
-
-
- DRA で属性に list 型のサポートを追加した(KEP-5491)。
DRAListTypeAttributesfeature gate(デフォルト無効)を有効化することで以下の機能が利用できる。- DRA driver は ResourceSlice 内のデバイス属性に list 型のフィールド(
bools/ints/strings/versions)を利用できる。1 つのデバイスあたりの属性値の数は、スカラと list 値を合わせて 48 に制限される。 - ResourceClaim の
matchAttribute/distinctAttribute制約は、スカラと list 属性の両方で動作する。matchAttribute制約は候補のデバイス間で list 値の共通集合が空でないときマッチする。distinctAttribute制約(ConsumableCapacityfeature gate により保護)は候補のデバイス間で list 値が両者で互いに素であるときマッチする。スカラ値は暗黙的にシングルトン集合として扱われる。 - スカラ属性および list 属性に対して包含関係を確認するための CEL 関数
.includesを追加した(例:device.attributes["dra.example.com"].model.includes("model-a"))。DRA driver が属性の値の型をスカラから list に、もしくはその逆に変更した場合の移行をサポートする。 - (#137190、@everpeace) [sig/api-machinery,sig/node,sig/scheduling,sig/testing]
-
1 つのデバイスが複数の集合に属する場合(例: 複数の PCIe root や NUMA ノードに接続している CPU など)、スカラ値しか持てない属性ではトポロジを表現できませんでした。 list 属性のサポートにより、「同じ PCIe root につながった CPU・GPU・NIC をまとめて要求する」といったトポロジを揃えた割り当てができるようになります。
- DRA driver は ResourceSlice 内のデバイス属性に list 型のフィールド(
- kubelet プラグインフレームワークにおいて、DRA driver が Pod の CDI マウントに DRA デバイスのメタデータを発行できるよう alpha のオプトインサポートを追加した。 (#137086、@alaypatel07) [sig/apps,sig/network,sig/node,sig/testing]
-
KEP-5304 の機能です。 Pod 内のコンテナがデバイス属性(PCIe バスアドレスや mediated device UUID など)を読みたい場合、これまでは Kubernetes API を使って ResourceClaim / ResourceSlice を取得する必要がありましたが、 この機能を用いることで CDI 経由でマウントされた JSON ファイルから読めるようになります。
-
- DRA のリソースプールの可用性を問い合わせるための
ResourcePoolStatusRequestAPI(v1alpha1)を追加した。外部のスケジューラは、ワークロードを投入する前にプール全体で利用可能なデバイスを確認できる。DRAResourcePoolStatusfeature gate(alpha)が必要。 (#137028、@nmn3m) [sig/api-machinery,sig/apps,sig/auth,sig/etcd,sig/instrumentation,sig/node,sig/scheduling,sig/storage,sig/testing]-
KEP-5677 DRA Resource Availability Visibility の機能です。これまで ResourceSlice (容量) と ResourceClaim (消費) は別々に管理されており、「いまどれだけのデバイスが空いているか」をユーザが直接確認する方法がありませんでした。 ResourcePoolStatusRequestを作成すると、 kube-controller-manager 上のコントローラが driver / pool 単位でデバイスの total / allocated / available 数を計算し、その request のstatusに書き込みます。
-
-
kube-controller-managerに--concurrent-resourceclaim-syncsフラグを追加し、ResourceClaimの reconcile の並列度を設定できるようにした。 (#134701、@anson627) [sig/api-machinery,sig/apps,sig/node,sig/testing] - alpha の
DRANodeAllocatableResources機能を追加した。新しいResourceSlice.Spec.Devices[*].NodeAllocatableResourceMappingsフィールドが導入され、DRA driver はデバイスリソースが Node の allocatable リソース(cpu や memory など)にどのようにマップされるかを宣言できる。 (#136725、@pravk03) [sig/api-machinery,sig/apps,sig/node,sig/scheduling,sig/testing]-
DRA で扱うデバイスが CPU やメモリを消費する場合に、それを Node の allocatableに反映できるようになります。これにより、デバイスを要求する Pod がスケジュールされた際に Node 上のリソースが正しく考慮されます。
-
-
imageMinimumGCAgeに対して負の値を許可しないバリデーションを追加した。 (#135997、@ngopalak-redhat) [sig/api-machinery,sig/node] -
cpuCFSQuotaPeriodkubelet config フィールドに対して非デフォルト値を使うにはCustomCPUCFSQuotaPeriodfeature gate が必要であることを明確化するため、ドキュメントとコメントを修正した。挙動の変更はない。 (#133845、@rbiamru) [sig/node,sig/release] - DRA
DeviceTaintRules: taint のTimeAddedフィールドは effect の変更時にも自動的に更新されるようになった。 (#137167、@pohly) [sig/api-machinery,sig/node,sig/testing] - DRA: PodGroup リソースが ResourceClaim や ResourceClaimTemplate を参照するための
spec.resourceClaimsフィールドを追加した。 PodGroup によって行われた claim は、個々の Pod ではなく PodGroup 全体のために予約され、256 個以上の Pod で 1 つの ResourceClaim を共有できるようになる。PodGroup の claim から参照される ResourceClaimTemplate は、その PodGroup 専用の ResourceClaim としてレプリケートされ、グループ内のすべての Pod で共有される。 (#136989、@nojnhuh) [sig/api-machinery,sig/apps,sig/auth,sig/cli,sig/cloud-provider,sig/etcd,sig/node,sig/scheduling,sig/testing]-
ResourceClaim の reserved-for リストは 256 件までという制限があり、これまでは PodGroup 内の Pod 数が増えると claim を共有できませんでした。 PodGroup 単位で予約することでこの制限を回避できます。
-
- DRA: Device Binding Conditions(KEP #5007)を beta に昇格させ、
v1.36でデフォルト有効化した。 (#137795、@ttsuuubasa) [sig/api-machinery,sig/node,sig/scheduling,sig/testing]-
Device Binding Conditions は、ファブリックを跨いで動的にアタッチされるデバイス(ネットワーク経由のアクセラレータなど)について、スケジュール後にバインドが完了するのを待ってから Pod 起動を進めるための機能です。
-
- DRA: device taint と toleration(KEP #5055)を beta に昇格させた。 ResourceSlice 内の DeviceTaints のサポートはデフォルトで有効。
DeviceTaintRulesのサポートはresource.k8s.io/v1beta2およびDeviceTaintRulesfeature gate を有効化するかどうかに依存する。 (#137170、@pohly) [sig/api-machinery,sig/apps,sig/auth,sig/cluster-lifecycle,sig/etcd,sig/node,sig/scheduling,sig/testing]-
1.35 で alpha 導入された機能が beta に昇格しました。 DeviceTaintRule(管理者が selector でデバイスに taint を付ける)は別の feature gate になっており、 driver による taint(ResourceSlice 内)と分けて管理できます。
-
- Pod の resize リクエストが Node の allocatable を超過するか、resize をサポートしない OS 上で実行された場合、
PodStatusで後からInfeasibleとマークされるのではなく、admission の時点で失敗するようになった。 (#136043、@natasha41575) [sig/api-machinery,sig/node,sig/release,sig/scheduling,sig/storage,sig/testing]-
これまでは Pod の resize リクエストはとりあえず受け付けて、後で kubelet が Infeasible状態に遷移させていました。 1.36 からは admission 時点で明確に拒否されるため、エラーがユーザに即時にフィードバックされます。
-
-
ImageVolume機能を stable に昇格させた。 (#136711、@saschagrunert) [sig/apps,sig/architecture,sig/node,sig/testing]-
OCI イメージを Pod のボリュームとして直接マウントできる機能です。 1.31 で alpha、 1.33 で beta、 1.35 でデフォルト有効、 1.36 で stable に昇格しました。
-
-
InPlacePodLevelResourcesVerticalScalingfeature gate を beta に昇格させ、デフォルトで有効化した。Pod-level でリソースを設定した Pod の CPU・メモリリソースを再作成なしで変更できるようになった。 (#137684、@ndixita) [sig/api-machinery,sig/apps,sig/autoscaling,sig/node,sig/release,sig/scheduling,sig/testing]-
1.35 で alpha だった機能です。 Pod レベル(pod.spec.resources)のリソース指定について、コンテナレベルと同様に in-place なリサイズができるようになります。
-
-
UserNamespacesSupportfeature gate を GA に昇格させた。 (#136792、@rata) [sig/api-machinery,sig/apps,sig/cli,sig/node,sig/storage,sig/testing]-
Pod の spec.hostUsers: falseでユーザネームスペースを利用できる機能です。 KEP-127 の GA となります。 ContainerRuntime のサポートが必要です(containerd は 2.0 以降、 CRI-O は 1.25 以降)。
-
- Kubelet: MemoryQoS 向けに cgroup v2 のメモリ保護を階層化した。 Guaranteed Pod に
memory.min、Burstable Pod にmemory.lowを設定し、Node レベルのメトリクスとロールバック reconcile を追加した(KEP-2570)。 (#137719、@sohankunkerkar) [sig/node,sig/storage,sig/testing]-
上述の MemoryReservationPolicy設定(KubeletConfiguration)にTieredReservationを指定したときに有効になる挙動の実装です。 Guaranteed Pod のメモリがmemory.minで保護され、 OS のメモリ回収から守られます。 Burstable Pod はmemory.lowでソフトな保護を受けます。
-
-
DRAPrioritizedListを GA に昇格させた。 (#136924、@troychiu) [sig/apps,sig/architecture,sig/autoscaling,sig/cli,sig/cloud-provider,sig/cluster-lifecycle,sig/network,sig/node,sig/release,sig/scheduling,sig/storage,sig/testing]-
ResourceClaim 内で「複数のデバイス選択肢に優先順位を付ける」機能です。最初の選択肢が割り当てられなければ次を試す、というフォールバックを書けます。
-
-
NodeDeclaredFeaturesを beta に昇格させた。 (#136042、@pravk03) [sig/api-machinery,sig/apps,sig/cluster-lifecycle,sig/instrumentation,sig/node,sig/scheduling,sig/storage,sig/testing]-
1.35 で alpha 導入された機能です。 kubelet で有効な feature gate を Node.Status.DeclaredFeaturesに書き出し、スケジューラやアドミッションプラグインから参照できるようにします。
-
- DRA extended resource 機能を
v1.36で beta に昇格させた。 (#135048、@yliaog) [sig/api-machinery,sig/architecture,sig/auth,sig/network,sig/node,sig/scheduling,sig/testing]-
既存の extended resource(pod.spec.containers[*].resources.requests)を DRA driver から提供するための仕組みです。既存の Pod 定義からそのまま DRA でデバイスを要求できます。
-
-
DRAAdminAccessfeature gate を GA に昇格させた。 (#137373、@ritazh) [sig/api-machinery,sig/auth,sig/node,sig/scheduling,sig/testing]-
ResourceClaim の adminAccess: trueでデバイスへの管理者アクセス(read-only な共有アクセスなど)を許可する機能です。
-
-
NodeLogQueryfeature gate を GA に昇格させた。 (#137544、@jrvaldes) [sig/node,sig/windows]-
kubelet API 経由で Node 上の systemd/journal ログを取得できる機能です。 kubectl get --raw "/api/v1/nodes/<node>/proxy/logs/?query=<service>"のように使います。
-
-
ProcMountType機能を GA に昇格させた。 (#137454、@haircommander) [sig/api-machinery,sig/apps,sig/auth,sig/cli,sig/node,sig/storage,sig/testing]-
securityContext.procMount: Unmaskedを許可することで、 user namespace を利用している Pod で/procのマスクを外すことができるようになる機能です。ネストされたコンテナを動かすときなどに必要です。
-
-
DRAConsumableCapacityfeature gate をデフォルトで有効化した。 (#136611、@sunya-ch) [sig/api-machinery,sig/cluster-lifecycle,sig/node,sig/scheduling,sig/testing]-
1 つの DRA デバイスを「容量を分割」して複数の Pod から共有できる機能です。 1.36 でデフォルト有効化されました。
-
Feature
-
kubelet_metrics_providerメトリクスを追加した。 kubelet のメトリクスがどこから来ているかを識別できるようにする。 (#136952、@dgrisonnet) [sig/node]-
kubelet が出力するコンテナのメトリクスは、 kubelet 内部、 cAdvisor、 CRI runtime など複数の供給元から提供されるため、運用時にトラブルシュートしやすくすることを目的としています。
-
- Node 上で動作する Pod に関する情報を提供する gRPC サービスを kubelet に追加した。 (#134627、@briansonnenberg) [sig/node,sig/testing]
-
KEP-4188 の機能で、 Node の管理ユーザ向けに Unix socket 経由で Pod 情報を提供する gRPC API です。 想定利用者は CNI plugin (Pod の Readiness を見てネットワーク設定を切り替える) や Node 上の監視ツールなどで、 kube-apiserver を経由せずに Pod 情報を取得できるようにする狙いがあります。
-
- 新しい RuntimeService ストリーミング RPC(
StreamPodSandboxes、StreamContainers、StreamContainerStats、StreamPodSandboxStats、StreamPodSandboxMetrics)および新しい ImageService ストリーミング RPC(StreamImages)を追加した。 (#136987、@bitoku) [sig/cluster-lifecycle,sig/node,sig/testing]-
KEP-5825 CRI List Streaming の機能です。 CRI のリスト系 RPC は、 Node 上の Pod/コンテナ数が増えるとレスポンスが gRPC のメッセージサイズ上限 (16 MB) を超えて RPC 全体が失敗していました。ストリーミング版を追加することで、このサイズ上限を回避します。
-
- 起動中の non-sidecar initContainer に対する in-place Pod resize をサポートした。 (#137352、@natasha41575) [sig/api-machinery,sig/apps,sig/autoscaling,sig/node,sig/scheduling,sig/storage,sig/testing]
- CRI(および NRI)が Pod レベルの resize をブロックできるようにした。 (#137555、@natasha41575) [sig/node]
-
ResourceClaimのstatus.reservedForで、未知の(Pod 以外の)参照をサポートするようにした。コントローラはこれらのエントリで sync を停止するのではなく、優雅にスキップする。これにより stale な Pod 参照は引き続きクリーンアップされる。 (#136450、@MohammedSaalif) [sig/apps,sig/node] -
ExtendWebSocketsToKubeletfeature gate を追加した(beta、v1.36でデフォルト true)。有効化すると、API server は WebSocket のexec/attach/portforwardリクエストを API server で変換やトンネリングするのではなく、kubelet に直接プロキシする。 kubelet は WebSocket から SPDY へのストリーム変換(exec/attach)と WebSocket トンネリング(portforward)を、以前 API server で利用されていたのと同じハンドラで処理する。 kubelet はNodeDeclaredFeaturesメカニズム経由で API server に対してこの機能のサポートを広告し、 API server はサポートを広告した kubelet に対してのみ直接プロキシする。ルーティングの決定と WebSocket ストリーミング量を追跡するために 2 つの新しい alpha メトリクスが追加された:apiserver_websocket_streaming_requests_total(label: subresource, proxy_type)とkubelet_streaming_websocket_requests_total(label: subresource)。 (#136256、@seans3) [sig/api-machinery,sig/autoscaling,sig/node,sig/scheduling,sig/testing]-
kubectl execやkubectl port-forwardは WebSocket でも通信できるようになりつつありますが、これまでは API server が WebSocket↔SPDY 変換を行っていました。 1.36 からは API server を素通しで kubelet が直接 WebSocket を処理します。NodeDeclaredFeaturesでサポートが宣言されている kubelet にのみ直接プロキシする仕組みになっている点もポイントです。
-
-
UserNamespacesHostNetworkruntime handler を追加し、UserNamespacesHostNetworkSupportfeature gate をNodeDeclaredFeaturesfeature gate と統合した。UserNamespacesHostNetworkSupportfeature gate は、コンテナランタイムのUserNamespacesHostNetworkruntime handler が true を返し、NodeDeclaredFeaturesfeature gate が有効化されているときにのみ有効となる。 (#135828、@HirazawaUi) [sig/autoscaling,sig/node,sig/scheduling,sig/testing]-
1.35 で導入された hostNetwork Pod でも user namespace を利用できる機能について、 ContainerRuntime が対応しているかを NodeDeclaredFeaturesで広告できるようになり、対応 Node にのみスケジュールするといった制御ができるようになりました。
-
- 失敗または成功したコンテナ数を exit code ごとに追跡するメトリクス
terminated_containers_totalを追加した。 (#137453、@rawsocket) [sig/instrumentation,sig/node,sig/testing] - CRI API:
PullImageResponseメッセージにimage_idフィールドを追加した。コンテナランタイムが返す Node 上のイメージの一意な識別子として機能する。 (#137217、@stlaz) [sig/node]-
ただし下記の通り #137574 で revert されているため、 1.36 リリース時点ではこのフィールドは存在しません。
-
- DRA ResourceSlice コントローラ: optional な
ReconcilePoolWithNameを追加した。 slice にNodeNameを設定しないプール単位の reconcile を可能にすることで、スケジューラは Node が保有するクラスタ全体に見えるリソース(ネットワーク共有のデバイスなど)に対してNodeSelectorやallNodesを利用できる。「All nodes」はもはやデフォルトではなく、クラスタ全体のデバイスを publish する場合は明示的に設定する必要がある。 (#137365、@yaroslavborbat) [sig/node,sig/testing] - feature gate が有効化されたとき、
kubeletで Prometheus native histogram をサポートするようにした。 ヒストグラムはクラシック形式とネイティブ形式の両方で公開され、 exponential bucket 設定(factor=1.1、max buckets=160)を利用する。 (#137780、@richabanker) [sig/node] - Topology Manager、CPU Manager、Memory Manager が
pod.spec.resourcesを認識して動作するようにした。これにより 2 つの柔軟なリソース管理モデルが有効になる。どちらのモデルも Guaranteed Pod について、排他的なリソース割り当てを受けるコンテナと Pod 共有リソースプールに属するコンテナの混在をサポートする。 (#134768、@KevinTMtz) [sig/node,sig/testing]-
これまで Topology/CPU/Memory Manager は container レベルのリソース指定しか認識できませんでした。 1.36 からは Pod レベルのリソース指定(pod.spec.resources)も認識します。 Pod 内のすべてのコンテナで共有される CPU/メモリのプールを Pod レベルで確保しつつ、特定のコンテナにのみ専有の CPU を割り当てるといった構成が可能になります。
-
- 単一コンテナの Pod が
RestartAllContainersアクションで素早く再起動できるようにした。 (#136966、@yuanwang04) [sig/node,sig/testing] - DRA API
v1beta1の手書きの変換コードで、フィールドの変換漏れ(BindsToNode、BindingConditions、BindingFailureConditions、AllowMultipleAllocations、Capacity)を修正した。 (#137240、@yykkibbb) [sig/node] - きめ細かい kubelet API authorization を stable に昇格させた。 (#136116、@vinayakankugoyal) [sig/node]
-
KEP-2862 の機能です。 kubelet API のサブリソース(exec/log/statsなど)ごとに RBAC で権限を制御できます。
-
-
KubeletPSI機能を GA に昇格させ、デフォルトで有効化した。 kubelet は Linux cgroup の Pressure Stall Information(PSI)メトリクスを公開し、 kubelet Summary API 経由でシステムレベルおよび Pod レベルのリソース競合(CPU、メモリ、I/O)の可視性を提供する。 (#136548、@mariafromano-25) [sig/node]-
PSI は Linux カーネル 4.20+ で提供されるリソース競合の指標です。 CPU/Memory/IO それぞれについて「ある程度の時間で何 % の時間 stalled していたか」を計測します。 Pod に与えるリソースが十分かどうかの判断材料になり、 in-place pod resize やオートスケーラと組み合わせると効果的です。
-
- ResourceSlice コントローラでインデックスベースの命名を導入し、 ResourceSlice とプールがアロケーションの前に辞書順でソートされるようにした。これによりユーザはアロケーションの優先順位を制御できる。 (#136641、@troychiu) [sig/node,sig/testing]
- Kubelet: 非推奨の kubelet 設定フラグ(および関連するフォールバック動作)の削除を、 containerd v1.7 のサポート終了に合わせて、 v1.36 から v1.37 に延期した。 (#136846、@carlory) [sig/node,sig/testing]
- Kubelet: kubelet 実行中に
--client-ca-fileが更新された場合、更新されたルート証明書が kubelet エンドポイントに接続する TLS クライアントに対して、受け入れる認証局として正しく広告される。この動作はReloadKubeletClientCAFilefeature gate により保護されており、デフォルトで有効化されている。 (#136762、@HarshalNeelkamal) [sig/api-machinery,sig/auth,sig/node,sig/testing] -
RestartAllContainers機能により再起動されたコンテナについて、再起動前のログを保持するようにした。 (#136963、@yuanwang04) [sig/node] -
DRAPartitionableDevicesを beta に昇格させた。 (#137350、@mortent) [sig/node,sig/scheduling,sig/testing]-
1 つの物理デバイスを複数の論理デバイスに分割して扱えるようにする機能です(例: NVIDIA の MIG)。
-
-
KubeletPodResourcesDynamicResourcesおよびKubeletPodResourcesGetfeature gate を GA に昇格させた。 (#136728、@guptaNswati) [sig/node,sig/testing]-
PodResources API を介して DRA リソースの割り当て状況を取得できる機能、および特定の Pod に絞って PodResources を取得する Get エンドポイントです。
-
-
RestartAllContainersOnContainerExitsfeature gate を beta に昇格させ、デフォルトで有効化した。 (#136681、@yuanwang04) [sig/node,sig/testing]-
1.35 で alpha 導入された機能です。 RestartPolicyRuleでRestartAllContainersアクションを指定すると、あるコンテナの終了時に Pod 内の全コンテナがまとめて再起動されます。
-
- CRI API
PullImageResponseメッセージへのimage_idフィールドの追加を revert した。 (#137574、@SergeyKanzhelev) [sig/node] - vendor 依存関係を cAdvisor
v0.55.0に更新した。 (#135829、@dims) [sig/node] - Node の performance e2e テストを TensorFlow から PyTorch Wide-Deep ワークロードに変更した。 (#136398、@dims) [sig/node,sig/testing]
Documentation
なし(SIG-Node 関連の項目はなし)。
Failing Test
- Kubelet: kubelet 再起動後の device plugin テストの失敗を修正した。 (#135485、@saschagrunert) [sig/node,sig/testing]
-
PLEGOnDemandRelistfeature flag を beta レベルに保持しつつ、デフォルトで無効化に切り替えた。 (#137909、@dims) [sig/node]-
同期 CRI 呼び出しのあと、 次の定期 relist (2 秒間隔) を待たずに該当 Pod を即座に relist する最適化機能です (詳細は後述の Bug or Regression 節を参照)。 この PR は一時的にデフォルト無効化したものですが、 #137946 で revert され、 v1.36.0 リリース時点ではデフォルト有効に戻っています。
-
Bug or Regression
- CRI runtime が返す runtime handlers のリストをソート済みにするよう変更した。順序の変更による不要な Node オブジェクト更新を防ぐ。 (#135358、@harche) [sig/node]
- DRA BindingConditions:
DRABindingConditionsfeature が有効で、異なる Pod 間で同じ claim が再利用されているときに、deallocation が並行して行われるとスケジューラで発生する panic を修正した。 (#137371、@pohly) [sig/node,sig/scheduling,sig/testing] - non-sidecar initContainer に対する resize の restart policy として
RestartContainerを設定することを許可しないよう変更した。これらのコンテナの resize はそもそもサポートされていない。 (#137458、@natasha41575) [sig/apps,sig/node,sig/testing] - QoS cgroup の計算された requests が 0 のとき、
memory.min=0を明示的に書き込むようにした。 (#137637、@QiWang19) [sig/node] -
DRAConsumableCapacityが有効化されているときに、DRA managerがキャッシュからsharedIDを初期化していなかった問題を修正した。 (#136734、@sunya-ch) [sig/node,sig/scheduling] -
/metrics/resourceエンドポイントのcontainer_swap_usage_bytesが常に 0 を返すのではなく、コンテナレベルの swap 使用量を正しくレポートするよう修正した。 cAdvisor からコンテナ統計オブジェクトに swap 統計を伝播するロジックがaddCadvisorContainerCPUAndMemoryStatsに欠落していたのが根本原因。 (#137098、@yuanwang04) [sig/apps,sig/node,sig/testing] -
event_handling_duration_seconds、preemption_goroutines_duration_seconds、run_podsandbox_duration_seconds、store_schedule_results_duration_secondsメトリクスが、実際の所要時間ではなく 0 に近いレイテンシ値を記録していた問題を修正した。 defer 呼び出しの中でSinceInSeconds(startTime)が早期評価されていたのが原因。 (#135749、@novahe) [sig/architecture,sig/instrumentation,sig/node,sig/scheduling] -
dra_operations_duration_secondsメトリクスにおいて、is_errorラベルが反転した値を記録していたバグを修正した。エラー操作は正しくis_error=trueを、成功操作はis_error=falseを返すようになった。 (#135227、@hime) [sig/node] - ResourceClaim を共有する Pod が GangScheduling でスケジュールされないバグを修正した。 (#137647、@nojnhuh) [sig/node,sig/scheduling,sig/testing]
- kubelet 再起動後、 sidecar(
restartPolicy: Alwaysの initContainer)とstartupProbeを持つ Pod の通常コンテナがクラッシュ後に再起動できなくなるバグを修正した。影響を受けた Pod はRestartCount: 0のまま無期限にスタックしていた。 (#137146、@george-angel) [sig/node,sig/testing] - kubelet の device manager で、 topology hint の計算が(マシン上のすべての NUMA ノードを利用して)O(2^n) の NUMA ノード組み合わせを列挙してしまうバグを修正した。デバイスを持たない NUMA ノードが多数あるシステム(例:36 個の NUMA ノードを持つ NVIDIA GB200)では、 Pod admission 中に kubelet が無期限に stall していた。 device manager は、要求されたリソースに対して実際にデバイスをホストする NUMA ノードのみに反復処理を制限するようになり、探索空間を O(2^k)(k は通常 1〜2)に削減した。 (#138244、@fanzhangio) [sig/node]
-
NVIDIA GB200 だと、2つの CPU が属する NUMAと、34 の GPU だけが属する NUMA があるそうです。
-
- システム管理者が設定した DRA extended resource のクオータを回避できる loophole を修正した。 (#135434、@yliaog) [sig/api-machinery,sig/apps,sig/node,sig/scheduling,sig/testing]
- Dynamic Resource Allocation(DRA)で、多数の Pod を非常に高速にスケジュールするときに同じデバイスが異なる
ResourceClaims用に二重にアロケートされうる race condition を修正した。 DRA driver がNodePrepareResourcesでこれをチェックしているか否かにより(チェックすべきだが、すべての実装が適切にチェックしているとは限らない)、同じデバイスを使用する 2 つ目の Pod は 1 つ目の終了まで起動に失敗するか、あるいは(より悪い場合)並行して動作してしまっていた。 (#136269、@pohly) [sig/node,sig/scheduling,sig/testing] - OS が PSI をサポートしていない場合に、
KubeletPSIfeature gate が有効化されていてもkubeletから 0 値の PSI(Pressure Stall Information)メトリクスが出力される問題を修正した。 (#137326、@amritansh1502) [sig/node] -
InPlacePodLevelResourcesVerticalScalingfeature gate が有効化されているときに、 Pod 作成時に Pod レベルの resize が進行中であると誤ってレポートされる問題を修正した。 (#138049、@ndixita) [sig/node,sig/testing] - kubelet の設定ファイル中の
preloadedImagesVerificationAllowlistの値とイメージ名を比較する処理を修正した。これまでは、 Pod から「familiar 形式」のイメージ名(例: "alpine")を使った場合、 kubelet の設定中の同じ名前と適切にマッチしていなかった。 (#137629、@stlaz) [sig/auth,sig/node,sig/testing]-
"alpine" などの省略表記は内部では "docker.io/library/alpine:latest" に展開されますが、 allowlist のマッチングがこの展開を考慮できていませんでした。
-
- DRA PrioritizedList を
AllocationModeAllで利用する際、デバイスが利用可能であっても allocator が claim をアロケーションできない不正な動作を修正した。 (#137347、@mortent) [sig/node] - エアギャップなクラスタやプライベートレジストリのテストイメージで DRA の e2e テストを実行できるよう修正した。 (#138318、@jsafrane) [sig/node,sig/testing]
- コンテナランタイムから init コンテナのステータスを取得できないとき、 static pod のステータスが
Init:0/1で表示される問題を修正した。 (#131317、@bitoku) [sig/node,sig/testing] -
RestartAllContainersアクションで再起動されたコンテナについて、lastTerminationStatusがこのアクションに合致するように修正した。 (#136964、@yuanwang04) [sig/node] -
DRA schedulingのパフォーマンスを改善し、 ResourceSlice のエントリを shared と onNode のカテゴリに分割することで、大規模クラスタで Filter ステージのレイテンシを約 50% 削減した。 (#136588、@abel-von) [sig/api-machinery,sig/apps,sig/auth,sig/node,sig/scheduling] - Kubelet: 1 つの
ResourceClaimがすでに preparation 済みの状態でも、複数のResourceClaimsを Dynamic Resource Allocation(DRA)が正しく扱うよう修正した。 (#135919、@rogowski-piotr) [sig/node,sig/testing] - Kubelet: pod allocated resources のデータ競合を修正した。 (#136226、@HirazawaUi) [sig/node]
- Kubelet: container manager のデータ競合を修正した。 (#136206、@HirazawaUi) [sig/node]
- Kubelet: status manager のデータ競合を修正した。 (#136205、@HirazawaUi) [sig/node]
- Kubelet: volume manager の
WaitForAllPodsUnmountで、並行する Pod の unmount 操作中にエラーが失われ得るデータ競合を修正した。 (#135794、@AutuSnow) [sig/node,sig/storage] - Kubelet:
NodeDeclaredFeaturesfeature gate が有効化されているとき、 mirror pod の pod update 処理で発生する nil ポインタ参照を修正した。 (#136037、@pravk03) [sig/node] - Kubelet: ロギングで verbosity レベルが適切に尊重されるよう修正した。これまでは
V().Error()を利用した一部の debug/info メッセージが、設定されたログ verbosity に関わらず常に出力されていた。 (#136028、@thc1006) [sig/node] - Kubelet: PodStatus 中の DRA
NodeAllocatableResourceClaimStatusesの保持を修正した。 (#138030、@askervin) [sig/node] - Kubelet: DNS/ホスト名ではなく IP アドレスで dial されたときに、ディスク上で変更されたサーバ証明書ファイルの再読み込みを修正した。 (#133654、@kwohlfahrt) [sig/api-machinery,sig/auth,sig/node,sig/testing]
- Kubelet: 低レイテンシの操作のため、 Pod のオンデマンドな relist を有効化した。 beta feature gate
PLEGOnDemandRelistにより保護されている。 (#137362、@tallclair) [sig/node]-
kubelet が SyncPodで CRI を同期呼び出ししたあと、 これまでは次の定期 relist (2 秒間隔) のタイミングまでその Pod の状態変化が PLEG に反映されないという無駄な待ち時間がありました。 この変更により、 SyncPod 完了直後に対象 Pod だけを即座に relist できるようになり、 Pod 作成 / リサイズなどのレイテンシが改善されます (リサイズで 10 倍程度の改善が報告されています)。 前述の Failing Test 節 (#137909) で一時的にデフォルト無効化されましたが #137946 で revert され、 v1.36.0 リリース時点ではデフォルト有効です。
-
- Kubelet: プラグインマネージャがプラグインの登録失敗を適切に処理するようになった。失敗したプラグインを actual state から削除し、 exponential backoff(初期遅延
500ms、失敗ごとに倍、最大約 2 分)でリトライすることで、壊れたプラグインが DoS を引き起こすことを防ぎつつ一時的な失敗からの回復も可能にする。 (#133335、@bart0sh) [sig/node,sig/storage,sig/testing] - これまでは、 DRA 経由でデバイスをアロケートしようとしてタイムアウトした場合、必要なリソースを持つ別のノードが存在すればスケジューリングはそちらで進行した。これにより、ノードが無視されたことが見えにくくなる問題があった。さらに、スケジューリング全体が遅い場合、 Pod は誤って "unschedulable" に移され、定期的な sweep でのみリトライされていた。タイムアウトは常に Pod のスケジューリング失敗として可視化されるエラーとなり、 Pod 単位の exponential backoff でリトライされるようになった。 (#137607、@0xMH) [sig/node,sig/scheduling,sig/testing]
- Node Declared Features から
GuaranteedQoSPodCPUResizeを削除した。 (#136759、@pravk03) [sig/node,sig/testing] - cadvisor から
container_cpu_load_average_10s、container_cpu_load_d_average_10s、cpu_tasks_stateメトリクスのレポートを削除した。これらは kubelet 側でフラグが有効化されていなかったため、値が常に 0 だった。 (#134981、@haircommander) [sig/node,sig/testing] -
kubelet_pod_start_sli_duration_seconds_bucketメトリクスを Pod startup latency SLI/SLO のドキュメントに合致させた。 (#131950、@alimaazamat) [sig/node] -
kubeletはイメージプル後ではなくサンドボックス作成直後にPodReadyToStartContainerscondition を設定するようにし、 condition が True になるまでの時間を短縮した。 (#134660、@Priyankasaggu11929) [sig/apps,sig/node,sig/testing] - discoverable metadata 用の CDI spec を
v0.5.0に更新した。 (#138035、@alaypatel07) [sig/node]
Other (Cleanup or Flake)
-
kubeGenericRuntimeManager.GetPods()およびGetPod()でコンテナを作成時刻と ID でソートし、安定性を改善した。 (#137566、@yangjunmyfm192085) [sig/node] - Kubelet: DRA に紐付いた extended resource を扱う admission 処理について、 Node の allocatable capacity にこれらのリソースが存在しなくても Pod が admit されるよう修正した。 (#135725、@bart0sh) [sig/node,sig/scheduling,sig/testing]
- cri-client helper メソッド
NewLogOptionsを削除した。LogOptionsは直接構築する必要がある。これにより cri-client から apimachinery への不要な依存が解消される。 (#137827、@SergeyKanzhelev) [sig/node,sig/release] -
GetPCIeRootAttributeByPCIBusIDヘルパーがファイルシステムに依存しないよう、オプションでfs.ReadLinkFS引数を受け取るようにした。 (#137220、@ffromani) [sig/node] - cri-api クライアントが初期化時に logger ではなく context を受け取るようにした。 (#137248、@SergeyKanzhelev) [sig/cluster-lifecycle,sig/node,sig/testing]
-
cri-toolsをv1.35.0に更新した。 (#135694、@saschagrunert) [sig/cloud-provider,sig/node]