From 510ff6752839f1ad620389150b966bcbeca293a1 Mon Sep 17 00:00:00 2001 From: Itamar Holder Date: Sun, 7 Apr 2024 10:28:25 +0300 Subject: [PATCH] Use libcontainer's cgroup manager to update resources through systemd libcontainer's cgroup manager is version agnostic, and is agnostic to whether systemd is used. This way if systemd is used, the cgroup manager would be able to update resources properly so that if the daemon would be restarted the changes would not be reverted. Signed-off-by: Itamar Holder --- pkg/kubelet/cm/cgroup_manager_linux.go | 10 ++++++++++ pkg/kubelet/cm/cgroup_v1_manager_linux.go | 17 ----------------- pkg/kubelet/cm/cgroup_v2_manager_linux.go | 16 ---------------- 3 files changed, 10 insertions(+), 33 deletions(-) diff --git a/pkg/kubelet/cm/cgroup_manager_linux.go b/pkg/kubelet/cm/cgroup_manager_linux.go index 8e9d3571549..d557265617e 100644 --- a/pkg/kubelet/cm/cgroup_manager_linux.go +++ b/pkg/kubelet/cm/cgroup_manager_linux.go @@ -34,6 +34,7 @@ import ( "k8s.io/klog/v2" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + v1 "k8s.io/api/core/v1" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/kubelet/metrics" @@ -255,6 +256,15 @@ func (m *cgroupCommon) Destroy(cgroupConfig *CgroupConfig) error { return nil } +func (m *cgroupCommon) SetCgroupConfig(name CgroupName, resource v1.ResourceName, resourceConfig *ResourceConfig) error { + containerConfig := &CgroupConfig{ + Name: name, + ResourceParameters: resourceConfig, + } + + return m.Update(containerConfig) +} + // getCPUWeight converts from the range [2, 262144] to [1, 10000] func getCPUWeight(cpuShares *uint64) uint64 { if cpuShares == nil { diff --git a/pkg/kubelet/cm/cgroup_v1_manager_linux.go b/pkg/kubelet/cm/cgroup_v1_manager_linux.go index 7325ba797c9..0f9d1ee1896 100644 --- a/pkg/kubelet/cm/cgroup_v1_manager_linux.go +++ b/pkg/kubelet/cm/cgroup_v1_manager_linux.go @@ -26,7 +26,6 @@ import ( libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" ) @@ -123,22 +122,6 @@ func (c *cgroupV1impl) GetCgroupConfig(name CgroupName, resource v1.ResourceName return nil, fmt.Errorf("unsupported resource %v for cgroup %v", resource, name) } -// Set resource config for the specified resource type on the cgroup -func (c *cgroupV1impl) SetCgroupConfig(name CgroupName, resource v1.ResourceName, resourceConfig *ResourceConfig) error { - cgroupPaths := c.buildCgroupPaths(name) - cgroupResourcePath, found := cgroupPaths[string(resource)] - if !found { - return fmt.Errorf("failed to build %v cgroup fs path for cgroup %v", resource, name) - } - switch resource { - case v1.ResourceCPU: - return c.setCgroupCPUConfig(cgroupResourcePath, resourceConfig) - case v1.ResourceMemory: - return c.setCgroupMemoryConfig(cgroupResourcePath, resourceConfig) - } - return nil -} - func (c *cgroupV1impl) getCgroupCPUConfig(cgroupPath string) (*ResourceConfig, error) { cpuQuotaStr, errQ := fscommon.GetCgroupParamString(cgroupPath, "cpu.cfs_quota_us") if errQ != nil { diff --git a/pkg/kubelet/cm/cgroup_v2_manager_linux.go b/pkg/kubelet/cm/cgroup_v2_manager_linux.go index d8cf58d79cf..8cea1e2d0ac 100644 --- a/pkg/kubelet/cm/cgroup_v2_manager_linux.go +++ b/pkg/kubelet/cm/cgroup_v2_manager_linux.go @@ -98,22 +98,6 @@ func (c *cgroupV2impl) GetCgroupConfig(name CgroupName, resource v1.ResourceName return nil, fmt.Errorf("unsupported resource %v for cgroup %v", resource, name) } -// Set resource config for the specified resource type on the cgroup -func (c *cgroupV2impl) SetCgroupConfig(name CgroupName, resource v1.ResourceName, resourceConfig *ResourceConfig) error { - cgroupPaths := c.buildCgroupPaths(name) - cgroupResourcePath, found := cgroupPaths[string(resource)] - if !found { - return fmt.Errorf("failed to build %v cgroup fs path for cgroup %v", resource, name) - } - switch resource { - case v1.ResourceCPU: - return c.setCgroupCPUConfig(cgroupResourcePath, resourceConfig) - case v1.ResourceMemory: - return c.setCgroupMemoryConfig(cgroupResourcePath, resourceConfig) - } - return nil -} - func (c *cgroupV2impl) getCgroupCPUConfig(cgroupPath string) (*ResourceConfig, error) { var cpuLimitStr, cpuPeriodStr string cpuLimitAndPeriod, err := fscommon.GetCgroupParamString(cgroupPath, "cpu.max")