address review comments

This commit is contained in:
Gavin 2017-11-19 11:08:02 +08:00
parent bed435deca
commit 8fa59aa9b0
3 changed files with 26 additions and 30 deletions

View File

@ -54,11 +54,13 @@ func NewSelectorSpreadPriority(
return selectorSpread.CalculateSpreadPriorityMap, selectorSpread.CalculateSpreadPriorityReduce return selectorSpread.CalculateSpreadPriorityMap, selectorSpread.CalculateSpreadPriorityReduce
} }
// CalculateSpreadPriorityMap spreads pods across hosts, considering pods belonging to the same service or replication controller. // CalculateSpreadPriorityMap spreads pods across hosts, considering pods
// When a pod is scheduled, it looks for services, RCs or RSs that match the pod, then finds existing pods that match those selectors. // belonging to the same service,RC,RS or StatefulSet.
// When a pod is scheduled, it looks for services, RCs,RSs and StatefulSets that match the pod,
// then finds existing pods that match those selectors.
// It favors nodes that have fewer existing matching pods. // It favors nodes that have fewer existing matching pods.
// i.e. it pushes the scheduler towards a node where there's the smallest number of // i.e. it pushes the scheduler towards a node where there's the smallest number of
// pods which match the same service, RC or RS selectors as the pod being scheduled. // pods which match the same service, RC,RSs or StatefulSets selectors as the pod being scheduled.
func (s *SelectorSpread) CalculateSpreadPriorityMap(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error) { func (s *SelectorSpread) CalculateSpreadPriorityMap(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error) {
var selectors []labels.Selector var selectors []labels.Selector
node := nodeInfo.Node() node := nodeInfo.Node()
@ -80,7 +82,7 @@ func (s *SelectorSpread) CalculateSpreadPriorityMap(pod *v1.Pod, meta interface{
}, nil }, nil
} }
count := float64(0) count := int(0)
for _, nodePod := range nodeInfo.Pods() { for _, nodePod := range nodeInfo.Pods() {
if pod.Namespace != nodePod.Namespace { if pod.Namespace != nodePod.Namespace {
continue continue
@ -110,22 +112,15 @@ func (s *SelectorSpread) CalculateSpreadPriorityMap(pod *v1.Pod, meta interface{
}, nil }, nil
} }
// CalculateSpreadPriorityReduce calculates the source of each node based on the number of existing matching pods on the node // CalculateSpreadPriorityReduce calculates the source of each node
// where zone information is included on the nodes, it favors nodes in zones with fewer existing matching pods. // based on the number of existing matching pods on the node
// where zone information is included on the nodes, it favors nodes
// in zones with fewer existing matching pods.
func (s *SelectorSpread) CalculateSpreadPriorityReduce(pod *v1.Pod, meta interface{}, nodeNameToInfo map[string]*schedulercache.NodeInfo, result schedulerapi.HostPriorityList) error { func (s *SelectorSpread) CalculateSpreadPriorityReduce(pod *v1.Pod, meta interface{}, nodeNameToInfo map[string]*schedulercache.NodeInfo, result schedulerapi.HostPriorityList) error {
var selectors []labels.Selector
countsByZone := make(map[string]int, 10) countsByZone := make(map[string]int, 10)
maxCountByZone := int(0) maxCountByZone := int(0)
maxCountByNodeName := int(0) maxCountByNodeName := int(0)
priorityMeta, ok := meta.(*priorityMetadata)
if ok {
selectors = priorityMeta.podSelectors
} else {
selectors = getSelectors(pod, s.serviceLister, s.controllerLister, s.replicaSetLister, s.statefulSetLister)
}
if len(selectors) > 0 {
for i := range result { for i := range result {
if result[i].Score > maxCountByNodeName { if result[i].Score > maxCountByNodeName {
maxCountByNodeName = result[i].Score maxCountByNodeName = result[i].Score
@ -136,7 +131,6 @@ func (s *SelectorSpread) CalculateSpreadPriorityReduce(pod *v1.Pod, meta interfa
} }
countsByZone[zoneId] += result[i].Score countsByZone[zoneId] += result[i].Score
} }
}
for zoneId := range countsByZone { for zoneId := range countsByZone {
if countsByZone[zoneId] > maxCountByZone { if countsByZone[zoneId] > maxCountByZone {
@ -146,19 +140,23 @@ func (s *SelectorSpread) CalculateSpreadPriorityReduce(pod *v1.Pod, meta interfa
haveZones := len(countsByZone) != 0 haveZones := len(countsByZone) != 0
maxCountByNodeNameFloat64 := float64(maxCountByNodeName)
maxCountByZoneFloat64 := float64(maxCountByZone)
MaxPriorityFloat64 := float64(schedulerapi.MaxPriority)
for i := range result { for i := range result {
// initializing to the default/max node score of maxPriority // initializing to the default/max node score of maxPriority
fScore := float64(schedulerapi.MaxPriority) fScore := MaxPriorityFloat64
if maxCountByNodeName > 0 { if maxCountByNodeName > 0 {
fScore = float64(schedulerapi.MaxPriority) * (float64(maxCountByNodeName-result[i].Score) / float64(maxCountByNodeName)) fScore = MaxPriorityFloat64 * (float64(maxCountByNodeName-result[i].Score) / maxCountByNodeNameFloat64)
} }
// If there is zone information present, incorporate it // If there is zone information present, incorporate it
if haveZones { if haveZones {
zoneId := utilnode.GetZoneKey(nodeNameToInfo[result[i].Host].Node()) zoneId := utilnode.GetZoneKey(nodeNameToInfo[result[i].Host].Node())
if zoneId != "" { if zoneId != "" {
zoneScore := float64(schedulerapi.MaxPriority) zoneScore := MaxPriorityFloat64
if maxCountByZone > 0 { if maxCountByZone > 0 {
zoneScore = float64(schedulerapi.MaxPriority) * (float64(maxCountByZone-countsByZone[zoneId]) / float64(maxCountByZone)) zoneScore = MaxPriorityFloat64 * (float64(maxCountByZone-countsByZone[zoneId]) / maxCountByZoneFloat64)
} }
fScore = (fScore * (1.0 - zoneWeighting)) + (zoneWeighting * zoneScore) fScore = (fScore * (1.0 - zoneWeighting)) + (zoneWeighting * zoneScore)
} }

View File

@ -553,7 +553,6 @@ func TestZoneSelectorSpreadPriority(t *testing.T) {
buildPod(nodeMachine1Zone2, labels1, controllerRef("ReplicationController", "name", "abc123")), buildPod(nodeMachine1Zone2, labels1, controllerRef("ReplicationController", "name", "abc123")),
buildPod(nodeMachine1Zone3, labels1, controllerRef("ReplicationController", "name", "abc123")), buildPod(nodeMachine1Zone3, labels1, controllerRef("ReplicationController", "name", "abc123")),
}, },
//nodes: []string{nodeMachine1Zone3, nodeMachine1Zone2, nodeMachine1Zone3},
rcs: []*v1.ReplicationController{{Spec: v1.ReplicationControllerSpec{Selector: labels1}}}, rcs: []*v1.ReplicationController{{Spec: v1.ReplicationControllerSpec{Selector: labels1}}},
expectedList: []schedulerapi.HostPriority{ expectedList: []schedulerapi.HostPriority{
// Note that because we put two pods on the same node (nodeMachine1Zone3), // Note that because we put two pods on the same node (nodeMachine1Zone3),

View File

@ -218,7 +218,6 @@ func defaultPriorities() sets.String {
Weight: 1, Weight: 1,
}, },
), ),
// pods should be placed in the same topological domain (e.g. same node, same rack, same zone, same power domain, etc.) // pods should be placed in the same topological domain (e.g. same node, same rack, same zone, same power domain, etc.)
// as some other pods, or, conversely, should not be placed in the same topological domain as some other pods. // as some other pods, or, conversely, should not be placed in the same topological domain as some other pods.
factory.RegisterPriorityConfigFactory( factory.RegisterPriorityConfigFactory(