rubik/patch/0011-support-systemd-cgroup-driver.patch

198 lines
6.8 KiB
Diff
Raw Normal View History

From 75075dbb1845e8714fa87ee0e19f80b8845dce71 Mon Sep 17 00:00:00 2001
From: suoxiaocong <suoxiaocong@kylinos.cn>
Date: Mon, 22 Apr 2024 15:52:03 +0800
Subject: [PATCH 11/13] support systemd cgroup driver
---
pkg/common/constant/constant.go | 7 +++++++
pkg/config/config.go | 12 +++++++-----
pkg/core/typedef/cgroup/common.go | 11 +++++++++++
pkg/core/typedef/containerinfo.go | 16 +++++++++++++++-
pkg/core/typedef/rawpod.go | 30 ++++++++++++++++++++++++++++--
pkg/rubik/rubik.go | 3 +++
6 files changed, 71 insertions(+), 8 deletions(-)
diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go
index 2df0b81..4f22ef0 100644
--- a/pkg/common/constant/constant.go
+++ b/pkg/common/constant/constant.go
@@ -111,3 +111,10 @@ const (
// PSIIOCgroupFileName is name of cgroup file used for detecting io psi
PSIIOCgroupFileName = "io.pressure"
)
+
+const (
+ // CgroupDriverSystemd is global config for cgroupfs driver choice: systemd driver
+ CgroupDriverSystemd = "systemd"
+ // CgroupDriverCgroupfs is global config for cgroupfs driver choice: cgroupfs driver
+ CgroupDriverCgroupfs = "cgroupfs"
+)
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 16ab6e1..6ae775f 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -44,6 +44,7 @@ type AgentConfig struct {
LogDir string `json:"logDir,omitempty"`
CgroupRoot string `json:"cgroupRoot,omitempty"`
EnabledFeatures []string `json:"enabledFeatures,omitempty"`
+ CgroupDriver string `json:"cgroupDriver,omitempty"`
}
// NewConfig returns an config object pointer
@@ -51,11 +52,12 @@ func NewConfig(pType parserType) *Config {
c := &Config{
ConfigParser: defaultParserFactory.getParser(pType),
Agent: &AgentConfig{
- LogDriver: constant.LogDriverStdio,
- LogSize: constant.DefaultLogSize,
- LogLevel: constant.DefaultLogLevel,
- LogDir: constant.DefaultLogDir,
- CgroupRoot: constant.DefaultCgroupRoot,
+ LogDriver: constant.LogDriverStdio,
+ LogSize: constant.DefaultLogSize,
+ LogLevel: constant.DefaultLogLevel,
+ LogDir: constant.DefaultLogDir,
+ CgroupRoot: constant.DefaultCgroupRoot,
+ CgroupDriver: constant.CgroupDriverCgroupfs,
},
}
return c
diff --git a/pkg/core/typedef/cgroup/common.go b/pkg/core/typedef/cgroup/common.go
index 8c0bd81..a952959 100644
--- a/pkg/core/typedef/cgroup/common.go
+++ b/pkg/core/typedef/cgroup/common.go
@@ -25,6 +25,17 @@ import (
)
var rootDir = constant.DefaultCgroupRoot
+var cgroupDriver = constant.CgroupDriverCgroupfs
+
+// SetCgroupDriver is the setter of global cgroup driver
+func SetCgroupDriver(driver string) {
+ cgroupDriver = driver
+}
+
+// GetCgroupDriver is the getter of global cgroup driver
+func GetCgroupDriver() string {
+ return cgroupDriver
+}
// AbsoluteCgroupPath returns the absolute path of the cgroup
func AbsoluteCgroupPath(elem ...string) string {
diff --git a/pkg/core/typedef/containerinfo.go b/pkg/core/typedef/containerinfo.go
index d810e5b..f751b25 100644
--- a/pkg/core/typedef/containerinfo.go
+++ b/pkg/core/typedef/containerinfo.go
@@ -20,6 +20,7 @@ import (
"strings"
"sync"
+ "isula.org/rubik/pkg/common/constant"
"isula.org/rubik/pkg/core/typedef/cgroup"
)
@@ -45,6 +46,11 @@ var (
}
currentContainerEngines = UNDEFINED
setContainerEnginesOnce sync.Once
+ containerEngineScopes = map[ContainerEngineType]string{
+ DOCKER: "docker",
+ CONTAINERD: "cri-containerd",
+ ISULAD: "isulad",
+ }
)
// Support returns true when the container uses the container engine
@@ -76,10 +82,18 @@ type ContainerInfo struct {
// NewContainerInfo creates a ContainerInfo instance
func NewContainerInfo(id, podCgroupPath string, rawContainer *RawContainer) *ContainerInfo {
requests, limits := rawContainer.GetResourceMaps()
+ var path string
+ if cgroup.GetCgroupDriver() == constant.CgroupDriverSystemd {
+ scopeName := containerEngineScopes[currentContainerEngines]
+ path = filepath.Join(podCgroupPath, scopeName+"-"+id+".scope")
+ } else {
+ path = filepath.Join(podCgroupPath, id)
+ }
+
return &ContainerInfo{
Name: rawContainer.status.Name,
ID: id,
- Hierarchy: cgroup.Hierarchy{Path: filepath.Join(podCgroupPath, id)},
+ Hierarchy: cgroup.Hierarchy{Path: path},
RequestResources: requests,
LimitResources: limits,
}
diff --git a/pkg/core/typedef/rawpod.go b/pkg/core/typedef/rawpod.go
index 138c580..895e9d4 100644
--- a/pkg/core/typedef/rawpod.go
+++ b/pkg/core/typedef/rawpod.go
@@ -23,6 +23,7 @@ import (
"k8s.io/apimachinery/pkg/api/resource"
"isula.org/rubik/pkg/common/constant"
+ "isula.org/rubik/pkg/core/typedef/cgroup"
)
const (
@@ -103,7 +104,7 @@ func (pod *RawPod) CgroupPath() string {
return ""
}
/*
- example:
+ for cgroupfs cgroup driver
1. Burstable: pod requests are less than the value of limits and not 0;
kubepods/burstable/pod34152897-dbaf-11ea-8cb9-0653660051c3
2. BestEffort: pod requests and limits are both 0;
@@ -111,7 +112,32 @@ func (pod *RawPod) CgroupPath() string {
3. Guaranteed: pod requests are equal to the value set by limits;
kubepods/pod34152897-dbaf-11ea-8cb9-0653660051c3
*/
- return filepath.Join(constant.KubepodsCgroup, qosClassPath, constant.PodCgroupNamePrefix+id)
+ /*
+ for systemd cgroup driver
+ 1. burstable:
+ kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podb895995a_e7e5_413e_9bc1_3c3895b3f233.slice
+ 2. besteffort
+ kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podb895995a_e7e5_413e_9bc1_3c3895b3f233.slice
+ 3. guaranteed
+ kubepods.slice/kubepods-podb895995a_e7e5_413e_9bc1_3c3895b3f233.slice/
+ */
+
+ if cgroup.GetCgroupDriver() == constant.CgroupDriverSystemd {
+ if qosClassPath == "" {
+ return filepath.Join(
+ constant.KubepodsCgroup+".slice",
+ constant.KubepodsCgroup+"-"+constant.PodCgroupNamePrefix+strings.Replace(id, "-", "_", -1)+".slice",
+ )
+ }
+ return filepath.Join(
+ constant.KubepodsCgroup+".slice",
+ constant.KubepodsCgroup+"-"+qosClassPath+".slice",
+ constant.KubepodsCgroup+"-"+qosClassPath+"-"+constant.PodCgroupNamePrefix+strings.Replace(id, "-", "_", -1)+".slice",
+ )
+ } else {
+ return filepath.Join(constant.KubepodsCgroup, qosClassPath, constant.PodCgroupNamePrefix+id)
+ }
+
}
// ListRawContainers returns all RawContainers in the RawPod
diff --git a/pkg/rubik/rubik.go b/pkg/rubik/rubik.go
index 3864956..3595ff1 100644
--- a/pkg/rubik/rubik.go
+++ b/pkg/rubik/rubik.go
@@ -126,6 +126,9 @@ func runAgent(ctx context.Context) error {
// 3. enable cgroup system
cgroup.InitMountDir(c.Agent.CgroupRoot)
+ if c.Agent.CgroupDriver != "" {
+ cgroup.SetCgroupDriver(c.Agent.CgroupDriver)
+ }
// 4. init service components
services.InitServiceComponents(defaultRubikFeature)
--
2.41.0