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

如何通过Helm删除更新早于指定日期或应用版本较低的Release?

刚好遇到过类似的需求,Helm本身确实没有内置的过滤删除功能,我们可以通过bash结合Helm的输出处理来实现这两个场景的批量删除,下面分情况给你具体的解决方案:

1. 删除更新时间早于指定日期的Release

这里推荐两种实现方式,优先用jq+JSON输出的方案,因为表格格式的输出容易受空格/换行影响,JSON格式更稳定。

方案一:使用jq处理JSON输出(推荐)

需要提前安装jq工具(大多数Linux发行版可以通过包管理器安装),步骤如下:

# 1. 定义目标日期,格式为YYYY-MM-DD
TARGET_DATE="2019-10-01"

# 2. 筛选并删除符合条件的Release
helm ls --all-namespaces --output json | jq -r --arg target "$TARGET_DATE" '.[] | select(.updated < $target) | .name + " " + .namespace' | while read -r release ns; do
  # 先打印要删除的Release,确认无误后再去掉echo注释执行delete
  echo "准备删除命名空间$ns下的Release: $release"
  # helm delete "$release" --namespace "$ns"
done

说明:

  • 如果只需要处理单个命名空间,去掉--all-namespaces,加上--namespace <你的命名空间>
  • Helm 3中delete已改为uninstall,如果用Helm 3,把helm delete换成helm uninstall
  • 执行前先保留echo语句确认要删除的列表,避免误删

方案二:纯Bash+Awk处理表格输出(无需jq)

如果环境中没有jq,可以用Awk解析表格输出,需要处理日期格式转换:

# 1. 将目标日期转换为时间戳(秒级)
TARGET_TIMESTAMP=$(date -d "2019-10-01" +%s)

# 2. 筛选并删除符合条件的Release
helm ls --all-namespaces | awk '
BEGIN {
    # 建立月份缩写到数字的映射
    split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", months, " ")
    for (i=1; i<=12; i++) {
        month_map[months[i]] = sprintf("%02d", i)
    }
}
NR>1 {
    # 解析更新时间字段,转换为mktime可识别的格式
    month_num = month_map[$3]
    year = $7
    day = $4
    split($6, time_parts, ":")
    hour = time_parts[1]
    minute = time_parts[2]
    second = time_parts[3]
    updated_str = year " " month_num " " day " " hour " " minute " " second
    updated_ts = mktime(updated_str)
    
    # 比较时间戳,筛选早于目标日期的Release
    if (updated_ts < '$TARGET_TIMESTAMP') {
        print $1 " " $11  # 输出Release名称和命名空间(注意列数对应实际输出)
    }
}' | while read -r release ns; do
  echo "准备删除命名空间$ns下的Release: $release"
  # helm delete "$release" --namespace "$ns"
done

2. 删除应用版本低于指定值的Release

同样分两种情况,纯数字版本和语义化版本(比如v1.2.3)。

情况一:纯数字版本(如示例中的85)

用jq+JSON输出的方案最可靠:

# 1. 指定最低版本
MIN_VERSION=86

# 2. 筛选并删除版本低于指定值的Release
helm ls --all-namespaces --output json | jq -r --arg min "$MIN_VERSION" '.[] | select(.appVersion | tonumber < ($min | tonumber)) | .name + " " + .namespace' | while read -r release ns; do
  echo "准备删除命名空间$ns下的Release: $release(应用版本低于$MIN_VERSION)"
  # helm delete "$release" --namespace "$ns"
done

情况二:语义化版本(如v1.2.3、2.0.0-beta)

语义化版本不能直接用数值比较,需要用sort -V来做版本排序比较:

# 1. 指定最低语义化版本
MIN_VERSION="v1.3.0"

# 2. 筛选并删除版本低于指定值的Release
helm ls --all-namespaces --output json | jq -r '.[] | .name + " " + .namespace + " " + .appVersion' | while read -r release ns app_ver; do
  # 通过sort -V比较版本号,判断当前版本是否低于指定版本
  if printf "%s\n%s" "$app_ver" "$MIN_VERSION" | sort -V | head -n1 | grep -q "$app_ver"; then
    echo "准备删除命名空间$ns下的Release: $release(应用版本$app_ver低于$MIN_VERSION)"
    # helm delete "$release" --namespace "$ns"
  fi
done

重要注意事项

  1. 先验证再执行:所有脚本都先保留echo语句,确认要删除的Release列表完全符合预期后,再注释掉echo并启用helm delete/uninstall命令
  2. Helm版本差异:Helm 3用helm uninstall代替helm delete,如果需要彻底删除历史记录,可以加--keep-history=false参数
  3. 权限问题:确保执行脚本的用户有对应命名空间的Helm操作权限

内容的提问来源于stack exchange,提问作者Sergii Zhuravskyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:23