是否可以在 Kubernetes 中进行滚动更新并保留相同版本?

Is it possible to do a rolling update and retain same version in Kubernetes?

背景:

我们目前正在使用持续交付管道,在管道的末端,我们将生成的 Docker 映像连同最新的应用程序配置(启动时设置为环境变量)一起部署到一些服务器Docker 容器)。持续交付内部版本号用作 Docker 图像的版本,目前也是该版本部署到服务器。

有时我们需要更新应用程序配置(环境变量)并重用现有的 Docker 图像。今天,我们只需部署一个现有的 Docker 映像,并更新配置。

现在我们正在考虑切换到 Kubernetes 而不是我们自己构建的解决方案。因此,如果我们的持续交付管道生成的版本号也反映为 Kubernetes 中的 pod 版本(即使我们部署与当前部署的 Docker 图像相同的版本,但具有不同的版本,这对我们来说会很好环境变量)。

问题:

我已经阅读了 rolling-update 的文档,但它并不表示您可以进行滚动更新并且 更改与pod 而不更改其版本。

  1. 这可能吗?
  2. 有解决办法吗?
  3. 我们是否应该完全避免这种情况并使用更 "Kubernetes friendly" 的不同方法?

滚动更新只是缩小一个 replicationController 并扩大另一个。因此,它以受控的速率删除旧的 pods 并生成新的 pods。所以,如果新的复制控制器 json 文件有不同的环境变量和相同的图像,那么新的 pods 也会有。

事实上,即使您不更改 json 文件中的任何内容,除了一个标签值(您必须更改一些标签),那么您将获得新的 pods相同的图像和环境。我猜你可以用它来滚动重启?

您可以在进行滚动更新时选择要更改的标签。 "version" 没有正式的 Kubernetes 概念。如果需要,您可以制作一个名为 "version" 的标签,或者 "contdelivver" 或其他名称。

我想如果我处在你的位置,我会考虑两个选择:

方案1:在rcs上(至少)打上两个标签,一个是docker图像版本(IIUC也是一个持续交付版本),一个是"environment version" .这可能是一个 git 提交,如果你将你的环境变量存储在 git 中,或者更随意的东西。因此,您的 pods 可能有 "imgver=1.3,envver=a34b87" 之类的标签。

选项 2:将当前最著名的复制控制器存储为版本控制(git、svn、whatevs)中的 json(或 yaml)文件。然后使用版本控制中的修订号作为单个标签(例如 "version=r346")。这与您的持续交付标签不同。 是整个pod配置的标签。