本記事は、Kubernetes 変更内容共有会(v1.31) の SIG-Node(kubelet)に関する資料として準備されました。
Kubernetes 1.31の CHANGELOG から、SIG-Nodeに関するところを抜粋して紹介します。
は筆者(@y1r96)による補足です。
所感
今回の Kubernetes 1.31 の SIG-Node (kubelet) の変更内容で、印象に残ったいくつかの機能を紹介します。
ImageVolume の Alpha サポート
OCI Artifact や Image を Pod 上にマウントする機能が開発されています。使い方としては以下のような方法が KEP で紹介されています:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
volumes:
- name: oci-volume
image:
reference: "example.com/my-image:latest"
pullPolicy: IfNotPresent
containers:
- name: my-container
image: busybox
volumeMounts:
- mountPath: /data
name: oci-volume
上の YAML の場合、example.com/my-image:latest
というイメージが /data
にマウントされます。
機械学習系のワークロードなど、大容量のデータを扱うがそれをコンテナイメージに含めるのは適切でない(例えば、リリースサイクルがランタイムとモデルで異なる場合や、1つのモデルを複数のランタイムで利用する場合)場合に有用そうです。
セキュリティ上の懸念から、ここでマウントされるディレクトリは readOnly
かつ noexec
でマウントする形で提案されています。
大きなライブラリやコンパイラなどを扱うことを考えると、readOnly
はよいですが、noexec
は少し使い勝手が悪いかもしれず、その辺りがどのように進んでいくかに興味があります。
SupplementalGroupsPolicy の導入
これまでの Kubernetes では、コンテナイメージ内の /etc/groups
と、SecurityContext で指定した supplementalGroups がマージされて、コンテナのプライマリグループに設定されていました。
このふるまいは、セキュリティを向上させるために設定する SecurityContext としては少し違和感があり、ユーザに誤解を招いていた可能性がありました。
この KEP では、従来どおりのこの挙動を維持する Merge
と、指定した supplementalGroups のみを設定する Strict
の2つのモードを導入しました。
ユーザは、Strict
モードを選択することで、コンテナイメージ内のグループを無視して、SecurityContext で指定した supplementalGroups のみを設定し、セキュリティを向上させることができます。
Woven By Toyota 社の大村さん (@everpeace) が PFN 時代にこの問題を発見して提案したものです。PFN ではこの問題に対して Fine-grained SupplementalGroups control と同じ動作を強制する runc ラッパーを使用して対処してきましたが、いよいよその必要がなくなりそうです。
cgroup v1 のメンテナンスモード化
Kubernetes 1.31 から、cgroup v1 のサポートはメンテナンスモードとなりました。
背景として、Linux Kernel のコミュニティは cgroup v2 の開発に注力しており、systemd のような 一部のディストリビューションやプロジェクトでは cgroup v1 のサポートを段階的に廃止しており、Kubernetes もこの動きに追従していくということで、これが提案されました。
具体的にいつ cgroup v1 が非推奨になったり、サポート終了が決まっていくかは今後の KEP で検討されるということになっています。
この KEP では、機能を freeze したり、cgroup v2 への移行を促進するための機能を提案しています:
-
PR 125328
- kubelet が cgroup v1 を利用していることを警告ログやイベント、メトリクスで通知するようになりました。
-
PR 126031
- kubelet が cgroup v1 環境で起動しないようにする
--fail-cgroupv1
フラグを追加しました。
- kubelet が cgroup v1 環境で起動しないようにする
-
PR 125496
- cgroup v1 と cgroup v2 で
cgroup_manager
の実装が分離されました。
- cgroup v1 と cgroup v2 で
cgroup v2 を使用すると memory.oom.group
が有効化されます。Pod で OOM が発生した場合に v1 ではそのプロセスのみが殺されますが、これが有効になると Pod 全体が殺されるようになります。Pod の安定化を目指したものですが、一部ワークロードでは子プロセスが OOM で殺されても問題ないように作られているケースがあり、これまでは処理が継続されていたものが終了されてしまうようになります (詳しくは Kubernetes と cgroup v2 を参照)。
v1.31 時点で無効化する機能が存在しないため、問題になる場合は v1 に留まったほうがよいでしょう。PFN では大きな問題になり kubelet にパッチを入れてしのいでいますが、v1.32 でノード単位で挙動を変更するフラグの追加を目指しています (https://github.com/kubernetes/kubernetes/pull/126096)。
Changes by Kind
Deprecation
- CephFS volume plugin (
kubernetes.io/cephfs
) がこのリリースで削除され、cephfs
volume type が機能しないようになりました。 代わりに CephFS CSI driver (https://github.com/ceph/ceph-csi/) を利用してください。 クラスタを 1.31 以上に更新する前に、kubernetes.io/cephfs
volume plugin を利用しているアプリケーションは再デプロイされる必要があります。(#124544, @carlory) [SIG Node, Scalability, Storage and Testing] [sig/scalability,sig/storage,sig/node,sig/testing] - CephRBD volume plugin (
kubernetes.io/rbd
) がこのリリースで削除され、rbd
volume type が機能しないようになりました。代わりに RBD CSI driver (https://github.com/ceph/ceph-csi/) を利用してください。 クラスタを 1.31 以上に更新する前に、kubernetes.io/rbd
volume plugin を利用しているアプリケーションは再デプロイされる必要があります。 (#124546, @carlory) [SIG Node, Scalability, Scheduling, Storage and Testing] [sig/scalability,sig/scheduling,sig/storage,sig/node,sig/testing]
API Change
- アクションが必要: Dynamic Resource Allocation (DRA) ドライバの DaemonSet は、ResourceSlice の書き込みと ResourceClaim オブジェクトの読み取りを有効にするサービスアカウントでデプロイする必要があります。(#125163, @pohly) [SIG Auth, Node and Testing] [sig/node,sig/auth,sig/testing]
- NodeRuntimeHandlerFeatures に UserNamespaces field を追加しました。 (#126034, @sohankunkerkar) [SIG API Machinery, Apps and Node] [sig/node,sig/api-machinery,sig/apps]
-
- NodeRuntimeHandlerFeatures は、Node オブジェクト内の .status.runtimeHandlers に含まれるフィールドで、UserNamespaces が runtime handler でサポートされているかどうかを示すフィールドです。
-
- Node オブジェクトに
.status.features.supplementalGroupsPolicy
フィールドを追加しました。このフィールドは、supplementalGroupsPolicy が CRI に実装されている場合に true になります。 (#125470, @everpeace) [SIG API Machinery, Apps, Node and Testing] [sig/node,sig/api-machinery,sig/apps,sig/testing]-
- supplementalGroupsPolicy についての詳細は Kubernetes Blog のこちらを参照してください。Pod の実行ユーザが所属するグループが、これまではコンテナイメージ内の
/etc/groups
と 指定した supplementalGroups を併合したものに設定されていましたが、Kubernetes 1.31 から strict policy が導入され、supplementalGroups に指定されたグループのみが設定されるようになります。このフィールドは、この機能が CRI に実装されているかどうかを示すものです。
- supplementalGroupsPolicy についての詳細は Kubernetes Blog のこちらを参照してください。Pod の実行ユーザが所属するグループが、これまではコンテナイメージ内の
-
- それぞれのコンテナステータスに
allocatedResourcesStatus
を追加し、デバイスプラグインによって公開されたデバイスのヘルスステータスを示すようにしました。(#126243, @SergeyKanzhelev) [SIG API Machinery, Apps, Node and Testing] [sig/node,sig/api-machinery,sig/apps,sig/testing]-
- これまでの Device Plugin と Kubelet の間の rpc の定義には、ListAndWatchResponse という デバイスのヘルスステータスを常に返すストリームがありましたが、この情報がコンテナのステータスには反映されていませんでした。この PR ではその情報を活用してヘルスステータスをコンテナのステータスに反映するようにしました。
- rpc 定義には変更がないので、ListAndWatch でステータスを返してさえいれば、Device Plugin の開発者はとくに変更を加える必要はありません。
-
- Kubelet boolean flag
--fail-cgroupv1
を追加しました。(#126031, @harche) [SIG API Machinery and Node] [sig/node,sig/api-machinery]-
- cgroup v1 環境で kubelet が起動しないようにするフラグです。Kubernetes 1.31 より、cgroup v1 サポートはメンテナンスモードとなりました。
-
-
LocalStorageCapacityIsolation
が Beta に昇格して、デフォルト有効になりました。対象の pod が user namespace を利用している場合、kubelet で storage capacity isolation が有効になります。(#126014, @PannagaRao) [SIG Apps, Autoscaling, Node, Storage and Testing] [sig/storage,sig/node,sig/autoscaling,sig/apps,sig/testing] - OCI Artifact や Image のマウントサポートが Pod API に追加されました。
ImageVolume
feature gate が有効になっている場合に利用できます。(#125660, @saschagrunert) [SIG API Machinery, Apps and Node] [sig/node,sig/api-machinery,sig/apps] - 細粒度な supplemental group policy (KEP-3619) がサポートされ、最初のコンテナプロセスで supplemental group の細かい制御が可能になりました。これにより、コンテナイメージで指定されたグループ (/etc/group) をコンテナのプライマリ UID に含めるかどうかを選択できるようになります。 (#117842, @everpeace) [SIG API Machinery, Apps and Node] [sig/node,sig/api-machinery,sig/apps]
- ユーザは異なる static policy option
SpreadPhysicalCPUsPreferredOption
を選択できるようになりました。これにより、特定のアプリケーションに対して物理 CPU にまたがって CPU コアを分散させることができます。(#123733, @Jeffwan) [SIG Node] [sig/node]
Feature
- TopologyManager の policy のオプションとして
max-allowable-numa-nodes
を追加しました。これは kubelet のmaxAllowableNUMANodes
を設定するものです。 (#124148, @cyclinder) [SIG Node and Testing] [sig/node,sig/testing]-
- TopologyManager は、Pod が依存するいくつかのリソース(CPU, Memory, その他 Device Plugin で拡張しているリソース)が、近い NUMA ノードに配置されるようにする機能です。これまでは、NUMA ノードに関する計算量を制約する観点から、サポートされている NUMA ノード数が 8 に設定されていましたが、この PR で
max-allowable-numa-nodes
を設定することでこの制約を緩和することができるようになりました。
- TopologyManager は、Pod が依存するいくつかのリソース(CPU, Memory, その他 Device Plugin で拡張しているリソース)が、近い NUMA ノードに配置されるようにする機能です。これまでは、NUMA ノードに関する計算量を制約する観点から、サポートされている NUMA ノード数が 8 に設定されていましたが、この PR で
-
- OCI VolumeSource に関する Container Runtime Interface API のフィールドと型が追加されました。(#125659, @saschagrunert) [SIG Node] [sig/node]
-
cri-client
staging repository が追加されました。 (#123797, @saschagrunert) [SIG API Machinery, Node, Release and Testing] [sig/node,sig/api-machinery,sig/testing,sig/release] - cgroupv1 が利用されていることを警告ログやイベント、メトリクスで通知するようにしました。 (#125328, @harche) [sig/node]
- Kubelet が証明書ファイルを動的にロードする機能を追加しました。 (#124574, @zhangweikop) [SIG Auth and Node] [sig/node,sig/auth]
- Kubelet が CRI に対して cgroup ドライバのメカニズムを問い合わせる機能をベータに昇格しました。
KubeletCgroupDriverFromCRI
feature gate がベータになり、デフォルトで有効になりました。これにより、kubelet は CRI を使用してコンテナランタイムに問い合わせ、cgroup 管理のメカニズムを取得することができます。コンテナランタイムがこれをサポートしていない場合、kubelet は設定ファイルを使用してフォールバックします(非推奨の--cgroup-driver
コマンドライン引数も使用できます)。(#125828, @haircommander) [SIG Node] [sig/node]-
- cgroup ドライバ としては、systemd と cgroupfs が想定されています。
-
- Linux の swap ハンドリングを変更し、高優先度の Pod に対して swap へのアクセスを制限しました。新しい Pod が node- または cluster-critical な優先度を持つ場合、Linux では swap へのアクセスが禁止されます。これは、クラスタやノードの設定が許可している場合でも、そのような制限がかかります。(#125277, @iholder101) [SIG Node and Testing] [sig/node,sig/testing]
-
- kubelettypes.IsCriticalPod によって対象となる Pod を判定しています。優先度が system-node-critical, system-cluster-critical, または、static pod か mirror pod の場合は、swap へのアクセスが禁止されます。
-
- kubelet が CRI サーバーが利用できない場合にもログをストリーミングし続けるようにしました。(#124025, @saschagrunert) [SIG Node] [sig/node]
- kubelet が、Node オブジェクトの
.status.addresses
に少なくとも 1 つの IP アドレスがある場合にのみ、サービング証明書をリクエストするように強制しました。これにより、外部で設定されたアドレスが設定される前に DNS のみのサービング証明書をリクエストすることが避けられます。1.33 まで、以前の動作は kubelet で廃止予定のAllowDNSOnlyNodeCSR
feature gate を true に設定することで選択できます。(#125813, @aojea) [SIG Auth, Cloud Provider and Node] [sig/node,sig/auth,sig/cloud-provider] - Windows ノードにおいて memory-pressure eviction が実装されていなかった問題を修正しました。(#122922, @marosset) [SIG Node, Testing and Windows] [sig/node,sig/windows,sig/testing]
- Kubernetes の AppArmor サポートが GA に昇格しました。
AppArmor
feature gate を無効にすることはできなくなりました。(#125257, @vinayakankugoyal) [SIG Apps, Node and Testing] [sig/node,sig/apps,sig/testing] - Container Device Interface (CDI) が GA に昇格しました。
DevicePluginCDIDevices
feature gate が無条件で有効になりました。 (#123315, @bart0sh) [SIG Node] [sig/node] - KEP-3857: RecursiveReadOnlyMounts feature が beta に昇格しました。(#125475, @AkihiroSuda) [SIG Node] [sig/node]
- Kubelet が、Pod の spec に image 以外のフィールドが変更された場合にコンテナを再起動しない問題を修正しました。(#124220, @HirazawaUi) [sig/node]
- Kubelet/stats: cadvisor memory cache error が発生した場合に INFO ログレベルを設定しました。(#125656, @gyuho) [sig/node]
- Kubelet: Windows でサポートされていないオプション
CgroupsPerQOS
とEnforceNodeAllocatable
に対してエラーではなく警告を出すようにしました。(#123137, @neolit123) [SIG Node and Windows] [sig/node,sig/windows] - ProcMountType feature gate を beta に昇格しました。(#125259, @sohankunkerkar) [sig/node]
-
- /proc をマウントする機能を制御する feature gate です。通常はコンテナに公開するべきではない情報を隠すためにマスクしていたり読み取り専用にしたりするなどの制約が設定されていますが、この制約が不要なコンテナについては ProcMontType を設定することで制約を緩和することができます。
-
- Service が ClusterIP と Type フィールドに対するフィールドセレクターを実装しました。Kubelet はこのフィールドセレクターを使用して Headless Service の監視を避けるようになり、メモリ消費を削減できるようになりました。(#123905, @aojea) [SIG Apps, Node and Testing] [sig/node,sig/apps,sig/testing]
- PodDistruptionBudget
spec.unhealthyPodEvictionPolicy
フィールドが GA に昇格しました。このフィールドはAlwaysAllow
に設定することで、PodDistruptionBudget にカバーされる unhealthy な Pod を常に削除できるようになります。(#123428, @atiratree) [SIG Apps, Auth, Node and Testing] [sig/node,sig/auth,sig/apps,sig/testing]-
- 一度 unhealthy になった Pod は二度と Healthy にならないという仮定に基づく機能で、AlwaysAllow に設定すると unhealthy な Pod は PDB を無視して削除されるようになります。
-
-
KubeletSepareteDiskGC
が beta に昇格しました。この機能は、kubelet が別々のファイルシステムにデプロイされたイメージ(読み取り専用レイヤー)および/またはコンテナ(書き込み可能レイヤー)のガベージコレクションを実行できるようにします。(#126205, @kwilczynski) [sig/node] - Kubelet の read-only endpoint が tracing をサポートしました。
WithPublicEndpoint
オプションを使用して、呼び出し元がサンプリングの決定に影響を与えないようにしています。(#121770, @frzifus) [SIG Node] [sig/node]
Failing Test
-
SplitImageFilesystem
feature gate が有効になっているが、コンテナランタイムが設定されていない場合のバグが kubelet で修正されました。(#126335, @kannon92) [sig/node] - Windows コンテナログのフォローがコンテナログのローテーションを妨げる問題を修正しました。(#124444, @claudiubelu) [SIG Node, Testing and Windows] [sig/node,sig/windows,sig/testing]
Bug or Regression
-
ResourceClaim
コントローラーがpodSchedulingSynced
とtemplatesSynced
を待機するのを忘れていた問題を修正しました。(#124589, @carlory) [SIG Apps and Node] [sig/node,sig/apps] -
/sys/devices/virtual/powercap
をデフォルトのマスクされたパスに追加しました。これにより、これらのファイルを読み取ることで発生する可能性のある電力ベースのサイドチャネル攻撃を回避することができます。(#125970, @carlory) [sig/node] - Dynamic Resource Allocation (DRA): 構造化されたパラメータを claim で利用していて、pod 間でその claim が再利用されると、無効な状態(確保されているが finalizer が設定されていない)claim が生成され、それによって claim を利用している pod のスケジューリングが停止する可能性がありました。(#124931, @pohly) [SIG Node and Scheduling] [sig/scheduling,sig/node]
- Dynamic Resource Allocator (DRA): ResourceClaimParametersReference と ResourceClassParametersReference の検証を強化しました。以下のルールが適用されます:
- terminal pod に対して一時的に PodIP フィールドが削除されるバグを修正しました。(#125404, @mimowo) [SIG Node and Testing] [sig/node,sig/testing]
-
Always
restartPolicy を持つ init コンテナが、まだ初期化されていない場合に正常に終了しない可能性があるバグを修正しました。(#125935, @gjkim42) [SIG Node and Testing] [sig/node,sig/testing]-
- いわゆる sidecar コンテナのバグ修正です。
-
- resource pressure が原因による hard eviction が発生したときに、pod に設定されていた grace period が尊重されてしまっていたバグを修正しました。現在は grace period が 1 秒に設定されます。(#124063, @olyazavr) [sig/node]
- Kubelet が pod の process usage を誤って計算していたバグを修正しました。これにより、PID 使用量のために pod が決して evicted されない問題が解消されました。(#124101, @haircommander) [SIG Node and Testing] [sig/node,sig/testing]
- Kubelet が
kubelet --hostname-override
が外部クラウドプロバイダーと正しく動作しなくなっていたリグレッションを修正しました。(#124516, @danwinship) [sig/node] - Kubelet が DRA(Dynamic Resource Allocation) ドライバが Node(Un)PrepareResources レスポンスの一部として空の構造体ではなく nil を返すとクラッシュする問題を修正しました。Go で書かれた driver は影響を受けておらず、Rust で実装された driver で発見されました。(#124091, @bitoku) [sig/node]
- kubelet が 再起動したとき、
container runtime status check may not have completed yet
で notReady が報告される問題を修正しました。(#124430, @AllenXu93) [sig/node] - Kubelet が pod の condition に scheduling gate を設定したときに、null の
lastTransitionTime
が設定されていた問題を修正しました。(#122636, @lianghao208) [SIG Node and Scheduling] [sig/scheduling,sig/node] - Pod が 不正な initContainerStatus を持つ場合に pod を出力する際に発生する 1.28 のリグレッションを修正しました。(#124906, @liggitt) [sig/node]
- node が AppArmor をサポートしていない場合に、AppArmor を持つ pod をハードリジェクトするようにしました。(#125776, @vinayakankugoyal) [sig/node]
- ProcMountType を default 無効に設定して、UserNamespacesSupport に従うようにしました。(#126291, @haircommander) [SIG Node] [sig/node]
- wmic を Windows で uuid を取得するために使用しないようにしました。(#126012, @marosset) [SIG Node and Windows] [sig/node,sig/windows]
Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.: (#125272, @mauri870) [sig/testing]
なし
Other (Cleanup or Flake)
- アクションが必要: v1alpha2 kubelet gRPC API を使用している Dynamic Resource Allocation (DRA) ドライバはサポートされなくなりました。アップデートが必要です。(#124316, @pohly) [SIG Node and Testing] [sig/node,sig/testing]
- Dynamic Resource Allocation (DRA): pod のスケジューリング中に発生していた競合状態を修正しました。(#124595, @pohly) [SIG Node, Scheduling and Testing] [sig/scheduling,sig/node,sig/testing]
- Kubelet は 1.20 よりも古いデバイスマネージャの状態ファイルから回復できなくなりました。適切な推奨されるアップグレードフローに従っていれば問題ありません。(#123398, @ffromani) [SIG Node and Testing] [sig/node,sig/testing]
- remote CRI implementation が kubelet から
k8s.io/cri-client
に移動しました。(#124634, @saschagrunert) [SIG Node, Release and Testing] [sig/node,sig/testing,sig/release] - Kubelet の
--iptables-masquerade-bit
と--iptables-drop-bit
フラグが削除されました。これらは v1.28 で非推奨になり、完全に削除されました。(#122363, @carlory) [SIG Network and Node] [sig/network,sig/node] -
ConsistentHTTPGetHandlers
という GA 済みの feature gate が削除されました。(#124463, @carlory) [sig/node] -
LocalStorageCapacityIsolationFSQuotaMonitoring
をデフォルトで false に設定して。UserNamespacesSupport
に対応するようにしました。この機能に依存しています。(#126355, @haircommander) [sig/node] - CNI Plugins を v1.5.0 に更新しました。 (#125113, @bzsuni) [SIG Cloud Provider, Network, Node and Testing] [sig/network,sig/node,sig/testing,sig/cloud-provider]
- cni-plugins を v1.4.1 に更新しました。 (#123894, @saschagrunert) [SIG Cloud Provider, Node and Testing] [sig/node,sig/testing,sig/cloud-provider]
- cri-tools を v1.30.0 に更新しました。 (#124364, @saschagrunert) [SIG Cloud Provider, Node and Release] [sig/node,sig/release,sig/cloud-provider]