【发布时间】:2023-04-03 13:58:01
【问题描述】:
我正在构建一个分布式系统,我需要在其中刷新两个服务(服务 A 和服务 B)的所有 pod 的特定配置。此配置由另一个服务-C 处理。用户可以向 service-C 发送 api 请求,该请求需要传播到 service-A 和 service-B 的所有 pod。
- 服务 A 和服务 B 在 grpc 上工作,不对外公开。
- 这些服务可以在不同的节点上运行(因此我们不能在这些节点之间共享一个文件系统)。
- 平均配置大约为 100KB,这样的配置大约有 100K。
可能的想法:
我可以使用 kafka 创建一个消息总线,并将这些配置推送到该总线上,然后由不同的 pod 监听。这种方法的问题是服务 A 和服务 B 将运行 100 个 pod,因此会有大约 100 个消费者组,如果出现新的 pod,它必须从头开始消耗队列,这将非常耗时。
使用像 consul 或 etcd 这样的轻量级瞬态键值存储,因此 Service-C 会将数据推送到 consul 中,然后可供 Service-A 和 Service-B 读取。这种方法的问题是,这么多的 pod 监听 consul 会导致延迟。
有人可以帮我提供一些想法,我如何在 kubernetes 本地实现这一点?
谢谢。
【问题讨论】:
-
这是一个 java spring 应用还是别的什么?
-
它是一个 golang 应用程序。
-
一个想法:服务 C 直接与 K8s API 对话以更新 configMap,服务 A 和 B 已配置,因此它们的 pod 会挂载该 configmap,这将在其文件系统上自动更新。服务 A 和 B 需要轮询该文件或获得更改通知,然后重新加载配置。这实际上只是在底层使用 etcd,这就是 K8s 的工作原理。另一个想法:使用 Consul。让代理作为守护程序集运行,而不是在每个 pod 内运行,这可能会减少您的延迟问题;尽管无论如何,领事都应该扩展到大量代理。 github.com/hashicorp/consul-helm
标签: kubernetes kubernetes-networking