遇到奇怪的 Helm 问题:helm list
看不到某个 release,但部署时却提示 “release already exists”。
问题现象
1 2 3 4 5
| $ helm list -n jupyter
$ 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
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
| kubectl get secret -n jupyter | grep foobar
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 rollback 或 helm 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
| helm list -n jupyter --all
helm status foobar -n jupyter
helm history foobar -n jupyter
helm rollback foobar 1 -n jupyter
kubectl get secret -n jupyter | grep foobar kubectl delete secret sh.helm.release.v1.foobar.v1 -n jupyter
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
| helm install foobar jupyterhub/jupyterhub -n jupyter --timeout 5m
|
注意事项
- 删除 release 前先备份重要数据
--force
参数会重新创建所有资源,谨慎使用
- Helm 2 使用 ConfigMap 存储,Helm 3 使用 Secret
- 手动删除 Secret 可能导致 release 历史丢失