在做离在线混部系统时,有这样需求:需要将在线集群整个节点出让给混部集群,因此需要将该节点中的资源在线Pod驱逐,但在驱逐中,可能会出现该服务只有一个Pod或Pod数非常少的情况,如果直接驱逐会导致该服务后无Pod,因此需要在其他节点启动Pod,Pod准备好后再进行驱逐。

比较容易想到的方案是先增加Deployment 副本数,监控所有副本是全部启动完成后,再删除Pod,将副本数改回来。该方案并不优雅,改回副本数前还会有一次额外的Pod创建。

Deployment是直接管理ReplicaSet的,可以采用将 Pod 从 ReplicaSet 中隔离的方式来实现先增加Pod,再删除的需求。

通过ReplicaSet 管理的 Pod 都有pod-template-hash 标签,因此

  1. 删除Pod label pod-template-hash,因Service label不会使用pod-template-hash,因此该Pod依然可以正常提供服务
  2. 此时会因Pod脱离,ReplicaSet创建新的副本
  3. 当Deployment / ReplicaSet 恢复后再删除Pod

这样更优雅实现对Node节点进行驱逐的过程中先增加Pod,再删除的需求。