Helm 升级失败:存在进行中的操作
问题描述
在使用 Helm 进行部署时,经常会遇到以下错误信息:
Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress
这种情况通常发生在 Helm 安装、升级或回滚操作被意外中断时(如手动停止流水线执行、网络中断等)。Helm 会保持该操作的状态为"进行中",从而阻止后续的任何部署操作。
根本原因
Helm 3 使用 Kubernetes Secrets 来存储和管理发布状态。每个 Helm 发布都会创建对应的 Secret 对象,其中包含发布的元数据和状态信息。当操作被中断时,对应的 Secret 可能处于不一致的状态,导致 Helm 认为仍有操作在进行中。
解决方案
方法一:删除挂起的 Helm Secret(推荐)
这是最直接且有效的解决方法,适用于大多数情况:
查看命名空间中的所有 Secret
bashkubectl get secrets -n <namespace>
筛选出与 Helm 相关的 Secret
bashkubectl get secrets -n <namespace> | grep "sh.helm.release"
删除处于挂起状态的 Secret
bashkubectl delete secret <secret-name> -n <namespace>
例如:
bashkubectl delete secret sh.helm.release.v1.auth.v1 -n your-namespace
TIP
Secret 名称的格式通常是 sh.helm.release.v1.<release-name>.v<revision-number>
,其中 revision-number 是版本号。
方法二:使用 Helm 回滚操作
如果 Helm 历史记录仍然可用,可以尝试回滚到之前的版本:
查看发布历史
bashhelm history <release-name> -n <namespace>
执行回滚操作
bashhelm rollback <release-name> <revision> -n <namespace>
方法三:查看所有发布状态
有时发布可能位于不同的命名空间中,使用以下命令全面检查:
# 查看特定命名空间的所有发布(包括失败状态)
helm ls -a -n <namespace>
# 查看所有命名空间的所有发布
helm ls -aA
Azure DevOps 流水线特殊处理
对于 Azure DevOps 环境,除了上述解决方案外,还需要:
确保已连接到正确的 Kubernetes 集群
bashaz account set --subscription <subscription-id> az aks get-credentials --name <cluster-name> --resource-group <resource-group>
检查流水线配置
- 确认所有必要的参数都已正确设置
- 检查超时设置是否合理
- 验证权限配置是否正确
预防措施
为了避免类似问题再次发生:
- 避免手动中断部署过程
- 确保网络连接稳定
- 设置合理的超时时间
- 定期清理旧的 Helm 发布记录
- 使用
--atomic
参数时确保环境稳定
WARNING
删除 Helm Secret 会移除该发布的元数据,但不会删除已部署的 Kubernetes 资源。如果需要完全清理,请确保同时删除相关的 Kubernetes 资源。
总结
"UPGRADE FAILED: another operation is in progress" 错误通常是由于 Helm 状态不一致导致的。通过删除挂起的 Helm Secret 或执行回滚操作,可以快速解决这个问题。在 Azure DevOps 环境中,还需要确保流水线配置正确且已连接到正确的集群。
大多数情况下,方法一(删除挂起的 Secret)是最直接有效的解决方案,建议优先尝试此方法。