本記事は、Kubernetes 変更内容共有会(v1.33) の SIG-Node(kubelet)に関する資料として準備されました。
Kubernetes 1.33の CHANGELOG から、SIG-Nodeに関するところを抜粋して紹介します。
は筆者(@y1r96)による補足です。
所感
今回の Kubernetes 1.33 の SIG-Node (kubelet) の変更内容で、印象に残ったいくつかの機能を紹介します。
Dynamic Resource Allocation (DRA) Updates
DRA は、Kubernetes クラスタ内のリソースを動的に割り当てるための機能です。これまで Device Plugin を使ってリソースを管理していましたが、DRA はより柔軟なリソース管理を可能にします。
今回の変更でも多数の DRA に関連する機能が追加されました。
様々な機能があり状況が複雑になっているので、かんたんに整理を試みてみます:
- API は、
resource.k8s.io/...
で定義されています- DeviceClass (v1beta2)
- クラスタに存在するデバイスのクラスを表現します。 Storage でいうと、 StorageClass のようなものです。
- ResourceClaim (v1beta2)
- PVC のように、リソースの要求を表現します。
- ResourceClaimTemplate (v1beta2)
- ResourceClaim のテンプレートを表現します。PodSpec で使用することで、テンプレートから自動的に ResourceClaim を生成できます。
- ResourceSlice (v1beta2)
- デバイスがどのような性質を持っているかを表現します。例えば GPU の場合に、VRAM のサイズや、演算能力などを表現できます。
- DeviceTaintRule (v1alpha3)
- デバイス を taint したいときに管理者が作成します。セレクタを記述することで、条件にマッチした特定のデバイスに taint を付与できます。付与された taint は、 ResourceClaim によって toleration される必要があります。
- DeviceTaintRule APIは Kubernetes 1.33 でアルファとして追加されました。
- DeviceClass (v1beta2)
- 最近追加された Features
- Admin access
- 管理者が ResourceClaim や ResourceClaimTemplate に
adminAccess
フィールドを設定することで、管理目的でリソースを使うことができます。- Kubernetes 1.33 から、
kubernetes.io/dra-admin-access
ラベルが付与された管理者用ネームスペースへのアクセス権を持つユーザーのみが、このフィールドを持つ ResourceClaim や ResourceClaimTemplate を作成できます。 - これを使うことで、管理者が使用中のリソースを横から利用したり、コンテナにリソースを割り当てる際に、権限を追加できたりします。
- Kubernetes 1.33 から、
- Admin access 自体の feature は Kubernetes 1.32 でアルファとして追加されました。
- 管理者が ResourceClaim や ResourceClaimTemplate に
- Partitionable Devices
- GPU の MIG (Multi-Instance GPU) のように、デバイスをパーティション化して複数の Pod に割り当てることができます。
- ResourceSlice に CounterSets と呼ばれるフィールドがあり、カウンタによって分割可能なリソースの数を表現できます。
- Partitionable Devices は Kubernetes 1.33 でアルファとして追加されました。
- Prioritized List
- リソースを要求する際に、「大リソースなら1個 」、「小リソースならN個」のどちらかがほしい。なお、可能なら大リソースを優先して割り当てたい、というような要求があることがあります。
- Prioritized List はこのような要求を ResourceClaim で表現するための機能です。
- Prioritized List は Kubernetes 1.33 でアルファとして追加されました。
- Admin access
他にも面白い機能がたくさんあります。興味がある方は調べてみてください。
昇格した機能
- GA になった
- Sidecar Containers
- CPU Manager Policy Options
- Recursive Read-Only Mounts (RRO)
- Beta になった
- ProcMountType
- DistributeCPUsAcrossNUMA
- In-Place Pod Vertical Scaling
- SELinuxChangePolicy, SELinuxMount
- Fine-Grained Supplemental Groups Policy
- User Namespace Support
ここでは、今回 GA になった機能のうち CPU Manager Policy Options について紹介します。
CPU Manager Policy Options KEP-2625 は Kubernetes 1.22 でアルファ、1.23 で ベータ、1.33 で GA になりました。
そもそも CPU Manager とは、Kubernetes で実行される コンテナ に対して、CPU リソースを効率的に割り当てるための機能です。
例えば static policy を利用することで、コンテナの CPU リソース要求量に対して、CPU コアを静的に(つまり、Core 0 と Core 1 を専有させるなど)割り当てることができます。
その際に Kubelet が、要求量の 2 コア 、という整数値から、どのコアを割り当てるかを決定する必要があります。
これを制御するのが CPU Manager Policy Options です。
同じ NUMA ノード内から コア を割り当てたい、別の NUMA ノードから コア を割り当てたい、など数多く存在する要件に対して、
それを満たすようなオプションを多数提供しています。
https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#cpu-policy-static--options に、オプションの一覧があります。
- full-pcpus-only (GA, visible by default) (1.33 or higher)
- distribute-cpus-across-numa (beta, visible by default) (1.33 or higher)
- align-by-socket (alpha, hidden by default) (1.25 or higher)
- distribute-cpus-across-cores (alpha, hidden by default) (1.31 or higher)
- strict-cpu-reservation (beta, visible by default) (1.32 or higher)
- prefer-align-cpus-by-uncorecache (alpha, hidden by default) (1.32 or higher)
CPU インテンシブなワークロードをベアメタルで実行する場合などに、チューニングに取り組んでみてください。
以下は Kubernetes 1.33 の CHANGELOG の和訳です。
Urgent Upgrade Notes
- クラスタ内のノードで
CrashLoopBackOff
状態のコンテナについて、コンテナ再起動時の初期遅延と最大遅延の両方を、推奨値である1s
の初期遅延と60s
の最大遅延に削減する機能を追加しました。この設定をノードに適用するには、feature gateReduceDefaultCrashLoopBackOffDecay
を有効にしてください。また、ノードごとに設定されたCrashLoopBackOff.MaxContainerRestartPeriod
とともに feature gateKubeletCrashLoopBackOffMax
を使用している場合、kubelet の実際の設定はドキュメント こちら で説明されている競合解決ポリシーに従います。(#130711, @lauralorenz) [SIG Node and Testing]
Changes By Kind
API Change
- 新しいアルファ feature gate
MutableCSINodeAllocatableCount
が導入されました。 この feature gate を有効にすると、CSINode.Spec.Drivers[*].Allocatable.Count
フィールドが変更可能になり、CSIDriver
オブジェクトにNodeAllocatableUpdatePeriodSeconds
という新しいフィールドが追加されます。これにより、ノードの報告済み割り当て可能ボリューム容量を周期的に更新できるようになり、kube-scheduler が依存する古い情報が原因でステートフル Pod がスタックするのを防ぎます。(#130007, @torredil) [SIG Apps, Node, Scheduling and Storage] - feature gate
DRAPartitionableDevices
を追加しました。有効にすると、動的リソース割り当てがパーティション可能なデバイスの割り当てをサポートします。(#130764, @cici37) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Scheduling, Storage and Testing] - リソース要求を満たすためのデバイス選択基準の「一意の」優先リストに対する DRA サポートを追加しました。(#128586, @mortent) [SIG API Machinery, Apps, Etcd, Node, Scheduling and Testing]
- kubelet エンドポイント用の
/flagz
エンドポイントを追加しました。(#128857, @zhifei92) [SIG Architecture, Instrumentation and Node] - 新しい StopSignal コンテナライフサイクルを使用してカスタム停止シグナルを設定するためのサポートを追加しました。(#130556, @sreeram-venkitesh) [SIG API Machinery, Apps, Node and Testing]
- サイドカー(
initContainers
内で定義されたコンテナでrestartPolicy
がAlways
に設定されている場合)を持つPodの In-place Pod Vertical Scaling をサポートしました。(#128367, @vivzbansal) [SIG API Machinery, Apps, CLI, Node, Scheduling and Testing] - CPU Manager Policy Option が Generally Available となりました。(#130535, @ffromani) [SIG API Machinery, Node and Testing]
- Pod APIを変更して、Podレベルのリソースとして
hugepage resources
をサポートしました。(#130577, @KevinTMtz) [SIG Apps, CLI, Node, Scheduling, Storage and Testing] - DRA API: 同じResourceClaimを使用できるPodの最大数が32から256に変更されました。この緩和された制限を使用しているクラスタをKubernetes 1.32.0にダウングレードすることはサポートされていません。バージョン1.32.0では、
status.reservedFor
フィールドに32を超えるエントリがあるResourceClaimの更新を拒否するためです。(#129543, @pohly) [SIG API Machinery, Node and Testing] - DRA: 属性文字列を使用したCEL式のコスト見積もりが不完全だったため、コスト制限を超えていました。(#129661, @pohly) [SIG Node]
- DRA: デバイスの taint により、DRAドライバや管理者がデバイスを使用不可としてマークできるようになります。taint の severity によって tolerate されていない taint がある場合は、Pod がスケジュールされなくなったり、実行中の Pod が停止されることもあります。 (#130447, @pohly) [SIG API Machinery, Apps, Architecture, Auth, Etcd, Instrumentation, Node, Scheduling and Testing]
- DRA: Kubernetes 1.33 以降、
kubernetes.io/dra-admin-access
ラベルが付与された管理者用ネームスペースへのアクセス権を持つユーザーのみが、この管理者用ネームスペース内でadminAccess
フィールドを持つ ResourceClaim または ResourceClaimTemplate オブジェクトを作成できます。これらの ResourceClaim や ResourceClaimTemplate を Pod や Deployment の仕様で参照できるのは、作成者本人のみに制限されます。(#130225, @ritazh) [SIG API Machinery, Apps, Auth, Node and Testing] - DRA: ノード上の「すべて」のデバイスを要求する場合、Kubernetes 1.32 まではデバイスが存在しないノードにも Pod をスケジュールしていましたが、Kubernetes 1.33 では少なくとも1つのデバイスが存在するノードのみを対象とするようになりました。「デバイスがなくてもスケジュールを継続する」動作が必要な場合は、今後実装予定の Prioritized List 機能を使用し、「すべて」のデバイスと「count: 0」の代替デバイスを指定してサブリクエストを送信してください。(#129560, @bart0sh) [SIG API Machinery and Node]
- ディスク上の kubelet 認証情報プロバイダーの設定を拡張し、オプションの
tokenAttribute
フィールドを設定可能にしました。設定すると、kubelet は現在の Pod とそのサービスアカウントに紐付けられた指定されたオーディエンスを持つトークンを生成します。この KSA トークンと設定で定義された KSA に必要なアノテーションは、kubelet 認証情報プロバイダープラグインに標準入力経由で送信されます(従来送信されていたイメージ情報も含まれます)。送信する KSA アノテーションは kubelet 認証情報プロバイダーの設定で変更可能です。(#128372, @aramase) [SIG API Machinery, Auth, Node and Testing] -
InPlacePodVerticalScaling
機能について、API サーバーはリサイズ要求を受信しても resize ステータスをProposed
に設定しなくなりました。(#130574, @natasha41575) [SIG Apps, Node and Testing] - PodAffinity (PodAntiAffinity) の
MatchLabelKeys
(MismatchLabelKeys) 機能を GA に昇格しました。(#130463, @sanposhiho) [SIG API Machinery, Apps, Node, Scheduling and Testing] - kubelet metrics
kubelet_image_volume_requested_total
,kubelet_image_volume_mounted_succeed_total
,kubelet_image_volume_mounted_errors_total
を追加しました。(#130135, @saschagrunert) [SIG API Machinery, Apps, Node and Testing] - InPlacePodVerticalScaling: メモリ制限値を減少させる場合、メモリリサイズ時の再起動ポリシーを
RestartContainer
に設定する必要があります。コンテナのresizePolicyは変更不可となりました。(#130183, @tallclair) [SIG Apps and Node] - KEP-3857: 再帰的な読み取り専用 (RRO) マウント: GA に昇格 (#130116, @AkihiroSuda) [SIG Apps, Node and Testing]
- kubelet:
KubeletConfiguration.subidsPerPod
を追加 (#130028, @AkihiroSuda) [SIG API Machinery and Node] -
MergeDefaultEvictionSettings
は、この設定で指定されている evictionHard、evictionSoft、evictionSoftGracePeriod、evictionMinimumReclaim フィールドのデフォルト値を、この設定で指定された値とマージすることを示します。この設定で指定されていないシグナルはデフォルト値を継承します。(#127577, @vaibhav2107) [SIG API Machinery and Node] - kubeletに新しい設定が追加され、コンテナイメージの追跡と取得成功に必要な認証情報を管理できるようになりました。この情報はホストの再起動やkubeletの再起動後も保持されます。kubeletは、認証情報の確認が必要なイメージについて、kubeletの再起動時に認証情報が存在しない場合必ず取得するようにし、認証を強制します。これにより、podが
IfNotPresent
の ImagePullPolicy を指定していても、kubeletは認証情報が存在しない場合はイメージの取得を試み、ImagePullPolicy がNever
で認証情報が提供できない場合は、Podの起動に失敗する可能性があります。(#128152, @stlaz) [SIG API Machinery, Architecture, Auth, Node and Testing] -
NodeInclusionPolicyInPodTopologySpread
をv1.33で安定版に昇格しました。(#130920, @kerthcet) [SIG Apps, Node, Scheduling and Testing] - Graduated feature gate
CPUManager
を削除しました。(#129296, @carlory) [SIG API Machinery, Node and Testing] -
node.status.nodeSystemInfo
にスワップ容量の情報を追加しました。(#129954, @iholder101) [SIG API Machinery, Apps and Node] - feature gate
InPlacePodVerticalScalingAllocatedStatus
は非推奨となり、使用されなくなりました。ContainerStatus
のAllocatedResources
フィールドはInPlacePodVerticalScaling
feature gate で保護されるようになりました。(#130880, @tallclair) [SIG CLI, Node and Scheduling] - kubeletは
PodObservedGenerationTracking
feature gate が設定されている場合、podの条件にobservedGeneration
フィールドを設定するようになりました。(#130573, @natasha41575) [SIG Apps, Node, Scheduling, Storage, Testing and Windows] - DRA:
resource.k8s.io/v1beta1
API が非推奨になり、Kubernetes 1.36 以降で削除されます。代わりにresource.k8s.io/v1beta2
を使用してください。 (#129970, @mortent) [SIG API Machinery, Apps, Auth, Etcd, Node, Scheduling and Testing]
Feature
- ノードメトリクスに Pressure Stall Information (PSI) メトリクスを追加しました。 (#130701, @roycaihw) [SIG Node and Testing]
- リソースアラインメントエラーの主な原因を公開するメトリクスを追加しました。 (#129950, @ffromani) [SIG Node and Testing]
- kubelet に
/statusz
HTTP エンドポイントを追加しました。 (#128811, @zhifei92) [SIG Architecture, Instrumentation and Node] - CPU Manager の static policy に新しいオプション
strict-cpu-reservation
を追加しました。このオプションが有効になっている場合、reservedSystemCPUs
の CPU コアは system daemon と interrupt processing に厳密に使用され、どのワークロードにも利用できなくなります。 (#130290, @psasnal) [SIG Node and Testing] - kubelet 設定ファイル内の
containerLogMaxFiles
の検証を追加しました。 (#129072, @kannon92) [SIG Node] -
ProcMountType
機能がデフォルトで有効なベータに移行しました (#130798、@haircommander) [SIG Node] - DRA: Kubernetes 1.33 以降、namespaced cluster
edit
ロールが割り当てられた通常ユーザーは、resourceclaims
、resourceclaims/status
、resourceclaimtemplates
に対するread
権限と、resourceclaims
、resourceclaimtemplates
に対するwrite
権限を持つようになりました。(#130738、@ritazh) [SIG Auth] -
DRAResourceClaimDeviceStatus
がデフォルトで有効になり、DRA-Driver が各割り当てデバイスのデバイスステータスデータを報告できるようになりました。(#130814、@LionelJouin) [SIG Network and Node] -
DistributeCPUsAcrossNUMA
ポリシーオプションがデフォルトで有効なベータに移行しました。(#130541、@swatisehgal) [SIG Node] - Feature gate
UserNamespacesSupport
をデフォルトで有効化しました。(#130138、@rata) [SIG Node and Testing] - Pod のリサイズ操作中に発生していたエラーが、
PodResizeInProgress
状態として表示されるようになりました。(#130902, @natasha41575) - コンテナレベルのスワップメトリクス収集に関する不具合を修正しました。(#129486, @iholder101) [SIG Node and Testing]
-
DisableNodeKubeProxyVersion
feature gate をデフォルトで有効化するように変更しました。これにより、kubeletは関連ノードの.status.kubeProxyVersion
フィールドを設定しなくなりました。(#129713, @HirazawaUi) [SIG Node] -
KubeletFineGrainedAuthz
feature gate をデフォルト有効なベータに移行しました。(#129656, @vinayakankugoyal) [SIG Auth, CLI, Node, Storage and Testing] - レガシーコードパスを有効にする
LegacySidecarContainers
feature gate を導入しました。この一時的 feature gate はデフォルトで無効になっており、v1.33でのみ利用可能で、v1.34で削除されます。(#130058, @gjkim42) [SIG Node] - KEP-3619: fine-grained supplemental groups policyがベータに移行しました。kubeletは現在、この機能をサポートしていないノードにスケジュールされた
.spec.securityContext.supplementalGroupsPolicy: Strict
を持つ Pod を拒否します。(#130210, @everpeace) [SIG Apps, Node and Testing] - kubelet + DRA: DRAドライバプラグイン(およびそれのみ)について、kubeletはドライバのDaemonSetで
maxSurge > 0
を使用したローリングアップデートをサポートします。DRAドライバはこれをサポートする必要があり、k8s.io/dynamic-resource-allocation/kubeletpluginヘルパーパッケージを使用して実装できます。(#129832, @pohly) [SIG Node, Storage and Testing] - Podリソースのチェックポイントは
allocated_pods_state
とactuated_pods_state
ファイルで管理されるようになり、以前使用されていたpod_status_manager_state
は廃止されました。(#130599, @tallclair) [SIG Node] -
PodLifecycleSleepAction
がデフォルトで有効化され、ユーザーはスリープライフサイクルアクションを持つコンテナを0秒の期間で作成できるようになりました。(#130621, @sreeram-venkitesh) [SIG Node] - In-place Pod Vertical Scaling がベータとして提供開始されました。
InPlacePodVerticalScaling
feature gate はデフォルトで有効化されています。(#130905, @tallclair) [SIG Node] - SELinuxChangePolicyとSELinuxMountがベータに昇格しました。SELinuxMountはデフォルトで無効のままです。(#130544, @jsafrane) [SIG Auth, Node and Storage]
-
SidecarContainers
機能が GA に昇格しました。'SidecarContainers' feature gate はデフォルト値にロックされ、v1.36 で削除されます。この feature gate を明示的に設定していた場合は、今すぐ削除してください。(#129731, @gjkim42) [SIG Apps, Node, Scheduling and Testing] -
UserNamespacesSupport
feature gate をデフォルト有効なベータに移行しました。 (#130138, @rata) [SIG Node and Testing]
Bug or Regression
- ボリュームの権限と所有権の変更に対する進捗追跡を追加しました。 (#130398, @gnufied) [SIG Node and Storage]
-
PublishResources()
のシグネチャを変更し、ResourceSlices
がResources
パラメータの代わりにresourceslice.DriverResources
パラメータを受け入れるようにしました。 (#129142, @googs1025) [SIG Node and Testing] - DRA: ResourceClaims を使用していない Pod がスケジュール不能だった理由の説明に、他の理由でスケジュール不能だった場合に不要な「no new claims to deallocate」という文言が含まれていました。 (#129823, @googs1025) [SIG Node and Scheduling]
- スワップが有効になっているコンテナで、メモリの ResizePolicy が RestartContainer でない場合の InPlace Pod リサイズを無効化しました。 (#130831, @ajaysundark) [SIG Node and Testing]
-
InPlacePodVerticalScalingExclusiveCPUs
feature gate の排他的割り当て可用性チェックのバグを修正しました。 (#130559, @esotsal) [SIG Node] - 新しいシークレットや ConfigMap を参照する Pod に一時コンテナを追加すると、その新しいシークレットや ConfigMap に Pod がアクセスできなくなるバグを修正しました。(#114984, @cslink) (#129670, @cslink) [SIG Auth]
- 1.32 で発生していた、
postStart
フックを持つ Pod が起動できなくなる問題を修正しました。(#129946, @alex-petrov-vt) [SIG Node] - 1.32 で発生していた、kubelet が再起動後にノードがステータスを報告できず、サービス証明書を更新できなくなる問題を修正しました。(#130348, @aojea) [SIG Node]
- kubelet が再起動時に Pod の PVC がユーザーによって削除されている場合、実行中の Pod のボリュームをアンマウントする問題を修正しました。(#130335, @carlory) [SIG Node, Storage and Testing]
- ノードの再起動後、Pod のフェーズが Pending のままになる問題を修正しました。(#128516, @gjkim42) [SIG Node and Testing]
- 圧縮されたkubeletログファイルのパーミッションを、非圧縮のkubeletログファイルのパーミッションを使用するように修正しました。(#129893, @simonfogliato) [SIG Node]
- kubeletのproberモジュールにおいて、
Unknown
ステータスのプローブ結果に対するログ記録とイベント記録を実装しました。これにより、コンテナプローブがUnknown
結果を返した場合の診断と監視が改善され、ヘルスチェックの可観測性と信頼性が向上しました。(#125901, @jralmaraz) - リブートイベントの報告を改善しました。kubeletが関連ノードにステータスを書き込みできない場合(リトライがトリガーされる場合)でも、サーバーレベルのリブートが検出された場合、kubeletは1つのリブートイベントのみを発行します。(#129151, @rphillips) [SIG Node]
- WebSockets HTTPSプロキシのサポートを追加しました。(#129872, @seans3) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Instrumentation, Network and Node]
- Linuxユーザーネームスペースとカーネルバージョンに関連する警告を削除しました。以前は、 feature gate
UserNamespacesSupport
が有効になっている場合、kubeletはLinuxカーネルバージョンが6.3.0より古いことを検出すると警告を表示していました。ユーザーネームスペースのサポートは通常カーネル6.3以降を必要としますが、古いカーネルでも動作する場合があります。(#130243, @rata) [SIG Node] -
cpu-manager-policy=static
が設定されている場合、Static CPU 割り当ての条件を満たすコンテナ(つまり、Guaranteed
QoSの Pod で、整数値の CPUrequests
を持つコンテナ)には cfs クォータが適用されなくなります。この修正は長年の動作を変更するため、regression を観測したユーザーはデフォルトで有効になっているDisableCPUQuotaWithExclusiveCPUs
feature gate を使用して以前の動作を復元できます。問題が発生して feature gate を使用する必要がある場合は、問題を報告してください。(#127525, @scott-grimes) [SIG Node and Testing]
Other (Cleanup or Flake)
- NUMAノード間のCPU使用率分布を計測するメトリクスを追加 (#130491, @swatisehgal) [SIG Node and Testing]
- Uncore(L3キャッシュ)ブロックの割り当てを追跡するメトリクスを追加 (#130133, @ffromani) [SIG Node and Testing]
-
StorageNamespaceIndex
feature gate をfalse
に設定し、非推奨化 (#129933, @serathius) [SIG Node] - iptables バイナリがインストールされていないシステムで実行されている場合、kubelet が複数回のエラーをログに記録しなくなりました。(#129826, @danwinship) [SIG Network and Node]
- Graduated feature gate
AppArmor
を削除しました。(#129375, @carlory) [SIG Auth and Node] - Graduated feature gate
AppArmorFields
を削除しました。(#129497, @carlory) [SIG Node] - CNI プラグインを
v1.6.2
に更新しました。(#129776, @saschagrunert) [SIG Cloud Provider, Node and Testing] - etcd クライアントライブラリを
v3.5.21
に更新しました。(#131103, @ahrtr) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Etcd, Instrumentation, Network, Node and Storage]