如何更新 Kubernetes 中的服务?

How to update services in Kubernetes?

背景:

假设我有一个带有一些 pods 的复制控制器。当这些 pods 首次部署时,它们被配置为公开端口 8080。还创建了一个服务(类型为 LoadBalancer)以公开公开端口 8080。后来我们决定要从 pods(端口 8081)导出一个额外的端口。我们更改了 pod 定义并进行了滚动更新,没有停机时间,太棒了!但我们希望这个端口也可以公开访问。

问题:

有没有什么好的方法可以在不停机的情况下更新服务(例如通过添加一个额外的端口来公开)?如果我这样做:

kubectl replace -f my-service-with-an-additional-port.json

我收到以下错误消息:

Replace failedspec.clusterIP: invalid value '': field is immutable

在这种情况下,您可以创建第二个服务来公开第二个端口,它不会与另一个端口冲突,并且您不会停机。

如果在 pods 中命名端口,则可以在服务中按名称而不是按编号指定目标端口,然后同一服务可以使用不同的方式将目标定向到 pods端口号。

或者,如 Yu-Ju 建议的那样,您可以对服务的实时状态进行读取-修改-写入,例如通过 kubectl edit。错误信息是由于没有指定已经设置的clusterIP。

如果您有多个 pod 运行 用于同一服务,您可以在 Google Cloud Console 中使用 Kubernetes Engine,如下所示:

在 "Workloads" 下,select 您的复制控制器。在该屏幕中,单击 "EDIT",然后更新并保存您的复制控制器详细信息。

在 "Discover & Load Balancing" 下,select 您的服务。在该屏幕中,单击 "EDIT",然后更新并保存您的服务详细信息。如果您更改了端口,当您完成详细信息的编辑后,您应该会在 "Endpoints" 列下看到那些反映出来的端口。

假设您在一台机器上至少有两个 pods 运行(和始终 的重启策略),如果您想更新 pods 使用新配置或容器映像:

在 "Workloads" 下,select 您的复制控制器。在该屏幕中,向下滚动到 "Managed pods"。 Select 一个 pod,然后在该屏幕中单击 "KUBECTL" -> "Delete"。请注意,您可以使用命令行执行相同的操作:kubectl delete pod <podname>。这将删除并使用新下载的配置和容器映像重新启动它。一次删除每个 pod,确保等到 pod 完全重启并正常工作(即检查日志、调试)等,然后再删除下一个。