Skip to content

Commit a8e1f41

Browse files
authored
Merge pull request kubernetes#124216 from iholder101/in-pod-vertical-scaling/update-cgroup-systemd-instead-of-cgroupfs
[FG:InPlacePodVerticalScaling] Handle systemd cgroup driver by using libcontainer for updating pod cgroup values
2 parents 05bc270 + f21473b commit a8e1f41

9 files changed

+27
-118
lines changed

pkg/kubelet/cm/cgroup_manager_linux.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,13 @@ import (
2121
"os"
2222
"path"
2323
"path/filepath"
24-
"strconv"
2524
"strings"
2625
"sync"
2726
"time"
2827

2928
libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups"
3029
"github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
31-
"github.com/opencontainers/runc/libcontainer/cgroups/manager"
30+
libcontainercgroupmanager "github.com/opencontainers/runc/libcontainer/cgroups/manager"
3231
cgroupsystemd "github.com/opencontainers/runc/libcontainer/cgroups/systemd"
3332
libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
3433
"k8s.io/klog/v2"
@@ -242,7 +241,7 @@ func (m *cgroupCommon) Destroy(cgroupConfig *CgroupConfig) error {
242241
}()
243242

244243
libcontainerCgroupConfig := m.libctCgroupConfig(cgroupConfig, false)
245-
manager, err := manager.New(libcontainerCgroupConfig)
244+
manager, err := libcontainercgroupmanager.New(libcontainerCgroupConfig)
246245
if err != nil {
247246
return err
248247
}
@@ -255,6 +254,15 @@ func (m *cgroupCommon) Destroy(cgroupConfig *CgroupConfig) error {
255254
return nil
256255
}
257256

257+
func (m *cgroupCommon) SetCgroupConfig(name CgroupName, resourceConfig *ResourceConfig) error {
258+
containerConfig := &CgroupConfig{
259+
Name: name,
260+
ResourceParameters: resourceConfig,
261+
}
262+
263+
return m.Update(containerConfig)
264+
}
265+
258266
// getCPUWeight converts from the range [2, 262144] to [1, 10000]
259267
func getCPUWeight(cpuShares *uint64) uint64 {
260268
if cpuShares == nil {
@@ -362,7 +370,7 @@ func (m *cgroupCommon) Update(cgroupConfig *CgroupConfig) error {
362370
}()
363371

364372
libcontainerCgroupConfig := m.libctCgroupConfig(cgroupConfig, true)
365-
manager, err := manager.New(libcontainerCgroupConfig)
373+
manager, err := libcontainercgroupmanager.New(libcontainerCgroupConfig)
366374
if err != nil {
367375
return fmt.Errorf("failed to create cgroup manager: %v", err)
368376
}
@@ -377,7 +385,7 @@ func (m *cgroupCommon) Create(cgroupConfig *CgroupConfig) error {
377385
}()
378386

379387
libcontainerCgroupConfig := m.libctCgroupConfig(cgroupConfig, true)
380-
manager, err := manager.New(libcontainerCgroupConfig)
388+
manager, err := libcontainercgroupmanager.New(libcontainerCgroupConfig)
381389
if err != nil {
382390
return err
383391
}
@@ -475,12 +483,3 @@ func readCgroupMemoryConfig(cgroupPath string, memLimitFile string) (*ResourceCo
475483
return &ResourceConfig{Memory: &mLim}, nil
476484

477485
}
478-
479-
func writeCgroupMemoryLimit(memoryLimitFileLocation string, resourceConfig *ResourceConfig) error {
480-
memLimit := strconv.FormatInt(*resourceConfig.Memory, 10)
481-
if err := os.WriteFile(memoryLimitFileLocation, []byte(memLimit), 0700); err != nil {
482-
return fmt.Errorf("failed to write %v to %v: %w", memLimit, memoryLimitFileLocation, err)
483-
}
484-
//TODO(vinaykul,InPlacePodVerticalScaling): Add memory request support
485-
return nil
486-
}

pkg/kubelet/cm/cgroup_manager_unsupported.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func (m *unsupportedCgroupManager) GetCgroupConfig(name CgroupName, resource v1.
8989
return nil, errNotSupported
9090
}
9191

92-
func (m *unsupportedCgroupManager) SetCgroupConfig(name CgroupName, resource v1.ResourceName, resourceConfig *ResourceConfig) error {
92+
func (m *unsupportedCgroupManager) SetCgroupConfig(name CgroupName, resourceConfig *ResourceConfig) error {
9393
return errNotSupported
9494
}
9595

pkg/kubelet/cm/cgroup_v1_manager_linux.go

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@ package cm
1919
import (
2020
"errors"
2121
"fmt"
22-
"os"
23-
"path/filepath"
2422
"strconv"
2523
"strings"
2624

2725
libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups"
2826
"github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
29-
3027
v1 "k8s.io/api/core/v1"
3128
"k8s.io/apimachinery/pkg/util/sets"
3229
)
@@ -123,22 +120,6 @@ func (c *cgroupV1impl) GetCgroupConfig(name CgroupName, resource v1.ResourceName
123120
return nil, fmt.Errorf("unsupported resource %v for cgroup %v", resource, name)
124121
}
125122

126-
// Set resource config for the specified resource type on the cgroup
127-
func (c *cgroupV1impl) SetCgroupConfig(name CgroupName, resource v1.ResourceName, resourceConfig *ResourceConfig) error {
128-
cgroupPaths := c.buildCgroupPaths(name)
129-
cgroupResourcePath, found := cgroupPaths[string(resource)]
130-
if !found {
131-
return fmt.Errorf("failed to build %v cgroup fs path for cgroup %v", resource, name)
132-
}
133-
switch resource {
134-
case v1.ResourceCPU:
135-
return c.setCgroupCPUConfig(cgroupResourcePath, resourceConfig)
136-
case v1.ResourceMemory:
137-
return c.setCgroupMemoryConfig(cgroupResourcePath, resourceConfig)
138-
}
139-
return nil
140-
}
141-
142123
func (c *cgroupV1impl) getCgroupCPUConfig(cgroupPath string) (*ResourceConfig, error) {
143124
cpuQuotaStr, errQ := fscommon.GetCgroupParamString(cgroupPath, "cpu.cfs_quota_us")
144125
if errQ != nil {
@@ -159,33 +140,6 @@ func (c *cgroupV1impl) getCgroupCPUConfig(cgroupPath string) (*ResourceConfig, e
159140
return &ResourceConfig{CPUShares: &cpuShares, CPUQuota: &cpuQuota, CPUPeriod: &cpuPeriod}, nil
160141
}
161142

162-
func (c *cgroupV1impl) setCgroupCPUConfig(cgroupPath string, resourceConfig *ResourceConfig) error {
163-
var cpuQuotaStr, cpuPeriodStr, cpuSharesStr string
164-
if resourceConfig.CPUQuota != nil {
165-
cpuQuotaStr = strconv.FormatInt(*resourceConfig.CPUQuota, 10)
166-
if err := os.WriteFile(filepath.Join(cgroupPath, "cpu.cfs_quota_us"), []byte(cpuQuotaStr), 0700); err != nil {
167-
return fmt.Errorf("failed to write %v to %v: %w", cpuQuotaStr, cgroupPath, err)
168-
}
169-
}
170-
if resourceConfig.CPUPeriod != nil {
171-
cpuPeriodStr = strconv.FormatUint(*resourceConfig.CPUPeriod, 10)
172-
if err := os.WriteFile(filepath.Join(cgroupPath, "cpu.cfs_period_us"), []byte(cpuPeriodStr), 0700); err != nil {
173-
return fmt.Errorf("failed to write %v to %v: %w", cpuPeriodStr, cgroupPath, err)
174-
}
175-
}
176-
if resourceConfig.CPUShares != nil {
177-
cpuSharesStr = strconv.FormatUint(*resourceConfig.CPUShares, 10)
178-
if err := os.WriteFile(filepath.Join(cgroupPath, "cpu.shares"), []byte(cpuSharesStr), 0700); err != nil {
179-
return fmt.Errorf("failed to write %v to %v: %w", cpuSharesStr, cgroupPath, err)
180-
}
181-
}
182-
return nil
183-
}
184-
185-
func (c *cgroupV1impl) setCgroupMemoryConfig(cgroupPath string, resourceConfig *ResourceConfig) error {
186-
return writeCgroupMemoryLimit(filepath.Join(cgroupPath, cgroupv1MemLimitFile), resourceConfig)
187-
}
188-
189143
func (c *cgroupV1impl) getCgroupMemoryConfig(cgroupPath string) (*ResourceConfig, error) {
190144
return readCgroupMemoryConfig(cgroupPath, cgroupv1MemLimitFile)
191145
}

pkg/kubelet/cm/cgroup_v2_manager_linux.go

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -98,22 +98,6 @@ func (c *cgroupV2impl) GetCgroupConfig(name CgroupName, resource v1.ResourceName
9898
return nil, fmt.Errorf("unsupported resource %v for cgroup %v", resource, name)
9999
}
100100

101-
// Set resource config for the specified resource type on the cgroup
102-
func (c *cgroupV2impl) SetCgroupConfig(name CgroupName, resource v1.ResourceName, resourceConfig *ResourceConfig) error {
103-
cgroupPaths := c.buildCgroupPaths(name)
104-
cgroupResourcePath, found := cgroupPaths[string(resource)]
105-
if !found {
106-
return fmt.Errorf("failed to build %v cgroup fs path for cgroup %v", resource, name)
107-
}
108-
switch resource {
109-
case v1.ResourceCPU:
110-
return c.setCgroupCPUConfig(cgroupResourcePath, resourceConfig)
111-
case v1.ResourceMemory:
112-
return c.setCgroupMemoryConfig(cgroupResourcePath, resourceConfig)
113-
}
114-
return nil
115-
}
116-
117101
func (c *cgroupV2impl) getCgroupCPUConfig(cgroupPath string) (*ResourceConfig, error) {
118102
var cpuLimitStr, cpuPeriodStr string
119103
cpuLimitAndPeriod, err := fscommon.GetCgroupParamString(cgroupPath, "cpu.max")
@@ -144,35 +128,6 @@ func (c *cgroupV2impl) getCgroupCPUConfig(cgroupPath string) (*ResourceConfig, e
144128
return &ResourceConfig{CPUShares: &cpuShares, CPUQuota: &cpuLimit, CPUPeriod: &cpuPeriod}, nil
145129
}
146130

147-
func (c *cgroupV2impl) setCgroupCPUConfig(cgroupPath string, resourceConfig *ResourceConfig) error {
148-
if resourceConfig.CPUQuota != nil {
149-
if resourceConfig.CPUPeriod == nil {
150-
return fmt.Errorf("CpuPeriod must be specified in order to set CpuLimit")
151-
}
152-
cpuLimitStr := Cgroup2MaxCpuLimit
153-
if *resourceConfig.CPUQuota > -1 {
154-
cpuLimitStr = strconv.FormatInt(*resourceConfig.CPUQuota, 10)
155-
}
156-
cpuPeriodStr := strconv.FormatUint(*resourceConfig.CPUPeriod, 10)
157-
cpuMaxStr := fmt.Sprintf("%s %s", cpuLimitStr, cpuPeriodStr)
158-
if err := os.WriteFile(filepath.Join(cgroupPath, "cpu.max"), []byte(cpuMaxStr), 0700); err != nil {
159-
return fmt.Errorf("failed to write %v to %v: %w", cpuMaxStr, cgroupPath, err)
160-
}
161-
}
162-
if resourceConfig.CPUShares != nil {
163-
cpuWeight := cpuSharesToCPUWeight(*resourceConfig.CPUShares)
164-
cpuWeightStr := strconv.FormatUint(cpuWeight, 10)
165-
if err := os.WriteFile(filepath.Join(cgroupPath, "cpu.weight"), []byte(cpuWeightStr), 0700); err != nil {
166-
return fmt.Errorf("failed to write %v to %v: %w", cpuWeightStr, cgroupPath, err)
167-
}
168-
}
169-
return nil
170-
}
171-
172-
func (c *cgroupV2impl) setCgroupMemoryConfig(cgroupPath string, resourceConfig *ResourceConfig) error {
173-
return writeCgroupMemoryLimit(filepath.Join(cgroupPath, cgroupv2MemLimitFile), resourceConfig)
174-
}
175-
176131
func (c *cgroupV2impl) getCgroupMemoryConfig(cgroupPath string) (*ResourceConfig, error) {
177132
return readCgroupMemoryConfig(cgroupPath, cgroupv2MemLimitFile)
178133
}

pkg/kubelet/cm/container_manager_stub.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func (m *podContainerManagerStub) GetPodCgroupConfig(_ *v1.Pod, _ v1.ResourceNam
103103
return nil, fmt.Errorf("not implemented")
104104
}
105105

106-
func (m *podContainerManagerStub) SetPodCgroupConfig(_ *v1.Pod, _ v1.ResourceName, _ *ResourceConfig) error {
106+
func (m *podContainerManagerStub) SetPodCgroupConfig(pod *v1.Pod, resourceConfig *ResourceConfig) error {
107107
return fmt.Errorf("not implemented")
108108
}
109109

pkg/kubelet/cm/fake_pod_container_manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ func (cm *FakePodContainerManager) GetPodCgroupConfig(_ *v1.Pod, _ v1.ResourceNa
119119
return nil, nil
120120
}
121121

122-
func (cm *FakePodContainerManager) SetPodCgroupConfig(_ *v1.Pod, _ v1.ResourceName, _ *ResourceConfig) error {
122+
func (cm *FakePodContainerManager) SetPodCgroupConfig(pod *v1.Pod, resourceConfig *ResourceConfig) error {
123123
cm.Lock()
124124
defer cm.Unlock()
125125
cm.CalledFunctions = append(cm.CalledFunctions, "SetPodCgroupConfig")

pkg/kubelet/cm/pod_container_manager_linux.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,9 @@ func (m *podContainerManagerImpl) GetPodCgroupConfig(pod *v1.Pod, resource v1.Re
134134
return m.cgroupManager.GetCgroupConfig(podCgroupName, resource)
135135
}
136136

137-
func (m *podContainerManagerImpl) SetPodCgroupConfig(pod *v1.Pod, resource v1.ResourceName, resourceConfig *ResourceConfig) error {
137+
func (m *podContainerManagerImpl) SetPodCgroupConfig(pod *v1.Pod, resourceConfig *ResourceConfig) error {
138138
podCgroupName, _ := m.GetPodContainerName(pod)
139-
return m.cgroupManager.SetCgroupConfig(podCgroupName, resource, resourceConfig)
139+
return m.cgroupManager.SetCgroupConfig(podCgroupName, resourceConfig)
140140
}
141141

142142
// Kill one process ID
@@ -350,6 +350,6 @@ func (m *podContainerManagerNoop) GetPodCgroupConfig(_ *v1.Pod, _ v1.ResourceNam
350350
return nil, nil
351351
}
352352

353-
func (m *podContainerManagerNoop) SetPodCgroupConfig(_ *v1.Pod, _ v1.ResourceName, _ *ResourceConfig) error {
353+
func (m *podContainerManagerNoop) SetPodCgroupConfig(_ *v1.Pod, _ *ResourceConfig) error {
354354
return nil
355355
}

pkg/kubelet/cm/types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ type CgroupManager interface {
9090
// Get the resource config values applied to the cgroup for specified resource type
9191
GetCgroupConfig(name CgroupName, resource v1.ResourceName) (*ResourceConfig, error)
9292
// Set resource config for the specified resource type on the cgroup
93-
SetCgroupConfig(name CgroupName, resource v1.ResourceName, resourceConfig *ResourceConfig) error
93+
SetCgroupConfig(name CgroupName, resourceConfig *ResourceConfig) error
9494
// Version of the cgroup implementation on the host
9595
Version() int
9696
}
@@ -136,5 +136,5 @@ type PodContainerManager interface {
136136
GetPodCgroupConfig(pod *v1.Pod, resource v1.ResourceName) (*ResourceConfig, error)
137137

138138
// Set resource config values for the specified resource type on the pod cgroup
139-
SetPodCgroupConfig(pod *v1.Pod, resource v1.ResourceName, resourceConfig *ResourceConfig) error
139+
SetPodCgroupConfig(pod *v1.Pod, resourceConfig *ResourceConfig) error
140140
}

pkg/kubelet/kuberuntime/kuberuntime_manager.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -663,15 +663,16 @@ func (m *kubeGenericRuntimeManager) doPodResizeAction(pod *v1.Pod, podStatus *ku
663663
var err error
664664
switch rName {
665665
case v1.ResourceCPU:
666-
podCpuResources := &cm.ResourceConfig{CPUPeriod: podResources.CPUPeriod}
666+
podCPUResources := &cm.ResourceConfig{}
667667
if setLimitValue {
668-
podCpuResources.CPUQuota = podResources.CPUQuota
668+
podCPUResources.CPUPeriod = podResources.CPUPeriod
669+
podCPUResources.CPUQuota = podResources.CPUQuota
669670
} else {
670-
podCpuResources.CPUShares = podResources.CPUShares
671+
podCPUResources.CPUShares = podResources.CPUShares
671672
}
672-
err = pcm.SetPodCgroupConfig(pod, rName, podCpuResources)
673+
err = pcm.SetPodCgroupConfig(pod, podCPUResources)
673674
case v1.ResourceMemory:
674-
err = pcm.SetPodCgroupConfig(pod, rName, podResources)
675+
err = pcm.SetPodCgroupConfig(pod, podResources)
675676
}
676677
if err != nil {
677678
klog.ErrorS(err, "Failed to set cgroup config", "resource", rName, "pod", pod.Name)

0 commit comments

Comments
 (0)