有以下两种方法可以更新所有pod:

  • 直接删除所有现有的pod,然后创建新的pod。(缺点:会导致应用程序在一定的时间内不可用)
  • 也可以先创建新的pod,并等待它们成功运行之后,再删除旧的pod。可以先创建所有新的pod,然后一次性删除所有旧的pod,或者按顺序创建新的pod,然后逐步删除旧的pod。(缺点:应用程序需要支持两个版本同时对外提供服务。如果应用程序使用数据库存储数据,那么新版本不应该对原有的数据结构或数据本身进行修改,从而导致之前的版本运行异常。)

9.1.1 删除旧版本pod, 使用新版本pod替换

image.png
从删除旧pod到启动新pod之间存在短暂的服务不可用时间。

9.1.2 先创建新pod,再删除旧版本pod

如果短暂的服务不可用完全不能接受,并且你的应用程序支持多个版本同时对
外服务,那么可以先创建新的pod再删除原有的pod。这会需要更多的硬件资源,因为你将在短时间内同时运行两倍数量的pod。

从旧版本立即切换到新版本

pod通常通过Service来暴露。在运行新版本的pod之前,Service只将流量转发到初始版本的pod。一旦新版本的pod被创建并且正常运行之后,就可以修改服务的 label selector 并将Service的流量切换到新的pod。整个过程如图9.3所示,这就是所谓的蓝绿部署 ( blue-green deployment )。在切换之后,一旦确定了新版本的功能运行正常,就可以通过删除旧的ReplicationController来删除旧版本的pod。

注意:可以使用 kubectl set selector 命令来修改 Service 的 pod 选择器。

image.png

执行滚动升级(rolling update)

还可以执行滚动升级操作来逐步替代原有的pod,而不是同时创建所有新的pod并一并删除所有旧的pod。可以通过逐步对旧版本的ReplicationController进行缩容(scale down)并对新版本的进行扩容(scale up),来实现上述操作。在这个过程中,你希望服务的pod选择器同时包含新旧两个版本的pod,因此它将请求转发到这两组pod,如图9.4所示。
image.png