【问题标题】:Kubernetes : is it possible to broadcast message from one service to another service?Kubernetes:是否可以将消息从一个服务广播到另一个服务?
【发布时间】:2023-04-03 13:58:01
【问题描述】:

我正在构建一个分布式系统,我需要在其中刷新两个服务(服务 A 和服务 B)的所有 pod 的特定配置。此配置由另一个服务-C 处理。用户可以向 service-C 发送 api 请求,该请求需要传播到 service-A 和 service-B 的所有 pod。

  1. 服务 A 和服务 B 在 grpc 上工作,不对外公开。
  2. 这些服务可以在不同的节点上运行(因此我们不能在这些节点之间共享一个文件系统)。
  3. 平均配置大约为 100KB,这样的配置大约有 100K。

可能的想法:

  1. 我可以使用 kafka 创建一个消息总线,并将这些配置推送到该总线上,然后由不同的 pod 监听。这种方法的问题是服务 A 和服务 B 将运行 100 个 pod,因此会有大约 100 个消费者组,如果出现新的 pod,它必须从头开始消耗队列,这将非常耗时。

  2. 使用像 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


【解决方案1】:

您可以为此使用 configMap。从应用程序 C 通过调用 kubernetes API 创建或更新 configMap 使用 kubernetes go 客户端库和 volumeMount 服务 A 和服务 B 中的 configMap。服务 A 和服务 B 可以有一种机制来检查这些 configMaps 中是否有任何变化,如果是然后在内存中重新加载配置。服务 B 和服务 A 中的机制可能只是计算 configMap 的哈希值,并定期将其与文件系统中的内容进行比较(通过 configMap 的 volumeMount),当有变化时重新加载内存中的 configMap。

【讨论】:

  • 谢谢。配置映射能否扩展到 100k 的 100kb 配置?还有其他方法可以将数据发送到所有 pod 吗?什么样的广播?
  • ConfigMaps 内部存储在 etcd 中,非常可扩展。我无法证明这一点,但你应该试一试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2020-11-27
  • 2019-05-11
相关资源
最近更新 更多