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