我们有一个服务的状态集(Druid historicals(,它在本地SSD上缓存了大量数据。(我们使用污点和亲和性在SSD中每个节点运行一个pod。(当我们需要更换底层机器时,这意味着pod从空的本地磁盘开始,然后需要一段时间来填充缓存。理想情况下,我们只想一次更换一个节点(例如GKE节点池升级(,并等待新节点上的pod完全填满其缓存后再推出下一个节点。
好的,这意味着我们需要将PodDisruptionBudget设置为1,并设置Readiness探测,以使新节点在缓存填满之前没有准备好。
问题是:该系统并没有真正为我们提供一个很好的方式来提问"pod X是否下载了使整个系统完全复制所需的所有东西"。
它让我们要问的是"整个系统是否完全复制?"。
所以我们很想写一个Readiness调查,说"除非整个系统完全复制,否则还没有准备好"。但这意味着,在节点池升级期间(或其他短暂的"未完全复制"状态(,状态集中的每个pod都将变得不就绪。
我的问题是:我真的不理解K8中每一个参考就绪状态的部分的全部含义。如果SS中的每个吊舱都没有准备好,而一个吊舱正在"装载",那会不会很糟糕?
我的理解是,准备状态用于控制部署或StatefulSet推出的速度(这在这里很好(,也用于让服务确定要路由到哪个pod。在这种情况下,我们实际上并不使用与StatefulSet相关的服务进行路由(客户端直接连接到各个pod(。所以看起来这可能真的很好。但是是吗?或者,是否有其他Ready状态的应用程序会使我们在全局复制未达到100%的情况下将所有pod标记为未就绪变得不好?
我无法回答您关于Kubernetes就绪性探测的一般含义的问题,但我碰巧非常了解您的应用程序(Druid(。
我相信你的假设是错误的。你说没有办法询问单个历史节点关于从深度存储加载段的状态,但实际上有这样一个API:
/druid/historical/v1/readiness
及相关/druid/historical/v1/loadstatus
如本文所述:https://druid.apache.org/docs/latest/operations/api-reference.html