You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Helm Upgrade更换不同厂商SubChart时如何自动删除旧子图表组件

Helm更换不同厂商SubChart后自动清理旧资源方案

问题核心是当父Chart的dependencies配置中移除旧SubChart后,新版本Helm Release渲染出的资源列表不再包含旧SubChart生成的资源。Helm默认仅对比当前模板生成的资源和集群中已关联到当前Release的资源,旧SubChart的资源因不在新的资源列表中,不会被识别为待删除对象。

解决方案

方案1:升级前配置预删Hook(适配GitOps流程,无需手动执行命令)

该方案适合还未执行SubChart切换升级的场景,仅需要修改一次父Chart代码,升级过程自动完成旧资源清理:

  • 在父Charttemplates目录下新增预升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:15:04