【问题标题】:Kubernetes: in-memory shared cache between podsKubernetes:Pod 之间的内存共享缓存
【发布时间】:2022-01-19 09:33:17
【问题描述】:

我正在寻找在同一节点上的 pod 之间共享只读内存缓存的任何现有实现。这种设置将允许快速访问,而无需将整个缓存加载到每个 pod 内存中。

示例:1GB 查找字典保持最新,每个 pod 都具有对数据的读取访问权限,从而允许快速查找而无需有效地将数据克隆到内存中。所以最终结果将是节点上仅使用 1GB 内存,而不是 1GB * N(pod 数量)

k8s 的设想解决方案:

  1. 具有 tmpfs 卷 RW 的单个(守护程序)pod,维护最新的缓存数据
  2. 具有相同 tmpfs 卷 R(仅)的多个 pod,映射数据文件以读取数据
    1. 自然地读出值并对其进行操作预计会产生传递性内存使用情况

注意事项:

  • 我找到了multiple entries regarding volume sharing between pods,但是上面没有完整的解决方案参考
  • tmpfs 是 R/W 缓存速度的理想选择,但显然它可以超过常规 fs
  • 寻找可以是特定语言或不可知论的解决方案以供参考
    • 特定语言将使用特定语言将文件数据映射为字典/其他 KV 查找
    • 语言不可知和更通用的解决方案可以使用sqlite,在我们的例子中,进程是 pod

【问题讨论】:

  • 我遇到了你的问题,或者我们可以说计划很好,毫无疑问,如果我们在 K8s 上运行守护进程,它会在每个节点上使用 tmpfs 安排 POD,但你的服务如何将确保连接到同一节点 POD 只读实例?理想情况下,从服务到 POD 的流量与读取写入副本无关。在您的应用程序中,您不能使用 POD ip 左右。阅读更多相同场景讨论:stackoverflow.com/questions/70452338/…
  • Redis 中有一个用于客户端缓存的选项,但正如您提到的 1GB * N(pod 数量):redis.io/topics/client-side-caching
  • @HarshManvar 假设 writer pod 被设置为 daemonset,确保每个节点都有一个有效的文件缓存 - 而其余的 pod 挂载它并“看到”它作为它们的本地只读副本跨度>

标签: kubernetes caching tmpfs


【解决方案1】:

您可以使用安装在tmpfs 上的hostIPC 和/或hostPath,但这会带来很多问题:

  1. hostPath 本身会带来安全风险,使用时,应将其范围限定为所需的文件或目录,并以只读方式挂载。它还附带一个警告,即不知道谁会被“收费” 对于内存,因此必须配置每个 pod 才能 吸收它,取决于它是如何写的。它也可能“泄漏”到 根命名空间,向任何人收费,但显示为“开销”
  2. hostIPCPod Security Policies 的一部分,自 1.21 起已弃用,未来将被删除

一般来说,最好的办法是使用Redis,它是此类场景中最常用的工具之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多