0
0

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.36: SIG-Node (kubelet) 変更内容

0
Last updated at Posted at 2026-05-21

本記事は、Kubernetes 変更内容共有会(v1.36) の SIG-Node(kubelet)に関する資料として準備されました。
Kubernetes 1.36の CHANGELOG から、SIG-Nodeに関するところを抜粋して紹介します。

:pencil: は筆者(@y1r96)による補足です。

所感 :pencil:

今回の 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 とそれを利用する機能群

KEP-5328

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 が対応を広告した場合のみ直接プロキシされます。
  • UserNamespacesHostNetwork (alpha):
    • hostNetwork Pod での user namespace 利用について、 コンテナランタイムの対応状況を広告し、対応 Node にのみその Pod がスケジュールできるようにする仕組みです。

Alpha: Pod Level Resource Managers

KEP-5526

Topology Manager / CPU Manager / Memory Manager は kubelet のリソース管理コンポーネントで、 Guaranteed Pod に対して以下のような制御を行います:

  • CPU Manager (static policy): 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 つのモードを選択できます:

  • container scope
    • 従来の振る舞い。コンテナごとに resource manager が動作します。
  • pod scope
    • 新規の振る舞い。Topology Manager が pod と container 両方のリソースを基に全体で 1 つの NUMA aligned なリソースプールを確保します。

Alpha: MemoryQoS / MemoryReservationPolicy

KEP-2570

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

