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

时间:2015-05-12 07:51:47

标签: kubernetes kubectl

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

我可以看到两种方式:

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

    更好的方法是什么?

3 个答案:

答案 0 :(得分:21)

您应该使用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 输出中显示的最后一个示例:

/

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

答案 1 :(得分:0)

到目前为止,我发现最好的选择是Skaffold,它会自动生成映像,将其推送到映像注册表中,并更新相应的pod /控制器。使用model_es_extend1 <- extend(model_es, along = 'id', n=30) nrow(getData(model_es_extend1)) #220 rows 命令保存更改后,它甚至可以监视代码更改并重建映像。这只需要添加一个简单的skaffold dev即可指定注册表上的映像以及Kubernetes清单的路径。 Getting Started guide中对此工作流程进行了详细说明。

答案 2 :(得分:0)

The following explanations are from Kubernetes In Action's book

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

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

使用kubectl 滚动更新

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

为什么执行这样的更新效果不佳,是因为它必须。 Kubernetes如何告诉您所需的系统状态,并通过找出最佳状态来让Kubernetes自行实现该状态。

使用部署以声明方式更新应用-最佳替代方案-

Deployment是较高级别的资源,用于部署应用程序并进行声明式更新,而不是通过均被视为较低级别概念的ReplicationController或ReplicaSet进行。

enter image description here

使用Deployment而不是底层结构使更新应用程序更加容易,因为您是通过单个Deployment资源定义所需的状态,并让Kubernetes负责其余的工作。

由于部署,还可以回滚一事。