【问题标题】:Is it OK to make all pods in a Kubernetes statefulset fail ReadinessProbes instead of just one?是否可以让 Kubernetes statefulset 中的所有 pod 都失败 ReadinessProbes 而不仅仅是一个?
【发布时间】: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


【解决方案1】:

我无法回答您关于 Kubernetes 就绪探测的一般含义的问题,但我碰巧非常了解您的应用程序(Druid)。

我相信你的假设是错误的。你说没有办法询问单个历史节点关于从深度存储加载段的状态,但实际上有这样一个API:

/druid/historical/v1/readiness 以及相关的 /druid/historical/v1/loadstatus

如此处所述:https://druid.apache.org/docs/latest/operations/api-reference.html

【讨论】:

  • 我问这个问题已经有一段时间了,但我的印象是这个 API 的意思是“历史已经加载了协调器当前请求它加载的所有数据”,但是当有很多复制不足的数据,协调器不一定会立即将其全部放入加载队列。
猜你喜欢
  • 2018-01-20
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2018-01-20
  • 2012-10-17
  • 2019-05-23
相关资源
最近更新 更多