Skip to content

Commit 2a1ac8b

Browse files
authored
Merge pull request kubernetes#84293 from ahg-g/ahg-shared
Made all scheduler Node and Pod list/lookups from the snapshot
2 parents 37edb69 + 8ec56ae commit 2a1ac8b

31 files changed

+243
-101
lines changed

pkg/scheduler/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ go_library(
2828
"//pkg/scheduler/internal/queue:go_default_library",
2929
"//pkg/scheduler/listers:go_default_library",
3030
"//pkg/scheduler/metrics:go_default_library",
31+
"//pkg/scheduler/nodeinfo/snapshot:go_default_library",
3132
"//pkg/scheduler/volumebinder:go_default_library",
3233
"//staging/src/k8s.io/api/core/v1:go_default_library",
3334
"//staging/src/k8s.io/api/storage/v1:go_default_library",

pkg/scheduler/algorithm/predicates/metadata_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ func TestPredicateMetadata_AddRemovePod(t *testing.T) {
355355
// getMeta creates predicate meta data given the list of pods.
356356
getMeta := func(lister fakelisters.PodLister) (*predicateMetadata, map[string]*schedulernodeinfo.NodeInfo) {
357357
nodeInfoMap := schedulernodeinfo.CreateNodeNameToInfoMap(lister, test.nodes)
358-
_, precompute := NewServiceAffinityPredicate(fakelisters.NodeLister(test.nodes), lister, fakelisters.ServiceLister(test.services), nil)
358+
_, precompute := NewServiceAffinityPredicate(fakelisters.NewNodeInfoLister(test.nodes), lister, fakelisters.ServiceLister(test.services), nil)
359359
RegisterPredicateMetadataProducer("ServiceAffinityMetaProducer", precompute)
360360
meta := GetPredicateMetadata(test.pendingPod, nodeInfoMap)
361361
return meta.(*predicateMetadata), nodeInfoMap

pkg/scheduler/algorithm/predicates/predicates.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -991,10 +991,10 @@ func (n *NodeLabelChecker) CheckNodeLabelPresence(pod *v1.Pod, meta PredicateMet
991991

992992
// ServiceAffinity defines a struct used for creating service affinity predicates.
993993
type ServiceAffinity struct {
994-
nodeLister schedulerlisters.NodeLister
995-
podLister schedulerlisters.PodLister
996-
serviceLister corelisters.ServiceLister
997-
labels []string
994+
nodeInfoLister schedulerlisters.NodeInfoLister
995+
podLister schedulerlisters.PodLister
996+
serviceLister corelisters.ServiceLister
997+
labels []string
998998
}
999999

10001000
// serviceAffinityMetadataProducer should be run once by the scheduler before looping through the Predicate. It is a helper function that
@@ -1024,12 +1024,12 @@ func (s *ServiceAffinity) serviceAffinityMetadataProducer(pm *predicateMetadata)
10241024
}
10251025

10261026
// NewServiceAffinityPredicate creates a ServiceAffinity.
1027-
func NewServiceAffinityPredicate(nodeLister schedulerlisters.NodeLister, podLister schedulerlisters.PodLister, serviceLister corelisters.ServiceLister, labels []string) (FitPredicate, predicateMetadataProducer) {
1027+
func NewServiceAffinityPredicate(nodeInfoLister schedulerlisters.NodeInfoLister, podLister schedulerlisters.PodLister, serviceLister corelisters.ServiceLister, labels []string) (FitPredicate, predicateMetadataProducer) {
10281028
affinity := &ServiceAffinity{
1029-
nodeLister: nodeLister,
1030-
podLister: podLister,
1031-
serviceLister: serviceLister,
1032-
labels: labels,
1029+
nodeInfoLister: nodeInfoLister,
1030+
podLister: podLister,
1031+
serviceLister: serviceLister,
1032+
labels: labels,
10331033
}
10341034
return affinity.checkServiceAffinity, affinity.serviceAffinityMetadataProducer
10351035
}
@@ -1084,11 +1084,11 @@ func (s *ServiceAffinity) checkServiceAffinity(pod *v1.Pod, meta PredicateMetada
10841084
if len(s.labels) > len(affinityLabels) {
10851085
if len(services) > 0 {
10861086
if len(filteredPods) > 0 {
1087-
nodeWithAffinityLabels, err := s.nodeLister.GetNodeInfo(filteredPods[0].Spec.NodeName)
1087+
nodeWithAffinityLabels, err := s.nodeInfoLister.Get(filteredPods[0].Spec.NodeName)
10881088
if err != nil {
10891089
return false, nil, err
10901090
}
1091-
AddUnsetLabelsToMap(affinityLabels, s.labels, labels.Set(nodeWithAffinityLabels.Labels))
1091+
AddUnsetLabelsToMap(affinityLabels, s.labels, labels.Set(nodeWithAffinityLabels.Node().Labels))
10921092
}
10931093
}
10941094
}
@@ -1192,15 +1192,15 @@ func EssentialPredicates(pod *v1.Pod, meta PredicateMetadata, nodeInfo *schedule
11921192

11931193
// PodAffinityChecker contains information to check pod affinity.
11941194
type PodAffinityChecker struct {
1195-
nodeLister schedulerlisters.NodeLister
1196-
podLister schedulerlisters.PodLister
1195+
nodeInfoLister schedulerlisters.NodeInfoLister
1196+
podLister schedulerlisters.PodLister
11971197
}
11981198

11991199
// NewPodAffinityPredicate creates a PodAffinityChecker.
1200-
func NewPodAffinityPredicate(nodeLister schedulerlisters.NodeLister, podLister schedulerlisters.PodLister) FitPredicate {
1200+
func NewPodAffinityPredicate(nodeInfoLister schedulerlisters.NodeInfoLister, podLister schedulerlisters.PodLister) FitPredicate {
12011201
checker := &PodAffinityChecker{
1202-
nodeLister: nodeLister,
1203-
podLister: podLister,
1202+
nodeInfoLister: nodeInfoLister,
1203+
podLister: podLister,
12041204
}
12051205
return checker.InterPodAffinityMatches
12061206
}
@@ -1254,15 +1254,15 @@ func (c *PodAffinityChecker) podMatchesPodAffinityTerms(pod, targetPod *v1.Pod,
12541254
return false, false, nil
12551255
}
12561256
// Namespace and selector of the terms have matched. Now we check topology of the terms.
1257-
targetPodNodeInfo, err := c.nodeLister.GetNodeInfo(targetPod.Spec.NodeName)
1257+
targetPodNodeInfo, err := c.nodeInfoLister.Get(targetPod.Spec.NodeName)
12581258
if err != nil {
12591259
return false, false, err
12601260
}
12611261
for _, term := range terms {
12621262
if len(term.TopologyKey) == 0 {
12631263
return false, false, fmt.Errorf("empty topologyKey is not allowed except for PreferredDuringScheduling pod anti-affinity")
12641264
}
1265-
if !priorityutil.NodesHaveSameTopologyKey(nodeInfo.Node(), targetPodNodeInfo, term.TopologyKey) {
1265+
if !priorityutil.NodesHaveSameTopologyKey(nodeInfo.Node(), targetPodNodeInfo.Node(), term.TopologyKey) {
12661266
return false, true, nil
12671267
}
12681268
}
@@ -1327,12 +1327,12 @@ func (c *PodAffinityChecker) getMatchingAntiAffinityTopologyPairsOfPods(pod *v1.
13271327
topologyMaps := newTopologyPairsMaps()
13281328

13291329
for _, existingPod := range existingPods {
1330-
existingPodNode, err := c.nodeLister.GetNodeInfo(existingPod.Spec.NodeName)
1330+
existingPodNodeInfo, err := c.nodeInfoLister.Get(existingPod.Spec.NodeName)
13311331
if err != nil {
13321332
klog.Errorf("Pod %s has NodeName %q but node is not found", podName(existingPod), existingPod.Spec.NodeName)
13331333
continue
13341334
}
1335-
existingPodTopologyMaps, err := getMatchingAntiAffinityTopologyPairsOfPod(pod, existingPod, existingPodNode)
1335+
existingPodTopologyMaps, err := getMatchingAntiAffinityTopologyPairsOfPod(pod, existingPod, existingPodNodeInfo.Node())
13361336
if err != nil {
13371337
return nil, err
13381338
}

pkg/scheduler/algorithm/predicates/predicates_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,7 +1858,7 @@ func TestServiceAffinity(t *testing.T) {
18581858
nodeInfo.SetNode(test.node)
18591859
nodeInfoMap := map[string]*schedulernodeinfo.NodeInfo{test.node.Name: nodeInfo}
18601860
// Reimplementing the logic that the scheduler implements: Any time it makes a predicate, it registers any precomputations.
1861-
predicate, precompute := NewServiceAffinityPredicate(fakelisters.NodeLister(nodes), fakelisters.PodLister(test.pods), fakelisters.ServiceLister(test.services), test.labels)
1861+
predicate, precompute := NewServiceAffinityPredicate(fakelisters.NewNodeInfoLister(nodes), fakelisters.PodLister(test.pods), fakelisters.ServiceLister(test.services), test.labels)
18621862
// Register a precomputation or Rewrite the precomputation to a no-op, depending on the state we want to test.
18631863
RegisterPredicateMetadataProducer("ServiceAffinityMetaProducer", func(pm *predicateMetadata) {
18641864
if !skipPrecompute {
@@ -2931,8 +2931,8 @@ func TestInterPodAffinity(t *testing.T) {
29312931
}
29322932

29332933
fit := PodAffinityChecker{
2934-
nodeLister: fakelisters.NodeLister([]*v1.Node{node}),
2935-
podLister: fakelisters.PodLister(test.pods),
2934+
nodeInfoLister: fakelisters.NewNodeInfoLister([]*v1.Node{node}),
2935+
podLister: fakelisters.PodLister(test.pods),
29362936
}
29372937
nodeInfo := schedulernodeinfo.NewNodeInfo(podsOnNode...)
29382938
nodeInfo.SetNode(test.node)
@@ -4044,8 +4044,8 @@ func TestInterPodAffinityWithMultipleNodes(t *testing.T) {
40444044

40454045
for indexNode, node := range test.nodes {
40464046
testFit := PodAffinityChecker{
4047-
nodeLister: fakelisters.NodeLister(test.nodes),
4048-
podLister: fakelisters.PodLister(test.pods),
4047+
nodeInfoLister: fakelisters.NewNodeInfoLister(test.nodes),
4048+
podLister: fakelisters.PodLister(test.pods),
40494049
}
40504050

40514051
var meta PredicateMetadata

pkg/scheduler/algorithm/priorities/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ go_test(
8080
"//pkg/scheduler/framework/v1alpha1:go_default_library",
8181
"//pkg/scheduler/listers/fake:go_default_library",
8282
"//pkg/scheduler/nodeinfo:go_default_library",
83+
"//pkg/scheduler/nodeinfo/snapshot:go_default_library",
8384
"//pkg/scheduler/testing:go_default_library",
8485
"//pkg/util/parsers:go_default_library",
8586
"//staging/src/k8s.io/api/apps/v1:go_default_library",

pkg/scheduler/algorithm/priorities/interpod_affinity.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ import (
3434

3535
// InterPodAffinity contains information to calculate inter pod affinity.
3636
type InterPodAffinity struct {
37-
nodeLister schedulerlisters.NodeLister
37+
nodeInfoLister schedulerlisters.NodeInfoLister
3838
hardPodAffinityWeight int32
3939
}
4040

4141
// NewInterPodAffinityPriority creates an InterPodAffinity.
42-
func NewInterPodAffinityPriority(nodeLister schedulerlisters.NodeLister, hardPodAffinityWeight int32) PriorityFunction {
42+
func NewInterPodAffinityPriority(nodeInfoLister schedulerlisters.NodeInfoLister, hardPodAffinityWeight int32) PriorityFunction {
4343
interPodAffinity := &InterPodAffinity{
44-
nodeLister: nodeLister,
44+
nodeInfoLister: nodeInfoLister,
4545
hardPodAffinityWeight: hardPodAffinityWeight,
4646
}
4747
return interPodAffinity.CalculateInterPodAffinityPriority
@@ -118,14 +118,15 @@ func (ipa *InterPodAffinity) CalculateInterPodAffinityPriority(pod *v1.Pod, node
118118
var maxCount, minCount int64
119119

120120
processPod := func(existingPod *v1.Pod) error {
121-
existingPodNode, err := ipa.nodeLister.GetNodeInfo(existingPod.Spec.NodeName)
121+
existingPodNodeInfo, err := ipa.nodeInfoLister.Get(existingPod.Spec.NodeName)
122122
if err != nil {
123123
klog.Errorf("Node not found, %v", existingPod.Spec.NodeName)
124124
return nil
125125
}
126126
existingPodAffinity := existingPod.Spec.Affinity
127127
existingHasAffinityConstraints := existingPodAffinity != nil && existingPodAffinity.PodAffinity != nil
128128
existingHasAntiAffinityConstraints := existingPodAffinity != nil && existingPodAffinity.PodAntiAffinity != nil
129+
existingPodNode := existingPodNodeInfo.Node()
129130

130131
if hasAffinityConstraints {
131132
// For every soft pod affinity term of <pod>, if <existingPod> matches the term,

pkg/scheduler/algorithm/priorities/interpod_affinity_test.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ import (
2323
v1 "k8s.io/api/core/v1"
2424
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2525
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
26-
fakelisters "k8s.io/kubernetes/pkg/scheduler/listers/fake"
27-
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
26+
nodeinfosnapshot "k8s.io/kubernetes/pkg/scheduler/nodeinfo/snapshot"
2827
st "k8s.io/kubernetes/pkg/scheduler/testing"
2928
)
3029

@@ -515,12 +514,12 @@ func TestInterPodAffinityPriority(t *testing.T) {
515514
}
516515
for _, test := range tests {
517516
t.Run(test.name, func(t *testing.T) {
518-
nodeNameToInfo := schedulernodeinfo.CreateNodeNameToInfoMap(test.pods, test.nodes)
517+
snapshot := nodeinfosnapshot.NewSnapshot(test.pods, test.nodes)
519518
interPodAffinity := InterPodAffinity{
520-
nodeLister: fakelisters.NodeLister(test.nodes),
519+
nodeInfoLister: snapshot.NodeInfos(),
521520
hardPodAffinityWeight: v1.DefaultHardPodAffinitySymmetricWeight,
522521
}
523-
list, err := interPodAffinity.CalculateInterPodAffinityPriority(test.pod, nodeNameToInfo, test.nodes)
522+
list, err := interPodAffinity.CalculateInterPodAffinityPriority(test.pod, snapshot.NodeInfoMap, test.nodes)
524523
if err != nil {
525524
t.Errorf("unexpected error: %v", err)
526525
}
@@ -603,12 +602,12 @@ func TestHardPodAffinitySymmetricWeight(t *testing.T) {
603602
}
604603
for _, test := range tests {
605604
t.Run(test.name, func(t *testing.T) {
606-
nodeNameToInfo := schedulernodeinfo.CreateNodeNameToInfoMap(test.pods, test.nodes)
605+
snapshot := nodeinfosnapshot.NewSnapshot(test.pods, test.nodes)
607606
ipa := InterPodAffinity{
608-
nodeLister: fakelisters.NodeLister(test.nodes),
607+
nodeInfoLister: snapshot.NodeInfos(),
609608
hardPodAffinityWeight: test.hardPodAffinityWeight,
610609
}
611-
list, err := ipa.CalculateInterPodAffinityPriority(test.pod, nodeNameToInfo, test.nodes)
610+
list, err := ipa.CalculateInterPodAffinityPriority(test.pod, snapshot.NodeInfoMap, test.nodes)
612611
if err != nil {
613612
t.Errorf("unexpected error: %v", err)
614613
}
@@ -660,14 +659,14 @@ func BenchmarkInterPodAffinityPriority(b *testing.B) {
660659
for _, tt := range tests {
661660
b.Run(tt.name, func(b *testing.B) {
662661
existingPods, allNodes := tt.prepFunc(tt.existingPodsNum, tt.allNodesNum)
663-
nodeNameToInfo := schedulernodeinfo.CreateNodeNameToInfoMap(existingPods, allNodes)
662+
snapshot := nodeinfosnapshot.NewSnapshot(existingPods, allNodes)
664663
interPodAffinity := InterPodAffinity{
665-
nodeLister: fakelisters.NodeLister(allNodes),
664+
nodeInfoLister: snapshot.NodeInfos(),
666665
hardPodAffinityWeight: v1.DefaultHardPodAffinitySymmetricWeight,
667666
}
668667
b.ResetTimer()
669668
for i := 0; i < b.N; i++ {
670-
interPodAffinity.CalculateInterPodAffinityPriority(tt.pod, nodeNameToInfo, allNodes)
669+
interPodAffinity.CalculateInterPodAffinityPriority(tt.pod, snapshot.NodeInfoMap, allNodes)
671670
}
672671
})
673672
}

pkg/scheduler/algorithm_factory.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ import (
4141

4242
// PluginFactoryArgs are passed to all plugin factory functions.
4343
type PluginFactoryArgs struct {
44+
NodeInfoLister schedulerlisters.NodeInfoLister
4445
PodLister schedulerlisters.PodLister
4546
ServiceLister corelisters.ServiceLister
4647
ControllerLister corelisters.ReplicationControllerLister
4748
ReplicaSetLister appslisters.ReplicaSetLister
4849
StatefulSetLister appslisters.StatefulSetLister
4950
PDBLister policylisters.PodDisruptionBudgetLister
50-
NodeLister schedulerlisters.NodeLister
5151
CSINodeLister v1beta1storagelisters.CSINodeLister
5252
PVLister corelisters.PersistentVolumeLister
5353
PVCLister corelisters.PersistentVolumeClaimLister
@@ -270,7 +270,7 @@ func RegisterCustomFitPredicate(policy schedulerapi.PredicatePolicy) string {
270270
if policy.Argument.ServiceAffinity != nil {
271271
predicateFactory = func(args PluginFactoryArgs) predicates.FitPredicate {
272272
predicate, precomputationFunction := predicates.NewServiceAffinityPredicate(
273-
args.NodeLister,
273+
args.NodeInfoLister,
274274
args.PodLister,
275275
args.ServiceLister,
276276
policy.Argument.ServiceAffinity.Labels,

pkg/scheduler/algorithmprovider/defaults/register_predicates.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func init() {
9292
scheduler.RegisterFitPredicateFactory(
9393
predicates.MatchInterPodAffinityPred,
9494
func(args scheduler.PluginFactoryArgs) predicates.FitPredicate {
95-
return predicates.NewPodAffinityPredicate(args.NodeLister, args.PodLister)
95+
return predicates.NewPodAffinityPredicate(args.NodeInfoLister, args.PodLister)
9696
},
9797
)
9898

pkg/scheduler/algorithmprovider/defaults/register_priorities.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func init() {
7070
priorities.InterPodAffinityPriority,
7171
scheduler.PriorityConfigFactory{
7272
Function: func(args scheduler.PluginFactoryArgs) priorities.PriorityFunction {
73-
return priorities.NewInterPodAffinityPriority(args.NodeLister, args.HardPodAffinitySymmetricWeight)
73+
return priorities.NewInterPodAffinityPriority(args.NodeInfoLister, args.HardPodAffinitySymmetricWeight)
7474
},
7575
Weight: 1,
7676
},

0 commit comments

Comments
 (0)