【问题标题】:Helm parallel execution causing release in pending install stateHelm 并行执行导致发布处于挂起安装状态
【发布时间】:2022-02-11 19:48:28
【问题描述】:

我有一个 CircleCI 工作流程,在任何与主分支的合并中,它都会构建代码、创建 Docker 映像并运行 helm upgrade 以将最新构建更新到 k8s 集群。

我遇到了 helm 问题,其中两个合并经常在 master 分支上发生,而 CircleCI 尝试同时运行两个 helm 升级并且 helm 开始表现得很奇怪。

很多时候发布都处于pending-install 状态,我必须手动回滚。即使在回滚之后,也留下了许多孤立的 k8s 对象,我需要手动删除它们。

我阅读了 helm 代码,发现有一个互斥锁会阻止并行释放。我怀疑,因为 helm mutex 不维护显式锁定(远程锁定)并且我的 CircleCI 正在 2 个不同的会话(2 个不同的 shell)中运行 helm 升级,所以 helm 不知道正在进行的发布并导致此问题。

我不确定如何处理这个用例,或者是否有人在过去遇到过 helm 将孤立对象抛在后面的问题(主要是 cronjobsingress)?

我能想到的一种解决方法是通过在运行 helm 升级之前检查 helm 状态来停止并行构建,这不是空闲的。

K8S 版本 - 1.21

Helm 版本 - 3.7.2

【问题讨论】:

  • 您是如何设置集群的?您是否使用裸机安装或某些云提供商?重现您的问题很重要。
  • 我在 GKE 上运行
  • 您能否给出重现此问题所需的确切步骤?
  • 运行 2 个不同的远程 shell 并尝试同时更新同一个 helm 版本。您将获得“正在进行的另一项操作”或最终出现此错误。另一个相关问题,错误的原因可能是什么 - 原始升级错误:无法使用 kind 部署修补“test-apps”:补丁列表中的顺序: 与 $setElementOrder list:
  • 我搜索了很多人报告这可能是因为部署对象中重复的 env 变量键,但我的问题是它应该总是失败还是总是成功,为什么 helm 会间歇性地抛出错误。 - 是的,我有重复的钥匙。我有 70:30 的成功:失败比率。这很奇怪,很难理解。

标签: go kubernetes kubernetes-helm circleci cicd


【解决方案1】:

你描述的问题主要和Helm有关。您正确地注意到可以找到解决方法:

我能想到的一种解决方法是通过在运行 helm 升级之前检查 helm 状态来停止并行构建,这不是空闲的。

总的来说,这个功能过去有很多错误,很可能再次无法正常工作。

这个错误也经常是由重复的环境变量键引起的,解决方案在this questionthis github issue中描述。

另请参阅this topic,了解并行 helm 安装和使用 --concurrency=N 标志。

说到这个:

我有 70:30 的成功:失败比率。这很奇怪,很难理解。

尝试检查您的日志,看看可能出了什么问题。也许您的资源不足(例如,内存)?我试图重新创建这个问题,但对我来说,解决方案是删除重复的 kyes。你也可以report a bug on github

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2021-07-12
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多