【发布时间】: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 将孤立对象抛在后面的问题(主要是 cronjobs 和 ingress)?
我能想到的一种解决方法是通过在运行 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