本記事は、Kubernetes 変更内容共有会(v1.35) の SIG-Node(kubelet)に関する資料として準備されました。
Kubernetes 1.35の CHANGELOG から、SIG-Nodeに関するところを抜粋して紹介します。
は筆者(@y1r96)による補足です。
所感
今回の Kubernetes 1.35 の SIG-Node (kubelet) の変更内容で、印象に残ったいくつかの機能を紹介します。
Stable: In-place update of Pod resources
ついに GA になりました!
コンテナのリソース(CPU / メモリ)を Pod の再作成なしに変更できるようになる機能です。
デフォルトで有効にされており、特に設定なしで利用可能です。
ドキュメント が整備されておりますので、こちらを参照してください。
Pod-level のリソースのリサイズについては現在アルファ機能であり、デフォルトでは無効です。
Alpha: Node declared features before scheduling
https://kubernetes.io/docs/concepts/scheduling-eviction/node-declared-features/
KEP-5328 で提案されている機能です。
kubelet で有効にされている feature gate の情報などを kubelet が Node.Status.DeclaredFeatures フィールドに設定します。
この情報をスケジューラプラグインやアドミッションプラグインで参照することで、ノードがサポートしている機能に基づいて Pod をスケジュールしたり、Pod の設定を検証したりできるようになります。
type NodeStatus struct {
// ... existing fields
// DeclaredFeatures provides a list of features declared by the node.
// The list is sorted alphabetically and contains no duplicate entries.
// +optional
// +listType=atomic
// +featureGate=NodeDeclaredFeatures
DeclaredFeatures []string `json:"declaredFeatures,omitempty"`
}
// Node object remains unchanged in spec, only status is modified.
type Node struct {
...
Status NodeStatus `json:"status,omitempty"`
}
Node declared features の 「ノードがサポートしている機能」は基本的に feature gate を指しています。
feature gate は、ある機能のライフサイクルを管理するための仕組みで、 アルファから始まり、ベータ、GA (Generally Available) と進んでいきます(もしくは開発中に廃止されることもあります)。
- アルファ: デフォルトで無効化されており、利用したい場合はユーザが明示的に有効化する必要があります。
- ベータ: デフォルトで有効化されており、ユーザが明示的に無効化することも可能です。
- GA: デフォルトで有効化されており、ユーザが無効化することはできません。
そのため、ノードの feature gate の設定状況や Kubernetes バージョンによって利用できる機能は異なります。
しかしこれまでは、feature gate の設定状況を確認する手段がなく、ユーザが一貫して feature gate を設定することに依存していました。
Node declared features を用いることで、スケジューラやアドミッションプラグインがノードの機能を確認できるようになり、一貫した動作を実現できるようになります。
また、KEPのなかでは、機能が GA に到達して feature gate そのものが非推奨になった場合には、 Node.Status.DeclaredFeatures から削除することが推奨されています。
Dynamic Resource Allocation (DRA)
DRA (Dynamic Resource Allocation) は、これまでの device plugin よりも柔軟にデバイスを管理できる仕組みとして継続的に開発が行われており、Kubernetes 1.35 では有効でロックされました。
依然として開発が続けられており、Kubernetes 1.35 では以下の機能がアルファとして追加されました。
DRA Device Taint Rules
DRA Device Taint Rule は、クラスタ管理者が selector にマッチする DRA device に taint を設定する機能です。
以下はその例で、dra.example.com にマッチする driver でアドバタイズされるすべてのデバイスに対して、dra.example.com/unhealthy=Broken:NoExecute という taint を設定します。
apiVersion: resource.k8s.io/v1alpha3
kind: DeviceTaintRule
metadata:
name: example
spec:
# The entire hardware installation for this
# particular driver is broken.
# Evict all pods and don't schedule new ones.
deviceSelector:
driver: dra.example.com
taint:
key: dra.example.com/unhealthy
value: Broken
effect: NoExecute
また、 effect: None もサポートされており、dry-run 的に taint の影響を事前に確認することができます。
以下は Kubernetes 1.35 の CHANGELOG の和訳です。
Urgent Upgrade Notes
(No, really, you MUST read this before you upgrade)
-
必須対応事項:
kubeletコマンドラインから--pod-infra-container-imageフラグを削除した。kubeadmを使用しないクラスタの場合、ユーザーはアップグレード前にkubeletの設定ファイルからこのフラグを手動で削除する必要がある。削除を怠ると、kubelet起動時に失敗する可能性がある。kubeadmを使用するクラスタでは、kubeletに--pod-infra-container-imageなどの追加引数を指定すると、initフェーズ中にその設定がkubeletの環境ファイルに書き込まれる。kubeadmはinitまたはjoinフェーズではこのフラグを削除しないため、ユーザーはkubeletの設定ファイル内のextraArgsから手動で削除する必要がある。(#133779、@carlory) [sig/node]-
pod-infra-container-imageフラグは pause コンテナ(親となるコンテナで、pid=1 を引き受ける)のイメージを指定するためのフラグです。特別な理由がなければこれを設定することはなく、影響を受けることはほとんどありませんが、もし設定している場合は注意が必要です。
-
-
必須対応事項: 依存:
k8s.io/system-validatorsをv1.12.1に更新した。cgroups validator において、ホスト環境で cgroups v1 が検出され、指定されたKubeletVersionがv1.35以降の場合、警告ではなくエラーを発生させるようになった。kubeadmとkubeletのバージョンがv1.35以降で cgroups v1 を使用するには、以下の対応が必要である:-
kubeadmのシステム検証事前チェックで発生するエラーを無視する。 - アップグレード前に、
kube-system/kubelet-configConfigMap を編集し、failCgroupV1: falseフィールドを追加する。(#134744、@neolit123) [sig/node,sig/cluster-lifecycle]
-
Changes by Kind
Deprecation
- 必須対応事項:
failCgroupV1はバージョン1.35以降で自動的に有効化される。これにより、デフォルトではノードが cgroups v1 環境で起動しなくなる。この変更により、cgroups v1 は非推奨状態となる。(#134298、@kannon92) [sig/node]
API Change
-
log-flush-frequencyが正の値であることを検証する機能を追加し、パニックを引き起こす代わりにエラーを返すようにした。(#133540、@BenTheElder) [SIG Architecture, Instrumentation, Network and Node] [sig/network,sig/node,sig/instrumentation,sig/architecture] - RestartPolicy ルール内のソースコンテナが終了すると、すべてのコンテナが再起動される。このアルファ機能は
RestartAllContainersOnContainerExitというゲート条件によって制限されている。(#134345、@yuanwang04) [SIG Apps, Node and Testing] [sig/node,sig/apps,sig/testing]-
KEP-5532 で提案されている機能です。RestartPolicyRuleとしてRestartAllContainersアクションを設定すると、そのコンテナが restart するときに、他のコンテナもまとめて restart されるようになります。
-
- DRA device taints:
DeviceTaintRuleのステータスには、Pod の強制終了がまだ必要かどうかを示すEvictionInProgress条件などが含まれる。新たに追加されたNoneeffect を使用することで、DeviceTaintRuleがNoExecuteeffect を使用した場合の影響を事前に確認したり、デバイスに taint を適用したりできる(ただし、スケジュールや実行中の Pod に即座に影響を与えることはない)。 (#134152、@pohly)[sig/scheduling,sig/node,sig/api-machinery,sig/auth,sig/apps,sig/testing,sig/release] - DRA:
DynamicResourceAllocationfeature gate(v1.34でGA)について、デフォルトで有効化状態に固定され、今後は無効化できなくなった。(#134452、@pohly)[sig/scheduling,sig/node,sig/auth,sig/testing] - Pod-level resources をインプレースにリサイズできるようにした:
-
statuszエンドポイント向けに構造化されバージョン管理されたv1alpha1レスポンス形式を導入した。(#134313、@richabanker)[sig/network,sig/scheduling,sig/node,sig/api-machinery,sig/instrumentation,sig/testing,sig/architecture] -
flagzエンドポイント向けに構造化されバージョン管理されたv1alpha1レスポンス形式を導入した。(#134995、@yongruilin) [sig/network,sig/scheduling,sig/node,sig/api-machinery,sig/instrumentation,sig/testing,sig/architecture] - Node Declared Features 機能(アルファ)を導入した。これには以下が含まれる:
- ノード固有の機能を公開するための新しい
Node.Status.DeclaredFeaturesフィールドを追加 - 機能の登録と推論を行うための
component-helpersライブラリを導入 - 必要な機能を提供するノードと Pod をマッチングする
NodeDeclaredFeaturesスケジューラプラグインを導入 - Pod の更新内容をノードが宣言した機能と照合して検証する
NodeDeclaredFeatureValidatorアドミッションプラグインを導入。 - (#133389, @pravk03) [sig/scheduling,sig/node,sig/api-machinery,sig/apps,sig/testing,sig/release]
- ノード固有の機能を公開するための新しい
- kubeletがイメージ取得を追跡するために使用する
ImagePullIntentおよびImagePulledRecordオブジェクトをv1beta1APIバージョンに移行した。(#132579、@stlaz)[sig/node,sig/auth] - Pod のサイズ変更時に許可されるリソースをCPUとメモリに限定し、その他のリソースタイプは使用不可とした。(#135084、@tallclair) [sig/node,sig/apps,sig/testing]
- DRA device の taint と toleration について、
DRADeviceTaintRulesという独立した feature gate を導入した。この feature gate はDeviceTaintRulesのサポートを制御するもので、DRADeviceTaintsを有効にしたままDRADeviceTaintRulesを無効化することで、ResourceSlicesを介した taint 機能を維持できるようにした。(#135068、@pohly) [sig/scheduling,sig/node,sig/api-machinery,sig/auth,sig/apps,sig/testing]-
DeviceTaintRule は selector にマッチする DRA device に taint を設定する機能で、クラスタ管理者が設定することが想定されています。 ResourceSlicesを介した taint は、DRA driver により広告されるものです。今回の変更により、大きな feature gate を分割し、より細かく Device Taint 機能の有効化を制御できるようになりました。
-
-
KubeletEnsureSecretPulledImages機能をベータに昇格させ、デフォルトで有効化した。(#135228、@aramase) [sig/node,sig/auth,sig/testing] -
ResourceQuotaの仕様を更新し、DRAExtendedResource機能が有効化されている場合、ResourceClaim内のデバイスクラス要求を以下の追加クォータとしてカウントするようにした:-
requests.deviceclass.resource.k8s.io/<deviceclass>は、要求されるデバイスの最悪ケース数に基づいて計算される - extended resource にマッピングされるデバイスクラスについては、
requests.<extended resource name>が消費対象となる。 - (#134210、@yliaog) [sig/scheduling,sig/node,sig/api-machinery,sig/apps,sig/testing]
-
extended resource 経由だったとしても、従来の requests.<extended resource name>と、DRA の DeviceClass によるクオータの両方が適用されます。
-
- Partitionable Device 機能を更新し、同一 ResourcePool 内の異なる ResourceSlice 間で CounterSet を参照できるようにした。不完全な pool に属するデバイスは割り当て対象から除外されるようになった。この変更により、アルファ機能に後方互換性のない更新が加えられたため、v1.34 と v1.35 の間でアップグレードまたはダウングレードを行う前に、この機能を使用しているすべての ResourceSlice を削除する必要がある。(#134189、@mortent) [sig/scheduling,sig/node,sig/api-machinery,sig/testing]
Feature
-
VolumeAttachmentLimitExceededによる Pod 拒否時のクリーンアップ処理をテストするためのkubeletストレステストを追加した。(#133357、@torredil)[sig/storage,sig/node] -
kubeletのstatuszエンドポイントにpathsセクションを追加した。(#133239、@Peac36) [sig/node] -
kubeletがノード上で特定のイメージが存在することを保証する処理に関する詳細情報を提供するメトリクス(カウンタ)kubelet_image_manager_ensure_image_requests_total{present_locally, pull_policy, pull_required}を追加した。(#132644、@stlaz) [sig/node,sig/auth] - Pod の Resize 処理中に追加のイベントを出力するようにし、Pod の Resize 状態が変更された際の可視性を向上させた。(#134825、@natasha41575) [sig/node]
-
追加されたイベントは以下:
- ResizeDeferred
- ResizeInfeasible
- ResizeCompleted
- ResizeStarted
- ResizeError
-
- DRA health monitoring APIにおいて、デバイスごとに設定可能なヘルスチェックのタイムアウト時間を追加した。(#135147、@harche) [SIG Node] [sig/node]
- リモートランタイムおよびイメージの
Close()メソッドを追加し、接続を正常にクローズできるようにした。(#133211、@saschagrunert) [SIG Node] [sig/node] -
ChangeContainerStatusOnKubeletRestartという feature gate を追加した。この feature gate はデフォルトで無効になっており、無効状態ではkubeletが再起動時に Pod のステータスを変更せず、kubelet再起動後に Pod が起動プローブを再実行しなくなる。(#134746、@HirazawaUi) [SIG Node and Testing] [sig/node,sig/testing] -
UserNamespacesHostNetworkSupportという feature gate を追加した。この feature gate はデフォルトで無効になっており、有効化すると許可されたhostNetworkPod がユーザーネームスペースを使用できるようになる。(#134893、@HirazawaUi) [SIG Apps, Node and Testing] [sig/node,sig/apps,sig/testing]-
コンテナランタイムのサポートが必要であり、コンテナランタイムのサポートが進むまではアルファ機能として提供される予定です。kube-apiserver や kube-controller-manager などのコンポーネントは static Pod かつ hostNetwork を利用していることが多いです。この環境でもユーザーネームスペースを利用できるようにすることで、セキュリティの向上を目指しています。
-
-
PodTopologyLabelsAdmissionfeature gate をベータに移行し、デフォルトで有効化した。 これにより、割り当てられたノードにこれらのラベルが存在する場合、Pod は自動的にtopology.kubernetes.io/zoneおよびtopology.kubernetes.io/regionラベルを付与されるようになった。(#135158、@andrewsykim) [sig/node] - fine-grained supplemental groups policy(KEP-3619)をGAに移行した。(#135088、@everpeace) [sig/node,sig/testing]
- ImageVolumeSource 機能をベータに移行し、デフォルトで有効化した。(#135195、@haircommander) [sig/node,sig/apps,sig/instrumentation,sig/testing]
-
KubeletEnsureSecretPulledImagesに対応するため、kubeletの新たなメトリクスを追加した:-
kubelet_imagemanager_ondisk_pullintents:ディスク上の pull intent を追跡-
in-flight なイメージ取得リクエストを追跡するためのメトリクス
-
-
kubelet_imagemanager_ondisk_pulledrecords:ディスク上の pull 済み image を追跡-
ノード上に存在するイメージを追跡するためのメトリクス
-
-
kubelet_imagemanager_image_mustpull_checks_total{result}:image pull を検証した回数をカウント。-
適切な権限があるかを検証した回数を追跡するためのメトリクス
-
- (#132812、@stlaz) [sig/node,sig/auth]
-
-
AllowOverwriteTerminationGracePeriodSecondsfeature gate の設定を有効で固定した。(#133792、@HirazawaUi) [sig/node] - 一般利用可能状態の feature gate
ExecProbeTimeoutをtrueに固定した。(#134635、@vivzbansal) [sig/node,sig/testing] -
ImageGCMaximumAgeパラメータを安定版に移行した。(#134736、@haircommander)[sig/node,sig/testing] -
InPlacePodVerticalScaling機能を一般利用可能状態に移行した。(#134949、@natasha41575) [sig/scheduling,sig/node,sig/api-machinery] -
EnvFilesfeature gate をベータに移行し、デフォルトで有効化した。さらに、環境変数の構文仕様をPOSIXシェルのサブセットに制限した(すべての変数値はシングルクォートで囲む必要がある)。(#134414、@HirazawaUi) [sig/node,sig/testing] -
HostnameOverridefeature gate をベータに移行し、デフォルトで有効化した。(#134729、@HirazawaUi) [sig/network,sig/node] -
KubeletCrashLoopBackOffMaxfeature gate をベータに移行し、デフォルトで有効化した。(#135044、@hankfreund) [sig/node] - 拡張リソースに対して複数のデバイスクラスが利用可能な場合、単一のデバイスクラスを決定論的に選択するように変更した。(#135037、@yliaog) [sig/scheduling,sig/node,sig/testing]
- サンドボックスの順序付け方式を、試行回数または作成時刻に基づいて決定するように更新した。(#130551、@yylt) [sig/node]
Bug or Regression
- KubeletプラグインAPIにおける
DRAConsumableCapacity機能のShareIDフィールドをサポートした。(#134520、@sunya-ch) [sig/node,sig/testing]-
ShareID は DRA driver が返すIDで、Consumable Capacity を共有するデバイスを区別するために使用されます。
-
-
DisruptionControllerのfailSafe機構によって強制終了がブロックされた場合に、適切なエラーメッセージを表示するように修正した。(#133097、@kei01234kei) [SIG Apps and Node] [sig/node,sig/apps] - DRA device taint:
NoExecuteのtolerationを修正した。本機能追加以前は、taint 情報を eviction controller に通知していなかったため、スケジュールされたPodがほぼ即座に evict される問題が発生していた。(#134479、@pohly)[sig/scheduling,sig/node,sig/apps,sig/testing]-
NoExecuteの taint があり tolerate されているとき、スケジュールはできていたものの eviction controller には toleration 情報が伝わっていないため、Pod が eviction されてしまっていた、という問題です。
-
- initContainer が要求する DRA extended resource について resourceClaim を自動的に作成する部分について、従来のデバイスプラグインと同様の動作に変更した。これにより、Podが要求するデバイス総数を最小限に抑えるため、後続のサイドカーinitContainerや通常のコンテナが要求するリソースを可能な限り再利用するようにした。(#134882、@yliaog) [sig/scheduling,sig/node,sig/apps,sig/cli,sig/testing]
-
initContainer は sidecar container を考慮しつつ、基本的にはその最大値が必要なリソース量になります。この変更が入るまでは無駄に DRA device を要求してしまう場合がありましたが、今回の変更により device plugin と同様の動作になりました。 -
ちなみに sidecar container を考慮する場合のリソースは、non-sidecar initContainer と sidecar initContainer の起動と終了のタイミングを考慮して計算されています
-
-
DRAConsumableCapacityとDRAPartitionableDevicesの両方が有効になっている場合に、以前にCounterSetを消費していた同一デバイスの割り当てを妨げるバグを修正した。(#134103、@sunya-ch) [sig/node] -
DRAConsumableCapacity機能使用時に次のPodのスケジューリングを妨げるバグを修正した。(#133706、@sunya-ch) [sig/node] - ResourcePool 内に現在のノードを対象としない
ResourceSlicesが含まれている場合、AllocationMode: Allが正常に機能しないバグを修正した。(#134466、@mortent) [sig/node] - ResourceClaim がテンプレートから生成された場合や、PodSpec で異なるローカル名が使用されていた場合に、DRAリソースの健全性がPodステータスに反映されない問題を修正した。(#134875、@Jpsassine) [sig/node,sig/testing]
-
kubeletが古い informer cache が原因でNodeAffinityFailed状態のPodを拒否するという長年の問題を解決した。(#134445、@natasha41575) [sig/node] -
restartPolicy=Never設定のPodにおいて、startupProbe を持つサイドカーコンテナが初回起動時に失敗した後に再起動時に成功しても、メインコンテナが「Initializing」状態から移行できないレースコンディションを修正した。(#133072、@AadiDev005)[sig/node,sig/testing] - static pod に対して restartPolicy と restartRule が適用されない問題を修正した。(#135031、@yuanwang04) [sig/node]
-
ResourceClaimステータス内の設定FromClassに対するリクエストが参照されない問題を修正した。(#134793、@LionelJouin) [sig/node] -
kubeletの/configzエンドポイントが、コンテナランタイムから受信したcgroupドライバ設定値と異なるkubeletconfig.cgroupDriver値を報告する問題を修正した。(#134743、@marquiz) [sig/node]-
ハンドラの初期化タイミングが CRI クライアントの初期化タイミングよりも早かったため、kubeletconfig.cgroupDriver が正しく設定されていなかった、という問題です。
-
-
DRAConsumableCapacityfeature gate が無効化されている状態でdistinctAttribute=nilを設定する際の問題を修正した。(#134962、@sunya-ch) [sig/node] -
kubelet_volume_stats_*メトリクスの欠落を修正した。(#133890、@huww98) [sig/node,sig/instrumentation] - Podが完了した際に DRA extended resource に対する resourceClaim の解放処理を修正した。(#134312、@alaypatel07) [sig/node,sig/apps,sig/testing]
- これまで無視されていた
userNamespaces.idsPerPod設定をkubeletが適切に考慮するように修正した。(#133373、@AkihiroSuda) [sig/node,sig/testing] - イメージのガベージコレクションで十分なディスク領域が解放できない場合に発生する
FreeDiskSpaceFailed警告イベントについて、より実用的な詳細情報を提供するように改善した。例:Insufficient free disk space on the node's image filesystem (95.0% of 10.0 GiB used). Failed to free sufficient space by deleting unused images. Consider resizing the disk or deleting unused files.(#132578、@drigz) [sig/node] - deviceClass から暗黙的に生成される extended resource(
deviceclass.resource.kubernetes.io/<device-class-name>)を使用して、該当クラスのDRA deviceを要求する機能を追加した。(#133363、@yliaog)[sig/scheduling,sig/node,sig/testing] - Kubelet:
LocalStorageCapacityIsolationFSQuotaMonitoringfeature gate が有効化されている状態で、空のボリュームを持つPodを作成する際に発生していた並行マップ書き込みエラーを修正した。(#135174、@carlory) [sig/storage] - Kubelet: 30分間アイドル状態が続いた後にDRAドライバへの接続が使用不能になる原因となっていた内部デッドロックを修正した。(#133926、@pohly) [sig/node]
- コンテナランタイムの初期化遅延が原因でSystem WatchDogがkubeletを強制終了することがなくなった。デバイスマネージャは、ポートへのリスニングを開始するまで不健全な状態として扱われていた。(#135153、@SergeyKanzhelev) [sig/node]
Other (Cleanup or Flake)
- テストカバレッジ率を89.8%に向上させた。(#132607、@ylink-lfs) [sig/node]
-
CPUManagerのログ出力をコンテキストベース方式に移行した。(#125912、@ffromani) [sig/node] - CPU Manager の static policy option
strict-cpu-reservationをGAに昇格させた。(#134388、@psasnal) [sig/node] - Topology Manager の policy option
max-allowable-numa-nodesをGAに昇格させた。(#134614、@ffromani) [sig/node] - コンテナ作成および起動イベントのメッセージからコンテナ名の表示を削除した。(#134043、@HirazawaUi) [sig/node]
-
k8s.io/kubelet/pkg/apis/draから廃止予定のgogoプロトコル定義を削除し、google.golang.org/protobufへの移行を実施した。(#133026、@saschagrunert) [SIG API Machinery and Node] [sig/node,sig/api-machinery] - 一般提供済み feature gate
SizeMemoryBackedVolumesを削除した。(#133720、@carlory)[sig/storage,sig/node,sig/testing] -
UserNamespacesPodSecurityStandardsfeature gate を削除した。kubeletの最小サポートKubernetesバージョンがv1.31となったため、このゲートは不要となった。(#132157、@haircommander) [sig/node,sig/auth,sig/testing] -
SystemdWatchdogfeature gate をデフォルト設定で固定し、将来のリリースで削除予定である。kubeletにおけるsystemdウォッチドッグ機能は、 feature gate の設定なしでsystemd経由で有効化可能である。詳細はsystemdウォッチドッグドキュメントを参照のこと。(#134691、@SergeyKanzhelev) [sig/node] - CNIプラグインをv1.8.0に更新した。(#133837、@saschagrunert) [sig/node,sig/testing,sig/cloud-provider]
- etcdクライアントライブラリを
v3.6.5に更新した。(#134780、@joshjms) [sig/network,sig/scheduling,sig/storage,sig/node,sig/api-machinery,sig/cluster-lifecycle,sig/auth,sig/cli,sig/instrumentation,sig/architecture,sig/cloud-provider]