From 85bca3b6845fcf311a032943fabe5e368d9ad8f2 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 13 Mar 2026 08:18:54 +0100 Subject: [PATCH] DRA device taints: fix beta-enabled, alpha-disable configurations DeviceTaintRule is off by default because the corresponding v1beta2 API group is off. When enabled, the potentially still disabled v1alpha3 API version was used instead of the new v1beta2, causing the scheduler to fail while setting up informers and then not scheduling pods. --- pkg/scheduler/eventhandlers_test.go | 18 +++++++++--------- .../dynamicresources/dynamicresources_test.go | 2 +- .../noderesources/resource_allocation_test.go | 2 +- pkg/scheduler/scheduler.go | 2 +- .../resourceslice/tracker/tracker.go | 4 ++-- .../resourceslice/tracker/tracker_test.go | 4 ++-- test/integration/scheduler_perf/dra.go | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pkg/scheduler/eventhandlers_test.go b/pkg/scheduler/eventhandlers_test.go index 02cd4da4314..5714b696ec3 100644 --- a/pkg/scheduler/eventhandlers_test.go +++ b/pkg/scheduler/eventhandlers_test.go @@ -29,7 +29,7 @@ import ( batchv1 "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" resourceapi "k8s.io/api/resource/v1" - resourcealphaapi "k8s.io/api/resource/v1alpha3" + resourcebetaapi "k8s.io/api/resource/v1beta2" schedulingapi "k8s.io/api/scheduling/v1alpha2" storagev1 "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -521,13 +521,13 @@ func TestAddAllEventHandlers(t *testing.T) { enableDRADeviceTaints: true, enableDRADeviceTaintRules: true, expectStaticInformers: map[reflect.Type]bool{ - reflect.TypeOf(&v1.Pod{}): true, - reflect.TypeOf(&v1.Node{}): true, - reflect.TypeOf(&v1.Namespace{}): true, - reflect.TypeOf(&resourceapi.ResourceClaim{}): true, - reflect.TypeOf(&resourceapi.ResourceSlice{}): true, - reflect.TypeOf(&resourcealphaapi.DeviceTaintRule{}): true, - reflect.TypeOf(&resourceapi.DeviceClass{}): true, + reflect.TypeOf(&v1.Pod{}): true, + reflect.TypeOf(&v1.Node{}): true, + reflect.TypeOf(&v1.Namespace{}): true, + reflect.TypeOf(&resourceapi.ResourceClaim{}): true, + reflect.TypeOf(&resourceapi.ResourceSlice{}): true, + reflect.TypeOf(&resourcebetaapi.DeviceTaintRule{}): true, + reflect.TypeOf(&resourceapi.DeviceClass{}): true, }, expectDynamicInformers: map[schema.GroupVersionResource]bool{}, }, @@ -658,7 +658,7 @@ func TestAddAllEventHandlers(t *testing.T) { SliceInformer: informerFactory.Resource().V1().ResourceSlices(), } if opts.EnableDeviceTaintRules { - opts.TaintInformer = informerFactory.Resource().V1alpha3().DeviceTaintRules() + opts.TaintInformer = informerFactory.Resource().V1beta2().DeviceTaintRules() opts.ClassInformer = informerFactory.Resource().V1().DeviceClasses() } diff --git a/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources_test.go b/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources_test.go index 17a0a3a23e5..222fbbced21 100644 --- a/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources_test.go +++ b/pkg/scheduler/framework/plugins/dynamicresources/dynamicresources_test.go @@ -3221,7 +3221,7 @@ func setup(tCtx ktesting.TContext, args *config.DynamicResourcesArgs, nodes []*v resourceSliceTrackerOpts := resourceslicetracker.Options{ EnableDeviceTaintRules: true, SliceInformer: tc.informerFactory.Resource().V1().ResourceSlices(), - TaintInformer: tc.informerFactory.Resource().V1alpha3().DeviceTaintRules(), + TaintInformer: tc.informerFactory.Resource().V1beta2().DeviceTaintRules(), ClassInformer: tc.informerFactory.Resource().V1().DeviceClasses(), KubeClient: tc.client, } diff --git a/pkg/scheduler/framework/plugins/noderesources/resource_allocation_test.go b/pkg/scheduler/framework/plugins/noderesources/resource_allocation_test.go index 99c974ad991..98b0c3b4729 100644 --- a/pkg/scheduler/framework/plugins/noderesources/resource_allocation_test.go +++ b/pkg/scheduler/framework/plugins/noderesources/resource_allocation_test.go @@ -591,7 +591,7 @@ func newTestDRAManager(tCtx ktesting.TContext, objects ...apiruntime.Object) *dy informerFactory := informers.NewSharedInformerFactory(client, 0) resourceSliceTrackerOpts := tracker.Options{ SliceInformer: informerFactory.Resource().V1().ResourceSlices(), - TaintInformer: informerFactory.Resource().V1alpha3().DeviceTaintRules(), + TaintInformer: informerFactory.Resource().V1beta2().DeviceTaintRules(), ClassInformer: informerFactory.Resource().V1().DeviceClasses(), KubeClient: client, } diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index ce5aea1749c..137a0b98b6d 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -336,7 +336,7 @@ func New(ctx context.Context, // If device taint rules are disabled, the additional informers are not needed and // the tracker turns into a simple wrapper around the slice informer. if resourceSliceTrackerOpts.EnableDeviceTaintRules { - resourceSliceTrackerOpts.TaintInformer = informerFactory.Resource().V1alpha3().DeviceTaintRules() + resourceSliceTrackerOpts.TaintInformer = informerFactory.Resource().V1beta2().DeviceTaintRules() resourceSliceTrackerOpts.ClassInformer = informerFactory.Resource().V1().DeviceClasses() } resourceSliceTracker, err = resourceslicetracker.StartTracker(ctx, resourceSliceTrackerOpts) diff --git a/staging/src/k8s.io/dynamic-resource-allocation/resourceslice/tracker/tracker.go b/staging/src/k8s.io/dynamic-resource-allocation/resourceslice/tracker/tracker.go index 953722a234f..9941a38c3f0 100644 --- a/staging/src/k8s.io/dynamic-resource-allocation/resourceslice/tracker/tracker.go +++ b/staging/src/k8s.io/dynamic-resource-allocation/resourceslice/tracker/tracker.go @@ -31,7 +31,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" resourceinformers "k8s.io/client-go/informers/resource/v1" - resourcealphainformers "k8s.io/client-go/informers/resource/v1alpha3" + resourcebetainformers "k8s.io/client-go/informers/resource/v1beta2" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" v1core "k8s.io/client-go/kubernetes/typed/core/v1" @@ -119,7 +119,7 @@ type Options struct { EnableConsumableCapacity bool SliceInformer resourceinformers.ResourceSliceInformer - TaintInformer resourcealphainformers.DeviceTaintRuleInformer + TaintInformer resourcebetainformers.DeviceTaintRuleInformer ClassInformer resourceinformers.DeviceClassInformer // KubeClient is used to generate Events when CEL expressions diff --git a/staging/src/k8s.io/dynamic-resource-allocation/resourceslice/tracker/tracker_test.go b/staging/src/k8s.io/dynamic-resource-allocation/resourceslice/tracker/tracker_test.go index e9233c23f98..8a5221eacbe 100644 --- a/staging/src/k8s.io/dynamic-resource-allocation/resourceslice/tracker/tracker_test.go +++ b/staging/src/k8s.io/dynamic-resource-allocation/resourceslice/tracker/tracker_test.go @@ -553,7 +553,7 @@ func TestListPatchedResourceSlices(t *testing.T) { opts := Options{ EnableDeviceTaintRules: true, SliceInformer: informerFactory.Resource().V1().ResourceSlices(), - TaintInformer: informerFactory.Resource().V1alpha3().DeviceTaintRules(), + TaintInformer: informerFactory.Resource().V1beta2().DeviceTaintRules(), ClassInformer: informerFactory.Resource().V1().DeviceClasses(), KubeClient: kubeClient, } @@ -961,7 +961,7 @@ func BenchmarkEventHandlers(b *testing.B) { opts := Options{ EnableDeviceTaintRules: true, SliceInformer: informerFactory.Resource().V1().ResourceSlices(), - TaintInformer: informerFactory.Resource().V1alpha3().DeviceTaintRules(), + TaintInformer: informerFactory.Resource().V1beta2().DeviceTaintRules(), ClassInformer: informerFactory.Resource().V1().DeviceClasses(), KubeClient: kubeClient, } diff --git a/test/integration/scheduler_perf/dra.go b/test/integration/scheduler_perf/dra.go index 71116c47ae7..b56820504c3 100644 --- a/test/integration/scheduler_perf/dra.go +++ b/test/integration/scheduler_perf/dra.go @@ -291,7 +291,7 @@ func (op *allocResourceClaimsOp) run(tCtx ktesting.TContext) { KubeClient: tCtx.Client(), } if resourceSliceTrackerOpts.EnableDeviceTaintRules { - resourceSliceTrackerOpts.TaintInformer = informerFactory.Resource().V1alpha3().DeviceTaintRules() + resourceSliceTrackerOpts.TaintInformer = informerFactory.Resource().V1beta2().DeviceTaintRules() resourceSliceTrackerOpts.ClassInformer = informerFactory.Resource().V1().DeviceClasses() } resourceSliceTracker, err := resourceslicetracker.StartTracker(tCtx, resourceSliceTrackerOpts)