已开启
InferNex-Bridge:删除推理实例后遗留 per-model ClusterRole / ClusterRoleBinding 未清理 #174
luochen01创建于 9月29日
9月29日 添加了label:sig/sig-ai-inference
openFuyao-bot
9月29日 评论:
9月29日 评论:
欢迎来到 openFuyao 社区
Hey @luochen01 , 感谢你对社区的贡献.
机器人使用手册
有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。您可以自助配置此仓库的 PR 合并规则,更多详情,请参阅此处。
联系指引
有疑问可以联系 SIG: sig-ai-inference ,
维护者是: @foxbit, @regandy ,
审核者是: @ShiroChen, @piamposer-li, @qinwenzh .


9月29日 修改了issue 的描述
9月29日 关联了pull request:fix(controller): cleanup per-model ClusterRole/ClusterRoleBinding on deletion
9月29日 关联了pull request:fix(controller): cleanup per-model ClusterRole/ClusterRoleBinding on deletion
9月29日 修改了issue 的描述
9月30日 修改了issue 的描述
问题描述
创建 PD(Prefill-Decode)分离模式的推理实例(
LLMInferenceService)时,InferNex-Bridge 会为每个模型派生增强组件(cache-indexer、pd-orchestrator的elastic-scaler/rsg/tidal等),并为这些组件的控制器创建 per-model 的ClusterRole/ClusterRoleBinding,其 label 为:infernex.io/managed-cluster-rbac=trueinfernex.io/owner=<model>infernex.io/component=<component>删除模型后,这些
ClusterRole/ClusterRoleBinding没有被清理,永久残留。复现步骤
enableCacheIndexer与enablePDOrchestrator。kubectl get clusterrolebindings -l infernex.io/managed-cluster-rbac=true | grep <model> kubectl get clusterroles -l infernex.io/managed-cluster-rbac=true | grep <model>仍能看到
<model>-cache-indexer-controller-rolebinding、<model>-pd-orchestrator-elastic-scaler-controller-rolebinding、<model>-pd-orchestrator-rsg-controller-rolebinding、<model>-pd-orchestrator-tidal-controller-rolebinding等残留 RBAC(实际数量取决于启用的组件;hermes-router使用的是 namespaced Role/RoleBinding,带 controller ownerRef,会被 GC 正常清理,不受影响)。根因
ClusterRole/ClusterRoleBinding是 cluster-scoped 资源,无法将 namespaced 的InferNexService设为ownerReferences,因此 K8s Garbage Collection(GC)的级联删除对它无效。deleteComponentControllerRBAC是存在的,但只在正常 reconcile 的 prune 路径被调用(pruneOrphanedComponents→syncComponentControllerRBACCleanup)。reconcileInferNexServiceDeletion路径,只清理了 Gateway 路由和 singleton ServiceAccount 的ownerReferences(releaseSingletonOwnerReferences),没有调用syncComponentControllerRBACCleanup,导致 cluster-scoped RBAC 泄漏。影响
cache-indexer-sa、elastic-scaler-sa等 ServiceAccount 是 namespace 内共享的 singleton。残留的ClusterRoleBinding会把这些共享 ServiceAccount 持续绑定到已删除模型的ClusterRole,导致本应随模型删除而回收的权限未被回收。尤其pd-orchestrator-elastic-scaler的ClusterRole含apiGroups: ["*"], resources: ["*"]的宽泛权限,模型全部删除后该权限仍可能保留,构成潜在安全风险。建议修复
删除路径
reconcileInferNexServiceDeletion在移除 finalizer 前本就会调用releaseSingletonOwnerReferences,但该函数原先只释放共享 singleton ServiceAccount 的 owner refs:// 修改前 return r.syncSingletonComponentSAOwnerRefsCleanup(ctx, owner, nil)将其实现改为委托给
syncComponentControllerRBACCleanup,即可在删除时一并显式清理 per-model 的 cluster-scoped RBAC:// 修改后 return r.syncComponentControllerRBACCleanup(ctx, owner, nil)syncComponentControllerRBACCleanup(ctx, owner, nil)传nildesired 表示所有组件均不再需要,会触发deleteComponentControllerRBAC逐个清理ClusterRole/ClusterRoleBinding(幂等,NotFound 忽略);同时它对共享 singleton ServiceAccount 只做 ownerRef 清理而不直接删除,并一并清理 per-owner 的 leader Role/RoleBinding 与 webhook 证书 Secret。