我们有一个服务(德鲁伊历史)的状态集,它在本地 SSD 上缓存大量数据。(我们使用污点和亲和性在 SSD 中为每个节点运行一个 pod。)当我们需要替换底层机器时,这意味着 pod 以空的本地磁盘启动,然后需要一段时间来重新填充缓存。理想情况下,我们只想一次有计划地更换节点(例如,GKE 节点池升级),并等到新节点上的 pod 完全填满其缓存后再推出下一个节点。
好的,这意味着我们需要将 PodDisruptionBudget 设置为 1,并设置 Readiness 探针以使新节点在缓存被填满之前不准备好。
问题是:该系统并没有真正为我们提供一个很好的方式来询问“pod X 是否下载了它所需要的所有东西,以使系统作为一个整体完全复制”。
它让我们问的是“整个系统是否完全复制?”。
因此,我们很想编写一个 Readiness 探针,上面写着“除非整个系统完全复制,否则未准备好”。但这意味着在节点池升级期间(或其他短暂的“未完全复制”状态),statefulset 中的每个 pod 都将变为 unready。
我的问题是:我并不真正了解 k8s 咨询 Ready 状态的每个部分的全部含义。如果 SS 中的每个 pod 都没有准备好而单个 pod 正在“加载”,那会不会很糟糕?
我的理解是,readiness 用于控制 Deployment 或 StatefulSet rollout 的速度(在这里很好),它也用于让服务确定路由到哪些 pod。在这种情况下,我们实际上并没有使用与 StatefulSet 关联的 Service 进行路由(客户端直接连接到各个 pod)。所以看起来这实际上可能很好。但是是吗?或者是否还有其他 Ready 状态的应用程序,这会使我们在全局复制未达到 100% 时将所有 pod 标记为未准备好?