Skip to content

Commit 8d76bb3

Browse files
authored
Merge pull request kubernetes#3498 from jbartosik/no-fetch-nodes
Don't fetch nodes
2 parents 2103c16 + 4b459a2 commit 8d76bb3

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

vertical-pod-autoscaler/pkg/recommender/input/controller_fetcher/controller_fetcher.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,14 @@ import (
4545
type wellKnownController string
4646

4747
const (
48+
cronJob wellKnownController = "CronJob"
4849
daemonSet wellKnownController = "DaemonSet"
4950
deployment wellKnownController = "Deployment"
51+
node wellKnownController = "Node"
52+
job wellKnownController = "Job"
5053
replicaSet wellKnownController = "ReplicaSet"
51-
statefulSet wellKnownController = "StatefulSet"
5254
replicationController wellKnownController = "ReplicationController"
53-
job wellKnownController = "Job"
54-
cronJob wellKnownController = "CronJob"
55+
statefulSet wellKnownController = "StatefulSet"
5556
)
5657

5758
const (
@@ -251,6 +252,9 @@ func (f *controllerFetcher) isWellKnownOrScalable(key *ControllerKeyWithAPIVersi
251252
if f.isWellKnown(key) {
252253
return true
253254
}
255+
if gk, err := key.groupKind(); err != nil && wellKnownController(gk.Kind) == node {
256+
return false
257+
}
254258

255259
//if not well known check if it supports scaling
256260
groupKind, err := key.groupKind()
@@ -276,11 +280,16 @@ func (f *controllerFetcher) isWellKnownOrScalable(key *ControllerKeyWithAPIVersi
276280
}
277281

278282
func (f *controllerFetcher) getOwnerForScaleResource(groupKind schema.GroupKind, namespace, name string) (*ControllerKeyWithAPIVersion, error) {
283+
if wellKnownController(groupKind.Kind) == node {
284+
// Some pods specify nods as their owners. This causes performance problems
285+
// in big clusters when VPA tries to get all nodes. We know nodes aren't
286+
// valid controllers so we can skip trying to fetch them.
287+
return nil, fmt.Errorf("node is not a valid owner")
288+
}
279289
mappings, err := f.mapper.RESTMappings(groupKind)
280290
if err != nil {
281291
return nil, err
282292
}
283-
284293
var lastError error
285294
for _, mapping := range mappings {
286295
groupResource := mapping.Resource.GroupResource()

vertical-pod-autoscaler/pkg/recommender/input/controller_fetcher/controller_fetcher_test.go

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,25 +107,29 @@ func addController(controller *controllerFetcher, obj runtime.Object) {
107107

108108
func TestControllerFetcher(t *testing.T) {
109109
type testCase struct {
110+
name string
110111
apiVersion string
111112
key *ControllerKeyWithAPIVersion
112113
objects []runtime.Object
113114
expectedKey *ControllerKeyWithAPIVersion
114115
expectedError error
115116
}
116-
for i, tc := range []testCase{
117+
for _, tc := range []testCase{
117118
{
119+
name: "nils",
118120
key: nil,
119121
expectedKey: nil,
120122
expectedError: nil,
121123
},
122124
{
125+
name: "deployment doesn't exist",
123126
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
124127
Name: "test-deployment", Kind: "Deployment", Namespace: "test-namesapce"}},
125128
expectedKey: nil,
126129
expectedError: fmt.Errorf("Deployment test-namesapce/test-deployment does not exist"),
127130
},
128131
{
132+
name: "deployment no parent",
129133
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
130134
Name: "test-deployment", Kind: "Deployment", Namespace: "test-namesapce"}},
131135
objects: []runtime.Object{&appsv1.Deployment{
@@ -142,6 +146,7 @@ func TestControllerFetcher(t *testing.T) {
142146
expectedError: nil,
143147
},
144148
{
149+
name: "deployment with parent",
145150
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
146151
Name: "test-rs", Kind: "ReplicaSet", Namespace: "test-namesapce"}},
147152
objects: []runtime.Object{&appsv1.Deployment{
@@ -173,6 +178,7 @@ func TestControllerFetcher(t *testing.T) {
173178
expectedError: nil,
174179
},
175180
{
181+
name: "StatefulSet",
176182
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
177183
Name: "test-statefulset", Kind: "StatefulSet", Namespace: "test-namesapce"}},
178184
objects: []runtime.Object{&appsv1.StatefulSet{
@@ -189,6 +195,7 @@ func TestControllerFetcher(t *testing.T) {
189195
expectedError: nil,
190196
},
191197
{
198+
name: "DaemonSet",
192199
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
193200
Name: "test-daemonset", Kind: "DaemonSet", Namespace: "test-namesapce"}},
194201
objects: []runtime.Object{&appsv1.DaemonSet{
@@ -205,6 +212,7 @@ func TestControllerFetcher(t *testing.T) {
205212
expectedError: nil,
206213
},
207214
{
215+
name: "CronJob",
208216
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
209217
Name: "test-job", Kind: "Job", Namespace: "test-namespace"}},
210218
objects: []runtime.Object{&batchv1.Job{
@@ -236,6 +244,7 @@ func TestControllerFetcher(t *testing.T) {
236244
expectedError: nil,
237245
},
238246
{
247+
name: "CronJob no parent",
239248
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
240249
Name: "test-cronjob", Kind: "CronJob", Namespace: "test-namespace"}},
241250
objects: []runtime.Object{&batchv1beta1.CronJob{
@@ -252,6 +261,7 @@ func TestControllerFetcher(t *testing.T) {
252261
expectedError: nil,
253262
},
254263
{
264+
name: "rc no parent",
255265
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
256266
Name: "test-rc", Kind: "ReplicationController", Namespace: "test-namesapce"}},
257267
objects: []runtime.Object{&corev1.ReplicationController{
@@ -268,6 +278,7 @@ func TestControllerFetcher(t *testing.T) {
268278
expectedError: nil,
269279
},
270280
{
281+
name: "deployment cycle in ownership",
271282
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
272283
Name: "test-deployment", Kind: "Deployment", Namespace: "test-namesapce"}},
273284
objects: []runtime.Object{&appsv1.Deployment{
@@ -291,6 +302,7 @@ func TestControllerFetcher(t *testing.T) {
291302
expectedError: fmt.Errorf("Cycle detected in ownership chain"),
292303
},
293304
{
305+
name: "deployment, parent with no scale subresource",
294306
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
295307
Name: "test-deployment", Kind: "Deployment", Namespace: "test-namesapce"}},
296308
objects: []runtime.Object{&appsv1.Deployment{
@@ -316,6 +328,7 @@ func TestControllerFetcher(t *testing.T) {
316328
expectedError: nil,
317329
},
318330
{
331+
name: "deployment, parent not well known with scale subresource",
319332
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
320333
Name: "test-deployment", Kind: "Deployment", Namespace: "test-namesapce"}},
321334
objects: []runtime.Object{&appsv1.Deployment{
@@ -340,8 +353,33 @@ func TestControllerFetcher(t *testing.T) {
340353
Name: "iCanScale", Kind: "Scale", Namespace: "test-namesapce"}, ApiVersion: "Foo/Foo"}, // Parent supports scale subresource"
341354
expectedError: nil,
342355
},
356+
{
357+
name: "pod, parent is node",
358+
key: &ControllerKeyWithAPIVersion{ControllerKey: ControllerKey{
359+
Name: "test-deployment", Kind: "Deployment", Namespace: "test-namesapce"}},
360+
objects: []runtime.Object{&appsv1.Deployment{
361+
TypeMeta: metav1.TypeMeta{
362+
Kind: "Deployment",
363+
},
364+
ObjectMeta: metav1.ObjectMeta{
365+
Name: "test-deployment",
366+
Namespace: "test-namesapce",
367+
// Parent is a node
368+
OwnerReferences: []metav1.OwnerReference{
369+
{
370+
APIVersion: "v1",
371+
Controller: &trueVar,
372+
Kind: "Node",
373+
Name: "node",
374+
},
375+
},
376+
},
377+
}},
378+
expectedKey: nil,
379+
expectedError: fmt.Errorf("Unhandled targetRef v1 / Node / node, last error node is not a valid owner"),
380+
},
343381
} {
344-
t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) {
382+
t.Run(tc.name, func(t *testing.T) {
345383
f := simpleControllerFetcher()
346384
for _, obj := range tc.objects {
347385
addController(f, obj)

0 commit comments

Comments
 (0)