#137362

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 に昇格:
    • DRAAdminAccess: ResourceClaim の adminAccess: true で管理者用デバイスアクセスを許可 (#137373)
    • DRAPrioritizedList: ResourceClaim 内でデバイス選択肢に優先順位を付与しフォールバックを書ける (#136924)
    • KubeletPodResourcesDynamicResources / KubeletPodResourcesGet: PodResources API 経由で DRA リソースの割り当て情報を取得 (#136728)
  • 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): プール内の利用可能デバイス数を問い合わせる ResourcePoolStatusRequest API (#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

  • 必須対応事項: DRAResourceClaimGranularStatusAuthorization feature 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]
    • :pencil: ResourceClaim のステータス更新は driver と scheduler/controller の両方が行うため、それぞれに最小権限を付与する仕組みが整備されました。 associated-node は driver が自分の動作しているノード上の claim のみ更新できる、 arbitrary-node は任意のノード上の claim を更新できるという違いがあります。
  • コンテナステータスにイメージボリュームのダイジェストを含める ImageVolumeWithDigest を追加した。 (#132807@iholder101) [sig/api-machinery,sig/apps,sig/node,sig/testing]
    • :pencil: イメージのダイジェスト(コンテンツアドレス)を ContainerStatus.VolumeMounts[*].VolumeStatus.Image.ImageRef から参照できるようになりました。これにより、コンテナでマウントされたイメージボリュームのバージョンを正確に追跡できます。
  • KubeletConfiguration に cgroup v2 の MemoryQoS 向けの MemoryReservationPolicy を追加した。 memory.min による保護をサポートする。 (#137584@QiWang19) [sig/node,sig/storage]
    • :pencil: KEP-2570 MemoryQoS のメモリ保護の挙動を KubeletConfiguration から設定できるようになりました。指定可能な値は次の 2 つです。
      • None (デフォルト): kubelet は memory.min による保護を行いません。
      • TieredReservation: Guaranteed Pod には memory.min、 Burstable Pod には memory.low を設定し、 OS のメモリ回収から保護します。
  • DRA で属性に list 型のサポートを追加した(KEP-5491)。 DRAListTypeAttributes feature gate(デフォルト無効)を有効化することで以下の機能が利用できる。
    • DRA driver は ResourceSlice 内のデバイス属性に list 型のフィールド(bools/ints/strings/versions)を利用できる。1 つのデバイスあたりの属性値の数は、スカラと list 値を合わせて 48 に制限される。
    • ResourceClaim の matchAttribute/distinctAttribute 制約は、スカラと list 属性の両方で動作する。 matchAttribute 制約は候補のデバイス間で list 値の共通集合が空でないときマッチする。 distinctAttribute 制約( ConsumableCapacity feature 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]
    • :pencil: 1 つのデバイスが複数の集合に属する場合(例: 複数の PCIe root や NUMA ノードに接続している CPU など)、スカラ値しか持てない属性ではトポロジを表現できませんでした。 list 属性のサポートにより、「同じ PCIe root につながった CPU・GPU・NIC をまとめて要求する」といったトポロジを揃えた割り当てができるようになります。
  • kubelet プラグインフレームワークにおいて、DRA driver が Pod の CDI マウントに DRA デバイスのメタデータを発行できるよう alpha のオプトインサポートを追加した。 (#137086@alaypatel07) [sig/apps,sig/network,sig/node,sig/testing]
    • :pencil: KEP-5304 の機能です。 Pod 内のコンテナがデバイス属性(PCIe バスアドレスや mediated device UUID など)を読みたい場合、これまでは Kubernetes API を使って ResourceClaim / ResourceSlice を取得する必要がありましたが、 この機能を用いることで CDI 経由でマウントされた JSON ファイルから読めるようになります。
  • DRA のリソースプールの可用性を問い合わせるための ResourcePoolStatusRequest API(v1alpha1)を追加した。外部のスケジューラは、ワークロードを投入する前にプール全体で利用可能なデバイスを確認できる。 DRAResourcePoolStatus feature gate(alpha)が必要。 (#137028@nmn3m) [sig/api-machinery,sig/apps,sig/auth,sig/etcd,sig/instrumentation,sig/node,sig/scheduling,sig/storage,sig/testing]
    • :pencil: 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]
    • :pencil: DRA で扱うデバイスが CPU やメモリを消費する場合に、それを Node の allocatable に反映できるようになります。これにより、デバイスを要求する Pod がスケジュールされた際に Node 上のリソースが正しく考慮されます。
  • imageMinimumGCAge に対して負の値を許可しないバリデーションを追加した。 (#135997@ngopalak-redhat) [sig/api-machinery,sig/node]
  • cpuCFSQuotaPeriod kubelet config フィールドに対して非デフォルト値を使うには CustomCPUCFSQuotaPeriod feature 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]
    • :pencil: 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]
    • :pencil: Device Binding Conditions は、ファブリックを跨いで動的にアタッチされるデバイス(ネットワーク経由のアクセラレータなど)について、スケジュール後にバインドが完了するのを待ってから Pod 起動を進めるための機能です。
  • DRA: device taint と toleration(KEP #5055)を beta に昇格させた。 ResourceSlice 内の DeviceTaints のサポートはデフォルトで有効。 DeviceTaintRules のサポートは resource.k8s.io/v1beta2 および DeviceTaintRules feature gate を有効化するかどうかに依存する。 (#137170@pohly) [sig/api-machinery,sig/apps,sig/auth,sig/cluster-lifecycle,sig/etcd,sig/node,sig/scheduling,sig/testing]
    • :pencil: 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]
    • :pencil: これまでは Pod の resize リクエストはとりあえず受け付けて、後で kubelet が Infeasible 状態に遷移させていました。 1.36 からは admission 時点で明確に拒否されるため、エラーがユーザに即時にフィードバックされます。
  • ImageVolume 機能を stable に昇格させた。 (#136711@saschagrunert) [sig/apps,sig/architecture,sig/node,sig/testing]
    • :pencil: OCI イメージを Pod のボリュームとして直接マウントできる機能です。 1.31 で alpha、 1.33 で beta、 1.35 でデフォルト有効、 1.36 で stable に昇格しました。
  • InPlacePodLevelResourcesVerticalScaling feature gate を beta に昇格させ、デフォルトで有効化した。Pod-level でリソースを設定した Pod の CPU・メモリリソースを再作成なしで変更できるようになった。 (#137684@ndixita) [sig/api-machinery,sig/apps,sig/autoscaling,sig/node,sig/release,sig/scheduling,sig/testing]
    • :pencil: 1.35 で alpha だった機能です。 Pod レベル(pod.spec.resources)のリソース指定について、コンテナレベルと同様に in-place なリサイズができるようになります。
  • UserNamespacesSupport feature gate を GA に昇格させた。 (#136792@rata) [sig/api-machinery,sig/apps,sig/cli,sig/node,sig/storage,sig/testing]
    • :pencil: 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]
    • :pencil: 上述の 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]
    • :pencil: ResourceClaim 内で「複数のデバイス選択肢に優先順位を付ける」機能です。最初の選択肢が割り当てられなければ次を試す、というフォールバックを書けます。
  • NodeDeclaredFeatures を beta に昇格させた。 (#136042@pravk03) [sig/api-machinery,sig/apps,sig/cluster-lifecycle,sig/instrumentation,sig/node,sig/scheduling,sig/storage,sig/testing]
    • :pencil: 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]
    • :pencil: 既存の extended resource(pod.spec.containers[*].resources.requests)を DRA driver から提供するための仕組みです。既存の Pod 定義からそのまま DRA でデバイスを要求できます。
  • DRAAdminAccess feature gate を GA に昇格させた。 (#137373@ritazh) [sig/api-machinery,sig/auth,sig/node,sig/scheduling,sig/testing]
    • :pencil: ResourceClaim の adminAccess: true でデバイスへの管理者アクセス(read-only な共有アクセスなど)を許可する機能です。
  • NodeLogQuery feature gate を GA に昇格させた。 (#137544@jrvaldes) [sig/node,sig/windows]
    • :pencil: 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]
    • :pencil: securityContext.procMount: Unmasked を許可することで、 user namespace を利用している Pod で /proc のマスクを外すことができるようになる機能です。ネストされたコンテナを動かすときなどに必要です。
  • DRAConsumableCapacity feature gate をデフォルトで有効化した。 (#136611@sunya-ch) [sig/api-machinery,sig/cluster-lifecycle,sig/node,sig/scheduling,sig/testing]
    • :pencil: 1 つの DRA デバイスを「容量を分割」して複数の Pod から共有できる機能です。 1.36 でデフォルト有効化されました。

Feature

  • kubelet_metrics_provider メトリクスを追加した。 kubelet のメトリクスがどこから来ているかを識別できるようにする。 (#136952@dgrisonnet) [sig/node]
    • :pencil: kubelet が出力するコンテナのメトリクスは、 kubelet 内部、 cAdvisor、 CRI runtime など複数の供給元から提供されるため、運用時にトラブルシュートしやすくすることを目的としています。
  • Node 上で動作する Pod に関する情報を提供する gRPC サービスを kubelet に追加した。 (#134627@briansonnenberg) [sig/node,sig/testing]
    • :pencil: KEP-4188 の機能で、 Node の管理ユーザ向けに Unix socket 経由で Pod 情報を提供する gRPC API です。 想定利用者は CNI plugin (Pod の Readiness を見てネットワーク設定を切り替える) や Node 上の監視ツールなどで、 kube-apiserver を経由せずに Pod 情報を取得できるようにする狙いがあります。
  • 新しい RuntimeService ストリーミング RPC(StreamPodSandboxesStreamContainersStreamContainerStatsStreamPodSandboxStatsStreamPodSandboxMetrics)および新しい ImageService ストリーミング RPC(StreamImages)を追加した。 (#136987@bitoku) [sig/cluster-lifecycle,sig/node,sig/testing]
    • :pencil: 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]
  • ResourceClaimstatus.reservedFor で、未知の(Pod 以外の)参照をサポートするようにした。コントローラはこれらのエントリで sync を停止するのではなく、優雅にスキップする。これにより stale な Pod 参照は引き続きクリーンアップされる。 (#136450@MohammedSaalif) [sig/apps,sig/node]
  • ExtendWebSocketsToKubelet feature 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]
    • :pencil: kubectl execkubectl port-forward は WebSocket でも通信できるようになりつつありますが、これまでは API server が WebSocket↔SPDY 変換を行っていました。 1.36 からは API server を素通しで kubelet が直接 WebSocket を処理します。 NodeDeclaredFeatures でサポートが宣言されている kubelet にのみ直接プロキシする仕組みになっている点もポイントです。
  • UserNamespacesHostNetwork runtime handler を追加し、 UserNamespacesHostNetworkSupport feature gate を NodeDeclaredFeatures feature gate と統合した。 UserNamespacesHostNetworkSupport feature gate は、コンテナランタイムの UserNamespacesHostNetwork runtime handler が true を返し、 NodeDeclaredFeatures feature gate が有効化されているときにのみ有効となる。 (#135828@HirazawaUi) [sig/autoscaling,sig/node,sig/scheduling,sig/testing]
    • :pencil: 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]
    • :pencil: ただし下記の通り #137574 で revert されているため、 1.36 リリース時点ではこのフィールドは存在しません。
  • DRA ResourceSlice コントローラ: optional な ReconcilePoolWithName を追加した。 slice に NodeName を設定しないプール単位の reconcile を可能にすることで、スケジューラは Node が保有するクラスタ全体に見えるリソース(ネットワーク共有のデバイスなど)に対して NodeSelectorallNodes を利用できる。「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]
    • :pencil: これまで 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 の手書きの変換コードで、フィールドの変換漏れ(BindsToNodeBindingConditionsBindingFailureConditionsAllowMultipleAllocationsCapacity)を修正した。 (#137240@yykkibbb) [sig/node]
  • きめ細かい kubelet API authorization を stable に昇格させた。 (#136116@vinayakankugoyal) [sig/node]
    • :pencil: 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]
    • :pencil: 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 クライアントに対して、受け入れる認証局として正しく広告される。この動作は ReloadKubeletClientCAFile feature 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]
    • :pencil: 1 つの物理デバイスを複数の論理デバイスに分割して扱えるようにする機能です(例: NVIDIA の MIG)。
  • KubeletPodResourcesDynamicResources および KubeletPodResourcesGet feature gate を GA に昇格させた。 (#136728@guptaNswati) [sig/node,sig/testing]
    • :pencil: PodResources API を介して DRA リソースの割り当て状況を取得できる機能、および特定の Pod に絞って PodResources を取得する Get エンドポイントです。
  • RestartAllContainersOnContainerExits feature gate を beta に昇格させ、デフォルトで有効化した。 (#136681@yuanwang04) [sig/node,sig/testing]
    • :pencil: 1.35 で alpha 導入された機能です。 RestartPolicyRuleRestartAllContainers アクションを指定すると、あるコンテナの終了時に 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]
  • PLEGOnDemandRelist feature flag を beta レベルに保持しつつ、デフォルトで無効化に切り替えた。 (#137909@dims) [sig/node]
    • :pencil: 同期 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: DRABindingConditions feature が有効で、異なる 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_secondspreemption_goroutines_duration_secondsrun_podsandbox_duration_secondsstore_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]
    • :pencil: 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 をサポートしていない場合に、 KubeletPSI feature gate が有効化されていても kubelet から 0 値の PSI(Pressure Stall Information)メトリクスが出力される問題を修正した。 (#137326@amritansh1502) [sig/node]
  • InPlacePodLevelResourcesVerticalScaling feature gate が有効化されているときに、 Pod 作成時に Pod レベルの resize が進行中であると誤ってレポートされる問題を修正した。 (#138049@ndixita) [sig/node,sig/testing]
  • kubelet の設定ファイル中の preloadedImagesVerificationAllowlist の値とイメージ名を比較する処理を修正した。これまでは、 Pod から「familiar 形式」のイメージ名(例: "alpine")を使った場合、 kubelet の設定中の同じ名前と適切にマッチしていなかった。 (#137629@stlaz) [sig/auth,sig/node,sig/testing]
    • :pencil: "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: NodeDeclaredFeatures feature 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]
    • :pencil: 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_10scontainer_cpu_load_d_average_10scpu_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 はイメージプル後ではなくサンドボックス作成直後に PodReadyToStartContainers condition を設定するようにし、 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-toolsv1.35.0 に更新した。 (#135694@saschagrunert) [sig/cloud-provider,sig/node]
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?