Skip to content

Commit 93c518b

Browse files
authored
Merge pull request #599 from ffromani/nrt-extra-informer
nrt: cache: add support for dedicated informer
2 parents d9c3dcc + e466bc4 commit 93c518b

18 files changed

+437
-169
lines changed

apis/config/types.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,14 @@ const (
176176
CacheResyncOnlyExclusiveResources CacheResyncMethod = "OnlyExclusiveResources"
177177
)
178178

179+
// CacheInformerMode is a "string" type
180+
type CacheInformerMode string
181+
182+
const (
183+
CacheInformerShared CacheInformerMode = "Shared"
184+
CacheInformerDedicated CacheInformerMode = "Dedicated"
185+
)
186+
179187
// NodeResourceTopologyCache define configuration details for the NodeResourceTopology cache.
180188
type NodeResourceTopologyCache struct {
181189
// ForeignPodsDetect sets how foreign pods should be handled.
@@ -192,6 +200,11 @@ type NodeResourceTopologyCache struct {
192200
// Has no effect if caching is disabled (CacheResyncPeriod is zero) or if DiscardReservedNodes
193201
// is enabled. "Autodetect" is the default, reads hint from NRT objects. Fallback is "All".
194202
ResyncMethod *CacheResyncMethod
203+
// InformerMode controls the channel the cache uses to get updates about pods.
204+
// "Shared" uses the default settings; "Dedicated" creates a specific subscription which is
205+
// guaranteed to best suit the cache needs, at cost of one extra connection.
206+
// If unspecified, default is "Dedicated"
207+
InformerMode *CacheInformerMode
195208
}
196209

197210
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

apis/config/v1/defaults.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ var (
8989

9090
defaultResyncMethod = CacheResyncAutodetect
9191

92+
defaultInformerMode = CacheInformerDedicated
93+
9294
// Defaults for NetworkOverhead
9395
// DefaultWeightsName contains the default costs to be used by networkAware plugins
9496
DefaultWeightsName = "UserDefined"
@@ -200,6 +202,9 @@ func SetDefaults_NodeResourceTopologyMatchArgs(obj *NodeResourceTopologyMatchArg
200202
if obj.Cache.ResyncMethod == nil {
201203
obj.Cache.ResyncMethod = &defaultResyncMethod
202204
}
205+
if obj.Cache.InformerMode == nil {
206+
obj.Cache.InformerMode = &defaultInformerMode
207+
}
203208
}
204209

205210
// SetDefaults_PreemptionTolerationArgs reuses SetDefaults_DefaultPreemptionArgs

apis/config/v1/defaults_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ func TestSchedulingDefaults(t *testing.T) {
205205
Cache: &NodeResourceTopologyCache{
206206
ForeignPodsDetect: &defaultForeignPodsDetect,
207207
ResyncMethod: &defaultResyncMethod,
208+
InformerMode: &defaultInformerMode,
208209
},
209210
},
210211
},

apis/config/v1/types.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ const (
174174
CacheResyncOnlyExclusiveResources CacheResyncMethod = "OnlyExclusiveResources"
175175
)
176176

177+
// CacheInformerMode is a "string" type
178+
type CacheInformerMode string
179+
180+
const (
181+
CacheInformerShared CacheInformerMode = "Shared"
182+
CacheInformerDedicated CacheInformerMode = "Dedicated"
183+
)
184+
177185
// NodeResourceTopologyCache define configuration details for the NodeResourceTopology cache.
178186
type NodeResourceTopologyCache struct {
179187
// ForeignPodsDetect sets how foreign pods should be handled.
@@ -190,6 +198,11 @@ type NodeResourceTopologyCache struct {
190198
// Has no effect if caching is disabled (CacheResyncPeriod is zero) or if DiscardReservedNodes
191199
// is enabled. "Autodetect" is the default, reads hint from NRT objects. Fallback is "All".
192200
ResyncMethod *CacheResyncMethod `json:"resyncMethod,omitempty"`
201+
// InformerMode controls the channel the cache uses to get updates about pods.
202+
// "Shared" uses the default settings; "Dedicated" creates a specific subscription which is
203+
// guaranteed to best suit the cache needs, at cost of one extra connection.
204+
// If unspecified, default is "Dedicated"
205+
InformerMode *CacheInformerMode `json:"informerMode,omitempty"`
193206
}
194207

195208
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

apis/config/v1/zz_generated.conversion.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/config/v1/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/config/v1beta3/defaults.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ var (
8989

9090
defaultResyncMethod = CacheResyncAutodetect
9191

92+
defaultInformerMode = CacheInformerDedicated
93+
9294
// Defaults for NetworkOverhead
9395
// DefaultWeightsName contains the default costs to be used by networkAware plugins
9496
DefaultWeightsName = "UserDefined"
@@ -200,6 +202,9 @@ func SetDefaults_NodeResourceTopologyMatchArgs(obj *NodeResourceTopologyMatchArg
200202
if obj.Cache.ResyncMethod == nil {
201203
obj.Cache.ResyncMethod = &defaultResyncMethod
202204
}
205+
if obj.Cache.InformerMode == nil {
206+
obj.Cache.InformerMode = &defaultInformerMode
207+
}
203208
}
204209

205210
// SetDefaults_PreemptionTolerationArgs reuses SetDefaults_DefaultPreemptionArgs

apis/config/v1beta3/defaults_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ func TestSchedulingDefaults(t *testing.T) {
205205
Cache: &NodeResourceTopologyCache{
206206
ForeignPodsDetect: &defaultForeignPodsDetect,
207207
ResyncMethod: &defaultResyncMethod,
208+
InformerMode: &defaultInformerMode,
208209
},
209210
},
210211
},

apis/config/v1beta3/types.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ const (
174174
CacheResyncOnlyExclusiveResources CacheResyncMethod = "OnlyExclusiveResources"
175175
)
176176

177+
// CacheInformerMode is a "string" type
178+
type CacheInformerMode string
179+
180+
const (
181+
CacheInformerShared CacheInformerMode = "Shared"
182+
CacheInformerDedicated CacheInformerMode = "Dedicated"
183+
)
184+
177185
// NodeResourceTopologyCache define configuration details for the NodeResourceTopology cache.
178186
type NodeResourceTopologyCache struct {
179187
// ForeignPodsDetect sets how foreign pods should be handled.
@@ -190,6 +198,11 @@ type NodeResourceTopologyCache struct {
190198
// Has no effect if caching is disabled (CacheResyncPeriod is zero) or if DiscardReservedNodes
191199
// is enabled. "Autodetect" is the default, reads hint from NRT objects. Fallback is "All".
192200
ResyncMethod *CacheResyncMethod `json:"resyncMethod,omitempty"`
201+
// InformerMode controls the channel the cache uses to get updates about pods.
202+
// "Shared" uses the default settings; "Dedicated" creates a specific subscription which is
203+
// guaranteed to best suit the cache needs, at cost of one extra connection.
204+
// If unspecified, default is "Dedicated"
205+
InformerMode *CacheInformerMode `json:"informerMode,omitempty"`
193206
}
194207

195208
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

apis/config/v1beta3/zz_generated.conversion.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/config/v1beta3/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/config/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/noderesourcetopology/cache/overreserve.go

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,16 @@ import (
2727
"github.com/k8stopologyawareschedwg/podfingerprint"
2828

2929
corev1 "k8s.io/api/core/v1"
30+
"k8s.io/apimachinery/pkg/labels"
3031
"k8s.io/apimachinery/pkg/types"
3132
podlisterv1 "k8s.io/client-go/listers/core/v1"
32-
k8scache "k8s.io/client-go/tools/cache"
3333
"k8s.io/klog/v2"
34-
"k8s.io/kubernetes/pkg/scheduler/framework"
3534

3635
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
3736

3837
apiconfig "sigs.k8s.io/scheduler-plugins/apis/config"
38+
"sigs.k8s.io/scheduler-plugins/pkg/noderesourcetopology/podprovider"
39+
"sigs.k8s.io/scheduler-plugins/pkg/noderesourcetopology/resourcerequests"
3940
"sigs.k8s.io/scheduler-plugins/pkg/noderesourcetopology/stringify"
4041
)
4142

@@ -50,9 +51,10 @@ type OverReserve struct {
5051
nodesWithForeignPods counter
5152
podLister podlisterv1.PodLister
5253
resyncMethod apiconfig.CacheResyncMethod
54+
isPodRelevant podprovider.PodFilterFunc
5355
}
5456

55-
func NewOverReserve(cfg *apiconfig.NodeResourceTopologyCache, client ctrlclient.Client, podLister podlisterv1.PodLister) (*OverReserve, error) {
57+
func NewOverReserve(cfg *apiconfig.NodeResourceTopologyCache, client ctrlclient.Client, podLister podlisterv1.PodLister, isPodRelevant podprovider.PodFilterFunc) (*OverReserve, error) {
5658
if client == nil || podLister == nil {
5759
return nil, fmt.Errorf("nrtcache: received nil references")
5860
}
@@ -74,6 +76,7 @@ func NewOverReserve(cfg *apiconfig.NodeResourceTopologyCache, client ctrlclient.
7476
nodesWithForeignPods: newCounter(),
7577
podLister: podLister,
7678
resyncMethod: resyncMethod,
79+
isPodRelevant: isPodRelevant,
7780
}
7881
return obj, nil
7982
}
@@ -199,7 +202,7 @@ func (ov *OverReserve) Resync() {
199202
}
200203

201204
// node -> pod identifier (namespace, name)
202-
nodeToObjsMap, err := makeNodeToPodDataMap(ov.podLister, logID)
205+
nodeToObjsMap, err := makeNodeToPodDataMap(ov.podLister, ov.isPodRelevant, logID)
203206
if err != nil {
204207
klog.ErrorS(err, "cannot find the mapping between running pods and nodes")
205208
return
@@ -267,16 +270,32 @@ func (ov *OverReserve) FlushNodes(logID string, nrts ...*topologyv1alpha2.NodeRe
267270
}
268271
}
269272

270-
func InformerFromHandle(handle framework.Handle) (k8scache.SharedIndexInformer, podlisterv1.PodLister) {
271-
podHandle := handle.SharedInformerFactory().Core().V1().Pods() // shortcut
272-
return podHandle.Informer(), podHandle.Lister()
273-
}
274-
275273
// to be used only in tests
276274
func (ov *OverReserve) Store() *nrtStore {
277275
return ov.nrts
278276
}
279277

278+
func makeNodeToPodDataMap(podLister podlisterv1.PodLister, isPodRelevant podprovider.PodFilterFunc, logID string) (map[string][]podData, error) {
279+
nodeToObjsMap := make(map[string][]podData)
280+
pods, err := podLister.List(labels.Everything())
281+
if err != nil {
282+
return nodeToObjsMap, err
283+
}
284+
for _, pod := range pods {
285+
if !isPodRelevant(pod, logID) {
286+
continue
287+
}
288+
nodeObjs := nodeToObjsMap[pod.Spec.NodeName]
289+
nodeObjs = append(nodeObjs, podData{
290+
Namespace: pod.Namespace,
291+
Name: pod.Name,
292+
HasExclusiveResources: resourcerequests.AreExclusiveForPod(pod),
293+
})
294+
nodeToObjsMap[pod.Spec.NodeName] = nodeObjs
295+
}
296+
return nodeToObjsMap, nil
297+
}
298+
280299
func logIDFromTime() string {
281300
return fmt.Sprintf("resync%v", time.Now().UnixMilli())
282301
}

0 commit comments

Comments
 (0)