Helm Upgrade更换不同厂商SubChart时如何自动删除旧子图表组件
Helm更换不同厂商SubChart后自动清理旧资源方案
问题核心是当父Chart的
dependencies配置中移除旧SubChart后,新版本Helm Release渲染出的资源列表不再包含旧SubChart生成的资源。Helm默认仅对比当前模板生成的资源和集群中已关联到当前Release的资源,旧SubChart的资源因不在新的资源列表中,不会被识别为待删除对象。
解决方案
方案1:升级前配置预删Hook(适配GitOps流程,无需手动执行命令)
该方案适合还未执行SubChart切换升级的场景,仅需要修改一次父Chart代码,升级过程自动完成旧资源清理:
- 在父Chart
templates目录下新增预升级Hook任务,通过标签匹配删除旧SubChart所有资源,示例模板如下:
apiVersion: batch/v1 kind: Job metadata: name: {{ .Release.Name }}-cleanup-old-subchart annotations: "helm.sh/hook": pre-upgrade "helm.sh/hook-weight": "-10" "helm.sh/hook-delete-policy": hook-succeeded,hook-failed spec: template: spec: containers: - name: kubectl image: bitnami/kubectl:latest command: - /bin/bash - -c - kubectl delete all,configmap,secret,pvc,ingress -l app.kubernetes.io/name=旧SubChart名称 -n {{ .Release.Namespace }} --ignore-not-found=true restartPolicy: OnFailure backoffLimit: 2
- 执行完第一次升级、旧资源清理完成后,下一次发布时直接删除该Hook文件即可,无需长期留存。
方案2:已完成升级后的残留资源清理
如果已经执行过upgrade操作,旧SubChart资源已残留,可直接通过历史Release清单批量删除:
- 首先执行
helm history <Release名称> -n <命名空间>找到切换SubChart前的版本号,比如版本号为15 - 执行以下命令批量删除旧资源,执行前可先把末尾
kubectl delete -f -替换为kubectl get -f -核对资源清单:
helm get manifest <Release名称> -n <命名空间> --revision 15 | grep -A 200 -B 2 "旧SubChart名称" | kubectl delete -f -
方案3:长期避免同类问题的配置规范
为了后续切换任意厂商SubChart都无需处理残留问题,建议在父Chart中统一覆写所有SubChart的公共标签:
- 在父Chart的
values.yaml中给每个SubChart添加公共标签配置,示例如下:
旧SubChart名称: commonLabels: parent.release: {{ .Release.Name }} parent.chart: {{ .Chart.Name }} bitnami新SubChart名称: commonLabels: parent.release: {{ .Release.Name }} parent.chart: {{ .Chart.Name }}
- 后续切换SubChart时,可直接通过
parent.release标签+旧SubChart自身的名称标签过滤资源,无需核对历史版本清单。
内容的提问来源于stack exchange,提问作者Slevin
相关产品推荐
相关产品推荐

