Helm 升级不会拉新容器

Helm upgrade doesn't pull new container

我构建了一个简单的 NodeJS API,将 Docker 图像推送到一个存储库并使用 Helm 安装将其部署到我的 k8s(工作得很好)。

pullPolicy 是 Always

现在我想更新源代码并部署我的应用程序的更新版本。我在所有文件中修改了版本,构建并推送了新的 Docker 图像并尝试了 helm upgrade 但似乎什么也没发生。 使用 helm list 我可以看到修订已部署,但未部署对源代码的更改。 watch kubectl get pods 还表明没有新的 pods 以您期望的方式创建 kubectl --apply...

我做错了什么?

仅当有更改要推出时,Helm 才会推出对 kubernetes 对象的更改。如果您使用 :latest,则不会对部署文件应用任何更改,因此 pods 将滚动更新。要继续使用 latest,您需要添加一些内容(即带有 sha / version 的标签),这些内容会发生变化并导致部署由 helm 更新。另请记住,您通常也需要 ImagePullPolicy: Always

我在 .gitlab.yaml 中的部署脚本中解决此问题的方法,您可以在任何部署脚本中执行类似操作。

export SAME_SHA=$(helm get values service-name | grep SHA | wc -l)

if [ SAME_SHA -eq 1] then helm uninstall service-name; fi

helm upgrade --install service-name -f service-values.yml .

这可能不是生产环境的最佳方法,因为您最终可能会卸载实时服务,但对我来说,生产环境永远不一样,所以这很有效。

可能的解决方法:

 spec:
  template:
    metadata:
      labels:
        date: "{{ now | unixEpoch }}"

将其添加到您的 Deployment 或 StatefulSet yaml

值得注意的是,'latest' 标签没有什么特别之处。换句话说,它并不意味着我们通常认为的,即“最新版本”。

从容器的角度来看,它只是一串字符。它可以是任何东西,比如“blahblah”。

运行时(docker 或 kubernetes)只会查看它是否有带有该标签的图像,只有在该标签不存在时才获取新图像。

鉴于“最新”实际上没有任何意义,如果您想不断更新图像,最佳做法是使用代码本身的实际版本作为图像标签。然后在部署时,让您的基础架构使用正确的标签专门部署最新版本。