Migrate DRA components to support granular authorization on status updates
/triage accepted /sig auth node network /wg device-management /good-first-issue
@liggitt @aojea @dims @pohly @johnbelamaric
AI generated migration guide with list of potentially impacted components.
DRA Granular Status Authorization: Migration Guide
Starting in Kubernetes v1.36, the DRAResourceClaimGranularStatusAuthorization feature gate
(beta, on-by-default) enforces fine-grained authorization checks for ResourceClaim status
updates. Components that previously only needed update/patch on resourceclaims/status
now require additional permissions on synthetic subresources depending on which status
fields they modify.
Reference: #134947, https://github.com/kubernetes/website/pull/55070
What changed
| Old permission | New additional permission required | Who needs it |
|---|---|---|
resourceclaims/status update/patch |
resourceclaims/binding update/patch |
Schedulers, allocation controllers (anything modifying status.allocation or status.reservedFor) |
resourceclaims/status update/patch |
resourceclaims/driver associated-node:update/associated-node:patch |
Node-local DRA drivers (ServiceAccount bound to a specific node via pod-bound token) |
resourceclaims/status update/patch |
resourceclaims/driver arbitrary-node:update/arbitrary-node:patch |
Control-plane DRA drivers, network controllers, or any component managing device status across nodes |
The existing resourceclaims/status permission is still required — it remains the "front door".
The new synthetic subresources are additional checks on top of it.
These new permissions can be added now in preparation for 1.36, they are inert in earlier versions of Kubernetes.
Migration by component type
Node-local DRA drivers
These run as DaemonSets with a ServiceAccount whose token is bound to the node (via a pod
scheduled on that node). They update status.devices for their own driver.
Add this rule to the driver's ClusterRole:
- apiGroups: ["resource.k8s.io"]
resources: ["resourceclaims/driver"]
verbs: ["associated-node:update", "associated-node:patch"]
resourceNames: ["<your-driver-name>"] # e.g. "dra.example.com"
Keep the existing rule:
- apiGroups: ["resource.k8s.io"]
resources: ["resourceclaims/status"]
verbs: ["get", "update", "patch"]
Control-plane DRA drivers / multi-node controllers
These run as Deployments (not node-bound). They update status.devices for their driver
from a central controller.
Add this rule to the controller's ClusterRole:
- apiGroups: ["resource.k8s.io"]
resources: ["resourceclaims/driver"]
verbs: ["arbitrary-node:update", "arbitrary-node:patch"]
resourceNames: ["<your-driver-name>"] # e.g. "dra.example.com"
Keep the existing rule:
- apiGroups: ["resource.k8s.io"]
resources: ["resourceclaims/status"]
verbs: ["get", "update", "patch"]
Schedulers
These modify status.allocation and status.reservedFor when binding claims to nodes.
Add this rule to the scheduler's ClusterRole:
- apiGroups: ["resource.k8s.io"]
resources: ["resourceclaims/binding"]
verbs: ["update", "patch"]
Keep the existing rule:
- apiGroups: ["resource.k8s.io"]
resources: ["resourceclaims/status"]
verbs: ["get", "update", "patch"]
Note: The built-in
system:kube-schedulerClusterRole is updated automatically by the bootstrap policy when the feature gate is enabled. Only custom schedulers need manual updates.
Operators / virtual clusters that proxy all ResourceClaim operations
These need all of the above depending on what operations they proxy.
Add both rules:
- apiGroups: ["resource.k8s.io"]
resources: ["resourceclaims/binding"]
verbs: ["update", "patch"]
- apiGroups: ["resource.k8s.io"]
resources: ["resourceclaims/driver"]
verbs: ["associated-node:update", "associated-node:patch", "arbitrary-node:update", "arbitrary-node:patch"]
Components that only read status or manage non-status fields
No changes needed. The new checks only apply to writes to status.allocation,
status.reservedFor, and status.devices.
Projects to update
DRA Drivers
- kubernetes-sigs/dra-driver-cpu —
manifests/base/clusterrole-dracpu.part.yaml- @back1ash - kubernetes-sigs/dranet —
install.yaml,examples/dranetctl-install.yaml,deployments/helm/dranet/templates/rbac.yaml,pkg/dranetctl/gke/components.go- @praveen0raj - google/dranet —
install.yaml,examples/dranetctl-install.yaml,pkg/dranetctl/gke/components.go- @praveen0raj - kubernetes-sigs/kubernetes-network-drivers —
manifests/driver-install.tmpl.yaml - k8snetworkplumbingwg/dra-driver-sriov —
deployments/helm/dra-driver-sriov/templates/clusterrole.yaml - kubevirt/kubevirt —
kubevirtci/cluster-up/cluster/kind-sriov/sriov-components/manifests/dra/sriov_dra.yaml - kubevirt/kubevirtci — same sriov DRA manifest
- kubevirt/containerized-data-importer — same sriov DRA manifest
- kubevirt/kubevirt-migration-controller — same sriov DRA manifest
- kubevirt/kubevirt-aie — same sriov DRA manifest
- ai-on-gke/common-infra —
common/charts/nvidia-dra-driver-gpu/templates/clusterrole.yaml - ffromani/dra-driver-integration-env —
manifests/{cpu,sriov,memory}/install.tmpl.yaml - ffromani/dra-driver-memory —
hack/ci/install.tmpl.yaml,hack/ci/install_unpriv.tmpl.yaml - Project-HAMi/HAMi-DRA —
charts/hami-dra/templates/hami-dra-driver/rbac.yaml - Project-HAMi/k8s-dra-driver —
demo/yaml/rbac.yaml - furiosa-ai/helm-charts —
charts/furiosa-dra-driver/templates/clusterrole.yaml,charts/furiosa-npu-operator/templates/clusterrole.yaml - justin-oleary/cxl-dra-driver —
deploy/helm/cxl-dra-driver/templates/rbac.yaml,deploy/kubernetes/rbac.yaml - NexusGPU/tensor-fusion —
charts/tensor-fusion/templates/rbac.yaml,config/rbac/role.yaml,internal/controller/pod_controller.go - CoHDI/dynamic-device-scaler —
config/rbac/role.yaml - CoHDI/cohdi-chart —
charts/dynamic-device-scaler/templates/deployment.yaml - gke-labs/dravip —
install.yaml - aojea/kubernetes-network-driver-basic —
install.yaml - pravk03/simple-cpu-dra-driver —
install.yaml - MikeZappa87/dra-multi-things —
deploy/driver.yaml - MikeZappa87/dra-example —
deploy/driver.yaml - fminna/LLM-Helm-Fix —
templates/intel-gpu-resource-driver_template.yaml - annuay-google/repro-toolkit-issue — nvidia DRA driver manifest
- spidernet-io/spiderpool —
charts/spiderpool/templates/role.yaml,pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/rbac.go - DaoCloud/dce-charts-repackage —
charts/spiderpool/spiderpool/charts/spiderpool/templates/role.yaml - Mellanox/network-operator —
config/rbac/role.yaml,deployment/network-operator/templates/role.yaml,manifests/state-multus-cni/0010-cluter_role.yml - datum-cloud/milo —
config/controller-manager/overlays/core-control-plane/rbac/role.yaml, Go controllers
Schedulers
- volcano-sh/volcano —
installer/helm/chart/volcano/templates/scheduler.yaml,installer/helm/chart/volcano/templates/agent_scheduler.yaml,installer/volcano-agent-scheduler-development.yaml - volcano-sh/agentcube —
manifests/charts/base/templates/volcano-agent-scheduler-development.yaml - kai-scheduler/KAI-Scheduler —
deployments/kai-scheduler/templates/rbac/binder.yaml,pkg/binder/controllers/bindrequest_controller.go - spectrocloud/pack-central —
packs/kai-scheduler-ai-0.10.0/charts/kai-scheduler/templates/rbac/binder.yaml - jupyterhub/zero-to-jupyterhub-k8s —
jupyterhub/templates/scheduling/user-scheduler/rbac.yaml- @back1ash - https://github.com/jupyterhub/zero-to-jupyterhub-k8s/pull/3862 - SlinkyProject/slurm-bridge —
helm/slurm-bridge/templates/scheduler/rbac.yaml - kube-nexus/kubenexus-scheduler —
deploy/kubenexus-scheduler.yaml - OpenCSGs/csghub-charts —
charts/runner/charts/volcano/templates/scheduler.yaml - ssup2-playground/k8s-data-platform_helm-charts —
volcano/templates/scheduler.yaml
Virtual Clusters / Operators
- loft-sh/vcluster —
chart/templates/role.yaml - cappyzawa/score-orchestrator —
config/rbac/role.yaml,config/rbac/resourceclaim_{editor,viewer,admin}_role.yaml, Go controllers - openshift/microshift — vendored k8s bootstrap policy
- openshift/origin — vendored k8s bootstrap policy
- kubeedge/kubeedge — vendored k8s bootstrap policy
Other (ResourceClaim management, not DRA)
- redhat-cop/babylon —
helm/templates/serviceAccessManager/clusterrole.yaml - redhat-gpte-devopsautomation/babylon-homeroom —
files/resource-claim-homeroom-clusterrole.yaml - rhpds/poolboy —
helm/templates/rbac.yaml
Documentation
- kubernetes/website — PR #55070 already open
Source: kubernetes/kubernetes