mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Update --reserved-cpus cpu list validation so kubelet won't fail to start due to off-line CPUs
This commit is contained in:
		@@ -38,6 +38,7 @@ import (
 | 
				
			|||||||
	"k8s.io/klog/v2"
 | 
						"k8s.io/klog/v2"
 | 
				
			||||||
	"k8s.io/mount-utils"
 | 
						"k8s.io/mount-utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cadvisorapi "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	v1 "k8s.io/api/core/v1"
 | 
						v1 "k8s.io/api/core/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/api/resource"
 | 
						"k8s.io/apimachinery/pkg/api/resource"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
@@ -82,6 +83,7 @@ import (
 | 
				
			|||||||
	kubeletcertificate "k8s.io/kubernetes/pkg/kubelet/certificate"
 | 
						kubeletcertificate "k8s.io/kubernetes/pkg/kubelet/certificate"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap"
 | 
						"k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/cm"
 | 
						"k8s.io/kubernetes/pkg/kubelet/cm"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/cm/cpuset"
 | 
						"k8s.io/kubernetes/pkg/kubelet/cm/cpuset"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/config"
 | 
						"k8s.io/kubernetes/pkg/kubelet/config"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
@@ -489,6 +491,28 @@ func makeEventRecorder(kubeDeps *kubelet.Dependencies, nodeName types.NodeName)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getReservedCPUs(machineInfo *cadvisorapi.MachineInfo, cpus string) (cpuset.CPUSet, error) {
 | 
				
			||||||
 | 
						emptyCPUSet := cpuset.NewCPUSet()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if cpus == "" {
 | 
				
			||||||
 | 
							return emptyCPUSet, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						topo, err := topology.Discover(machineInfo)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return emptyCPUSet, fmt.Errorf("Unable to discover CPU topology info: %s", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						reservedCPUSet, err := cpuset.Parse(cpus)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return emptyCPUSet, fmt.Errorf("Unable to parse reserved-cpus list: %s", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						allCPUSet := topo.CPUDetails.CPUs()
 | 
				
			||||||
 | 
						if !reservedCPUSet.IsSubsetOf(allCPUSet) {
 | 
				
			||||||
 | 
							return emptyCPUSet, fmt.Errorf("reserved-cpus: %s is not a subset of online-cpus: %s", cpus, allCPUSet.String())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return reservedCPUSet, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate featuregate.FeatureGate) (err error) {
 | 
					func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate featuregate.FeatureGate) (err error) {
 | 
				
			||||||
	// Set global feature gates based on the value on the initial KubeletServer
 | 
						// Set global feature gates based on the value on the initial KubeletServer
 | 
				
			||||||
	err = utilfeature.DefaultMutableFeatureGate.SetFromMap(s.KubeletConfiguration.FeatureGates)
 | 
						err = utilfeature.DefaultMutableFeatureGate.SetFromMap(s.KubeletConfiguration.FeatureGates)
 | 
				
			||||||
@@ -661,35 +685,14 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend
 | 
				
			|||||||
			s.CgroupRoot = "/"
 | 
								s.CgroupRoot = "/"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var reservedSystemCPUs cpuset.CPUSet
 | 
					 | 
				
			||||||
		if s.ReservedSystemCPUs != "" {
 | 
					 | 
				
			||||||
			// is it safe do use CAdvisor here ??
 | 
					 | 
				
			||||||
		machineInfo, err := kubeDeps.CAdvisorInterface.MachineInfo()
 | 
							machineInfo, err := kubeDeps.CAdvisorInterface.MachineInfo()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
				// if can't use CAdvisor here, fall back to non-explicit cpu list behavior
 | 
								return err
 | 
				
			||||||
				klog.InfoS("Failed to get MachineInfo, set reservedSystemCPUs to empty")
 | 
					 | 
				
			||||||
				reservedSystemCPUs = cpuset.NewCPUSet()
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				var errParse error
 | 
					 | 
				
			||||||
				reservedSystemCPUs, errParse = cpuset.Parse(s.ReservedSystemCPUs)
 | 
					 | 
				
			||||||
				if errParse != nil {
 | 
					 | 
				
			||||||
					// invalid cpu list is provided, set reservedSystemCPUs to empty, so it won't overwrite kubeReserved/systemReserved
 | 
					 | 
				
			||||||
					klog.InfoS("Invalid ReservedSystemCPUs", "systemReservedCPUs", s.ReservedSystemCPUs)
 | 
					 | 
				
			||||||
					return errParse
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
				reservedList := reservedSystemCPUs.ToSlice()
 | 
							reservedSystemCPUs, err := getReservedCPUs(machineInfo, s.ReservedSystemCPUs)
 | 
				
			||||||
				first := reservedList[0]
 | 
							if err != nil {
 | 
				
			||||||
				last := reservedList[len(reservedList)-1]
 | 
								return err
 | 
				
			||||||
				if first < 0 || last >= machineInfo.NumCores {
 | 
					 | 
				
			||||||
					// the specified cpuset is outside of the range of what the machine has
 | 
					 | 
				
			||||||
					klog.InfoS("Invalid cpuset specified by --reserved-cpus")
 | 
					 | 
				
			||||||
					return fmt.Errorf("Invalid cpuset %q specified by --reserved-cpus", s.ReservedSystemCPUs)
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			reservedSystemCPUs = cpuset.NewCPUSet()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if reservedSystemCPUs.Size() > 0 {
 | 
							if reservedSystemCPUs.Size() > 0 {
 | 
				
			||||||
			// at cmd option validation phase it is tested either --system-reserved-cgroup or --kube-reserved-cgroup is specified, so overwrite should be ok
 | 
								// at cmd option validation phase it is tested either --system-reserved-cgroup or --kube-reserved-cgroup is specified, so overwrite should be ok
 | 
				
			||||||
			klog.InfoS("Option --reserved-cpus is specified, it will overwrite the cpu setting in KubeReserved and SystemReserved", "kubeReservedCPUs", s.KubeReserved, "systemReservedCPUs", s.SystemReserved)
 | 
								klog.InfoS("Option --reserved-cpus is specified, it will overwrite the cpu setting in KubeReserved and SystemReserved", "kubeReservedCPUs", s.KubeReserved, "systemReservedCPUs", s.SystemReserved)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user