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)只会查看它是否有带有该标签的图像,只有在该标签不存在时才获取新图像。
鉴于“最新”实际上没有任何意义,如果您想不断更新图像,最佳做法是使用代码本身的实际版本作为图像标签。然后在部署时,让您的基础架构使用正确的标签专门部署最新版本。
我构建了一个简单的 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)只会查看它是否有带有该标签的图像,只有在该标签不存在时才获取新图像。
鉴于“最新”实际上没有任何意义,如果您想不断更新图像,最佳做法是使用代码本身的实际版本作为图像标签。然后在部署时,让您的基础架构使用正确的标签专门部署最新版本。