遇到奇怪的 Helm 问题:helm list 看不到某个 release,但部署时却提示 “release already exists”。

问题现象

1
2
3
4
5
$ helm list -n jupyter
# 没有 foobar

$ helm install foobar jupyterhub/jupyterhub -n jupyter
Error: release foobar already exists

原因分析

Release 可能处于以下状态:

  • 失败状态:上次部署失败但未清理
  • pending-upgrade:升级过程中断
  • 部分删除:删除操作未完成

解决方法

1. 查看所有状态的 Release

包括失败和待删除的:

1
helm list --all-namespaces --all

或指定命名空间:

1
helm list -n jupyter --all

2. 删除问题 Release

如果找到了 release:

1
helm delete foobar -n jupyter

强制删除:

1
helm delete foobar -n jupyter --no-hooks

3. 处理 pending-upgrade 状态

方法一:回滚到上一个版本

1
2
3
4
5
# 查看历史版本
helm history foobar -n jupyter

# 回滚到版本 1
helm rollback foobar 1 -n jupyter

方法二:强制升级

1
helm upgrade --install --force foobar jupyterhub/jupyterhub -n jupyter

4. 手动清理 Release 数据

Helm 3 将 release 信息存储在 Secret 中:

1
2
3
4
5
6
7
8
# 查找 release 相关的 Secret
kubectl get secret -n jupyter | grep foobar

# 示例输出:
# sh.helm.release.v1.foobar.v1

# 删除 Secret
kubectl delete secret sh.helm.release.v1.foobar.v1 -n jupyter

批量删除:

1
kubectl get secret -n jupyter -o name | grep foobar | xargs kubectl delete -n jupyter

常见状态处理

状态 处理方法
deployed 正常状态,可以直接 helm upgrade
failed helm rollbackhelm delete
pending-install helm delete 然后重新安装
pending-upgrade helm rollback 或强制升级
uninstalling 等待完成或手动删除 Secret

完整排查流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 查看所有 release
helm list -n jupyter --all

# 2. 查看 release 详细状态
helm status foobar -n jupyter

# 3. 查看 release 历史
helm history foobar -n jupyter

# 4. 尝试回滚
helm rollback foobar 1 -n jupyter

# 5. 如果失败,手动删除
kubectl get secret -n jupyter | grep foobar
kubectl delete secret sh.helm.release.v1.foobar.v1 -n jupyter

# 6. 重新安装
helm install foobar jupyterhub/jupyterhub -n jupyter

预防措施

部署前检查

1
helm list -n jupyter --all

使用 –atomic 参数

1
2
# 失败时自动回滚
helm install foobar jupyterhub/jupyterhub -n jupyter --atomic

设置超时

1
2
# 5 分钟超时
helm install foobar jupyterhub/jupyterhub -n jupyter --timeout 5m

注意事项

  • 删除 release 前先备份重要数据
  • --force 参数会重新创建所有资源,谨慎使用
  • Helm 2 使用 ConfigMap 存储,Helm 3 使用 Secret
  • 手动删除 Secret 可能导致 release 历史丢失