From dd0882a83e06accf8827275a933dee05e5b97873 Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Sat, 9 Mar 2024 09:48:16 +0900 Subject: [PATCH] kubelet: expose `node.status.runtimeClasses` For KEP-3857: Recursive Read-only (RRO) mounts Signed-off-by: Akihiro Suda --- pkg/kubelet/kubelet_node_status.go | 1 + pkg/kubelet/nodestatus/setters.go | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/pkg/kubelet/kubelet_node_status.go b/pkg/kubelet/kubelet_node_status.go index 46bd7c3579f..22458406686 100644 --- a/pkg/kubelet/kubelet_node_status.go +++ b/pkg/kubelet/kubelet_node_status.go @@ -741,6 +741,7 @@ func (kl *Kubelet) defaultNodeStatusFuncs() []func(context.Context, *v1.Node) er nodestatus.DaemonEndpoints(kl.daemonEndpoints), nodestatus.Images(kl.nodeStatusMaxImages, kl.imageManager.GetImageList), nodestatus.GoRuntime(), + nodestatus.RuntimeClasses(kl.runtimeState.runtimeHandlers), ) // Volume limits setters = append(setters, nodestatus.VolumeLimits(kl.volumePluginMgr.ListVolumePluginWithLimits)) diff --git a/pkg/kubelet/nodestatus/setters.go b/pkg/kubelet/nodestatus/setters.go index 58a5eb3c1a8..8155c08e107 100644 --- a/pkg/kubelet/nodestatus/setters.go +++ b/pkg/kubelet/nodestatus/setters.go @@ -480,6 +480,26 @@ func GoRuntime() Setter { } } +// RuntimeClasses returns a Setter that sets RuntimeClasses on the node. +func RuntimeClasses(fn func() []kubecontainer.RuntimeHandler) Setter { + return func(ctx context.Context, node *v1.Node) error { + if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) { + return nil + } + handlers := fn() + node.Status.RuntimeClasses = make([]v1.NodeRuntimeClass, len(handlers)) + for i, h := range handlers { + node.Status.RuntimeClasses[i] = v1.NodeRuntimeClass{ + Name: h.Name, + Features: &v1.NodeRuntimeClassFeatures{ + RecursiveReadOnlyMounts: &h.SupportsRecursiveReadOnlyMounts, + }, + } + } + return nil + } +} + // ReadyCondition returns a Setter that updates the v1.NodeReady condition on the node. func ReadyCondition( nowFunc func() time.Time, // typically Kubelet.clock.Now