更新一组pod的首选方法是什么(例如,在将代码更改并将底层docker镜像推送到docker hub之后)由kubernetes群集中的复制控制器控制?
我可以看到两种方式:
kubectl rolling-update
使用rolling-update
我必须更改复制控制器名称。由于我将复制控制器定义存储在YAML文件中而不是手动生成它,因此必须更改文件以推出代码更新似乎会带来不良习惯,例如在复制控制器(例如controllerA和controllerB)的2个名称之间交替避免名称冲突。
更好的方法是什么?
答案 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进行。
使用Deployment而不是底层结构使更新应用程序更加容易,因为您是通过单个Deployment资源定义所需的状态,并让Kubernetes负责其余的工作。
由于部署,还可以回滚一事。