Kubernetes Helm在进行更新时卡住了。

96

我之前尝试在运行helm repo update之前运行Helm升级操作,现在看起来它似乎永久地卡在“状态: pending-upgrade”中,无法再次尝试运行升级操作。

尝试运行以下命令: helm upgrade --namespace coder --install --force --atomic --wait --version 1.13.2 --values ./coder.yaml coder coder/coder

输出:Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress

8个回答

120

这个解决方案对我有效:

kubectl get secrets
kubectl delete secret sh.helm.release.v1.<RELEASE_NAME>.v<LATEST_REVISION>

根据这个问题中描述的决议


8
这个回答解释了原因,但是这个回答解决了我的问题。我在执行 upgrade 命令的过程中取消了流水线运行,并且 helm 中没有注册任何 Release 以进行 rollbackuninstall。删除 helm 的 release 密钥是唯一继续操作的方法。+1 - Diego Rafael Souza
这对我也起作用了。 - jph
很棒的解决方案! - Mark Davydov
1
只是补充一下 - 我不得不在两个kubectl命令中都添加--namespace <name-of-namespace>才能使它们适用于我的部署(否则它会假定默认名称空间)。 - Andy Lorenz
1
这可能是最糟糕的建议。你很可能会遇到悬挂资源的情况。回滚是恢复到先前状态最安全的方法。如果这是第一次helm安装(即没有发布版本),只需强制删除即可。 - Francois Nel
显示剩余3条评论

104

总结:您需要先回滚到另一个版本,然后再次使用helm upgrade命令:

helm rollback <release> <revision> --namespace <namespace>


这可能有几个原因,但最终是升级/安装过程中发生了中断。通常,当部署正在进行时,您会发出SIGKILL(Ctrl C)命令。
如果您在状态为“pending-upgrade”的情况下运行helm ls --namespace 命令,您只会看到以下信息,而没有其他任何信息:
NAME    NAMESPACE   REVISION    UPDATED STATUS  CHART   APP VERSION

目前最好的解决方法是回滚到另一个版本,然后再次执行helm upgradehelm rollback --namespace revision是可选的,但建议提供。
更多资源:

编辑

如果这是您的第一次修订,请使用:

helm delete <release> -n <namespace>

24
如果这是第一次修订,你该怎么办?因为没有可以回滚的内容。 - Explicitsoul
3
我也遇到了这个问题,但使用 Flux,这个解决方案对我也起作用。 - aL3891
3
要获取被卡住的应用程序列表,请使用 helm ls --namespace <namespace> -all 命令。 - defonion
1
@Explicitsoul 只需运行 helm delete <release> 命令(如果没有先前的版本)。 - Francois Nel
如果您有多个部署,可以运行以下命令回滚所有失败的部署: helm ls -a -n <namespace> | grep -e failed -e pending-upgrade | awk '{print $1} {print $2} {print $3 - 1}' | xargs -n 3 /bin/sh -c 'helm rollback $0 $2 -n $1' - DC-
我想补充一点:如果你遇到了一个挂起回滚的情况,这个方法同样适用。在我的情况下,我错误地杀掉了回滚任务,导致了永久挂起回滚状态。手动回滚可以解决问题,并允许我继续进行下一个部署。 - techfly

31

如果对某人有用,在回应explicitsoul的评论时,对我起作用的是:

只需:

helm delete <release> -n <namespace>

这样做移除了未完成的安装(在我的情况中是第一次安装,所以我没有之前的版本可以回退),然后我就能够再次运行安装程序。

在我的情况下,导致进程卡住的原因是CTRL-C取消了安装命令,所以不要这样做。


26

这是对我有效的方法

  1. helm list --all 这将列出所有发布及其状态
NAME  NAMESPACE       REVISION        UPDATED                                 STATUS               CHART                   APP VERSION
rel1  default         1               2021-06-04 14:15:37.652066 +0530 IST    deployed             rel1-3.32.0             0.46.0     
rel2  default         29              2021-06-18 11:02:38.779801 +0530 IST    pending-upgrade      rel2-0.0.1                     
rel3  default         3               2021-06-17 11:27:14.608042 +0530 IST    deployed             rel3-0.0.1      
  1. 请注意,rel2的状态为pending-update。这是因为我在升级过程中按了Ctrl+C。
  2. 在这种情况下,我所要做的就是回滚到先前的修订版本28 helm rollback rel2 28 --namespace default
NAME   NAMESPACE       REVISION        UPDATED                                 STATUS          CHART          APP VERSION
rel1   default         1               2021-06-04 14:15:37.652066 +0530 IST    deployed        rel1-3.32.0    0.46.0     
rel2   default         30              2021-06-18 11:26:07.555547 +0530 IST    deployed        rel2-0.0.1                     
rel3   default         3               2021-06-17 11:27:14.608042 +0530 IST    deployed        rel3-0.0.1     

6

我也遇到了同样的问题。 我使用的是helm 3.4.1版本……

当deployment处于pending状态时,并且你使用--atomic选项(在helm3中也意味着使用--wait),就会出现这种情况。

我无法使升级操作正常工作。 最糟糕的是,即使helm -n code list也没有显示任何内容,所以我无法执行以下操作:

helm -n code code 

由于Helm3将此类信息保存在secrets中,因此只需清除相应的secret并进行安装(或升级--install,但不要使用--atomic)。在您的情况下,可以执行以下操作:
helm delete --namespace code secret sh.helm.release.v1.code.v1

(v1代表最新版本号,如果您可以接受,请列出并删除所有内容)。

然后运行helm install命令。

注意:旧的对象(pod等)将保留,因此新的安装将尝试合并这些内容。对我来说一切都很顺利,但请注意-> 这是一种黑客方式 :)

更多信息请参见:https://github.com/helm/helm/issues/5595


4
为了回滚到先前的版本,你只需传递发布名称:
helm rollback <RELEASE_NAME>

当你运行 helm list --all 命令时,可以在 NAME 列下看到 RELEASE_NAME

(*) 如果终端上下文没有设置为命名空间,请添加 --namespace <namespace> 参数。


3
以下是我使用的步骤:
  1. 查看部署状态(我的一直处于等待状态)

    helm list --all

  2. 回滚到以前的版本,对我来说已经可以在这里工作了,下一步是可选的

    helm rollback <NAMESPACE_NAME> <Previous Version> --namespace <NAMESPACE_NAME>

  3. 如果您需要新的/另一个部署

    helm upgrade . . .


请注意,以上是我使用的步骤。

应该是 helm rollback <RELEASE_NAME> ... 而不是 <NAMESPACE_NAME>,对吗? - Vikram Deshmukh

2

使用以下命令,将会在进行helm升级时删除现有的secrets,以此来解决卡住的helm升级,并生成新的secrets以继续新的升级。

kubectl get secrets
kubectl delete secret sh.helm.release.v1.<RELEASE_NAME>.v<LATEST_REVISION>


这正是我正在寻找的,谢谢! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接