16

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

我可以看到两种方式:

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

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

更好的方法是什么?

4

3 回答 3

25

更新:kubectl rolling-update已弃用,替换命令为kubectl rollout. 另请注意,由于我编写了原始答案,因此已添加部署资源,并且是比 ReplicaSets 更好的选择,因为滚动更新是在服务器端而不是由客户端执行的。


你应该使用kubectl rolling-update. 我们最近添加了一个功能来执行“简单滚动更新”,它将更新复制控制器中的图像而不重命名它。这是输出中显示的最后一个示例kubectl help rolling-update

// Update the pods of frontend by just changing the image, and keeping the old name
$ kubectl rolling-update frontend --image=image:v2

此命令还支持恢复 - 如果您取消更新并稍后重新启动它,它将从中断的地方恢复。尽管它在后台创建了一个新的复制控制器,但在更新结束时,新的复制控制器会采用旧复制控制器的名称,因此它看起来像纯更新,而不是切换到全新的复制控制器。

于 2015-05-12T15:13:50.210 回答
0

到目前为止,我发现的最佳选择是Skaffold,它会自动构建映像,将其推送到映像注册表并更新相应的 Pod/控制器。它甚至可以监视代码更改并在使用skaffold dev命令保存更改后立即重建图像。这只需要添加一个简单skaffold.yaml的指定注册表上的图像和 Kubernetes 清单的路径。入门指南中详细描述了此工作流程。

于 2019-07-18T11:28:02.993 回答
0

The following explanations are from Kubernetes 在行动s book

手动删除和重新创建复制控制器

手动进行滚动更新是laboriouserror-prone。根据副本的数量,您需要以正确的顺序运行十几个或更多命令来执行更新过程。幸运的是,Kubernetes 允许您使用单个命令执行滚动更新。

使用 kubectl滚动更新

您可以让 kubectl 执行它们,而不是手动使用 ReplicationControllers 执行滚动更新。使用 kubectl 执行更新使过程变得更加容易,但是,现在这是更新应用程序的过时方式。

为什么执行这样的更新不如预期的好,因为它是必要的。Kubernetes 是如何告诉它系统的期望状态,并让 Kubernetes 通过找出最佳方式来实现该状态的。

使用部署以声明方式更新应用程序——最佳选择——

Deployment 是一种更高级别的资源,用于部署应用程序并以声明方式更新它们,而不是通过 ReplicationController 或 ReplicaSet 来完成,它们都被认为是较低级别的概念。

在此处输入图像描述

使用 Deployment 而不是较低级别的构造可以更轻松地更新应用程序,因为您通过单个 Deployment 资源定义所需的状态,并让 Kubernetes 负责其余的工作。

还有一件事,回滚 部署是可能的,因为部署。

于 2020-03-07T18:17:53.313 回答