// Filters the minions to find the ones that fit based on the given predicate functions // Each minion is passed through the predicate functions to determine if it is a fit func findNodesThatFit(pod *api.Pod, podLister algorithm.PodLister, predicateFuncs map[string]algorithm.FitPredicate, nodes api.NodeList) (api.NodeList, FailedPredicateMap, error) { filtered := []api.Node{} machineToPods, err := predicates.MapPodsToMachines(podLister) failedPredicateMap := FailedPredicateMap{} if err != nil { return api.NodeList{}, FailedPredicateMap{}, err } for _, node := range nodes.Items { fits := true for name, predicate := range predicateFuncs { fit, err := predicate(pod, machineToPods[node.Name], node.Name) if err != nil { return api.NodeList{}, FailedPredicateMap{}, err } if !fit { fits = false if _, found := failedPredicateMap[node.Name]; !found { failedPredicateMap[node.Name] = util.StringSet{} } failedPredicateMap[node.Name].Insert(name) break } } if fits { filtered = append(filtered, node) } } return api.NodeList{Items: filtered}, failedPredicateMap, nil }
// LeastRequestedPriority is a priority function that favors nodes with fewer requested resources. // It calculates the percentage of memory and CPU requested by pods scheduled on the node, and prioritizes // based on the minimum of the average of the fraction of requested to capacity. // Details: (Sum(requested cpu) / Capacity + Sum(requested memory) / Capacity) * 50 func LeastRequestedPriority(pod *api.Pod, podLister algorithm.PodLister, minionLister algorithm.MinionLister) (algorithm.HostPriorityList, error) { nodes, err := minionLister.List() if err != nil { return algorithm.HostPriorityList{}, err } podsToMachines, err := predicates.MapPodsToMachines(podLister) list := algorithm.HostPriorityList{} for _, node := range nodes.Items { list = append(list, calculateOccupancy(pod, node, podsToMachines[node.Name])) } return list, nil }
// BalancedResourceAllocation favors nodes with balanced resource usage rate. // BalancedResourceAllocation should **NOT** be used alone, and **MUST** be used together with LeastRequestedPriority. // It calculates the difference between the cpu and memory fracion of capacity, and prioritizes the host based on how // close the two metrics are to each other. // Detail: score = 10 - abs(cpuFraction-memoryFraction)*10. The algorithm is partly inspired by: // "Wei Huang et al. An Energy Efficient Virtual Machine Placement Algorithm with Balanced Resource Utilization" func BalancedResourceAllocation(pod *api.Pod, podLister algorithm.PodLister, minionLister algorithm.MinionLister) (algorithm.HostPriorityList, error) { nodes, err := minionLister.List() if err != nil { return algorithm.HostPriorityList{}, err } podsToMachines, err := predicates.MapPodsToMachines(podLister) list := algorithm.HostPriorityList{} for _, node := range nodes.Items { list = append(list, calculateBalancedResourceAllocation(pod, node, podsToMachines[node.Name])) } return list, nil }