更新Nginx Ingress Controller Helm Chart遇权限错误,如何禁用自定义资源?
问题原因
你遇到的cannot list virtualserverroutes.k8s.nginx.org at cluster scope错误,是因为Nginx Ingress Controller默认启用了对VirtualServerRoute这类自定义资源(CRD)的支持,但当前集群中对应的ClusterRole没有授予该资源的集群级list权限,或者你本身不需要使用这类CRD。
能不能禁用自定义资源?
可以,但不建议手动修改deployment.yaml/daemonset.yaml(Helm部署下手动修改的配置会在下次upgrade时被覆盖),正确的方式是通过Helm的values配置项来禁用,这也是Helm部署的最佳实践。
具体操作步骤
确认Chart的控制参数:
官方nginxinc维护的Helm Chart中,控制自定义资源启用的参数为controller.enableCustomResources;部分衍生Chart可能使用controller.config.use-custom-resources,可直接查看Chart自带的values.yaml文件确认。执行升级时指定禁用参数:
helm upgrade nginx-ingress nginx-stable/nginx-ingress --set controller.enableCustomResources=false或者将配置写入自定义values.yaml后执行升级:
helm upgrade nginx-ingress nginx-stable/nginx-ingress -f your-custom-values.yaml可选:彻底禁用相关CRD组件
如果完全不需要VirtualServer、VirtualServerRoute这类CRD,可在values.yaml中添加以下配置:controller: virtualServer: enabled: false virtualServerRoute: enabled: false
关于GitHub案例的说明
你看到的手动修改deployment/daemonset的案例,大多是非Helm部署的场景(比如直接用yaml文件部署)。Helm部署依赖values配置生成资源文件,手动修改生成后的yaml会破坏Helm的状态管理,后续升级会丢失修改,所以优先用values配置更稳妥。
替代方案(若需保留CRD)
如果业务需要使用VirtualServerRoute等CRD,需检查并更新对应的ClusterRole,确保包含以下权限规则:
rules: - apiGroups: ["k8s.nginx.org"] resources: ["virtualserverroutes"] verbs: ["list", "watch", "get", "update", "create", "delete"]
内容的提问来源于stack exchange,提问作者Jay

