【发布时间】:2020-05-13 19:10:43
【问题描述】:
Automation 使用微服务构建 Docker 镜像,并将此镜像推送到 JFrog Artifactory 注册表中,并标记为分支名称 registry/service-name:branch。在下一步中,它会应用 Kubernetes yaml 清单文件,并在适当的 Kubernetes 节点拉取镜像后启动应用程序。
问题如下 - 当我将微服务源代码中的更改推送到存储库时,自动化开始:
- 重建项目并将更新后的 docker 镜像推送到具有相同标签(分支)的注册表中
- 在 Kubernetes 中重新部署微服务
- 微服务重新部署,但使用旧映像
我猜这是因为 Kubernetes yaml 清单文件的“部署”部分没有更改,并且 Kubernetes 没有从 JFrog 注册表中提取更新的图像。作为解决方法,我在每次重新部署时将时间戳注释插入到模板部分:
"template": {
"metadata": {
"labels": {
"app": "service-name"
},
"annotations": {
"timestamp": "1588246422"
但奇迹并没有发生 - 仅当我删除 Kubernetes 部署并重新部署应用程序时才更新映像(在这种情况下,它可能只是从另一个节点开始,并且需要 docker pull)。
是否可以设置 Kubernetes 或配置清单文件,如何在每次重新部署时强制 Kubernetes 拉取镜像?
【问题讨论】:
-
你设置
imagePullPolicy: Always了吗? -
如下来自here
imagePullPolicy: Always没有按预期工作。终于There is no direct way to have Kubernetes automatically update running containers with new images.关注documentation真让我失望 -
由于图像名称没有改变,你实际上并没有改变部署对象中的任何东西,所以集群得出的结论是一切都处于你想要的状态(你想要一个图像名称称为
registry/service-name:branch,这是 pod 正在运行的图像)。如果您每次构建都使用唯一标签,这不会有问题。 -
不幸的是,更改标签不是我的方式,因为环境由数十个微服务组成,并且应该从具有最后更改的分支构建,这意味着 - 在每次推送/提交时。但是您提供的上述链接描述了解决我的问题的三个可行技巧,其中一个(添加随机终止GracePeriodSecond 值)我检查过,它看起来像解决方案。谢谢@DavidMaze!
标签: kubernetes