From d7797fbc616155cbb7156d1f0a9fc4d4a9d83450 Mon Sep 17 00:00:00 2001 From: Markus Lehtonen Date: Fri, 16 Jun 2023 12:06:04 +0300 Subject: [PATCH] kubelet: get cgroup driver config from CRI This patch modifies kubelet to get the cgroup driver setting from the CRI runtime using the newly added RuntimeConfig rpc. The new code path only takes place if the KubeletCgroupDriverFromCRI feature gate is enabled. If the runtime returns a not-implemented error kubelet falls back to using the cgroupDriver configuration option, with a log message instructing the user to upgrade to w newer container runtime. Other rpc errors cause kubelet to exit as is the case if the runtime returns an unknown cgroup driver. --- cmd/kubelet/app/server.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 8fa32e2cce6..55769ec3b4c 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -35,6 +35,8 @@ import ( "github.com/coreos/go-systemd/v22/daemon" "github.com/spf13/cobra" "github.com/spf13/pflag" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "k8s.io/klog/v2" "k8s.io/mount-utils" @@ -76,6 +78,7 @@ import ( "k8s.io/component-base/version" "k8s.io/component-base/version/verflag" nodeutil "k8s.io/component-helpers/node/util" + runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1" kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1" "k8s.io/kubernetes/cmd/kubelet/app/options" "k8s.io/kubernetes/pkg/api/legacyscheme" @@ -629,6 +632,13 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend return err } + // Get cgroup driver setting from CRI + if utilfeature.DefaultFeatureGate.Enabled(features.KubeletCgroupDriverFromCRI) { + if err := getCgroupDriverFromCRI(ctx, s, kubeDeps); err != nil { + return err + } + } + var cgroupRoots []string nodeAllocatableRoot := cm.NodeAllocatableRoot(s.CgroupRoot, s.CgroupsPerQOS, s.CgroupDriver) cgroupRoots = append(cgroupRoots, nodeAllocatableRoot) @@ -1281,3 +1291,28 @@ func newTracerProvider(s *options.KubeletServer) (oteltrace.TracerProvider, erro } return tp, nil } + +func getCgroupDriverFromCRI(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Dependencies) error { + klog.V(4).InfoS("Getting CRI runtime configuration information") + runtimeConfig, err := kubeDeps.RemoteRuntimeService.RuntimeConfig(ctx) + if err != nil { + s, ok := status.FromError(err) + if !ok || s.Code() != codes.Unimplemented { + return err + } + // CRI implementation doesn't support RuntimeConfig, fallback + klog.InfoS("CRI implementation should be updated to support RuntimeConfig when KubeletCgroupDriverFromCRI feature gate has been enabled. Falling back to using cgroupDriver from kubelet config.") + return nil + } + + switch d := runtimeConfig.GetLinux().GetCgroupDriver(); d { + case runtimeapi.CgroupDriver_SYSTEMD: + s.CgroupDriver = "systemd" + case runtimeapi.CgroupDriver_CGROUPFS: + s.CgroupDriver = "cgroupfs" + default: + return fmt.Errorf("runtime returned an unknown cgroup driver %d", d) + } + klog.InfoS("Using cgroup driver setting received from the CRI runtime", "cgroupDriver", s.CgroupDriver) + return nil +}