【问题标题】:Kubernetes not updates Docker image on redeployment [duplicate]Kubernetes 不会在重新部署时更新 Docker 映像 [重复]
【发布时间】: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


【解决方案1】:

我建议以registry/service-name:branch-git-sha 或registry/service-name:git-sha 的模式标记图像,这将自动提取图像。

或者作为一种解决方法,您可以保留当前的图像标签系统并在模板中添加一个环境变量,该变量设置为时间戳。

更改环境变量总是会导致 Pod 连同配置 imagePullPolicy: Always 一起重新启动。

【讨论】:

  • 非常感谢@Tummala Dhanvi!这正是我要找的。感谢@DavidMaze,我最初使用添加随机 ```terminationGracePeriodSecond`` 值的方式,它可以工作,但您的解决方案更干净。
  • 我很高兴,随时:)
  • 看起来类似的策略已经在这里讨论过stackoverflow.com/a/51835397/3514300
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
相关资源
最近更新 更多