【发布时间】:2019-04-30 18:03:10
【问题描述】:
我们有一个用于服务(Druid 历史记录)的状态集,该服务将大量数据缓存在本地 SSD 上。 (我们使用污点和亲和性在 SSD 中为每个节点运行一个 pod。)当我们需要替换底层机器时,这意味着 pod 以空的本地磁盘启动,然后需要一段时间来重新填充缓存。理想情况下,我们只想一次有计划地更换节点(例如,GKE 节点池升级),并等到新节点上的 pod 完全填满其缓存后再推出下一个节点。
好的,所以这意味着我们需要将 PodDisruptionBudget 设置为 1,并设置 Readiness probe 以使新节点在缓存被填满之前不准备好。
问题是:系统并没有真正为我们提供一个很好的方式来询问“pod X 是否下载了它所需要的所有内容以使整个系统完全复制”。
它让我们问的是“整个系统是否完全复制?”。
因此,我们很想编写一个 Readiness 探针,表示“除非整个系统完全复制,否则未准备好”。但这意味着在节点池升级期间(或其他短暂的“未完全复制”状态),statefulset 中的每个 pod 都将变得未就绪。
我的问题是:我并不真正了解 k8s 咨询就绪状态的每个部分的全部含义。如果 SS 中的每个 pod 都没有准备好,而单个 pod 正在“加载”,那会不会很糟糕?
我的理解是,readiness 用于控制 Deployment 或 StatefulSet 推出的速度(在这里很好),它还用于让服务确定路由到哪些 pod。在这种情况下,我们实际上并没有使用与 StatefulSet 关联的 Service 进行路由(客户端直接连接到各个 pod)。所以看起来这实际上可能很好。但是是吗?或者是否还有其他 Ready 状态的应用程序,这会使我们在全局复制未达到 100% 时将所有 pod 标记为未准备好?
【问题讨论】:
-
我不确定为什么要让所有 pod 都失败 ReadinessProbe,它可以用来设置依赖项。和
initContainers一样,你可以用它来测试复制是否成功。 -
底层软件并不容易问“这个 pod 是否拥有它应该拥有的所有数据”这个问题。很容易提出“集群作为一个整体是否复制不足”的问题。但我不认为它真的有单个节点要求的概念,只是“我们需要在某个地方的每个文件的两个副本”。
-
您应该创建自己的图像,并在其中运行一个脚本,如果缓存被正确复制,它将输出“0”。 Kubernetes 将旋转映像并等待此输出,直到那时
POD应该还没有准备好。但这些都是你必须做的事情。 -
我发布了一个答案,但你的问题是大约 8 个月大。请问你最后做了什么?问是因为我今年晚些时候还需要将 Druid 集群迁移到 Kubernetes...
-
FWIW 我们停止使用本地磁盘,转而使用 k8s PVC,因此我们不再遇到“新机器意味着从头开始重新加载历史”问题。
标签: kubernetes statefulset kubernetes-statefulset