From 4714c7f51561af27f7aec64efe8dc128ee0fb8bc Mon Sep 17 00:00:00 2001 From: Saba Touheed Mujawar Date: Tue, 12 Dec 2023 08:57:04 -0500 Subject: [PATCH] enable support for kubernetes to ignore isolcpus The normal mechanisms for allocating isolated CPUs do not allow a mix of isolated and exclusive CPUs in the same container. In order to allow this in *very* limited cases where the pod spec is known in advance we will add the ability to disable the normal isolcpus behaviour. If the file "/etc/kubernetes/ignore_isolcpus" exists, then kubelet will basically forget everything it knows about isolcpus and just treat them like regular CPUs. The admin user can then rely on the fact that CPU allocation is deterministic to ensure that the isolcpus they configure end up being allocated to the correct pods. Signed-off-by: Daniel Safta Signed-off-by: Ramesh Kumar Sivanandam Signed-off-by: Boovan Rajendran Signed-off-by: Saba Touheed Mujawar --- pkg/kubelet/cm/cpumanager/cpu_manager.go | 7 +++++++ pkg/kubelet/cm/cpumanager/policy_static.go | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/pkg/kubelet/cm/cpumanager/cpu_manager.go b/pkg/kubelet/cm/cpumanager/cpu_manager.go index 396d9358a04..ebd6e2917ab 100644 --- a/pkg/kubelet/cm/cpumanager/cpu_manager.go +++ b/pkg/kubelet/cm/cpumanager/cpu_manager.go @@ -56,6 +56,13 @@ const cpuManagerStateFileName = "cpu_manager_state" // get the system-level isolated CPUs func getIsolcpus() cpuset.CPUSet { + // This is a gross hack to basically turn off awareness of isolcpus to enable + // isolated cpus to be allocated to pods the same way as non-isolated CPUs. + if _, err := os.Stat("/etc/kubernetes/ignore_isolcpus"); err == nil { + klog.Infof("[cpumanager] turning off isolcpus awareness") + return cpuset.New() + } + dat, err := os.ReadFile("/sys/devices/system/cpu/isolated") if err != nil { klog.Errorf("[cpumanager] unable to read sysfs isolcpus subdir") diff --git a/pkg/kubelet/cm/cpumanager/policy_static.go b/pkg/kubelet/cm/cpumanager/policy_static.go index c76a6edbc20..9425f5b27fb 100644 --- a/pkg/kubelet/cm/cpumanager/policy_static.go +++ b/pkg/kubelet/cm/cpumanager/policy_static.go @@ -18,6 +18,7 @@ package cpumanager import ( "fmt" + "os" "strconv" v1 "k8s.io/api/core/v1" @@ -755,6 +756,12 @@ func isKubeInfra(pod *v1.Pod) bool { // get the isolated CPUs (if any) from the devices associated with a specific container func (p *staticPolicy) podIsolCPUs(pod *v1.Pod, container *v1.Container) cpuset.CPUSet { + // This is a gross hack to basically turn off awareness of isolcpus to enable + // isolated cpus to be allocated to pods the same way as non-isolated CPUs. + if _, err := os.Stat("/etc/kubernetes/ignore_isolcpus"); err == nil { + return cpuset.New() + } + // NOTE: This is required for TestStaticPolicyAdd() since makePod() does // not create UID. We also need a way to properly stub devicemanager. if len(string(pod.UID)) == 0 { -- 2.25.1