求助:Helm执行upgrade时无法更新RoleBinding的问题
--force) 我写了一个Helm Chart,用来给不同项目创建Namespace,同时管理ServiceAccount、资源限制、配额、存储卷和RoleBinding。目前大部分功能正常,但遇到一个问题:执行helm upgrade时,已存在的RoleBinding不会随模板配置的变化(比如用户/组主体变更)更新——只有RoleBinding不存在时,升级才会创建正确的实例。
尝试过用helm upgrade --force强制执行更新,虽然能重建RoleBinding,但会重置Namespace的UID范围(sa.scc.uid-range),导致挂载的NFS存储卷需要手动执行chown修正权限。给Namespace添加helm.sh/resource-policy=keep注解也没解决这个问题。
现在陷入两难:要么用--force修复RoleBinding但触发NFS权限问题,要么不用但任由RoleBinding偏离模板配置。不想把Chart拆分成Namespace创建和内部对象管理两部分,求更优方案。
附RoleBinding模板代码:
--- {{- range .Values.evsEnv }} apiVersion: authorization.openshift.io/v1 kind: RoleBinding metadata: name: evs-rb-admin namespace: {{ $.Values.evsName }}-{{ .name }} roleRef: name: admin subjects: {{- range $.Values.evsGroupAdmin }} - kind: Group name: {{ . | quote }} {{- end }} {{- range $.Values.evsUserAdmin }} - kind: User name: {{ . | quote }} {{- end }} - kind: User name: {{ $.Values.evsRequester | quote }} --- {{- end }}
可行解决方案
1. 为RoleBinding添加校验和注解(推荐)
Helm有时无法检测到RoleBinding内容的细微变化,手动添加基于模板内容的校验和注解,能强制Helm识别到配置变更并触发更新:
修改RoleBinding模板的metadata部分,加入校验和注解:
metadata: name: evs-rb-admin namespace: {{ $.Values.evsName }}-{{ .name }} annotations: checksum/rb-config: {{ include (print $.Template.BasePath "/rolebinding.yaml") $ | sha256sum }}
当模板中的subjects(用户/组)发生变化时,校验和会随之改变,Helm升级时就会自动更新RoleBinding,无需使用--force。
2. 用Helm Hook强制重建RoleBinding
通过Hook机制,让Helm在每次安装/升级时先删除旧的RoleBinding,再创建新的,确保完全匹配模板配置:
修改RoleBinding模板的metadata:
metadata: name: evs-rb-admin namespace: {{ $.Values.evsName }}-{{ .name }} annotations: "helm.sh/hook": "install,post-upgrade" "helm.sh/hook-delete-policy": "before-hook-creation"
这个配置会让Helm在执行install或upgrade操作时,先删除已存在的同名RoleBinding,再重新创建,既保证配置一致,又不会影响Namespace的UID范围。
3. 确认Namespace的资源策略注解配置
如果一定要用--force,确保Namespace的helm.sh/resource-policy=keep注解配置正确(必须加在Namespace模板中):
apiVersion: v1 kind: Namespace metadata: name: {{ $.Values.evsName }}-{{ .name }} annotations: helm.sh/resource-policy: keep
不过需要注意:--force会绕过Helm的资源策略检查,所以这个方案只能作为备选,优先推荐前两种无需--force的方案。
内容的提问来源于stack exchange,提问作者Bvoid

