假设我有 10 个 pod 运行稳定版本,我希望在完全推出之前替换其中一个的映像以运行更新版本。
有没有办法做到这一点?
假设我有 10 个 pod 运行稳定版本,我希望在完全推出之前替换其中一个的映像以运行更新版本。
有没有办法做到这一点?
并非如此:部署管理的每个 pod 都应该是相同的,包括运行相同的映像。一旦创建了 pod 的镜像,您就无法更改它,如果您更改了 Deployment 的镜像,它将尝试重新创建其所有托管的 pod。
如果您唯一担心的是 pod 启动,则部署的默认行为是使用新映像启动 25% 的指定副本。旧 pod 将继续不间断地运行,直到新副本成功启动并通过就绪检查。如果新的 Pod 立即进入 CrashLoopBackOff 状态,旧的 Pod 仍将运行。
如果您想专门启动一个 pod 作为金丝雀部署,您可以创建第二个部署来处理它。您需要在 pod 上添加一些标签(例如,canary: 'true'
),以便将金丝雀与主 pod 区分开来。这将出现在 pod 规范和部署选择器中,但不会出现在相应的服务选择器中:服务匹配金丝雀和非金丝雀 pod。如果此操作成功运行,则您可以删除金丝雀部署并更新主部署上的映像。
就像提到的另一个答案一样,听起来您正在谈论金丝雀部署。您可以使用 Kubernetes 和 Istio 来做到这一点。我更喜欢 Istio,因为它可以很好地控制流量权重。即,您可以将 1% 的流量发送到金丝雀,将 99% 的流量发送到控件。非常适合在生产中进行测试。它还允许您使用 HTTP 标头进行路由。
https://istio.io/latest/blog/2017/0.1-canary/
如果你想用 k8s 做这件事,只需创建两个具有唯一部署名称的部署(例如 myappv1 和 myappv2),并使用相同的 app= 标签。然后,您可以使用选择器创建服务 = 无论您的应用标签是什么。svc 将在两个 v1 和 v2 部署之间循环。