如何更新在kubernetes中运行的一组pod?

Mad*_*mme 12 kubernetes kubectl

在kubernetes集群中由复制控制器控制的更新一组pod的优选方法(例如,在进行代码更改并将底层docker映像推送到docker hub之后)是什么?

我可以看到两种方式:

  1. 手动删除和重新创建复制控制器
  2. 运用 kubectl rolling-update

随着rolling-update我必须更改复制控制器名称.由于我将复制控制器定义存储在YAML文件中而不是手动生成它,因此必须更改文件以推出代码更新似乎会带来不良习惯,例如在复制控制器(例如controllerA和controllerB)的2个名称之间交替避免名称冲突.

有什么更好的方法?

Rob*_*ley 23

你应该用kubectl rolling-update.我们最近添加了一个功能来执行"简单滚动更新",它将更新复制控制器中的映像而无需重命名.这是kubectl rollout输出中显示的最后一个示例:

// Update the pods of frontend by just changing the image, and keeping the old name
$ kubectl rolling-update frontend --image=image:v2
Run Code Online (Sandbox Code Playgroud)

此命令还支持恢复 - 如果取消更新并稍后重新启动,它将从中断处继续.尽管它在后台创建了一个新的复制控制器,但在更新结束时,新的复制控制器将使用旧复制控制器的名称,使其显示为纯更新,而不是切换到全新的复制控制器.

  • 在k8s v1.2 +中,建议使用部署而不是rc.部署对象控制滚动更新.使用只需运行kubectl apply -f your-apps-deployment.yaml.该命令会在一秒左右返回,滚动更新将在后台进行.您可以通过各种方式观看它,例如运行kubectl get po以查看即将推出的新吊舱和旧吊舱 (6认同)
  • 如果您有rc文件,则使用`kubectl rolling-update -f rc_spec.yaml`更改pod的任何部分.您仍然需要更改rc名称和其中一个选择器字段(通常是"版本"或"部署"字段).话虽这么说,复制控制器最初并不是长寿命对象.用于管理一组pod并随时更新它们的更好抽象是[deployments](http://kubernetes.io/v1.1/docs/user-guide/deployments.html),它们目前作为API扩展提供并将在未来版本中添加到适当的API中. (5认同)
  • 如果它是自动部署过程的一部分,为什么不只是更新图像?您可以非常轻松地从`:latest`到完整图像哈希进行客户端解析,并将其用作新图像名称.既然它是自动化的,你可以编写一次翻译代码然后让机器继续.拥有完整哈希还可以让您更容易实际查看当前部署的特定版本. (3认同)
  • 不确定部署是否解决了这个问题,但我有一个用例,我不想每次都更新图像的名称,我只想使用最新的图像(例如,作为自动部署的一部分)处理).除非图像名称发生变化,否则我无法使用滚动更新(即使附加了`:latest`).我可以删除并重新制作复制控制器以重新创建所有pod,但这似乎不是最佳的.建议? (2认同)