是否可以在 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 而不更改其版本。
- 这可能吗?
- 有解决办法吗?
- 我们是否应该完全避免这种情况并使用更 "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配置的标签。
背景:
我们目前正在使用持续交付管道,在管道的末端,我们将生成的 Docker 映像连同最新的应用程序配置(启动时设置为环境变量)一起部署到一些服务器Docker 容器)。持续交付内部版本号用作 Docker 图像的版本,目前也是该版本部署到服务器。
有时我们需要更新应用程序配置(环境变量)并重用现有的 Docker 图像。今天,我们只需部署一个现有的 Docker 映像,并更新配置。
现在我们正在考虑切换到 Kubernetes 而不是我们自己构建的解决方案。因此,如果我们的持续交付管道生成的版本号也反映为 Kubernetes 中的 pod 版本(即使我们部署与当前部署的 Docker 图像相同的版本,但具有不同的版本,这对我们来说会很好环境变量)。
问题:
我已经阅读了 rolling-update 的文档,但它并不表示您可以进行滚动更新并且 仅 更改与pod 而不更改其版本。
- 这可能吗?
- 有解决办法吗?
- 我们是否应该完全避免这种情况并使用更 "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配置的标签。